Mercurial > pidgin.yaz
changeset 21453:93e69f29bc5f
merge of '45a353a8a7978312260680050564b3a32f0d07aa'
and 'c7f6969f2405aa75f2e945cb239e6bf9ff0d6372'
author | Sadrul Habib Chowdhury <imadil@gmail.com> |
---|---|
date | Mon, 12 Nov 2007 16:53:54 +0000 |
parents | b068b2d146d1 (diff) 14f06265d134 (current diff) |
children | d78e440584e0 |
files | pidgin/pixmaps/dialogs/16/Makefile.am pidgin/pixmaps/dialogs/16/Makefile.mingw pidgin/pixmaps/dialogs/64/Makefile.am pidgin/pixmaps/dialogs/64/Makefile.mingw pidgin/pixmaps/emblems/16/Makefile.am pidgin/pixmaps/emblems/16/Makefile.mingw pidgin/pixmaps/emotes/default/Makefile.mingw pidgin/pixmaps/icons/16/Makefile.am pidgin/pixmaps/icons/16/pidgin.png pidgin/pixmaps/icons/16/scalable/pidgin.svg pidgin/pixmaps/icons/22/Makefile.am pidgin/pixmaps/icons/22/pidgin.png pidgin/pixmaps/icons/22/scalable/pidgin.svg pidgin/pixmaps/icons/24/Makefile.am pidgin/pixmaps/icons/24/pidgin.png pidgin/pixmaps/icons/24/scalable/pidgin.svg pidgin/pixmaps/icons/32/Makefile.am pidgin/pixmaps/icons/32/pidgin.png pidgin/pixmaps/icons/32/scalable/pidgin.svg pidgin/pixmaps/icons/48/Makefile.am pidgin/pixmaps/icons/48/pidgin.png pidgin/pixmaps/icons/48/scalable/pidgin.svg pidgin/pixmaps/protocols/16/Makefile.am pidgin/pixmaps/protocols/16/Makefile.mingw pidgin/pixmaps/protocols/22/Makefile.am pidgin/pixmaps/protocols/22/Makefile.mingw pidgin/pixmaps/protocols/48/Makefile.am pidgin/pixmaps/protocols/48/Makefile.mingw pidgin/pixmaps/status/11/Makefile.am pidgin/pixmaps/status/11/Makefile.mingw pidgin/pixmaps/status/11/rtl/Makefile.am pidgin/pixmaps/status/11/rtl/Makefile.mingw pidgin/pixmaps/status/16/Makefile.am pidgin/pixmaps/status/16/Makefile.mingw pidgin/pixmaps/status/16/rtl/Makefile.am pidgin/pixmaps/status/16/rtl/Makefile.mingw pidgin/pixmaps/status/22/Makefile.am pidgin/pixmaps/status/22/Makefile.mingw pidgin/pixmaps/status/22/rtl/Makefile.am pidgin/pixmaps/status/22/rtl/Makefile.mingw pidgin/pixmaps/status/32/Makefile.am pidgin/pixmaps/status/32/Makefile.mingw pidgin/pixmaps/status/32/rtl/Makefile.am pidgin/pixmaps/status/32/rtl/Makefile.mingw pidgin/pixmaps/status/48/Makefile.am pidgin/pixmaps/status/48/Makefile.mingw pidgin/pixmaps/status/48/rtl/Makefile.am pidgin/pixmaps/status/48/rtl/Makefile.mingw pidgin/pixmaps/toolbar/16/Makefile.am pidgin/pixmaps/toolbar/16/Makefile.mingw pidgin/pixmaps/toolbar/22/Makefile.am pidgin/pixmaps/toolbar/22/Makefile.mingw pidgin/pixmaps/tray/16/Makefile.am pidgin/pixmaps/tray/16/Makefile.mingw pidgin/pixmaps/tray/16/scalable/Makefile.am pidgin/pixmaps/tray/22/Makefile.am pidgin/pixmaps/tray/22/Makefile.mingw pidgin/pixmaps/tray/22/scalable/Makefile.am pidgin/pixmaps/tray/32/Makefile.am pidgin/pixmaps/tray/32/Makefile.mingw pidgin/pixmaps/tray/48/Makefile.am pidgin/pixmaps/tray/48/Makefile.mingw share/Makefile.am share/Makefile.mingw |
diffstat | 218 files changed, 28033 insertions(+), 8069 deletions(-) [+] |
line wrap: on
line diff
--- a/COPYRIGHT Mon Nov 12 16:15:53 2007 +0000 +++ b/COPYRIGHT Mon Nov 12 16:53:54 2007 +0000 @@ -80,6 +80,7 @@ Graham Cole Jono Cole Lorenzo Colitti +Collabora Ltd. Jeff Connelly Nathan Conrad Felipe Contreras
--- a/ChangeLog.API Mon Nov 12 16:15:53 2007 +0000 +++ b/ChangeLog.API Mon Nov 12 16:53:54 2007 +0000 @@ -15,6 +15,38 @@ to unload a plugin--fails. This then prevents the plugin from being saved in the saved plugins list, so it'll won't be loaded at the next startup. + + * PurpleDisconnectReason enumeration of machine-readable + types of connection error. + * purple_connection_error_reason(), to be used by prpls + (instead of purple_connection_error() and setting + gc->wants_to_die) to report errors along with a + PurpleDisconnectReason. + * PurpleConnectionUiOps.report_disconnect_reason, to be + implemented by UIs (rather than .report_disconnect) if + they want to use the reported PurpleDisconnectReason + to give a more specific error. + * A connection-error signal, fired just after the UiOp is + called with the same information. + * purple_connection_reason_is_fatal(), acting as a hint + to whether automatic reconnection should be attempted + after a connection error (rather than checking + gc->wants_to_die). + * PurpleConnectionErrorInfo, a struct to hold a + PurpleConnectionError and a const char *description. + * purple_account_get_current_error() to get the most recent + PurpleConnectionError and description (or NULL if the + account is happy with life), to allow bits of the UI to know + the last error without caching it themselves (as + PidginBuddyList does). + * purple_account_clear_current_error() to reset an account's + error state to NULL. + * An account-error-changed signal, firing when + purple_account_get_current_error()'s return value changes. + + * PidginMiniDialog, a Gtk widget-ified version of + pidgin_make_mini_dialog(). + * purple_util_init() * purple_util_uninit() @@ -61,6 +93,11 @@ when a dependent plugin fails to unload. The UI should do something appropriate. + * pidgin_make_mini_dialog() now declares its return type to be + GtkWidget * rather than void *. This should not break any + existing code since any code using it must already rely on + the return type actually being GtkWidget * all along. + Deprecated: * pidgin_dialogs_about() * pidgin_log_show_contact() @@ -82,6 +119,10 @@ * purple_request_ok_cancel() * purple_request_yes_no() + * purple_connection_error() + * pidgin_blist_update_account_error_state() + * PidginBuddyList.connection_errors + MSN: * A new independant status type with PURPLE_STATUS_TUNE primitive, and PURPLE_TUNE_ARTIST, PURPLE_TUNE_ALBUM and PURPLE_TUNE_TITLE
--- a/ChangeLog.win32 Mon Nov 12 16:15:53 2007 +0000 +++ b/ChangeLog.win32 Mon Nov 12 16:53:54 2007 +0000 @@ -1,5 +1,7 @@ version 2.2.3: - * No changes + * Updated GTK+ to 2.12.1 (This was actually included in 2.2.2, but + didn't get into the Changelog.) + * Upgrade SILC to use the 1.1.5 toolkit version 2.2.2 (10/23/2007): * Updated gtkspell to include a patch to share Aspell dictionaries @@ -11,6 +13,7 @@ * libpurple now looks for a default prefs.xml in the COMMON_APPDATA directory (e.g. \Documents and Settings\All Users\Application Data\purple\prefs.xml) similarly to how this is done on other platforms. + * Updated GTK+ to 2.12.1 version 2.2.1 (09/29/2007): * No changes
--- a/Doxyfile.in Mon Nov 12 16:15:53 2007 +0000 +++ b/Doxyfile.in Mon Nov 12 16:53:54 2007 +0000 @@ -1,4 +1,4 @@ -# Doxyfile 1.4.4 +# Doxyfile 1.5.3 # This file describes the settings to be used by the documentation system # doxygen (www.doxygen.org) for a project @@ -14,6 +14,14 @@ # Project related configuration options #--------------------------------------------------------------------------- +# This tag specifies the encoding used for all characters in the config file that +# follow. The default is UTF-8 which is also the encoding used for all text before +# the first occurrence of this tag. Doxygen uses libiconv (or the iconv built into +# libc) for the transcoding. See http://www.gnu.org/software/libiconv for the list of +# possible encodings. + +DOXYFILE_ENCODING = UTF-8 + # The PROJECT_NAME tag is a single word (or a sequence of words surrounded # by quotes) that should identify the project. @@ -45,23 +53,14 @@ # documentation generated by doxygen is written. Doxygen will use this # information to generate all constant output in the proper language. # The default language is English, other supported languages are: -# Brazilian, Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, Dutch, -# Finnish, French, German, Greek, Hungarian, Italian, Japanese, Japanese-en -# (Japanese with English messages), Korean, Norwegian, Polish, Portuguese, -# Romanian, Russian, Serbian, Slovak, Slovene, Spanish, Swedish, and Ukrainian. +# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, +# Croatian, Czech, Danish, Dutch, Finnish, French, German, Greek, Hungarian, +# Italian, Japanese, Japanese-en (Japanese with English messages), Korean, +# Korean-en, Lithuanian, Norwegian, Polish, Portuguese, Romanian, Russian, +# Serbian, Slovak, Slovene, Spanish, Swedish, and Ukrainian. OUTPUT_LANGUAGE = English -# This tag can be used to specify the encoding used in the generated output. -# The encoding is not always determined by the language that is chosen, -# but also whether or not the output is meant for Windows or non-Windows users. -# In case there is a difference, setting the USE_WINDOWS_ENCODING tag to YES -# forces the Windows encoding (this is the default for the Windows binary), -# whereas setting the tag to NO uses a Unix-style encoding (the default for -# all platforms other than Windows). - -USE_WINDOWS_ENCODING = NO - # If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will # include brief member descriptions after the members that are listed in # the file and class documentation (similar to JavaDoc). @@ -76,16 +75,28 @@ REPEAT_BRIEF = YES +# This tag implements a quasi-intelligent brief description abbreviator +# that is used to form the text in various listings. Each string +# in this list, if found as the leading text of the brief description, will be +# stripped from the text and the result after processing the whole list, is +# used as the annotated text. Otherwise, the brief description is used as-is. +# If left blank, the following values are used ("$name" is automatically +# replaced with the name of the entity): "The $name class" "The $name widget" +# "The $name file" "is" "provides" "specifies" "contains" +# "represents" "a" "an" "the" + +ABBREVIATE_BRIEF = + # If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then # Doxygen will generate a detailed section even if there is only a brief # description. ALWAYS_DETAILED_SEC = NO -# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all inherited -# members of a class in the documentation of that class as if those members were -# ordinary class members. Constructors, destructors and assignment operators of -# the base classes will not be shown. +# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all +# inherited members of a class in the documentation of that class as if those +# members were ordinary class members. Constructors, destructors and assignment +# operators of the base classes will not be shown. INLINE_INHERITED_MEMB = NO @@ -98,10 +109,21 @@ # If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag # can be used to strip a user-defined part of the path. Stripping is # only done if one of the specified strings matches the left-hand part of -# the path. It is allowed to use relative paths in the argument list. +# the path. The tag can be used to show relative paths in the file list. +# If left blank the directory from which doxygen is run is used as the +# path to strip. STRIP_FROM_PATH = +# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of +# the path mentioned in the documentation of a class, which tells +# the reader which header file to include in order to use a class. +# If left blank only the name of the header file containing the class +# definition is used. Otherwise one should specify the include paths that +# are normally passed to the compiler using the -I flag. + +STRIP_FROM_INC_PATH = + # If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter # (but less readable) file names. This can be useful is your file systems # doesn't support long names like on DOS, Mac, or CD-ROM. @@ -111,11 +133,19 @@ # If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen # will interpret the first line (until the first dot) of a JavaDoc-style # comment as the brief description. If set to NO, the JavaDoc -# comments will behave just like the Qt-style comments (thus requiring an -# explict @brief command for a brief description. +# comments will behave just like regular Qt-style comments +# (thus requiring an explicit @brief command for a brief description.) JAVADOC_AUTOBRIEF = YES +# If the QT_AUTOBRIEF tag is set to YES then Doxygen will +# interpret the first line (until the first dot) of a Qt-style +# comment as the brief description. If set to NO, the comments +# will behave just like regular Qt-style comments (thus requiring +# an explicit \brief command for a brief description.) + +QT_AUTOBRIEF = NO + # The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen # treat a multi-line C++ special comment block (i.e. a block of //! or /// # comments) as a brief description. This used to be the default behaviour. @@ -133,17 +163,10 @@ # If the INHERIT_DOCS tag is set to YES (the default) then an undocumented # member inherits the documentation from any documented member that it -# reimplements. +# re-implements. INHERIT_DOCS = YES -# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC -# tag is set to YES, then doxygen will reuse the documentation of the first -# member in the group (if any) for the other members of the group. By default -# all members of a group must be documented explicitly. - -DISTRIBUTE_GROUP_DOC = NO - # If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce # a new page for each member. If set to NO, the documentation of a member will # be part of the file/class/namespace that contains it. @@ -162,30 +185,51 @@ # will result in a user-defined paragraph with heading "Side Effects:". # You can put \n's in the value part of an alias to insert newlines. -ALIASES = "signal=- @ref" \ - "signaldef=@section" \ - "endsignaldef=" \ - "signalproto=@code" \ - "endsignalproto=@endcode" \ - "signaldesc=@par Description:" \ - "signals=@b Signals:" \ - "endsignals=" \ - "constreturn=@note The return value of this function must not be modified or freed. @return" +ALIASES = "signal=- @ref " \ + "signaldef=@section " \ + "endsignaldef= " \ + "signalproto=@code " \ + "endsignalproto=@endcode " \ + "signaldesc=@par Description: " \ + "signals=@b Signals: " \ + "endsignals= " \ + "constreturn=@note The return value of this function must not be modified or freed. @return " -# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources -# only. Doxygen will then generate output that is more tailored for C. +# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C +# sources only. Doxygen will then generate output that is more tailored for C. # For instance, some of the names that are used will be different. The list # of all members will be omitted, etc. OPTIMIZE_OUTPUT_FOR_C = YES -# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java sources -# only. Doxygen will then generate output that is more tailored for Java. +# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java +# sources only. Doxygen will then generate output that is more tailored for Java. # For instance, namespaces will be presented as packages, qualified scopes # will look different, etc. OPTIMIZE_OUTPUT_JAVA = NO +# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want to +# include (a tag file for) the STL sources as input, then you should +# set this tag to YES in order to let doxygen match functions declarations and +# definitions whose arguments contain STL classes (e.g. func(std::string); v.s. +# func(std::string) {}). This also make the inheritance and collaboration +# diagrams that involve STL classes more complete and accurate. + +BUILTIN_STL_SUPPORT = NO + +# If you use Microsoft's C++/CLI language, you should set this option to YES to +# enable parsing support. + +CPP_CLI_SUPPORT = NO + +# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC +# tag is set to YES, then doxygen will reuse the documentation of the first +# member in the group (if any) for the other members of the group. By default +# all members of a group must be documented explicitly. + +DISTRIBUTE_GROUP_DOC = NO + # Set the SUBGROUPING tag to YES (the default) to allow class member groups of # the same type (for instance a group of public functions) to be put as a # subgroup of that type (e.g. under the Public Functions section). Set it to @@ -228,6 +272,13 @@ EXTRACT_LOCAL_METHODS = YES +# If this flag is set to YES, the members of anonymous namespaces will be extracted +# and appear in the documentation as a namespace called 'anonymous_namespace{file}', +# where file will be replaced with the base name of the file that contains the anonymous +# namespace. By default anonymous namespace are hidden. + +EXTRACT_ANON_NSPACES = NO + # If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all # undocumented members of documented classes, files or namespaces. # If set to NO (the default) these members will be included in the @@ -268,7 +319,7 @@ # file names in lower-case letters. If set to YES upper-case letters are also # allowed. This is useful if you have classes or files whose names only differ # in case and if your file system supports case sensitive file names. Windows -# users are advised to set this option to NO. +# and Mac users are advised to set this option to NO. CASE_SENSE_NAMES = YES @@ -360,7 +411,7 @@ # If the sources in your project are distributed over multiple directories # then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy -# in the documentation. The default is YES. +# in the documentation. The default is NO. SHOW_DIRECTORIES = YES @@ -369,7 +420,7 @@ # version control system). Doxygen will invoke the program by executing (via # popen()) the command <command> <input-file>, where <command> is the value of # the FILE_VERSION_FILTER tag, and <input-file> is the name of an input file -# provided by doxygen. Whatever the progam writes to standard output +# provided by doxygen. Whatever the program writes to standard output # is used as the file version. See the manual for examples. FILE_VERSION_FILTER = @@ -413,9 +464,11 @@ # The WARN_FORMAT tag determines the format of the warning messages that # doxygen can produce. The string should contain the $file, $line, and $text # tags, which will be replaced by the file and line number from which the -# warning originated and the warning text. +# warning originated and the warning text. Optionally the format may contain +# $version, which will be replaced by the version of the file (if it could +# be obtained via FILE_VERSION_FILTER) -WARN_FORMAT = "$file:$line: $text" +WARN_FORMAT = "$file:$line: $text " # The WARN_LOGFILE tag can be used to specify a file to which warning # and error messages should be written. If left blank the output is written @@ -433,17 +486,24 @@ # with spaces. INPUT = libpurple \ - finch \ - finch/libgnt \ - pidgin \ + finch \ + finch/libgnt \ + pidgin \ doc +# This tag can be used to specify the character encoding of the source files that +# doxygen parses. Internally doxygen uses the UTF-8 encoding, which is also the default +# input encoding. Doxygen uses libiconv (or the iconv built into libc) for the transcoding. +# See http://www.gnu.org/software/libiconv for the list of possible encodings. + +INPUT_ENCODING = UTF-8 + # If the value of the INPUT tag contains directories, you can use the # FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank the following patterns are tested: -# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx *.hpp -# *.h++ *.idl *.odl *.cs *.php *.php3 *.inc +# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx +# *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py FILE_PATTERNS = *.h \ *.dox @@ -461,17 +521,27 @@ EXCLUDE = libpurple/purple-client.h \ libpurple/purple-client-bindings.h -# The EXCLUDE_SYMLINKS tag can be used select whether or not files or directories -# that are symbolic links (a Unix filesystem feature) are excluded from the input. +# The EXCLUDE_SYMLINKS tag can be used select whether or not files or +# directories that are symbolic links (a Unix filesystem feature) are excluded +# from the input. EXCLUDE_SYMLINKS = NO # If the value of the INPUT tag contains directories, you can use the # EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude -# certain files from those directories. +# certain files from those directories. Note that the wildcards are matched +# against the file with absolute path, so to exclude all test directories +# for example use the pattern */test/* EXCLUDE_PATTERNS = +# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names +# (namespaces, classes, functions, etc.) that should be excluded from the output. +# The symbol name can be a fully qualified name, a word, or if the wildcard * is used, +# a substring. Examples: ANamespace, AClass, AClass::ANamespace, ANamespace::*Test + +EXCLUDE_SYMBOLS = + # The EXAMPLE_PATH tag can be used to specify one or more files or # directories that contain example code fragments that are included (see # the \include command). @@ -503,7 +573,8 @@ # by executing (via popen()) the command <filter> <input-file>, where <filter> # is the value of the INPUT_FILTER tag, and <input-file> is the name of an # input file. Doxygen will then use the output that the filter program writes -# to standard output. +# to standard output. If FILTER_PATTERNS is specified, this tag will be +# ignored. INPUT_FILTER = @@ -527,7 +598,11 @@ #--------------------------------------------------------------------------- # If the SOURCE_BROWSER tag is set to YES then a list of source files will -# be generated. Documented entities will be cross-referenced with these sources. +# be generated. Documented entities will be cross-referenced with these sources. +# Note: To get rid of all source code in the generated output, make sure also +# VERBATIM_HEADERS is set to NO. If you have enabled CALL_GRAPH or CALLER_GRAPH +# then you must also enable this option. If you don't then doxygen will produce +# a warning and turn it on anyway SOURCE_BROWSER = NO @@ -554,6 +629,13 @@ REFERENCES_RELATION = YES +# If the REFERENCES_LINK_SOURCE tag is set to YES (the default) +# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from +# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will +# link to the source code. Otherwise they will link to the documentstion. + +REFERENCES_LINK_SOURCE = YES + # If the USE_HTAGS tag is set to YES then the references to source code # will point to the HTML generated by the htags(1) tool instead of doxygen # built-in source browser. The htags tool is part of GNU's global source @@ -629,7 +711,9 @@ # The HTML_STYLESHEET tag can be used to specify a user-defined cascading # style sheet that is used by each HTML page. It can be used to # fine-tune the look of the HTML output. If the tag is left blank doxygen -# will generate a default style sheet +# will generate a default style sheet. Note that doxygen will try to copy +# the style sheet file to the HTML output directory, so don't put your own +# stylesheet in the HTML output directory as well, or it will be erased! HTML_STYLESHEET = @@ -646,10 +730,18 @@ GENERATE_HTMLHELP = YES +# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML +# documentation will contain sections that can be hidden and shown after the +# page has loaded. For this to work a browser that supports +# JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox +# Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari). + +HTML_DYNAMIC_SECTIONS = NO + # If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can # be used to specify the file name of the resulting .chm file. You # can add a path in front of the file if the result should not be -# written to the html output dir. +# written to the html output directory. CHM_FILE = @@ -784,7 +876,7 @@ #--------------------------------------------------------------------------- # If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output -# The RTF output is optimised for Word 97 and may not look very pretty with +# The RTF output is optimized for Word 97 and may not look very pretty with # other RTF readers or editors. GENERATE_RTF = NO @@ -811,7 +903,7 @@ RTF_HYPERLINKS = NO # Load stylesheet definitions from file. Syntax is similar to doxygen's -# config file, i.e. a series of assigments. You only have to provide +# config file, i.e. a series of assignments. You only have to provide # replacements, missing definitions are set to their default value. RTF_STYLESHEET_FILE = @@ -855,9 +947,7 @@ # If the GENERATE_XML tag is set to YES Doxygen will # generate an XML file that captures the structure of -# the code including all documentation. Note that this -# feature is still experimental and incomplete at the -# moment. +# the code including all documentation. GENERATE_XML = YES @@ -879,6 +969,13 @@ XML_DTD = +# If the XML_PROGRAMLISTING tag is set to YES Doxygen will +# dump the program listings (including syntax highlighting +# and cross-referencing information) to the XML output. Note that +# enabling this will significantly increase the size of the XML output. + +XML_PROGRAMLISTING = YES + #--------------------------------------------------------------------------- # configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- @@ -943,7 +1040,7 @@ # If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES # then the macro expansion is limited to the macros specified with the -# PREDEFINED and EXPAND_AS_PREDEFINED tags. +# PREDEFINED and EXPAND_AS_DEFINED tags. EXPAND_ONLY_PREDEF = NO @@ -969,7 +1066,9 @@ # are defined before the preprocessor is started (similar to the -D option of # gcc). The argument of the tag is a list of macros of the form: name # or name=definition (no spaces). If the definition and the = are -# omitted =1 is assumed. +# omitted =1 is assumed. To prevent a macro definition from being +# undefined via #undef or recursively expanded use the := operator +# instead of the = operator. PREDEFINED = @@ -983,13 +1082,13 @@ # If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then # doxygen's preprocessor will remove all function-like macros that are alone # on a line, have an all uppercase name, and do not end with a semicolon. Such -# function macros are typically used for boiler-plate code, and will confuse the -# parser if not removed. +# function macros are typically used for boiler-plate code, and will confuse +# the parser if not removed. SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- -# Configuration::addtions related to external references +# Configuration::additions related to external references #--------------------------------------------------------------------------- # The TAGFILES option can be used to specify one or more tagfiles. @@ -1036,13 +1135,22 @@ #--------------------------------------------------------------------------- # If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will -# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base or -# super classes. Setting the tag to NO turns the diagrams off. Note that this -# option is superceded by the HAVE_DOT option below. This is only a fallback. It is -# recommended to install and use dot, since it yields more powerful graphs. +# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base +# or super classes. Setting the tag to NO turns the diagrams off. Note that +# this option is superseded by the HAVE_DOT option below. This is only a +# fallback. It is recommended to install and use dot, since it yields more +# powerful graphs. CLASS_DIAGRAMS = YES +# You can define message sequence charts within doxygen comments using the \msc +# command. Doxygen will then run the mscgen tool (see http://www.mcternan.me.uk/mscgen/) to +# produce the chart and insert it in the documentation. The MSCGEN_PATH tag allows you to +# specify the directory where the mscgen tool resides. If left empty the tool is assumed to +# be found in the default search path. + +MSCGEN_PATH = + # If set to YES, the inheritance and collaboration graphs will hide # inheritance and usage relations if the target is undocumented # or is not a class. @@ -1076,7 +1184,7 @@ GROUP_GRAPHS = YES # If the UML_LOOK tag is set to YES doxygen will generate inheritance and -# collaboration diagrams in a style similiar to the OMG's Unified Modeling +# collaboration diagrams in a style similar to the OMG's Unified Modeling # Language. UML_LOOK = YES @@ -1100,7 +1208,7 @@ INCLUDED_BY_GRAPH = YES -# If the CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will +# If the CALL_GRAPH, SOURCE_BROWSER and HAVE_DOT tags are set to YES then doxygen will # generate a call dependency graph for every global function or class method. # Note that enabling this option will significantly increase the time of a run. # So in most cases it will be better to enable call graphs for selected @@ -1108,6 +1216,14 @@ CALL_GRAPH = YES +# If the CALLER_GRAPH, SOURCE_BROWSER and HAVE_DOT tags are set to YES then doxygen will +# generate a caller dependency graph for every global function or class method. +# Note that enabling this option will significantly increase the time of a run. +# So in most cases it will be better to enable caller graphs for selected +# functions only using the \callergraph command. + +CALLER_GRAPH = NO + # If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen # will graphical hierarchy of all classes instead of a textual one. @@ -1127,7 +1243,7 @@ DOT_IMAGE_FORMAT = png # The tag DOT_PATH can be used to specify the path where the dot tool can be -# found. If left blank, it is assumed the dot tool can be found on the path. +# found. If left blank, it is assumed the dot tool can be found in the path. DOT_PATH = @@ -1137,30 +1253,23 @@ DOTFILE_DIRS = -# The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width -# (in pixels) of the graphs generated by dot. If a graph becomes larger than -# this value, doxygen will try to truncate the graph, so that it fits within -# the specified constraint. Beware that most browsers cannot cope with very -# large images. - -MAX_DOT_GRAPH_WIDTH = 1024 +# The MAX_DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of +# nodes that will be shown in the graph. If the number of nodes in a graph +# becomes larger than this value, doxygen will truncate the graph, which is +# visualized by representing a node as a red box. Note that doxygen if the number +# of direct children of the root node in a graph is already larger than +# MAX_DOT_GRAPH_NOTES then the graph will not be shown at all. Also note +# that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. -# The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height -# (in pixels) of the graphs generated by dot. If a graph becomes larger than -# this value, doxygen will try to truncate the graph, so that it fits within -# the specified constraint. Beware that most browsers cannot cope with very -# large images. - -MAX_DOT_GRAPH_HEIGHT = 1024 +DOT_GRAPH_MAX_NODES = 50 # The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the # graphs generated by dot. A depth value of 3 means that only nodes reachable -# from the root by following a path via at most 3 edges will be shown. Nodes that -# lay further from the root node will be omitted. Note that setting this option to -# 1 or 2 may greatly reduce the computation time needed for large code bases. Also -# note that a graph may be further truncated if the graph's image dimensions are -# not sufficient to fit the graph (see MAX_DOT_GRAPH_WIDTH and MAX_DOT_GRAPH_HEIGHT). -# If 0 is used for the depth value (the default), the graph is not depth-constrained. +# from the root by following a path via at most 3 edges will be shown. Nodes +# that lay further from the root node will be omitted. Note that setting this +# option to 1 or 2 may greatly reduce the computation time needed for large +# code bases. Also note that the size of a graph can be further restricted by +# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction. MAX_DOT_GRAPH_DEPTH = 2 @@ -1192,7 +1301,7 @@ DOT_CLEANUP = YES #--------------------------------------------------------------------------- -# Configuration::addtions related to the search engine +# Configuration::additions related to the search engine #--------------------------------------------------------------------------- # The SEARCHENGINE tag specifies whether or not a search engine should be
--- a/Makefile.am Mon Nov 12 16:15:53 2007 +0000 +++ b/Makefile.am Mon Nov 12 16:53:54 2007 +0000 @@ -42,7 +42,7 @@ GNT_DIR=finch endif -SUBDIRS = libpurple doc $(GNT_DIR) $(GTK_DIR) m4macros po share +SUBDIRS = libpurple doc $(GNT_DIR) $(GTK_DIR) m4macros po share/ca-certs share/sounds docs: Doxyfile if HAVE_DOXYGEN
--- a/Makefile.mingw Mon Nov 12 16:15:53 2007 +0000 +++ b/Makefile.mingw Mon Nov 12 16:53:54 2007 +0000 @@ -86,7 +86,8 @@ ifndef DISABLE_NLS $(MAKE) -C $(PURPLE_PO_TOP) -f $(MINGW_MAKEFILE) install endif - $(MAKE) -C share -f $(MINGW_MAKEFILE) install + $(MAKE) -C share/ca-certs -f $(MINGW_MAKEFILE) install + $(MAKE) -C share/sounds -f $(MINGW_MAKEFILE) install create_release_install_dir: install rm -rf $(STRIPPED_RELEASE_DIR)
--- a/configure.ac Mon Nov 12 16:15:53 2007 +0000 +++ b/configure.ac Mon Nov 12 16:53:54 2007 +0000 @@ -900,7 +900,7 @@ CPPFLAGS_save="$CPPFLAGS" CPPFLAGS="$CPPFLAGS $GADU_CFLAGS" AC_TRY_COMPILE([#include <libgadu.h>], [ -#ifdef __GG_LIBGADU_HAVE_OPENSSL +#if defined(__GG_LIBGADU_HAVE_OPENSSL) || defined(GG_CONFIG_HAVE_OPENSSL) #error "libgadu is not compatible with the GPL when compiled with OpenSSL support." #endif ], [ @@ -912,10 +912,11 @@ echo echo echo "libgadu is not compatible with the GPL when compiled with OpenSSL support." - echo "Please recompile libgadu using:" + echo "To compile against system libgadu, please recompile libgadu using:" echo "./autogen.sh --disable-libgadu-openssl --disable-static --enable-shared" echo "Then rerun this ./configure" echo + echo "Falling back to using our own copy of libgadu" echo GADU_LIBS="" GADU_CFLAGS="" @@ -929,6 +930,7 @@ AC_SUBST(GADU_LIBS) AC_SUBST(GADU_CFLAGS) +AC_ARG_ENABLE(msnp14,[AC_HELP_STRING([--disable-msnp14], [Disable the newer MSNP14 protocol])],,enable_msnp14=yes) AC_ARG_ENABLE(distrib,,,enable_distrib=no) AM_CONDITIONAL(DISTRIB, test "x$enable_distrib" = "xyes") @@ -949,6 +951,9 @@ STATIC_PRPLS=`echo $STATIC_PRPLS | $sedpath 's/bonjour//'` fi fi +if test "x$enable_msnp14" != "xyes" ; then + STATIC_PRPLS=`echo $STATIC_PRPLS | $sedpath 's/msn/msnp9/'` +fi if test "x$silcincludes" != "xyes" -o "x$silcclient" != "xyes"; then STATIC_PRPLS=`echo $STATIC_PRPLS | $sedpath 's/silc/silc10/'` fi @@ -973,6 +978,8 @@ STATIC_LINK_LIBS="$STATIC_LINK_LIBS \$(top_builddir)/libpurple/protocols/$i/lib${i}purple.a" elif test "x$i" = "xsilc10"; then STATIC_LINK_LIBS="$STATIC_LINK_LIBS \$(top_builddir)/libpurple/protocols/$i/libsilcpurple.a" + elif test "x$i" = "xmsnp9"; then + STATIC_LINK_LIBS="$STATIC_LINK_LIBS \$(top_builddir)/libpurple/protocols/$i/libmsn.a" else STATIC_LINK_LIBS="$STATIC_LINK_LIBS \$(top_builddir)/libpurple/protocols/$i/lib$i.a" fi @@ -985,6 +992,7 @@ irc) static_irc=yes ;; jabber) static_jabber=yes ;; msn) static_msn=yes ;; + msnp9) static_msn=yes ;; myspace) static_myspace=yes ;; novell) static_novell=yes ;; oscar) static_oscar=yes ;; @@ -1032,6 +1040,9 @@ DYNAMIC_PRPLS=`echo $DYNAMIC_PRPLS | $sedpath 's/bonjour//'` fi fi +if test "x$enable_msnp14" != "xyes" ; then + DYNAMIC_PRPLS=`echo $DYNAMIC_PRPLS | $sedpath 's/msn/msnp9/'` +fi if test "x$silcincludes" != "xyes" -o "x$silcclient" != "xyes"; then DYNAMIC_PRPLS=`echo $DYNAMIC_PRPLS | $sedpath 's/silc/silc10/'` fi @@ -1046,6 +1057,7 @@ irc) dynamic_irc=yes ;; jabber) dynamic_jabber=yes ;; msn) dynamic_msn=yes ;; + msnp9) dynamic_msn=yes ;; myspace) dynamic_myspace=yes ;; novell) dynamic_novell=yes ;; oscar) dynamic_oscar=yes ;; @@ -2206,35 +2218,8 @@ pidgin/pidgin-uninstalled.pc pidgin/pixmaps/Makefile pidgin/pixmaps/buddy_icons/qq/Makefile - pidgin/pixmaps/dialogs/16/Makefile - pidgin/pixmaps/dialogs/64/Makefile - pidgin/pixmaps/emblems/16/Makefile pidgin/pixmaps/emotes/default/24/Makefile pidgin/pixmaps/emotes/none/Makefile - pidgin/pixmaps/icons/16/Makefile - pidgin/pixmaps/icons/22/Makefile - pidgin/pixmaps/icons/24/Makefile - pidgin/pixmaps/icons/32/Makefile - pidgin/pixmaps/icons/48/Makefile - pidgin/pixmaps/protocols/16/Makefile - pidgin/pixmaps/protocols/22/Makefile - pidgin/pixmaps/protocols/48/Makefile - pidgin/pixmaps/status/11/Makefile - pidgin/pixmaps/status/11/rtl/Makefile - pidgin/pixmaps/status/16/Makefile - pidgin/pixmaps/status/16/rtl/Makefile - pidgin/pixmaps/status/22/Makefile - pidgin/pixmaps/status/22/rtl/Makefile - pidgin/pixmaps/status/32/Makefile - pidgin/pixmaps/status/32/rtl/Makefile - pidgin/pixmaps/status/48/Makefile - pidgin/pixmaps/status/48/rtl/Makefile - pidgin/pixmaps/toolbar/16/Makefile - pidgin/pixmaps/toolbar/22/Makefile - pidgin/pixmaps/tray/16/Makefile - pidgin/pixmaps/tray/22/Makefile - pidgin/pixmaps/tray/32/Makefile - pidgin/pixmaps/tray/48/Makefile pidgin/plugins/Makefile pidgin/plugins/cap/Makefile pidgin/plugins/gestures/Makefile @@ -2262,6 +2247,7 @@ libpurple/protocols/irc/Makefile libpurple/protocols/jabber/Makefile libpurple/protocols/msn/Makefile + libpurple/protocols/msnp9/Makefile libpurple/protocols/myspace/Makefile libpurple/protocols/novell/Makefile libpurple/protocols/null/Makefile @@ -2277,7 +2263,6 @@ libpurple/tests/Makefile libpurple/purple.h libpurple/version.h - share/Makefile share/sounds/Makefile share/ca-certs/Makefile finch/finch.pc
--- a/doc/account-signals.dox Mon Nov 12 16:15:53 2007 +0000 +++ b/doc/account-signals.dox Mon Nov 12 16:53:54 2007 +0000 @@ -12,6 +12,7 @@ @signal account-authorization-requested @signal account-authorization-denied @signal account-authorization-granted + @signal account-error-changed @endsignals @see account.h @@ -141,5 +142,23 @@ @since 2.3.0 @endsignaldef + @signaldef account-error-changed + @signalproto +void (*account_error_changed)(PurpleAccount *account, const PurpleConnectionErrorInfo *old_error, const PurpleConnectionErrorInfo *current_error); + @endsignalproto + @signaldesc + Emitted when @a account's error changes. + @param account The account whose error has changed. + @param old_error The account's previous error, or @c NULL if it had no + error. After this signal is emitted, @a old_error is + not guaranteed to be a valid pointer. + @param new_error The account's new error, or @c NULL if it has no error. + If not @c NULL, @a new_error will remain a valid until + pointer just after the next time this signal is emitted + for this @a account. + @see purple_account_get_current_error() + @since 2.3.0 + @endsignaldef + */ // vim: syntax=c.doxygen tw=75 et
--- a/doc/connection-signals.dox Mon Nov 12 16:15:53 2007 +0000 +++ b/doc/connection-signals.dox Mon Nov 12 16:53:54 2007 +0000 @@ -47,5 +47,16 @@ @param gc The connection that has signed off. @endsignaldef + @signaldef connection-error + @signalproto +void (*connection_error)(PurpleConnection *gc, PurpleConnectionError err, const gchar *desc) + @endsignalproto + @signaldesc + Emitted when a connection error occurs, before @ref signed-off. + @param gc The connection on which the error has occured + @param err The error that occured + @param desc A description of the error, giving more information. + @endsignaldef + */ // vim: syntax=c.doxygen tw=75 et
--- a/doc/pidgin.1.in Mon Nov 12 16:15:53 2007 +0000 +++ b/doc/pidgin.1.in Mon Nov 12 16:53:54 2007 +0000 @@ -17,8 +17,8 @@ .\" .\" You should have received a copy of the GNU General Public .\" License along with this manual; if not, write to the Free -.\" Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, -.\" USA. +.\" Software Foundation, Inc., 51 Franklin Street, Fifth Floor, +.\" Boston, MA 02111-1301 USA. .TH pidgin 1 .SH NAME Pidgin v@VERSION@ \- Instant Messaging client @@ -58,22 +58,22 @@ .TP .B \-l, \-\-login[=\fINAME\fR,\fINAME\fR,...] Sign in the comma-separated list of accounts provided, in addition to the -accounts that would be logged in anyway. If you do not specify such a -comma-separated list, your first account will be signed in. +accounts that would be logged in anyway. If the user does not specify such a +comma-separated list, the first account in accounts.xml will be signed in. .TP .B \-v, \-\-version Print the current version and exit. .SH BUDDY LIST The \fBBuddy List\fR window is Pidgin's main interface window. Using -this window you can see which of your buddies is online, away, idle, etc. -You can also add and remove buddies from your buddy list. +this window a user can see which of his/her buddies is online, away, idle, +etc. The user can also add buddies to and remove buddies from the buddy list. -The \fBBuddy List\fR window contains a list of your buddies who are online -and have allowed you to be notified of their presence. The icon to the -left of each buddy indicates the buddy's current status. Double clicking -a buddy will open a new \fBConversation\fR window. Right clicking will -pop up a menu: +The \fBBuddy List\fR window contains a list of the user's buddies who are +online and have allowed the user to be notified of their presence. The icon +to the left of each buddy indicates the buddy's current status. Double +clicking a buddy will open a new \fBConversation\fR window. Right clicking +will pop up a menu: .TP .B Get Info Retrieves and displays information about the buddy. This information is @@ -121,9 +121,9 @@ them. It can be accessed by selecting \fBManage\fR from the Tools menu. Clicking \fIDelete\fR will delete the currently selected account. Clicking \fIAdd\fR or \fIModify\fR will invoke a \fBModify Account\fR -window. Here, you can add or alter account information. When creating a -new account, you will submit your screen name and password. You will also -choose your protocol. +window. Here, the user can add or alter account information. When creating +a new account, the user will submit a screen name and password. The user will +also choose the protocol for the account. If \fIRemember Password\fR is chosen, the password will be saved in Pidgin's \fI~/.purple/accounts.xml\fR configuration file. @@ -143,7 +143,7 @@ .TP .B Show system tray icon -Specifies when to show a Pidgin icon in the notification area of your +Specifies when to show a Pidgin icon in the notification area of the user's panel (commonly referred to as the System Tray). .TP @@ -299,8 +299,8 @@ .B Report idle time Determines under which conditions to report idle time. \fBBased on keyboard and mouse use\fR uses keyboard and mouse activity to determine idle time. -\fBFrom last sent message\fR uses the time at which you last sent a message -in Pidgin to determine idle. \fBNever\fR disables idle reporting. +\fBFrom last sent message\fR uses the time at which the user last sent a +message in Pidgin to determine idle. \fBNever\fR disables idle reporting. .TP .B Auto-reply @@ -358,8 +358,7 @@ For protocols that allow it, \fBChats\fR can be entered through the \fIBuddies\fR menu. - -Additional commands available in chat, depending on the protocol are: +Additional features available in chat, depending on the protocol are: .TP .B Whisper The text will appear in the chat conversation, but it will only be visible @@ -374,6 +373,10 @@ .B Set Topic Set the topic of the chat room. This is usually a brief sentence describing the nature of the chat--an explanation of the chat room's name. +.TP +.B Private Message (IM) +Send a message to a specific person in the chat. Messages sent this way will +not appear in the chat window, but instead open a new IM conversation. .SH STATUS MESSAGES Most protocols allow for status messages. By using status messages, a user @@ -457,7 +460,7 @@ button. A pounce can be set to occur on any combination of the events listed, and any combination of actions can result. If \fIPounce only when my status is not Available\fR is checked, the pounce will occur -only if you are set to a non-available status, such as invisible, do not +only if the user is set to a non-available status, such as invisible, do not disturb, away, etc. If \fIRecurring\fR is checked, the pounce will remain until removed by the \fBDelete\fR button. @@ -487,20 +490,20 @@ .SH D-Bus Pidgin allows for interaction via D-Bus. Currently very little documentation -on this interaction exists. +about this interaction exists. .SH FILES \fI@prefix@/bin/pidgin\fR: Pidgin's location. .br \fI~/.purple/blist.xml\fR: the buddy list. .br - \fI~/.purple/accounts.xml\fR: information about your accounts. + \fI~/.purple/accounts.xml\fR: information about the user's accounts. .br - \fI~/.purple/pounces.xml\fR: stores your buddy pounces. + \fI~/.purple/pounces.xml\fR: stores the user's buddy pounces. .br \fI~/.purple/prefs.xml\fR: Pidgin's configuration file. .br - \fI~/.purple/status.xml\fR: stores your away messages. + \fI~/.purple/status.xml\fR: stores the user's away messages. .br \fI~/.purple/logs/PROTOCOL/ACCOUNT/SCREENNAME/DATE.{html,txt}\fR: conversation logs.
--- a/finch/finch.pc.in Mon Nov 12 16:15:53 2007 +0000 +++ b/finch/finch.pc.in Mon Nov 12 16:53:54 2007 +0000 @@ -3,6 +3,7 @@ libdir=@libdir@ includedir=@includedir@ datadir=@datadir@ +datarootdir=@datarootdir@ sysconfdir=@sysconfdir@ Name: Finch
--- a/libpurple/account.c Mon Nov 12 16:15:53 2007 +0000 +++ b/libpurple/account.c Mon Nov 12 16:53:54 2007 +0000 @@ -41,6 +41,14 @@ #include "util.h" #include "xmlnode.h" +typedef struct +{ + PurpleConnectionErrorInfo *current_error; +} PurpleAccountPrivate; + +#define PURPLE_ACCOUNT_GET_PRIVATE(account) \ + ((PurpleAccountPrivate *) (account->priv)) + /* TODO: Should use PurpleValue instead of this? What about "ui"? */ typedef struct { @@ -77,6 +85,9 @@ static GList *handles = NULL; +static void set_current_error(PurpleAccount *account, + PurpleConnectionErrorInfo *new_err); + /********************************************************************* * Writing to disk * *********************************************************************/ @@ -310,8 +321,32 @@ } static xmlnode * +current_error_to_xmlnode(PurpleConnectionErrorInfo *err) +{ + xmlnode *node, *child; + char type_str[3]; + + node = xmlnode_new("current_error"); + + if(err == NULL) + return node; + + child = xmlnode_new_child(node, "type"); + snprintf(type_str, sizeof(type_str), "%u", err->type); + xmlnode_insert_data(child, type_str, -1); + + child = xmlnode_new_child(node, "description"); + if(err->description) + xmlnode_insert_data(child, err->description, -1); + + return node; +} + +static xmlnode * account_to_xmlnode(PurpleAccount *account) { + PurpleAccountPrivate *priv = PURPLE_ACCOUNT_GET_PRIVATE(account); + xmlnode *node, *child; const char *tmp; PurplePresence *presence; @@ -368,6 +403,9 @@ xmlnode_insert_child(node, child); } + child = current_error_to_xmlnode(priv->current_error); + xmlnode_insert_child(node, child); + return node; } @@ -672,6 +710,42 @@ purple_account_set_proxy_info(account, proxy_info); } +static void +parse_current_error(xmlnode *node, PurpleAccount *account) +{ + guint type; + char *type_str = NULL, *description = NULL; + xmlnode *child; + PurpleConnectionErrorInfo *current_error = NULL; + + child = xmlnode_get_child(node, "type"); + if (child == NULL || (type_str = xmlnode_get_data(child)) == NULL) + return; + type = atoi(type_str); + g_free(type_str); + + if (type > PURPLE_CONNECTION_ERROR_OTHER_ERROR) + { + purple_debug_error("account", + "Invalid PurpleConnectionError value %d found when " + "loading account information for %s\n", + type, purple_account_get_username(account)); + type = PURPLE_CONNECTION_ERROR_OTHER_ERROR; + } + + child = xmlnode_get_child(node, "description"); + if (child) + description = xmlnode_get_data(child); + if (description == NULL) + description = g_strdup(""); + + current_error = g_new0(PurpleConnectionErrorInfo, 1); + current_error->type = type; + current_error->description = description; + + set_current_error(account, current_error); +} + static PurpleAccount * parse_account(xmlnode *node) { @@ -781,6 +855,13 @@ parse_proxy_info(child, ret); } + /* Read current error */ + child = xmlnode_get_child(node, "current_error"); + if (child != NULL) + { + parse_current_error(child, ret); + } + return ret; } @@ -827,6 +908,7 @@ purple_account_new(const char *username, const char *protocol_id) { PurpleAccount *account = NULL; + PurpleAccountPrivate *priv = NULL; PurplePlugin *prpl = NULL; PurplePluginProtocolInfo *prpl_info = NULL; PurpleStatusType *status_type; @@ -841,6 +923,8 @@ account = g_new0(PurpleAccount, 1); PURPLE_DBUS_REGISTER_POINTER(account, PurpleAccount); + priv = g_new0(PurpleAccountPrivate, 1); + account->priv = priv; purple_account_set_username(account, username); @@ -881,6 +965,7 @@ void purple_account_destroy(PurpleAccount *account) { + PurpleAccountPrivate *priv = NULL; GList *l; g_return_if_fail(account != NULL); @@ -912,6 +997,10 @@ if(account->system_log) purple_log_free(account->system_log); + priv = PURPLE_ACCOUNT_GET_PRIVATE(account); + g_free(priv->current_error); + g_free(priv); + PURPLE_DBUS_UNREGISTER_POINTER(account); g_free(account); } @@ -2214,6 +2303,65 @@ return prpl_info->offline_message(buddy); } +static void +signed_on_cb(PurpleConnection *gc, + gpointer unused) +{ + PurpleAccount *account = purple_connection_get_account(gc); + purple_account_clear_current_error(account); +} + +static void +set_current_error(PurpleAccount *account, + PurpleConnectionErrorInfo *new_err) +{ + PurpleAccountPrivate *priv = PURPLE_ACCOUNT_GET_PRIVATE(account); + PurpleConnectionErrorInfo *old_err = priv->current_error; + + if(new_err == old_err) + return; + + priv->current_error = new_err; + + purple_signal_emit(purple_accounts_get_handle(), + "account-error-changed", + account, old_err, new_err); + schedule_accounts_save(); + + if(old_err) + g_free(old_err->description); + + g_free(old_err); +} + +static void +connection_error_cb(PurpleConnection *gc, + PurpleConnectionError type, + const gchar *description, + gpointer unused) +{ + PurpleAccount *account = purple_connection_get_account(gc); + PurpleConnectionErrorInfo *err = g_new0(PurpleConnectionErrorInfo, 1); + + err->type = type; + err->description = g_strdup(description); + + set_current_error(account, err); +} + +const PurpleConnectionErrorInfo * +purple_account_get_current_error(PurpleAccount *account) +{ + PurpleAccountPrivate *priv = PURPLE_ACCOUNT_GET_PRIVATE(account); + return priv->current_error; +} + +void +purple_account_clear_current_error(PurpleAccount *account) +{ + set_current_error(account, NULL); +} + void purple_accounts_add(PurpleAccount *account) { @@ -2238,6 +2386,11 @@ schedule_accounts_save(); + /* Clearing the error ensures that account-error-changed is emitted, + * which is the end of the guarantee that the the error's pointer is + * valid. + */ + purple_account_clear_current_error(account); purple_signal_emit(purple_accounts_get_handle(), "account-removed", account); } @@ -2443,6 +2596,7 @@ purple_accounts_init(void) { void *handle = purple_accounts_get_handle(); + void *conn_handle = purple_connections_get_handle(); purple_signal_register(handle, "account-connecting", purple_marshal_VOID__POINTER, NULL, 1, @@ -2513,6 +2667,19 @@ PURPLE_SUBTYPE_ACCOUNT), purple_value_new(PURPLE_TYPE_STRING)); + purple_signal_register(handle, "account-error-changed", + purple_marshal_VOID__POINTER_POINTER_POINTER, + NULL, 3, + purple_value_new(PURPLE_TYPE_SUBTYPE, + PURPLE_SUBTYPE_ACCOUNT), + purple_value_new(PURPLE_TYPE_POINTER), + purple_value_new(PURPLE_TYPE_POINTER)); + + purple_signal_connect(conn_handle, "signed-on", handle, + PURPLE_CALLBACK(signed_on_cb), NULL); + purple_signal_connect(conn_handle, "connection-error", handle, + PURPLE_CALLBACK(connection_error_cb), NULL); + load_accounts(); } @@ -2520,6 +2687,7 @@ void purple_accounts_uninit(void) { + gpointer handle = purple_accounts_get_handle(); if (save_timer != 0) { purple_timeout_remove(save_timer); @@ -2527,5 +2695,6 @@ sync_accounts(); } - purple_signals_unregister_by_instance(purple_accounts_get_handle()); + purple_signals_disconnect_by_handle(handle); + purple_signals_unregister_by_instance(handle); }
--- a/libpurple/account.h Mon Nov 12 16:15:53 2007 +0000 +++ b/libpurple/account.h Mon Nov 12 16:53:54 2007 +0000 @@ -140,6 +140,8 @@ void *ui_data; /**< The UI can put data here. */ PurpleAccountRegistrationCb registration_cb; void *registration_cb_user_data; + + gpointer priv; /**< Pointer to opaque private data. */ }; #ifdef __cplusplus @@ -893,6 +895,25 @@ */ gboolean purple_account_supports_offline_message(PurpleAccount *account, PurpleBuddy *buddy); +/** + * Get the error that caused the account to be disconnected, or @c NULL if the + * account is happily connected or disconnected without an error. + * + * @param account The account whose error should be retrieved. + * @constreturn The type of error and a human-readable description of the + * current error, or @c NULL if there is no current error. This + * pointer is guaranteed to remain valid until the @ref + * account-error-changed signal is emitted for @a account. + */ +const PurpleConnectionErrorInfo *purple_account_get_current_error(PurpleAccount *account); + +/** + * Clear an account's current error state, resetting it to @c NULL. + * + * @param account The account whose error state should be cleared. + */ +void purple_account_clear_current_error(PurpleAccount *account); + /*@}*/ /**************************************************************************/
--- a/libpurple/connection.c Mon Nov 12 16:15:53 2007 +0000 +++ b/libpurple/connection.c Mon Nov 12 16:53:54 2007 +0000 @@ -488,29 +488,120 @@ void purple_connection_error(PurpleConnection *gc, const char *text) { + /* prpls that have not been updated to use disconnection reasons will + * be setting wants_to_die before calling this function, so choose + * PURPLE_CONNECTION_ERROR_OTHER_ERROR (which is fatal) if it's true, + * and PURPLE_CONNECTION_ERROR_NETWORK_ERROR (which isn't) if not. See + * the documentation in connection.h. + */ + PurpleConnectionError reason = gc->wants_to_die + ? PURPLE_CONNECTION_ERROR_OTHER_ERROR + : PURPLE_CONNECTION_ERROR_NETWORK_ERROR; + purple_connection_error_reason (gc, reason, text); +} + +void +purple_connection_error_reason (PurpleConnection *gc, + PurpleConnectionError reason, + const char *description) +{ PurpleConnectionUiOps *ops; g_return_if_fail(gc != NULL); + /* This sanity check relies on PURPLE_CONNECTION_ERROR_OTHER_ERROR + * being the last member of the PurpleConnectionError enum in + * connection.h; if other reasons are added after it, this check should + * be updated. + */ + if (reason > PURPLE_CONNECTION_ERROR_OTHER_ERROR) { + purple_debug_error("connection", + "purple_connection_error_reason: reason %u isn't a " + "valid reason\n", reason); + reason = PURPLE_CONNECTION_ERROR_OTHER_ERROR; + } - if (text == NULL) { - purple_debug_error("connection", "purple_connection_error: check `text != NULL' failed\n"); - text = _("Unknown error"); + if (description == NULL) { + purple_debug_error("connection", "purple_connection_error_reason: check `description != NULL' failed\n"); + description = _("Unknown error"); } /* If we've already got one error, we don't need any more */ if (gc->disconnect_timeout) return; + gc->wants_to_die = purple_connection_error_is_fatal (reason); + ops = purple_connections_get_ui_ops(); - if (ops != NULL && ops->report_disconnect != NULL) - ops->report_disconnect(gc, text); + if (ops != NULL) + { + if (ops->report_disconnect_reason != NULL) + ops->report_disconnect_reason (gc, reason, description); + if (ops->report_disconnect != NULL) + ops->report_disconnect (gc, description); + } + + purple_signal_emit(purple_connections_get_handle(), "connection-error", + gc, reason, description); gc->disconnect_timeout = purple_timeout_add(0, purple_connection_disconnect_cb, purple_connection_get_account(gc)); } void +purple_connection_ssl_error (PurpleConnection *gc, + PurpleSslErrorType ssl_error) +{ + PurpleConnectionError reason; + + switch (ssl_error) { + case PURPLE_SSL_HANDSHAKE_FAILED: + case PURPLE_SSL_CONNECT_FAILED: + reason = PURPLE_CONNECTION_ERROR_ENCRYPTION_ERROR; + break; + case PURPLE_SSL_CERTIFICATE_INVALID: + /* TODO: maybe PURPLE_SSL_* should be more specific? */ + reason = PURPLE_CONNECTION_ERROR_CERT_OTHER_ERROR; + break; + default: + g_assert_not_reached (); + reason = PURPLE_CONNECTION_ERROR_ENCRYPTION_ERROR; + } + + purple_connection_error_reason (gc, reason, + purple_ssl_strerror(ssl_error)); +} + +gboolean +purple_connection_error_is_fatal (PurpleConnectionError reason) +{ + switch (reason) + { + case PURPLE_CONNECTION_ERROR_NETWORK_ERROR: + return FALSE; + case PURPLE_CONNECTION_ERROR_INVALID_USERNAME: + case PURPLE_CONNECTION_ERROR_AUTHENTICATION_FAILED: + case PURPLE_CONNECTION_ERROR_AUTHENTICATION_IMPOSSIBLE: + case PURPLE_CONNECTION_ERROR_NO_SSL_SUPPORT: + case PURPLE_CONNECTION_ERROR_ENCRYPTION_ERROR: + case PURPLE_CONNECTION_ERROR_NAME_IN_USE: + case PURPLE_CONNECTION_ERROR_INVALID_SETTINGS: + case PURPLE_CONNECTION_ERROR_OTHER_ERROR: + case PURPLE_CONNECTION_ERROR_CERT_NOT_PROVIDED: + case PURPLE_CONNECTION_ERROR_CERT_UNTRUSTED: + case PURPLE_CONNECTION_ERROR_CERT_EXPIRED: + case PURPLE_CONNECTION_ERROR_CERT_NOT_ACTIVATED: + case PURPLE_CONNECTION_ERROR_CERT_HOSTNAME_MISMATCH: + case PURPLE_CONNECTION_ERROR_CERT_FINGERPRINT_MISMATCH: + case PURPLE_CONNECTION_ERROR_CERT_SELF_SIGNED: + case PURPLE_CONNECTION_ERROR_CERT_OTHER_ERROR: + return TRUE; + default: + g_return_val_if_reached(TRUE); + } +} + +void purple_connections_disconnect_all(void) { GList *l; @@ -571,6 +662,14 @@ purple_marshal_VOID__POINTER, NULL, 1, purple_value_new(PURPLE_TYPE_SUBTYPE, PURPLE_SUBTYPE_CONNECTION)); + + purple_signal_register(handle, "connection-error", + purple_marshal_VOID__POINTER_INT_POINTER, NULL, 1, + purple_value_new(PURPLE_TYPE_SUBTYPE, + PURPLE_SUBTYPE_CONNECTION), + purple_value_new(PURPLE_TYPE_ENUM), + purple_value_new(PURPLE_TYPE_STRING)); + } void
--- a/libpurple/connection.h Mon Nov 12 16:15:53 2007 +0000 +++ b/libpurple/connection.h Mon Nov 12 16:53:54 2007 +0000 @@ -54,11 +54,97 @@ } PurpleConnectionState; +/** Possible errors that can cause a connection to be closed. + * @since 2.3.0 + */ +typedef enum +{ + /** There was an error sending or receiving on the network socket, or + * there was some protocol error (such as the server sending malformed + * data). + */ + PURPLE_CONNECTION_ERROR_NETWORK_ERROR = 0, + /** The username supplied was not valid. */ + PURPLE_CONNECTION_ERROR_INVALID_USERNAME = 1, + /** The username, password or some other credential was incorrect. Use + * #PURPLE_CONNECTION_ERROR_INVALID_USERNAME instead if the username + * is known to be invalid. + */ + PURPLE_CONNECTION_ERROR_AUTHENTICATION_FAILED = 2, + /** libpurple doesn't speak any of the authentication methods the + * server offered. + */ + PURPLE_CONNECTION_ERROR_AUTHENTICATION_IMPOSSIBLE = 3, + /** libpurple was built without SSL support, and the connection needs + * SSL. + */ + PURPLE_CONNECTION_ERROR_NO_SSL_SUPPORT = 4, + /** There was an error negotiating SSL on this connection, or the + * server does not support encryption but an account option was set to + * require it. + */ + PURPLE_CONNECTION_ERROR_ENCRYPTION_ERROR = 5, + /** Someone is already connected to the server using the name you are + * trying to connect with. + */ + PURPLE_CONNECTION_ERROR_NAME_IN_USE = 6, + + /** The username/server/other preference for the account isn't valid. + * For instance, on IRC the screen name cannot contain white space. + * This reason should not be used for incorrect passwords etc: use + * #PURPLE_CONNECTION_ERROR_AUTHENTICATION_FAILED for that. + * + * @todo This reason really shouldn't be necessary. Usernames and + * other account preferences should be validated when the + * account is created. + */ + PURPLE_CONNECTION_ERROR_INVALID_SETTINGS = 7, + + /** The server did not provide a SSL certificate. */ + PURPLE_CONNECTION_ERROR_CERT_NOT_PROVIDED = 8, + /** The server's SSL certificate could not be trusted. */ + PURPLE_CONNECTION_ERROR_CERT_UNTRUSTED = 9, + /** The server's SSL certificate has expired. */ + PURPLE_CONNECTION_ERROR_CERT_EXPIRED = 10, + /** The server's SSL certificate is not yet valid. */ + PURPLE_CONNECTION_ERROR_CERT_NOT_ACTIVATED = 11, + /** The server's SSL certificate did not match its hostname. */ + PURPLE_CONNECTION_ERROR_CERT_HOSTNAME_MISMATCH = 12, + /** The server's SSL certificate does not have the expected + * fingerprint. + */ + PURPLE_CONNECTION_ERROR_CERT_FINGERPRINT_MISMATCH = 13, + /** The server's SSL certificate is self-signed. */ + PURPLE_CONNECTION_ERROR_CERT_SELF_SIGNED = 14, + /** There was some other error validating the server's SSL certificate. + */ + PURPLE_CONNECTION_ERROR_CERT_OTHER_ERROR = 15, + + /** Some other error occured which fits into none of the other + * categories. + */ + /* purple_connection_error_reason() in connection.c uses the fact that + * this is the last member of the enum when sanity-checking; if other + * reasons are added after it, the check must be updated. + */ + PURPLE_CONNECTION_ERROR_OTHER_ERROR = 16 +} PurpleConnectionError; + +/** Holds the type of an error along with its description. */ +typedef struct +{ + /** The type of error. */ + PurpleConnectionError type; + /** A localised, human-readable description of the error. */ + char *description; +} PurpleConnectionErrorInfo; + #include <time.h> #include "account.h" #include "plugin.h" #include "status.h" +#include "sslconn.h" /** Connection UI operations. Used to notify the user of changes to * connections, such as being disconnected, and to respond to the @@ -73,11 +159,13 @@ * the UI of what is happening, as well as which @a step out of @a * step_count has been reached (which might be displayed as a progress * bar). + * @see #purple_connection_update_progress */ void (*connect_progress)(PurpleConnection *gc, const char *text, size_t step, size_t step_count); + /** Called when a connection is established (just before the * @ref signed-on signal). */ @@ -86,17 +174,23 @@ * and @ref signed-off signals). */ void (*disconnected)(PurpleConnection *gc); + /** Used to display connection-specific notices. (Pidgin's Gtk user * interface implements this as a no-op; #purple_connection_notice(), * which uses this operation, is not used by any of the protocols * shipped with libpurple.) */ void (*notice)(PurpleConnection *gc, const char *text); + /** Called when an error causes a connection to be disconnected. * Called before #disconnected. * @param text a localized error message. + * @see #purple_connection_error + * @deprecated in favour of + * #PurpleConnectionUiOps.report_disconnect_reason. */ void (*report_disconnect)(PurpleConnection *gc, const char *text); + /** Called when libpurple discovers that the computer's network * connection is active. On Linux, this uses Network Manager if * available; on Windows, it uses Win32's network change notification @@ -108,10 +202,24 @@ */ void (*network_disconnected)(); + /** Called when an error causes a connection to be disconnected. + * Called before #disconnected. This op is intended to replace + * #report_disconnect. If both are implemented, this will be called + * first; however, there's no real reason to implement both. + * @param reason why the connection ended, if known, or + * #PURPLE_CONNECTION_ERROR_OTHER_ERROR, if not. + * @param text a localized message describing the disconnection + * in more detail to the user. + * @see #purple_connection_error_reason + * @since 2.3.0 + */ + void (*report_disconnect_reason)(PurpleConnection *gc, + PurpleConnectionError reason, + const char *text); + void (*_purple_reserved1)(void); void (*_purple_reserved2)(void); void (*_purple_reserved3)(void); - void (*_purple_reserved4)(void); } PurpleConnectionUiOps; struct _PurpleConnection @@ -125,19 +233,23 @@ char *password; /**< The password used. */ int inpa; /**< The input watcher. */ - GSList *buddy_chats; /**< A list of active chats. */ + GSList *buddy_chats; /**< A list of active chats + (#PurpleConversation structs of type + #PURPLE_CONV_TYPE_CHAT). */ void *proto_data; /**< Protocol-specific data. */ char *display_name; /**< How you appear to other people. */ guint keepalive; /**< Keep-alive. */ + /** Wants to Die state. This is set when the user chooses to log out, or + * when the protocol is disconnected and should not be automatically + * reconnected (incorrect password, etc.). prpls should rely on + * purple_connection_error_reason() to set this for them rather than + * setting it themselves. + * @see purple_connection_error_is_fatal + */ + gboolean wants_to_die; - gboolean wants_to_die; /**< Wants to Die state. This is set - when the user chooses to log out, - or when the protocol is - disconnected and should not be - automatically reconnected - (incorrect password, etc.) */ guint disconnect_timeout; /**< Timer used for nasty stack tricks */ }; @@ -209,7 +321,7 @@ /** * Sets the connection state. PRPLs should call this and pass in - * the state "PURPLE_CONNECTED" when the account is completely + * the state #PURPLE_CONNECTED when the account is completely * signed on. What does it mean to be completely signed on? If * the core can call prpl->set_status, and it successfully changes * your status, then the account is online. @@ -302,10 +414,65 @@ * Closes a connection with an error. * * @param gc The connection. - * @param reason The error text. + * @param reason The error text, which may not be @c NULL. + * @deprecated in favour of #purple_connection_error_reason. Calling + * @c purple_connection_error(gc, text) is equivalent to calling + * @c purple_connection_error_reason(gc, reason, text) where @c reason is + * #PURPLE_CONNECTION_ERROR_OTHER_ERROR if @c gc->wants_to_die is @c TRUE, and + * #PURPLE_CONNECTION_ERROR_NETWORK_ERROR if not. (This is to keep + * auto-reconnection behaviour the same when using old prpls which don't use + * reasons yet.) */ void purple_connection_error(PurpleConnection *gc, const char *reason); +/** + * Closes a connection with an error and a human-readable description of the + * error. It also sets @c gc->wants_to_die to the value of + * #purple_connection_error_is_fatal(@a reason), mainly for + * backwards-compatibility. + * + * @param gc the connection which is closing. + * @param reason why the connection is closing. + * @param description a non-@c NULL localized description of the error. + * @since 2.3.0 + */ +void +purple_connection_error_reason (PurpleConnection *gc, + PurpleConnectionError reason, + const char *description); + +/** + * Closes a connection due to an SSL error; this is basically a shortcut to + * turning the #PurpleSslErrorType into a #PurpleConnectionError and a + * human-readable string and then calling purple_connection_error_reason(). + * @since 2.3.0 + */ +void +purple_connection_ssl_error (PurpleConnection *gc, + PurpleSslErrorType ssl_error); + +/** + * Reports whether a disconnection reason is fatal (in which case the account + * should probably not be automatically reconnected) or transient (so + * auto-reconnection is a good idea). + * For instance, #PURPLE_CONNECTION_ERROR_NETWORK_ERROR is a temporary error, + * which might be caused by losing the network connection, so <tt> + * purple_connection_error_is_fatal (PURPLE_CONNECTION_ERROR_NETWORK_ERROR)</tt> + * is @c FALSE. On the other hand, + * #PURPLE_CONNECTION_ERROR_AUTHENTICATION_FAILED probably indicates a + * misconfiguration of the account which needs the user to go fix it up, so + * <tt> purple_connection_error_is_fatal + * (PURPLE_CONNECTION_ERROR_AUTHENTICATION_FAILED)</tt> is @c TRUE. + * + * (This function is meant to replace checking PurpleConnection.wants_to_die.) + * + * @return @c TRUE if the account should not be automatically reconnected, and + * @c FALSE otherwise. + * @since 2.3.0 + */ +gboolean +purple_connection_error_is_fatal (PurpleConnectionError reason); + /*@}*/ /**************************************************************************/
--- a/libpurple/core.c Mon Nov 12 16:15:53 2007 +0000 +++ b/libpurple/core.c Mon Nov 12 16:53:54 2007 +0000 @@ -138,15 +138,17 @@ /* The buddy icon code uses the imgstore, so init it early. */ purple_imgstore_init(); - /* Accounts use status and buddy icons, so initialize these before accounts */ + /* Accounts use status, buddy icons and connection signals, so + * initialize these before accounts + */ purple_status_init(); purple_buddy_icons_init(); + purple_connections_init(); purple_accounts_init(); purple_savedstatuses_init(); purple_notify_init(); purple_certificate_init(); - purple_connections_init(); purple_conversations_init(); purple_blist_init(); purple_log_init();
--- a/libpurple/plugins/signals-test.c Mon Nov 12 16:15:53 2007 +0000 +++ b/libpurple/plugins/signals-test.c Mon Nov 12 16:53:54 2007 +0000 @@ -226,6 +226,18 @@ purple_account_get_username(purple_connection_get_account(gc))); } +static void +connection_error_cb(PurpleConnection *gc, + PurpleConnectionError err, + const gchar *desc, + void *data) +{ + const gchar *username = + purple_account_get_username(purple_connection_get_account(gc)); + purple_debug_misc("signals test", "connection-error (%s, %u, %s)\n", + username, err, desc); +} + /************************************************************************** * Conversation subsystem signal callbacks **************************************************************************/ @@ -626,6 +638,8 @@ plugin, PURPLE_CALLBACK(signing_off_cb), NULL); purple_signal_connect(conn_handle, "signed-off", plugin, PURPLE_CALLBACK(signed_off_cb), NULL); + purple_signal_connect(conn_handle, "connection-error", + plugin, PURPLE_CALLBACK(connection_error_cb), NULL); /* Conversations subsystem signals */ purple_signal_connect(conv_handle, "writing-im-msg",
--- a/libpurple/protocols/Makefile.am Mon Nov 12 16:15:53 2007 +0000 +++ b/libpurple/protocols/Makefile.am Mon Nov 12 16:53:54 2007 +0000 @@ -1,5 +1,5 @@ EXTRA_DIST = Makefile.mingw -DIST_SUBDIRS = bonjour gg irc jabber msn myspace novell null oscar qq sametime silc silc10 toc simple yahoo zephyr +DIST_SUBDIRS = bonjour gg irc jabber msn msnp9 myspace novell null oscar qq sametime silc silc10 toc simple yahoo zephyr SUBDIRS = $(DYNAMIC_PRPLS) $(STATIC_PRPLS)
--- a/libpurple/protocols/bonjour/bonjour.c Mon Nov 12 16:15:53 2007 +0000 +++ b/libpurple/protocols/bonjour/bonjour.c Mon Nov 12 16:53:54 2007 +0000 @@ -102,8 +102,8 @@ #ifdef _WIN32 if (!dns_sd_available()) { - gc->wants_to_die = TRUE; - purple_connection_error(gc, + purple_connection_error_reason(gc, + PURPLE_CONNECTION_ERROR_OTHER_ERROR, _("The Apple Bonjour For Windows toolkit wasn't found, see the FAQ at: " "http://developer.pidgin.im/wiki/Using%20Pidgin#CanIusePidginforBonjourLink-LocalMessaging" " for more information.")); @@ -121,7 +121,9 @@ if (bonjour_jabber_start(bd->jabber_data) == -1) { /* Send a message about the connection error */ - purple_connection_error(gc, _("Unable to listen for incoming IM connections\n")); + purple_connection_error_reason (gc, + PURPLE_CONNECTION_ERROR_NETWORK_ERROR, + _("Unable to listen for incoming IM connections\n")); return; } @@ -146,7 +148,9 @@ bd->dns_sd_data->account = account; if (!bonjour_dns_sd_start(bd->dns_sd_data)) { - purple_connection_error(gc, _("Unable to establish connection with the local mDNS server. Is it running?")); + purple_connection_error_reason (gc, + PURPLE_CONNECTION_ERROR_NETWORK_ERROR, + _("Unable to establish connection with the local mDNS server. Is it running?")); return; }
--- a/libpurple/protocols/bonjour/jabber.c Mon Nov 12 16:15:53 2007 +0000 +++ b/libpurple/protocols/bonjour/jabber.c Mon Nov 12 16:53:54 2007 +0000 @@ -584,7 +584,9 @@ if ((data->socket = socket(PF_INET, SOCK_STREAM, 0)) < 0) { purple_debug_error("bonjour", "Cannot open socket: %s\n", g_strerror(errno)); - purple_connection_error(data->account->gc, _("Cannot open socket")); + purple_connection_error_reason (data->account->gc, + PURPLE_CONNECTION_ERROR_NETWORK_ERROR, + _("Cannot open socket")); return -1; } @@ -592,7 +594,9 @@ if (setsockopt(data->socket, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int)) != 0) { purple_debug_error("bonjour", "Error setting socket options: %s\n", g_strerror(errno)); - purple_connection_error(data->account->gc, _("Error setting socket options")); + purple_connection_error_reason (data->account->gc, + PURPLE_CONNECTION_ERROR_NETWORK_ERROR, + _("Error setting socket options")); return -1; } @@ -616,7 +620,9 @@ if (!bind_successful) { purple_debug_error("bonjour", "Cannot bind socket: %s\n", g_strerror(errno)); - purple_connection_error(data->account->gc, _("Could not bind socket to port")); + purple_connection_error_reason (data->account->gc, + PURPLE_CONNECTION_ERROR_NETWORK_ERROR, + _("Could not bind socket to port")); return -1; } @@ -624,7 +630,9 @@ if (listen(data->socket, 10) != 0) { purple_debug_error("bonjour", "Cannot listen on socket: %s\n", g_strerror(errno)); - purple_connection_error(data->account->gc, _("Could not listen on socket")); + purple_connection_error_reason (data->account->gc, + PURPLE_CONNECTION_ERROR_NETWORK_ERROR, + _("Could not listen on socket")); return -1; }
--- a/libpurple/protocols/gg/gg.c Mon Nov 12 16:15:53 2007 +0000 +++ b/libpurple/protocols/gg/gg.c Mon Nov 12 16:53:54 2007 +0000 @@ -254,16 +254,14 @@ /* */ /* static void ggp_callback_buddylist_save_ok(PurpleConnection *gc, const char *file) {{{ */ -static void ggp_callback_buddylist_save_ok(PurpleConnection *gc, const char *file) +static void ggp_callback_buddylist_save_ok(PurpleConnection *gc, const char *filename) { PurpleAccount *account = purple_connection_get_account(gc); - FILE *fh; char *buddylist = ggp_buddylist_dump(account); - gchar *msg; purple_debug_info("gg", "Saving...\n"); - purple_debug_info("gg", "file = %s\n", file); + purple_debug_info("gg", "file = %s\n", filename); if (buddylist == NULL) { purple_notify_info(account, _("Save Buddylist..."), @@ -272,21 +270,19 @@ return; } - if ((fh = g_fopen(file, "wb")) == NULL) { - msg = g_strconcat(_("Couldn't open file"), ": ", file, "\n", NULL); - purple_debug_error("gg", "Could not open file: %s\n", file); - purple_notify_error(account, _("Couldn't open file"), msg, NULL); - g_free(msg); - g_free(buddylist); - return; + if(purple_util_write_data_to_file_absolute(filename, buddylist, -1)) { + purple_notify_info(account, _("Save Buddylist..."), + _("Buddylist saved successfully!"), NULL); + } else { + gchar *primary = g_strdup_printf( + _("Couldn't write buddy list for %s to %s"), + purple_account_get_username(account), filename); + purple_notify_error(account, _("Save Buddylist..."), + primary, NULL); + g_free(primary); } - fwrite(buddylist, sizeof(char), g_utf8_strlen(buddylist, -1), fh); - fclose(fh); g_free(buddylist); - - purple_notify_info(account, _("Save Buddylist..."), - _("Buddylist saved successfully!"), NULL); } /* }}} */ @@ -381,12 +377,16 @@ if (email == NULL || p1 == NULL || p2 == NULL || t == NULL || *email == '\0' || *p1 == '\0' || *p2 == '\0' || *t == '\0') { - purple_connection_error(gc, _("Fill in the registration fields.")); + purple_connection_error_reason (gc, + PURPLE_CONNECTION_ERROR_OTHER_ERROR, + _("Fill in the registration fields.")); goto exit_err; } if (g_utf8_collate(p1, p2) != 0) { - purple_connection_error(gc, _("Passwords do not match.")); + purple_connection_error_reason (gc, + PURPLE_CONNECTION_ERROR_AUTHENTICATION_FAILED, + _("Passwords do not match.")); goto exit_err; } @@ -394,7 +394,8 @@ token->id, t); h = gg_register3(email, p1, token->id, t, 0); if (h == NULL || !(s = h->data) || !s->success) { - purple_connection_error(gc, + purple_connection_error_reason (gc, + PURPLE_CONNECTION_ERROR_OTHER_ERROR, _("Unable to register new account. Error occurred.\n")); goto exit_err; } @@ -1308,7 +1309,9 @@ if (!(ev = gg_watch_fd(info->session))) { purple_debug_error("gg", "ggp_callback_recv: gg_watch_fd failed -- CRITICAL!\n"); - purple_connection_error(gc, _("Unable to read socket")); + purple_connection_error_reason (gc, + PURPLE_CONNECTION_ERROR_NETWORK_ERROR, + _("Unable to read socket")); return; } @@ -1461,7 +1464,9 @@ if (!(ev = gg_watch_fd(info->session))) { purple_debug_error("gg", "login_handler: gg_watch_fd failed!\n"); - purple_connection_error(gc, _("Unable to read socket")); + purple_connection_error_reason (gc, + PURPLE_CONNECTION_ERROR_NETWORK_ERROR, + _("Unable to read socket")); return; } purple_debug_info("gg", "login_handler: session->fd = %d\n", info->session->fd); @@ -1507,7 +1512,9 @@ case GG_EVENT_CONN_FAILED: purple_input_remove(gc->inpa); gc->inpa = 0; - purple_connection_error(gc, _("Connection failed.")); + purple_connection_error_reason (gc, + PURPLE_CONNECTION_ERROR_NETWORK_ERROR, + _("Connection failed.")); break; default: purple_debug_error("gg", "strange event: %d\n", ev->type); @@ -1713,7 +1720,9 @@ info->session = gg_login(glp); if (info->session == NULL) { - purple_connection_error(gc, _("Connection failed.")); + purple_connection_error_reason (gc, + PURPLE_CONNECTION_ERROR_NETWORK_ERROR, + _("Connection failed.")); g_free(glp); return; } @@ -2005,7 +2014,9 @@ if (gg_ping(info->session) < 0) { purple_debug_info("gg", "Not connected to the server " "or gg_session is not correct\n"); - purple_connection_error(gc, _("Not connected to the server.")); + purple_connection_error_reason (gc, + PURPLE_CONNECTION_ERROR_NETWORK_ERROR, + _("Not connected to the server.")); } } /* }}} */
--- a/libpurple/protocols/irc/irc.c Mon Nov 12 16:15:53 2007 +0000 +++ b/libpurple/protocols/irc/irc.c Mon Nov 12 16:53:54 2007 +0000 @@ -123,8 +123,10 @@ if (ret < 0 && errno == EAGAIN) return; else if (ret <= 0) { - purple_connection_error(purple_account_get_connection(irc->account), - _("Server has disconnected")); + PurpleConnection *gc = purple_account_get_connection(irc->account); + purple_connection_error_reason (gc, + PURPLE_CONNECTION_ERROR_NETWORK_ERROR, + _("Server has disconnected")); return; } @@ -161,8 +163,10 @@ /* purple_debug(PURPLE_DEBUG_MISC, "irc", "sent%s: %s", irc->gsc ? " (ssl)" : "", tosend); */ if (ret <= 0 && errno != EAGAIN) { - purple_connection_error(purple_account_get_connection(irc->account), - _("Server has disconnected")); + PurpleConnection *gc = purple_account_get_connection(irc->account); + purple_connection_error_reason (gc, + PURPLE_CONNECTION_ERROR_NETWORK_ERROR, + _("Server has disconnected")); } else if (ret < buflen) { if (ret < 0) ret = 0; @@ -295,7 +299,9 @@ gc->flags |= PURPLE_CONNECTION_NO_NEWLINES; if (strpbrk(username, " \t\v\r\n") != NULL) { - purple_connection_error(gc, _("IRC nicks may not contain whitespace")); + purple_connection_error_reason (gc, + PURPLE_CONNECTION_ERROR_INVALID_SETTINGS, + _("IRC nicks may not contain whitespace")); return; } @@ -324,7 +330,9 @@ purple_account_get_int(account, "port", IRC_DEFAULT_SSL_PORT), irc_login_cb_ssl, irc_ssl_connect_failure, gc); } else { - purple_connection_error(gc, _("SSL support unavailable")); + purple_connection_error_reason (gc, + PURPLE_CONNECTION_ERROR_NO_SSL_SUPPORT, + _("SSL support unavailable")); return; } } @@ -335,7 +343,9 @@ purple_account_get_int(account, "port", IRC_DEFAULT_PORT), irc_login_cb, gc) == NULL) { - purple_connection_error(gc, _("Couldn't create socket")); + purple_connection_error_reason (gc, + PURPLE_CONNECTION_ERROR_NETWORK_ERROR, + _("Couldn't create socket")); return; } } @@ -352,7 +362,6 @@ if (pass && *pass) { buf = irc_format(irc, "vv", "PASS", pass); if (irc_send(irc, buf) < 0) { -/* purple_connection_error(gc, "Error sending password"); */ g_free(buf); return FALSE; } @@ -384,14 +393,12 @@ strlen(realname) ? realname : IRC_DEFAULT_ALIAS); g_free(tmp); if (irc_send(irc, buf) < 0) { -/* purple_connection_error(gc, "Error registering with server");*/ g_free(buf); return FALSE; } g_free(buf); buf = irc_format(irc, "vn", "NICK", purple_connection_get_display_name(gc)); if (irc_send(irc, buf) < 0) { -/* purple_connection_error(gc, "Error sending nickname");*/ g_free(buf); return FALSE; } @@ -418,7 +425,9 @@ struct irc_conn *irc = gc->proto_data; if (source < 0) { - purple_connection_error(gc, _("Couldn't connect to host")); + purple_connection_error_reason (gc, + PURPLE_CONNECTION_ERROR_NETWORK_ERROR, + _("Couldn't connect to host")); return; } @@ -438,7 +447,7 @@ irc->gsc = NULL; - purple_connection_error(gc, purple_ssl_strerror(error)); + purple_connection_ssl_error (gc, error); } static void irc_close(PurpleConnection *gc) @@ -606,10 +615,14 @@ /* Try again later */ return; } else if (len < 0) { - purple_connection_error(gc, _("Read error")); + purple_connection_error_reason (gc, + PURPLE_CONNECTION_ERROR_NETWORK_ERROR, + _("Read error")); return; } else if (len == 0) { - purple_connection_error(gc, _("Server has disconnected")); + purple_connection_error_reason (gc, + PURPLE_CONNECTION_ERROR_NETWORK_ERROR, + _("Server has disconnected")); return; } @@ -631,10 +644,14 @@ if (len < 0 && errno == EAGAIN) { return; } else if (len < 0) { - purple_connection_error(gc, _("Read error")); + purple_connection_error_reason (gc, + PURPLE_CONNECTION_ERROR_NETWORK_ERROR, + _("Read error")); return; } else if (len == 0) { - purple_connection_error(gc, _("Server has disconnected")); + purple_connection_error_reason (gc, + PURPLE_CONNECTION_ERROR_NETWORK_ERROR, + _("Server has disconnected")); return; }
--- a/libpurple/protocols/irc/msgs.c Mon Nov 12 16:15:53 2007 +0000 +++ b/libpurple/protocols/irc/msgs.c Mon Nov 12 16:53:54 2007 +0000 @@ -913,9 +913,9 @@ _("Your selected nickname was rejected by the server. It probably contains invalid characters.")); } else { - gc->wants_to_die = TRUE; - purple_connection_error(purple_account_get_connection(irc->account), - _("Your selected account name was rejected by the server. It probably contains invalid characters.")); + purple_connection_error_reason (gc, + PURPLE_CONNECTION_ERROR_INVALID_SETTINGS, + _("Your selected account name was rejected by the server. It probably contains invalid characters.")); } }
--- a/libpurple/protocols/irc/parse.c Mon Nov 12 16:15:53 2007 +0000 +++ b/libpurple/protocols/irc/parse.c Mon Nov 12 16:53:54 2007 +0000 @@ -612,6 +612,7 @@ struct _irc_msg *msgent; char *cur, *end, *tmp, *from, *msgname, *fmt, **args, *msg; guint i; + PurpleConnection *gc = purple_account_get_connection(irc->account); irc->recv_time = time(NULL); @@ -620,7 +621,7 @@ * TODO: It should be passed as an array of bytes and a length * instead of a null terminated string. */ - purple_signal_emit(_irc_plugin, "irc-receiving-text", purple_account_get_connection(irc->account), &input); + purple_signal_emit(_irc_plugin, "irc-receiving-text", gc, &input); if (!strncmp(input, "PING ", 5)) { msg = irc_format(irc, "vv", "PONG", input + 5); @@ -630,10 +631,13 @@ } else if (!strncmp(input, "ERROR ", 6)) { if (g_utf8_validate(input, -1, NULL)) { char *tmp = g_strdup_printf("%s\n%s", _("Disconnected."), input); - purple_connection_error(purple_account_get_connection(irc->account), tmp); + purple_connection_error_reason (gc, + PURPLE_CONNECTION_ERROR_NETWORK_ERROR, tmp); g_free(tmp); } else - purple_connection_error(purple_account_get_connection(irc->account), _("Disconnected.")); + purple_connection_error_reason (gc, + PURPLE_CONNECTION_ERROR_NETWORK_ERROR, + _("Disconnected.")); return; }
--- a/libpurple/protocols/jabber/adhoccommands.c Mon Nov 12 16:15:53 2007 +0000 +++ b/libpurple/protocols/jabber/adhoccommands.c Mon Nov 12 16:53:54 2007 +0000 @@ -138,7 +138,7 @@ const char *type = xmlnode_get_attrib(packet,"type"); if(type && !strcmp(type,"error")) { - char *msg = jabber_parse_error(js, packet); + char *msg = jabber_parse_error(js, packet, NULL); if(!msg) msg = g_strdup(_("Unknown Error"));
--- a/libpurple/protocols/jabber/auth.c Mon Nov 12 16:15:53 2007 +0000 +++ b/libpurple/protocols/jabber/auth.c Mon Nov 12 16:53:54 2007 +0000 @@ -50,7 +50,9 @@ "<starttls xmlns='urn:ietf:params:xml:ns:xmpp-tls'/>", -1); return TRUE; } else if(xmlnode_get_child(starttls, "required")) { - purple_connection_error(js->gc, _("Server requires TLS/SSL for login. No TLS/SSL support found.")); + purple_connection_error_reason (js->gc, + PURPLE_CONNECTION_ERROR_NO_SSL_SUPPORT, + _("Server requires TLS/SSL for login. No TLS/SSL support found.")); return TRUE; } } @@ -113,7 +115,9 @@ static void disallow_plaintext_auth(PurpleAccount *account) { - purple_connection_error(account->gc, _("Server requires plaintext authentication over an unencrypted stream")); + purple_connection_error_reason (account->gc, + PURPLE_CONNECTION_ERROR_ENCRYPTION_ERROR, + _("Server requires plaintext authentication over an unencrypted stream")); } #ifdef HAVE_CYRUS_SASL @@ -331,7 +335,9 @@ * error here. */ } else { - purple_connection_error(js->gc, _("Server does not use any supported authentication method")); + purple_connection_error_reason (js->gc, + PURPLE_CONNECTION_ERROR_AUTHENTICATION_IMPOSSIBLE, + _("Server does not use any supported authentication method")); return; } /* not reached */ @@ -386,7 +392,9 @@ jabber_send(js, auth); xmlnode_free(auth); } else { - purple_connection_error(js->gc, "SASL authentication failed\n"); + purple_connection_error_reason (js->gc, + PURPLE_CONNECTION_ERROR_AUTHENTICATION_IMPOSSIBLE, + "SASL authentication failed\n"); } } @@ -459,7 +467,9 @@ mechs = xmlnode_get_child(packet, "mechanisms"); if(!mechs) { - purple_connection_error(js->gc, _("Invalid response from server.")); + purple_connection_error_reason (js->gc, + PURPLE_CONNECTION_ERROR_NETWORK_ERROR, + _("Invalid response from server.")); return; } @@ -519,7 +529,8 @@ } finish_plaintext_authentication(js); } else { - purple_connection_error(js->gc, + purple_connection_error_reason (js->gc, + PURPLE_CONNECTION_ERROR_AUTHENTICATION_IMPOSSIBLE, _("Server does not use any supported authentication method")); } #endif @@ -532,20 +543,22 @@ if(type && !strcmp(type, "result")) { jabber_stream_set_state(js, JABBER_STREAM_CONNECTED); } else { - char *msg = jabber_parse_error(js, packet); + PurpleConnectionError reason = PURPLE_CONNECTION_ERROR_NETWORK_ERROR; + char *msg = jabber_parse_error(js, packet, &reason); xmlnode *error; const char *err_code; + /* FIXME: Why is this not in jabber_parse_error? */ if((error = xmlnode_get_child(packet, "error")) && (err_code = xmlnode_get_attrib(error, "code")) && !strcmp(err_code, "401")) { - js->gc->wants_to_die = TRUE; + reason = PURPLE_CONNECTION_ERROR_AUTHENTICATION_FAILED; /* Clear the pasword if it isn't being saved */ if (!purple_account_get_remember_password(js->gc->account)) purple_account_set_password(js->gc->account, NULL); } - purple_connection_error(js->gc, msg); + purple_connection_error_reason (js->gc, reason, msg); g_free(msg); } } @@ -558,11 +571,14 @@ const char *pw = purple_connection_get_password(js->gc); if(!type) { - purple_connection_error(js->gc, _("Invalid response from server.")); + purple_connection_error_reason (js->gc, + PURPLE_CONNECTION_ERROR_NETWORK_ERROR, + _("Invalid response from server.")); return; } else if(!strcmp(type, "error")) { - char *msg = jabber_parse_error(js, packet); - purple_connection_error(js->gc, msg); + PurpleConnectionError reason = PURPLE_CONNECTION_ERROR_NETWORK_ERROR; + char *msg = jabber_parse_error(js, packet, &reason); + purple_connection_error_reason (js->gc, reason, msg); g_free(msg); } else if(!strcmp(type, "result")) { query = xmlnode_get_child(packet, "query"); @@ -606,8 +622,9 @@ } finish_plaintext_authentication(js); } else { - purple_connection_error(js->gc, - _("Server does not use any supported authentication method")); + purple_connection_error_reason (js->gc, + PURPLE_CONNECTION_ERROR_AUTHENTICATION_IMPOSSIBLE, + _("Server does not use any supported authentication method")); return; } } @@ -773,7 +790,9 @@ GHashTable *parts; if(!enc_in) { - purple_connection_error(js->gc, _("Invalid response from server.")); + purple_connection_error_reason (js->gc, + PURPLE_CONNECTION_ERROR_NETWORK_ERROR, + _("Invalid response from server.")); return; } @@ -794,7 +813,9 @@ "<response xmlns='urn:ietf:params:xml:ns:xmpp-sasl' />", -1); } else { - purple_connection_error(js->gc, _("Invalid challenge from server")); + purple_connection_error_reason (js->gc, + PURPLE_CONNECTION_ERROR_NETWORK_ERROR, + _("Invalid challenge from server")); } g_free(js->expected_rspauth); } else { @@ -817,7 +838,9 @@ realm = js->user->domain; if (nonce == NULL || realm == NULL) - purple_connection_error(js->gc, _("Invalid challenge from server")); + purple_connection_error_reason (js->gc, + PURPLE_CONNECTION_ERROR_NETWORK_ERROR, + _("Invalid challenge from server")); else { GString *response = g_string_new(""); char *a2; @@ -889,7 +912,9 @@ g_free(dec_in); if (js->sasl_state != SASL_CONTINUE && js->sasl_state != SASL_OK) { purple_debug_error("jabber", "Error is %d : %s\n",js->sasl_state,sasl_errdetail(js->sasl)); - purple_connection_error(js->gc, _("SASL error")); + purple_connection_error_reason (js->gc, + PURPLE_CONNECTION_ERROR_NETWORK_ERROR, + _("SASL error")); return; } else { response = xmlnode_new("response"); @@ -914,7 +939,9 @@ #endif if(!ns || strcmp(ns, "urn:ietf:params:xml:ns:xmpp-sasl")) { - purple_connection_error(js->gc, _("Invalid response from server.")); + purple_connection_error_reason (js->gc, + PURPLE_CONNECTION_ERROR_NETWORK_ERROR, + _("Invalid response from server.")); return; } @@ -939,7 +966,9 @@ if (js->sasl_state != SASL_OK) { /* This should never happen! */ - purple_connection_error(js->gc, _("Invalid response from server.")); + purple_connection_error_reason (js->gc, + PURPLE_CONNECTION_ERROR_NETWORK_ERROR, + _("Invalid response from server.")); } } /* If we've negotiated a security layer, we need to enable it */ @@ -955,12 +984,15 @@ void jabber_auth_handle_failure(JabberStream *js, xmlnode *packet) { - char *msg = jabber_parse_error(js, packet); + PurpleConnectionError reason = PURPLE_CONNECTION_ERROR_NETWORK_ERROR; + char *msg = jabber_parse_error(js, packet, &reason); if(!msg) { - purple_connection_error(js->gc, _("Invalid response from server.")); + purple_connection_error_reason (js->gc, + PURPLE_CONNECTION_ERROR_NETWORK_ERROR, + _("Invalid response from server.")); } else { - purple_connection_error(js->gc, msg); + purple_connection_error_reason (js->gc, reason, msg); g_free(msg); } }
--- a/libpurple/protocols/jabber/buddy.c Mon Nov 12 16:15:53 2007 +0000 +++ b/libpurple/protocols/jabber/buddy.c Mon Nov 12 16:53:54 2007 +0000 @@ -2344,7 +2344,7 @@ return; if(!(type = xmlnode_get_attrib(packet, "type")) || !strcmp(type, "error")) { - char *msg = jabber_parse_error(js, packet); + char *msg = jabber_parse_error(js, packet, NULL); if(!msg) msg = g_strdup(_("Unknown error"));
--- a/libpurple/protocols/jabber/chat.c Mon Nov 12 16:15:53 2007 +0000 +++ b/libpurple/protocols/jabber/chat.c Mon Nov 12 16:53:54 2007 +0000 @@ -391,7 +391,7 @@ } } } else if(!strcmp(type, "error")) { - char *msg = jabber_parse_error(js, packet); + char *msg = jabber_parse_error(js, packet, NULL); purple_notify_error(js->gc, _("Configuration error"), _("Configuration error"), msg); @@ -465,7 +465,7 @@ const char *type = xmlnode_get_attrib(packet, "type"); if(type && !strcmp(type, "error")) { - char *msg = jabber_parse_error(js, packet); + char *msg = jabber_parse_error(js, packet, NULL); purple_notify_error(js->gc, _("Registration error"), _("Registration error"), msg); @@ -534,7 +534,7 @@ } } } else if(!strcmp(type, "error")) { - char *msg = jabber_parse_error(js, packet); + char *msg = jabber_parse_error(js, packet, NULL); purple_notify_error(js->gc, _("Registration error"), _("Registration error"), msg); @@ -673,7 +673,7 @@ return; if(!(type = xmlnode_get_attrib(packet, "type")) || strcmp(type, "result")) { - char *err = jabber_parse_error(js,packet); + char *err = jabber_parse_error(js, packet, NULL); purple_notify_error(js->gc, _("Error"), _("Error retrieving room list"), err); purple_roomlist_set_in_progress(js->roomlist, FALSE); @@ -684,7 +684,7 @@ } if(!(query = xmlnode_get_child(packet, "query"))) { - char *err = jabber_parse_error(js, packet); + char *err = jabber_parse_error(js, packet, NULL); purple_notify_error(js->gc, _("Error"), _("Error retrieving room list"), err); purple_roomlist_set_in_progress(js->roomlist, FALSE);
--- a/libpurple/protocols/jabber/jabber.c Mon Nov 12 16:15:53 2007 +0000 +++ b/libpurple/protocols/jabber/jabber.c Mon Nov 12 16:53:54 2007 +0000 @@ -89,7 +89,9 @@ if(js->unregistration) jabber_unregister_account_cb(js); } else { - purple_connection_error(js->gc, _("Error initializing session")); + purple_connection_error_reason (js->gc, + PURPLE_CONNECTION_ERROR_NETWORK_ERROR, + ("Error initializing session")); } } @@ -120,15 +122,18 @@ JabberBuddy *my_jb = NULL; jabber_id_free(js->user); if(!(js->user = jabber_id_new(full_jid))) { - purple_connection_error(js->gc, _("Invalid response from server.")); + purple_connection_error_reason (js->gc, + PURPLE_CONNECTION_ERROR_NETWORK_ERROR, + _("Invalid response from server.")); } if((my_jb = jabber_buddy_find(js, full_jid, TRUE))) my_jb->subscription |= JABBER_SUB_BOTH; g_free(full_jid); } } else { - char *msg = jabber_parse_error(js, packet); - purple_connection_error(js->gc, msg); + PurpleConnectionError reason = PURPLE_CONNECTION_ERROR_NETWORK_ERROR; + char *msg = jabber_parse_error(js, packet, &reason); + purple_connection_error_reason (js->gc, reason, msg); g_free(msg); } @@ -141,8 +146,9 @@ if(jabber_process_starttls(js, packet)) return; } else if(purple_account_get_bool(js->gc->account, "require_tls", FALSE) && !js->gsc) { - js->gc->wants_to_die = TRUE; - purple_connection_error(js->gc, _("You require encryption, but it is not available on this server.")); + purple_connection_error_reason (js->gc, + PURPLE_CONNECTION_ERROR_ENCRYPTION_ERROR, + _("You require encryption, but it is not available on this server.")); return; } @@ -173,9 +179,11 @@ static void jabber_stream_handle_error(JabberStream *js, xmlnode *packet) { - char *msg = jabber_parse_error(js, packet); + PurpleConnectionError reason = PURPLE_CONNECTION_ERROR_NETWORK_ERROR; + char *msg = jabber_parse_error(js, packet, &reason); - purple_connection_error(js->gc, msg); + purple_connection_error_reason (js->gc, reason, msg); + g_free(msg); } @@ -256,7 +264,9 @@ if (ret < 0 && errno == EAGAIN) return; else if (ret <= 0) { - purple_connection_error(js->gc, _("Write error")); + purple_connection_error_reason (js->gc, + PURPLE_CONNECTION_ERROR_NETWORK_ERROR, + _("Write error")); return; } @@ -309,7 +319,9 @@ } if (ret < 0 && errno != EAGAIN) - purple_connection_error(js->gc, _("Write error")); + purple_connection_error_reason (js->gc, + PURPLE_CONNECTION_ERROR_NETWORK_ERROR, + _("Write error")); else if (ret < olen) { if (ret < 0) ret = 0; @@ -337,7 +349,9 @@ } if (ret < 0 && errno != EAGAIN) - purple_connection_error(js->gc, _("Write error")); + purple_connection_error_reason (js->gc, + PURPLE_CONNECTION_ERROR_NETWORK_ERROR, + _("Write error")); else if (ret < len) { if (ret < 0) ret = 0; @@ -405,7 +419,9 @@ if(errno == EAGAIN) return; else - purple_connection_error(gc, _("Read Error")); + purple_connection_error_reason (js->gc, + PURPLE_CONNECTION_ERROR_NETWORK_ERROR, + _("Read Error")); } static void @@ -442,7 +458,9 @@ } else if(errno == EAGAIN) { return; } else { - purple_connection_error(gc, _("Read Error")); + purple_connection_error_reason (js->gc, + PURPLE_CONNECTION_ERROR_NETWORK_ERROR, + _("Read Error")); } } @@ -481,7 +499,8 @@ gchar *tmp; tmp = g_strdup_printf(_("Could not establish a connection with the server:\n%s"), error); - purple_connection_error(gc, tmp); + purple_connection_error_reason (gc, + PURPLE_CONNECTION_ERROR_NETWORK_ERROR, tmp); g_free(tmp); return; } @@ -509,7 +528,7 @@ js = gc->proto_data; js->gsc = NULL; - purple_connection_error(gc, purple_ssl_strerror(error)); + purple_connection_ssl_error (gc, error); } static void tls_init(JabberStream *js) @@ -526,7 +545,9 @@ if (purple_proxy_connect(js->gc, js->gc->account, host, port, jabber_login_callback, js->gc) == NULL) - purple_connection_error(js->gc, _("Unable to create socket")); + purple_connection_error_reason (js->gc, + PURPLE_CONNECTION_ERROR_NETWORK_ERROR, + _("Unable to create socket")); } static void srv_resolved_cb(PurpleSrvResponse *resp, int results, gpointer data) @@ -572,12 +593,16 @@ js->old_length = -1; if(!js->user) { - purple_connection_error(gc, _("Invalid XMPP ID")); + purple_connection_error_reason (gc, + PURPLE_CONNECTION_ERROR_INVALID_SETTINGS, + _("Invalid XMPP ID")); return; } if (!js->user->domain || *(js->user->domain) == '\0') { - purple_connection_error(gc, _("Invalid XMPP ID. Domain must be set.")); + purple_connection_error_reason (gc, + PURPLE_CONNECTION_ERROR_INVALID_SETTINGS, + _("Invalid XMPP ID. Domain must be set.")); return; } @@ -607,7 +632,9 @@ purple_account_get_int(account, "port", 5223), jabber_login_callback_ssl, jabber_ssl_connect_failure, js->gc); } else { - purple_connection_error(js->gc, _("SSL support unavailable")); + purple_connection_error_reason (js->gc, + PURPLE_CONNECTION_ERROR_NO_SSL_SUPPORT, + _("SSL support unavailable")); } } @@ -665,7 +692,7 @@ _("Registration Successful"), buf); g_free(buf); } else { - char *msg = jabber_parse_error(js, packet); + char *msg = jabber_parse_error(js, packet, NULL); if(!msg) msg = g_strdup(_("Unknown Error")); @@ -695,7 +722,7 @@ _("Unregistration Successful"), buf); g_free(buf); } else { - char *msg = jabber_parse_error(js, packet); + char *msg = jabber_parse_error(js, packet, NULL); if(!msg) msg = g_strdup(_("Unknown Error")); @@ -1060,7 +1087,9 @@ js->old_length = -1; if(!js->user) { - purple_connection_error(gc, _("Invalid XMPP ID")); + purple_connection_error_reason (gc, + PURPLE_CONNECTION_ERROR_INVALID_SETTINGS, + _("Invalid XMPP ID")); return; } @@ -1092,7 +1121,9 @@ purple_account_get_int(account, "port", 5222), jabber_login_callback_ssl, jabber_ssl_connect_failure, gc); } else { - purple_connection_error(gc, _("SSL support unavailable")); + purple_connection_error_reason (gc, + PURPLE_CONNECTION_ERROR_NO_SSL_SUPPORT, + _("SSL support unavailable")); } } @@ -1115,7 +1146,7 @@ PurpleAccount *account = purple_connection_get_account(js->gc); const char *type = xmlnode_get_attrib(packet,"type"); if(!strcmp(type,"error")) { - char *msg = jabber_parse_error(js, packet); + char *msg = jabber_parse_error(js, packet, NULL); purple_notify_error(js->gc, _("Error unregistering account"), _("Error unregistering account"), msg); @@ -1643,7 +1674,7 @@ purple_account_set_password(js->gc->account, (char *)data); } else { - char *msg = jabber_parse_error(js, packet); + char *msg = jabber_parse_error(js, packet, NULL); purple_notify_error(js->gc, _("Error changing password"), _("Error changing password"), msg); @@ -1807,13 +1838,18 @@ } -char *jabber_parse_error(JabberStream *js, xmlnode *packet) +char *jabber_parse_error(JabberStream *js, + xmlnode *packet, + PurpleConnectionError *reason) { xmlnode *error; const char *code = NULL, *text = NULL; const char *xmlns = xmlnode_get_namespace(packet); char *cdata = NULL; +#define SET_REASON(x) \ + if(reason != NULL) { *reason = x; } + if((error = xmlnode_get_child(packet, "error"))) { cdata = xmlnode_get_data(error); code = xmlnode_get_attrib(error, "code"); @@ -1865,22 +1901,21 @@ text = _("Unknown Error"); } } else if(xmlns && !strcmp(xmlns, "urn:ietf:params:xml:ns:xmpp-sasl")) { + /* Most common reason can be the default */ + SET_REASON(PURPLE_CONNECTION_ERROR_NETWORK_ERROR); if(xmlnode_get_child(packet, "aborted")) { - js->gc->wants_to_die = TRUE; text = _("Authorization Aborted"); } else if(xmlnode_get_child(packet, "incorrect-encoding")) { text = _("Incorrect encoding in authorization"); } else if(xmlnode_get_child(packet, "invalid-authzid")) { - js->gc->wants_to_die = TRUE; text = _("Invalid authzid"); } else if(xmlnode_get_child(packet, "invalid-mechanism")) { - js->gc->wants_to_die = TRUE; text = _("Invalid Authorization Mechanism"); } else if(xmlnode_get_child(packet, "mechanism-too-weak")) { - js->gc->wants_to_die = TRUE; + SET_REASON(PURPLE_CONNECTION_ERROR_AUTHENTICATION_IMPOSSIBLE); text = _("Authorization mechanism too weak"); } else if(xmlnode_get_child(packet, "not-authorized")) { - js->gc->wants_to_die = TRUE; + SET_REASON(PURPLE_CONNECTION_ERROR_AUTHENTICATION_FAILED); /* Clear the pasword if it isn't being saved */ if (!purple_account_get_remember_password(js->gc->account)) purple_account_set_password(js->gc->account, NULL); @@ -1888,18 +1923,20 @@ } else if(xmlnode_get_child(packet, "temporary-auth-failure")) { text = _("Temporary Authentication Failure"); } else { - js->gc->wants_to_die = TRUE; + SET_REASON(PURPLE_CONNECTION_ERROR_AUTHENTICATION_FAILED); text = _("Authentication Failure"); } } else if(!strcmp(packet->name, "stream:error") || (!strcmp(packet->name, "error") && xmlns && !strcmp(xmlns, "http://etherx.jabber.org/streams"))) { + /* Most common reason as default: */ + SET_REASON(PURPLE_CONNECTION_ERROR_NETWORK_ERROR); if(xmlnode_get_child(packet, "bad-format")) { text = _("Bad Format"); } else if(xmlnode_get_child(packet, "bad-namespace-prefix")) { text = _("Bad Namespace Prefix"); } else if(xmlnode_get_child(packet, "conflict")) { - js->gc->wants_to_die = TRUE; + SET_REASON(PURPLE_CONNECTION_ERROR_NAME_IN_USE); text = _("Resource Conflict"); } else if(xmlnode_get_child(packet, "connection-timeout")) { text = _("Connection Timeout"); @@ -1948,6 +1985,8 @@ } } +#undef SET_REASON + if(text || cdata) { char *ret = g_strdup_printf("%s%s%s", code ? code : "", code ? ": " : "", text ? text : cdata);
--- a/libpurple/protocols/jabber/jabber.h Mon Nov 12 16:15:53 2007 +0000 +++ b/libpurple/protocols/jabber/jabber.h Mon Nov 12 16:53:54 2007 +0000 @@ -216,7 +216,14 @@ char *jabber_get_next_id(JabberStream *js); -char *jabber_parse_error(JabberStream *js, xmlnode *packet); +/** Parse an error into a human-readable string and optionally a disconnect + * reason. + * @param js the stream on which the error occurred. + * @param packet the error packet + * @param reason where to store the disconnection reason, or @c NULL if you + * don't care or you don't intend to close the connection. + */ +char *jabber_parse_error(JabberStream *js, xmlnode *packet, PurpleConnectionError *reason); void jabber_add_feature(const gchar *shortname, const gchar *namespace, JabberFeatureEnabled cb); /* cb may be NULL */ void jabber_remove_feature(const gchar *shortname);
--- a/libpurple/protocols/jabber/parser.c Mon Nov 12 16:15:53 2007 +0000 +++ b/libpurple/protocols/jabber/parser.c Mon Nov 12 16:53:54 2007 +0000 @@ -193,7 +193,9 @@ js->context = xmlCreatePushParserCtxt(&jabber_parser_libxml, js, buf, len, NULL); xmlParseChunk(js->context, "", 0, 0); } else if (xmlParseChunk(js->context, buf, len, 0) < 0) { - purple_connection_error(js->gc, _("XML Parse error")); + purple_connection_error_reason (js->gc, + PURPLE_CONNECTION_ERROR_NETWORK_ERROR, + _("XML Parse error")); } }
--- a/libpurple/protocols/jabber/presence.c Mon Nov 12 16:15:53 2007 +0000 +++ b/libpurple/protocols/jabber/presence.c Mon Nov 12 16:53:54 2007 +0000 @@ -429,7 +429,7 @@ } if(type && !strcmp(type, "error")) { - char *msg = jabber_parse_error(js, packet); + char *msg = jabber_parse_error(js, packet, NULL); state = JABBER_BUDDY_STATE_ERROR; jb->error_msg = msg ? msg : g_strdup(_("Unknown Error in presence")); @@ -561,7 +561,7 @@ char *room_jid = g_strdup_printf("%s@%s", jid->node, jid->domain); if(state == JABBER_BUDDY_STATE_ERROR) { - char *title, *msg = jabber_parse_error(js, packet); + char *title, *msg = jabber_parse_error(js, packet, NULL); if(chat->conv) { title = g_strdup_printf(_("Error in chat %s"), from);
--- a/libpurple/protocols/msn/contact.c Mon Nov 12 16:15:53 2007 +0000 +++ b/libpurple/protocols/msn/contact.c Mon Nov 12 16:53:54 2007 +0000 @@ -709,7 +709,7 @@ msn_get_address_book(contact, NULL, NULL); */ msn_session_disconnect(session); - purple_connection_error(session->account->gc, _("Unable to retrieve MSN Address Book")); + purple_connection_error_reason(session->account->gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR, _("Unable to retrieve MSN Address Book")); } }
--- a/libpurple/protocols/msn/msn.c Mon Nov 12 16:15:53 2007 +0000 +++ b/libpurple/protocols/msn/msn.c Mon Nov 12 16:53:54 2007 +0000 @@ -844,8 +844,8 @@ if (!purple_ssl_is_supported()) { - gc->wants_to_die = TRUE; - purple_connection_error(gc, + purple_connection_error_reason (gc, + PURPLE_CONNECTION_ERROR_NO_SSL_SUPPORT, _("SSL support is needed for MSN. Please install a supported " "SSL library.")); return; @@ -874,7 +874,9 @@ purple_account_set_username(account, username); if (!msn_session_connect(session, host, port, http_method)) - purple_connection_error(gc, _("Failed to connect to server.")); + purple_connection_error_reason (gc, + PURPLE_CONNECTION_ERROR_NETWORK_ERROR, + _("Failed to connect to server.")); } static void
--- a/libpurple/protocols/msn/session.c Mon Nov 12 16:15:53 2007 +0000 +++ b/libpurple/protocols/msn/session.c Mon Nov 12 16:53:54 2007 +0000 @@ -333,6 +333,7 @@ const char *info) { PurpleConnection *gc; + PurpleConnectionError reason; char *msg; gc = purple_account_get_connection(session->account); @@ -340,49 +341,56 @@ switch (error) { case MSN_ERROR_SERVCONN: + reason = PURPLE_CONNECTION_ERROR_NETWORK_ERROR; msg = g_strdup(info); break; case MSN_ERROR_UNSUPPORTED_PROTOCOL: + reason = PURPLE_CONNECTION_ERROR_NETWORK_ERROR; msg = g_strdup(_("Our protocol is not supported by the " "server.")); break; case MSN_ERROR_HTTP_MALFORMED: + reason = PURPLE_CONNECTION_ERROR_NETWORK_ERROR; msg = g_strdup(_("Error parsing HTTP.")); break; case MSN_ERROR_SIGN_OTHER: - gc->wants_to_die = TRUE; + reason = PURPLE_CONNECTION_ERROR_NAME_IN_USE; msg = g_strdup(_("You have signed on from another location.")); if (!purple_account_get_remember_password(session->account)) purple_account_set_password(session->account, NULL); break; case MSN_ERROR_SERV_UNAVAILABLE: + reason = PURPLE_CONNECTION_ERROR_NETWORK_ERROR; msg = g_strdup(_("The MSN servers are temporarily " "unavailable. Please wait and try " "again.")); break; case MSN_ERROR_SERV_DOWN: + reason = PURPLE_CONNECTION_ERROR_NETWORK_ERROR; msg = g_strdup(_("The MSN servers are going down " "temporarily.")); break; case MSN_ERROR_AUTH: - gc->wants_to_die = TRUE; + reason = PURPLE_CONNECTION_ERROR_AUTHENTICATION_FAILED; msg = g_strdup_printf(_("Unable to authenticate: %s"), (info == NULL ) ? _("Unknown error") : info); break; case MSN_ERROR_BAD_BLIST: + reason = PURPLE_CONNECTION_ERROR_NETWORK_ERROR; msg = g_strdup(_("Your MSN buddy list is temporarily " "unavailable. Please wait and try " "again.")); break; default: + reason = PURPLE_CONNECTION_ERROR_NETWORK_ERROR; msg = g_strdup(_("Unknown error.")); break; } msn_session_disconnect(session); - purple_connection_error(gc, msg); + purple_connection_error_reason (gc, reason, msg); g_free(msg); }
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libpurple/protocols/msnp9/Makefile.am Mon Nov 12 16:53:54 2007 +0000 @@ -0,0 +1,90 @@ +EXTRA_DIST = \ + Makefile.mingw + +pkgdir = $(libdir)/purple-$(PURPLE_MAJOR_VERSION) + +MSNP9SOURCES = \ + cmdproc.c \ + cmdproc.h \ + command.c \ + command.h \ + dialog.c \ + dialog.h \ + directconn.c \ + directconn.h \ + error.c \ + error.h \ + group.c \ + group.h \ + history.c \ + history.h \ + httpconn.c \ + httpconn.h \ + msg.c \ + msg.h \ + msn.c \ + msn.h \ + nexus.c \ + nexus.h \ + notification.c \ + notification.h \ + object.c \ + object.h \ + page.c \ + page.h \ + servconn.c \ + servconn.h \ + session.c \ + session.h \ + slp.c \ + slp.h \ + slpcall.c \ + slpcall.h \ + slplink.c \ + slplink.h \ + slpmsg.c \ + slpmsg.h \ + slpsession.c \ + slpsession.h \ + state.c \ + state.h \ + switchboard.c \ + switchboard.h \ + sync.c \ + sync.h \ + table.c \ + table.h \ + transaction.c \ + transaction.h \ + user.c \ + user.h \ + userlist.c \ + userlist.h \ + msn-utils.c \ + msn-utils.h + +AM_CFLAGS = $(st) + +libmsn_la_LDFLAGS = -module -avoid-version + +if STATIC_MSN + +st = -DPURPLE_STATIC_PRPL +noinst_LIBRARIES = libmsn.a +libmsn_a_SOURCES = $(MSNP9SOURCES) +libmsn_a_CFLAGS = $(AM_CFLAGS) + +else + +st = +pkg_LTLIBRARIES = libmsn.la +libmsn_la_SOURCES = $(MSNP9SOURCES) +libmsn_la_LIBADD = $(GLIB_LIBS) + +endif + +AM_CPPFLAGS = \ + -I$(top_srcdir)/libpurple \ + -I$(top_builddir)/libpurple \ + $(GLIB_CFLAGS) \ + $(DEBUG_CFLAGS)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libpurple/protocols/msnp9/Makefile.mingw Mon Nov 12 16:53:54 2007 +0000 @@ -0,0 +1,105 @@ +# +# Makefile.mingw +# +# Description: Makefile for win32 (mingw) version of libmsn +# + +PIDGIN_TREE_TOP := ../../.. +include $(PIDGIN_TREE_TOP)/libpurple/win32/global.mak + +TARGET = libmsn +TYPE = PLUGIN + +# Static or Plugin... +ifeq ($(TYPE),STATIC) + DEFINES += -DSTATIC + DLL_INSTALL_DIR = $(PURPLE_INSTALL_DIR) +else +ifeq ($(TYPE),PLUGIN) + DLL_INSTALL_DIR = $(PURPLE_INSTALL_PLUGINS_DIR) +endif +endif + +## +## INCLUDE PATHS +## +INCLUDE_PATHS += -I. \ + -I$(GTK_TOP)/include \ + -I$(GTK_TOP)/include/glib-2.0 \ + -I$(GTK_TOP)/lib/glib-2.0/include \ + -I$(PURPLE_TOP) \ + -I$(PURPLE_TOP)/win32 \ + -I$(PIDGIN_TREE_TOP) + +LIB_PATHS += -L$(GTK_TOP)/lib \ + -L$(PURPLE_TOP) + +## +## SOURCES, OBJECTS +## +C_SRC = cmdproc.c \ + command.c \ + dialog.c \ + directconn.c \ + error.c \ + group.c \ + history.c \ + httpconn.c \ + msg.c \ + msn.c \ + nexus.c \ + notification.c \ + object.c \ + page.c \ + servconn.c \ + session.c \ + slp.c \ + slpcall.c \ + slplink.c \ + slpmsg.c \ + slpsession.c \ + state.c \ + switchboard.c \ + sync.c \ + table.c \ + transaction.c \ + user.c \ + userlist.c \ + msn-utils.c + +OBJECTS = $(C_SRC:%.c=%.o) + +## +## LIBRARIES +## +LIBS = \ + -lglib-2.0 \ + -lintl \ + -lws2_32 \ + -lpurple + +include $(PIDGIN_COMMON_RULES) + +## +## TARGET DEFINITIONS +## +.PHONY: all install clean + +all: $(TARGET).dll + +install: all $(DLL_INSTALL_DIR) + cp $(TARGET).dll $(DLL_INSTALL_DIR) + +$(OBJECTS): $(PURPLE_CONFIG_H) + +$(TARGET).dll: $(PURPLE_DLL).a $(OBJECTS) + $(CC) -shared $(OBJECTS) $(LIB_PATHS) $(LIBS) $(DLL_LD_FLAGS) -o $(TARGET).dll + +## +## CLEAN RULES +## +clean: + rm -f $(OBJECTS) + rm -f $(TARGET).dll + +include $(PIDGIN_COMMON_TARGETS)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libpurple/protocols/msnp9/cmdproc.c Mon Nov 12 16:53:54 2007 +0000 @@ -0,0 +1,336 @@ +/** + * @file cmdproc.c MSN command processor functions + * + * purple + * + * Purple is the legal property of its developers, whose names are too numerous + * to list here. Please refer to the COPYRIGHT file distributed with this + * source distribution. + * + * 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 02111-1301 USA + */ +#include "msn.h" +#include "cmdproc.h" + +MsnCmdProc * +msn_cmdproc_new(MsnSession *session) +{ + MsnCmdProc *cmdproc; + + cmdproc = g_new0(MsnCmdProc, 1); + + cmdproc->session = session; + cmdproc->txqueue = g_queue_new(); + cmdproc->history = msn_history_new(); + + return cmdproc; +} + +void +msn_cmdproc_destroy(MsnCmdProc *cmdproc) +{ + MsnTransaction *trans; + + while ((trans = g_queue_pop_head(cmdproc->txqueue)) != NULL) + msn_transaction_destroy(trans); + + g_queue_free(cmdproc->txqueue); + + msn_history_destroy(cmdproc->history); + + if (cmdproc->last_cmd != NULL) + msn_command_destroy(cmdproc->last_cmd); + + g_free(cmdproc); +} + +void +msn_cmdproc_process_queue(MsnCmdProc *cmdproc) +{ + MsnTransaction *trans; + + while ((trans = g_queue_pop_head(cmdproc->txqueue)) != NULL) + msn_cmdproc_send_trans(cmdproc, trans); +} + +void +msn_cmdproc_queue_trans(MsnCmdProc *cmdproc, MsnTransaction *trans) +{ + g_return_if_fail(cmdproc != NULL); + g_return_if_fail(trans != NULL); + + g_queue_push_tail(cmdproc->txqueue, trans); +} + +static void +show_debug_cmd(MsnCmdProc *cmdproc, gboolean incoming, const char *command) +{ + MsnServConn *servconn; + const char *names[] = { "NS", "SB" }; + char *show; + char tmp; + size_t len; + + servconn = cmdproc->servconn; + len = strlen(command); + show = g_strdup(command); + + tmp = (incoming) ? 'S' : 'C'; + + if ((show[len - 1] == '\n') && (show[len - 2] == '\r')) + { + show[len - 2] = '\0'; + } + + purple_debug_misc("msn", "%c: %s %03d: %s\n", tmp, + names[servconn->type], servconn->num, show); + + g_free(show); +} + +void +msn_cmdproc_send_trans(MsnCmdProc *cmdproc, MsnTransaction *trans) +{ + MsnServConn *servconn; + char *data; + size_t len; + + g_return_if_fail(cmdproc != NULL); + g_return_if_fail(trans != NULL); + + servconn = cmdproc->servconn; + + if (!servconn->connected) + return; + + msn_history_add(cmdproc->history, trans); + + data = msn_transaction_to_string(trans); + + len = strlen(data); + + show_debug_cmd(cmdproc, FALSE, data); + + if (trans->callbacks == NULL) + trans->callbacks = g_hash_table_lookup(cmdproc->cbs_table->cmds, + trans->command); + + if (trans->payload != NULL) + { + data = g_realloc(data, len + trans->payload_len); + memcpy(data + len, trans->payload, trans->payload_len); + len += trans->payload_len; + } + + msn_servconn_write(servconn, data, len); + + g_free(data); +} + +void +msn_cmdproc_send_quick(MsnCmdProc *cmdproc, const char *command, + const char *format, ...) +{ + MsnServConn *servconn; + char *data; + char *params = NULL; + va_list arg; + size_t len; + + g_return_if_fail(cmdproc != NULL); + g_return_if_fail(command != NULL); + + servconn = cmdproc->servconn; + + if (!servconn->connected) + return; + + if (format != NULL) + { + va_start(arg, format); + params = g_strdup_vprintf(format, arg); + va_end(arg); + } + + if (params != NULL) + data = g_strdup_printf("%s %s\r\n", command, params); + else + data = g_strdup_printf("%s\r\n", command); + + g_free(params); + + len = strlen(data); + + show_debug_cmd(cmdproc, FALSE, data); + + msn_servconn_write(servconn, data, len); + + g_free(data); +} + +void +msn_cmdproc_send(MsnCmdProc *cmdproc, const char *command, + const char *format, ...) +{ + MsnTransaction *trans; + va_list arg; + + g_return_if_fail(cmdproc != NULL); + g_return_if_fail(command != NULL); + + if (!cmdproc->servconn->connected) + return; + + trans = g_new0(MsnTransaction, 1); + + trans->command = g_strdup(command); + + if (format != NULL) + { + va_start(arg, format); + trans->params = g_strdup_vprintf(format, arg); + va_end(arg); + } + + msn_cmdproc_send_trans(cmdproc, trans); +} + +void +msn_cmdproc_process_payload(MsnCmdProc *cmdproc, char *payload, + int payload_len) +{ + MsnCommand *last; + + g_return_if_fail(cmdproc != NULL); + + last = cmdproc->last_cmd; + last->payload = g_memdup(payload, payload_len); + last->payload_len = payload_len; + + if (last->payload_cb != NULL) + last->payload_cb(cmdproc, last, payload, payload_len); +} + +void +msn_cmdproc_process_msg(MsnCmdProc *cmdproc, MsnMessage *msg) +{ + MsnMsgTypeCb cb; + + if (msn_message_get_content_type(msg) == NULL) + { + purple_debug_misc("msn", "failed to find message content\n"); + return; + } + + cb = g_hash_table_lookup(cmdproc->cbs_table->msgs, + msn_message_get_content_type(msg)); + + if (cb == NULL) + { + purple_debug_warning("msn", "Unhandled content-type '%s'\n", + msn_message_get_content_type(msg)); + + return; + } + + cb(cmdproc, msg); +} + +void +msn_cmdproc_process_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd) +{ + MsnTransCb cb = NULL; + MsnTransaction *trans = NULL; + + if (cmd->trId) + trans = msn_history_find(cmdproc->history, cmd->trId); + + if (trans != NULL) + if (trans->timer) + purple_timeout_remove(trans->timer); + + if (g_ascii_isdigit(cmd->command[0])) + { + if (trans != NULL) + { + MsnErrorCb error_cb = NULL; + int error; + + error = atoi(cmd->command); + + if (trans->error_cb != NULL) + error_cb = trans->error_cb; + + if (error_cb == NULL && cmdproc->cbs_table->errors != NULL) + error_cb = g_hash_table_lookup(cmdproc->cbs_table->errors, trans->command); + + if (error_cb != NULL) + { + error_cb(cmdproc, trans, error); + } + else + { +#if 1 + msn_error_handle(cmdproc->session, error); +#else + purple_debug_warning("msn", "Unhandled error '%s'\n", + cmd->command); +#endif + } + + return; + } + } + + if (cmdproc->cbs_table->async != NULL) + cb = g_hash_table_lookup(cmdproc->cbs_table->async, cmd->command); + + if (cb == NULL && trans != NULL) + { + cmd->trans = trans; + + if (trans->callbacks != NULL) + cb = g_hash_table_lookup(trans->callbacks, cmd->command); + } + + if (cb == NULL && cmdproc->cbs_table->fallback != NULL) + cb = g_hash_table_lookup(cmdproc->cbs_table->fallback, cmd->command); + + if (cb != NULL) + { + cb(cmdproc, cmd); + } + else + { + purple_debug_warning("msn", "Unhandled command '%s'\n", + cmd->command); + } + + if (trans != NULL && trans->pendent_cmd != NULL) + msn_transaction_unqueue_cmd(trans, cmdproc); +} + +void +msn_cmdproc_process_cmd_text(MsnCmdProc *cmdproc, const char *command) +{ + show_debug_cmd(cmdproc, TRUE, command); + + if (cmdproc->last_cmd != NULL) + msn_command_destroy(cmdproc->last_cmd); + + cmdproc->last_cmd = msn_command_from_string(command); + + msn_cmdproc_process_cmd(cmdproc, cmdproc->last_cmd); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libpurple/protocols/msnp9/cmdproc.h Mon Nov 12 16:53:54 2007 +0000 @@ -0,0 +1,74 @@ +/** + * @file cmdproc.h MSN command processor functions + * + * purple + * + * Purple is the legal property of its developers, whose names are too numerous + * to list here. Please refer to the COPYRIGHT file distributed with this + * source distribution. + * + * 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 02111-1301 USA + */ +#ifndef _MSN_CMDPROC_H_ +#define _MSN_CMDPROC_H_ + +typedef struct _MsnCmdProc MsnCmdProc; + +#include "session.h" +#include "servconn.h" +#include "error.h" +#include "command.h" +#include "table.h" +#include "history.h" + +struct _MsnCmdProc +{ + MsnSession *session; + MsnServConn *servconn; + + GQueue *txqueue; + + MsnCommand *last_cmd; + + MsnTable *cbs_table; + + MsnHistory *history; + + void *data; /**< Extra data, like the switchboard. */ +}; + +MsnCmdProc *msn_cmdproc_new(MsnSession *session); +void msn_cmdproc_destroy(MsnCmdProc *cmdproc); + +void msn_cmdproc_process_queue(MsnCmdProc *cmdproc); + +void msn_cmdproc_send_trans(MsnCmdProc *cmdproc, MsnTransaction *trans); +void msn_cmdproc_queue_trans(MsnCmdProc *cmdproc, + MsnTransaction *trans); +void msn_cmdproc_send(MsnCmdProc *cmdproc, const char *command, + const char *format, ...); +void msn_cmdproc_send_quick(MsnCmdProc *cmdproc, const char *command, + const char *format, ...); + +void msn_cmdproc_process_msg(MsnCmdProc *cmdproc, + MsnMessage *msg); +void msn_cmdproc_process_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd); +void msn_cmdproc_process_cmd_text(MsnCmdProc *cmdproc, const char *command); +void msn_cmdproc_process_payload(MsnCmdProc *cmdproc, + char *payload, int payload_len); + +void msn_cmdproc_disconnect(MsnCmdProc *cmdproc); + +#endif /* _MSN_CMDPROC_H_ */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libpurple/protocols/msnp9/command.c Mon Nov 12 16:53:54 2007 +0000 @@ -0,0 +1,123 @@ +/** + * @file command.c MSN command functions + * + * purple + * + * Purple is the legal property of its developers, whose names are too numerous + * to list here. Please refer to the COPYRIGHT file distributed with this + * source distribution. + * + * 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 02111-1301 USA + */ +#include "msn.h" +#include "command.h" + +static gboolean +is_num(char *str) +{ + char *c; + for (c = str; *c; c++) { + if (!(g_ascii_isdigit(*c))) + return FALSE; + } + + return TRUE; +} + +MsnCommand * +msn_command_from_string(const char *string) +{ + MsnCommand *cmd; + char *tmp; + char *param_start; + + g_return_val_if_fail(string != NULL, NULL); + + tmp = g_strdup(string); + param_start = strchr(tmp, ' '); + + cmd = g_new0(MsnCommand, 1); + cmd->command = tmp; + + if (param_start) + { + *param_start++ = '\0'; + cmd->params = g_strsplit(param_start, " ", 0); + } + + if (cmd->params != NULL) + { + char *param; + int c; + + for (c = 0; cmd->params[c]; c++); + cmd->param_count = c; + + param = cmd->params[0]; + + cmd->trId = is_num(param) ? atoi(param) : 0; + } + else + cmd->trId = 0; + + msn_command_ref(cmd); + + return cmd; +} + +void +msn_command_destroy(MsnCommand *cmd) +{ + g_return_if_fail(cmd != NULL); + + if (cmd->ref_count > 0) + { + msn_command_unref(cmd); + return; + } + + if (cmd->payload != NULL) + g_free(cmd->payload); + + g_free(cmd->command); + g_strfreev(cmd->params); + g_free(cmd); +} + +MsnCommand * +msn_command_ref(MsnCommand *cmd) +{ + g_return_val_if_fail(cmd != NULL, NULL); + + cmd->ref_count++; + return cmd; +} + +MsnCommand * +msn_command_unref(MsnCommand *cmd) +{ + g_return_val_if_fail(cmd != NULL, NULL); + g_return_val_if_fail(cmd->ref_count > 0, NULL); + + cmd->ref_count--; + + if (cmd->ref_count == 0) + { + msn_command_destroy(cmd); + return NULL; + } + + return cmd; +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libpurple/protocols/msnp9/command.h Mon Nov 12 16:53:54 2007 +0000 @@ -0,0 +1,61 @@ +/** + * @file command.h MSN command functions + * + * purple + * + * Purple is the legal property of its developers, whose names are too numerous + * to list here. Please refer to the COPYRIGHT file distributed with this + * source distribution. + * + * 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 02111-1301 USA + */ +#ifndef _MSN_COMMAND_H +#define _MSN_COMMAND_H + +typedef struct _MsnCommand MsnCommand; + +#include "cmdproc.h" +#include "transaction.h" + +typedef void (*MsnPayloadCb)(MsnCmdProc *cmdproc, MsnCommand *cmd, + char *payload, size_t len); + +/** + * A received command. + */ +struct _MsnCommand +{ + unsigned int trId; + + char *command; + char **params; + int param_count; + + int ref_count; + + MsnTransaction *trans; + + char *payload; + size_t payload_len; + + MsnPayloadCb payload_cb; +}; + +MsnCommand *msn_command_from_string(const char *string); +void msn_command_destroy(MsnCommand *cmd); +MsnCommand *msn_command_ref(MsnCommand *cmd); +MsnCommand *msn_command_unref(MsnCommand *cmd); + +#endif /* _MSN_COMMAND_H */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libpurple/protocols/msnp9/dialog.c Mon Nov 12 16:53:54 2007 +0000 @@ -0,0 +1,138 @@ +/** + * @file dialog.c Dialog functions + * + * purple + * + * Purple is the legal property of its developers, whose names are too numerous + * to list here. Please refer to the COPYRIGHT file distributed with this + * source distribution. + * + * 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 02111-1301 USA + */ + +#include "msn.h" +#include "dialog.h" + +typedef struct +{ + PurpleConnection *gc; + char *who; + char *group; + gboolean add; + +} MsnAddRemData; + +/* Remove the buddy referenced by the MsnAddRemData before the serverside list is changed. + * If the buddy will be added, he'll be added back; if he will be removed, he won't be. */ +static void +msn_complete_sync_issue(MsnAddRemData *data) +{ + PurpleBuddy *buddy; + PurpleGroup *group = NULL; + + if (data->group != NULL) + group = purple_find_group(data->group); + + if (group != NULL) + buddy = purple_find_buddy_in_group(purple_connection_get_account(data->gc), data->who, group); + else + buddy = purple_find_buddy(purple_connection_get_account(data->gc), data->who); + + if (buddy != NULL) + purple_blist_remove_buddy(buddy); +} + +static void +msn_add_cb(MsnAddRemData *data) +{ + MsnSession *session; + MsnUserList *userlist; + + msn_complete_sync_issue(data); + + session = data->gc->proto_data; + userlist = session->userlist; + + msn_userlist_add_buddy(userlist, data->who, MSN_LIST_FL, data->group); + + g_free(data->group); + g_free(data->who); + g_free(data); +} + +static void +msn_rem_cb(MsnAddRemData *data) +{ + MsnSession *session; + MsnUserList *userlist; + + msn_complete_sync_issue(data); + + session = data->gc->proto_data; + userlist = session->userlist; + + msn_userlist_rem_buddy(userlist, data->who, MSN_LIST_FL, data->group); + + g_free(data->group); + g_free(data->who); + g_free(data); +} + +void +msn_show_sync_issue(MsnSession *session, const char *passport, + const char *group_name) +{ + PurpleConnection *gc; + PurpleAccount *account; + MsnAddRemData *data; + char *msg, *reason; + + account = session->account; + gc = purple_account_get_connection(account); + + data = g_new0(MsnAddRemData, 1); + data->who = g_strdup(passport); + data->group = g_strdup(group_name); + data->gc = gc; + + msg = g_strdup_printf(_("Buddy list synchronization issue in %s (%s)"), + purple_account_get_username(account), + purple_account_get_protocol_name(account)); + + if (group_name != NULL) + { + reason = g_strdup_printf(_("%s on the local list is " + "inside the group \"%s\" but not on " + "the server list. " + "Do you want this buddy to be added?"), + passport, group_name); + } + else + { + reason = g_strdup_printf(_("%s is on the local list but " + "not on the server list. " + "Do you want this buddy to be added?"), + passport); + } + + purple_request_action(gc, NULL, msg, reason, PURPLE_DEFAULT_ACTION_NONE, + purple_connection_get_account(gc), data->who, NULL, + data, 2, + _("Yes"), G_CALLBACK(msn_add_cb), + _("No"), G_CALLBACK(msn_rem_cb)); + + g_free(reason); + g_free(msg); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libpurple/protocols/msnp9/dialog.h Mon Nov 12 16:53:54 2007 +0000 @@ -0,0 +1,30 @@ +/** + * @file dialog.h Dialog functions + * + * purple + * + * Purple is the legal property of its developers, whose names are too numerous + * to list here. Please refer to the COPYRIGHT file distributed with this + * source distribution. + * + * 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 02111-1301 USA + */ +#ifndef _MSN_DIALOG_H_ +#define _MSN_DIALOG_H_ + +void msn_show_sync_issue(MsnSession *session, const char *passport, + const char *group_name); + +#endif /* _MSN_DIALOG_H_ */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libpurple/protocols/msnp9/directconn.c Mon Nov 12 16:53:54 2007 +0000 @@ -0,0 +1,494 @@ +/** + * @file directconn.c MSN direct connection functions + * + * purple + * + * Purple is the legal property of its developers, whose names are too numerous + * to list here. Please refer to the COPYRIGHT file distributed with this + * source distribution. + * + * 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 02111-1301 USA + */ +#include "msn.h" +#include "directconn.h" + +#include "slp.h" +#include "slpmsg.h" + +/************************************************************************** + * Directconn Specific + **************************************************************************/ + +void +msn_directconn_send_handshake(MsnDirectConn *directconn) +{ + MsnSlpLink *slplink; + MsnSlpMessage *slpmsg; + + g_return_if_fail(directconn != NULL); + + slplink = directconn->slplink; + + slpmsg = msn_slpmsg_new(slplink); + slpmsg->flags = 0x100; + + if (directconn->nonce != NULL) + { + guint32 t1; + guint16 t2; + guint16 t3; + guint16 t4; + guint64 t5; + + sscanf (directconn->nonce, "%08X-%04hX-%04hX-%04hX-%012" G_GINT64_MODIFIER "X", &t1, &t2, &t3, &t4, &t5); + + t1 = GUINT32_TO_LE(t1); + t2 = GUINT16_TO_LE(t2); + t3 = GUINT16_TO_LE(t3); + t4 = GUINT16_TO_BE(t4); + t5 = GUINT64_TO_BE(t5); + + slpmsg->ack_id = t1; + slpmsg->ack_sub_id = t2 | (t3 << 16); + slpmsg->ack_size = t4 | t5; + } + + g_free(directconn->nonce); + + msn_slplink_send_slpmsg(slplink, slpmsg); + + directconn->acked =TRUE; +} + +/************************************************************************** + * Connection Functions + **************************************************************************/ + +#if 0 +static int +create_listener(int port) +{ + int fd; + const int on = 1; + +#if 0 + struct addrinfo hints; + struct addrinfo *c, *res; + char port_str[5]; + + snprintf(port_str, sizeof(port_str), "%d", port); + + memset(&hints, 0, sizeof(hints)); + + hints.ai_flags = AI_PASSIVE; + hints.ai_family = AF_UNSPEC; + hints.ai_socktype = SOCK_STREAM; + + if (getaddrinfo(NULL, port_str, &hints, &res) != 0) + { + purple_debug_error("msn", "Could not get address info: %s.\n", + port_str); + return -1; + } + + for (c = res; c != NULL; c = c->ai_next) + { + fd = socket(c->ai_family, c->ai_socktype, c->ai_protocol); + + if (fd < 0) + continue; + + setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)); + + if (bind(fd, c->ai_addr, c->ai_addrlen) == 0) + break; + + close(fd); + } + + if (c == NULL) + { + purple_debug_error("msn", "Could not find socket: %s.\n", port_str); + return -1; + } + + freeaddrinfo(res); +#else + struct sockaddr_in sockin; + + fd = socket(AF_INET, SOCK_STREAM, 0); + + if (fd < 0) + return -1; + + if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (char *)&on, sizeof(on)) != 0) + { + close(fd); + return -1; + } + + memset(&sockin, 0, sizeof(struct sockaddr_in)); + sockin.sin_family = AF_INET; + sockin.sin_port = htons(port); + + if (bind(fd, (struct sockaddr *)&sockin, sizeof(struct sockaddr_in)) != 0) + { + close(fd); + return -1; + } +#endif + + if (listen (fd, 4) != 0) + { + close (fd); + return -1; + } + + fcntl(fd, F_SETFL, O_NONBLOCK); + + return fd; +} +#endif + +static size_t +msn_directconn_write(MsnDirectConn *directconn, + const char *data, size_t len) +{ + char *buffer, *tmp; + size_t buf_size; + size_t ret; + guint32 sent_len; + + g_return_val_if_fail(directconn != NULL, 0); + + buf_size = len + 4; + buffer = tmp = g_malloc(buf_size); + + sent_len = GUINT32_TO_LE(len); + + memcpy(tmp, &sent_len, 4); + tmp += 4; + memcpy(tmp, data, len); + tmp += len; + + ret = write(directconn->fd, buffer, buf_size); + +#ifdef DEBUG_DC + char *str; + str = g_strdup_printf("%s/msntest/w%.4d.bin", g_get_home_dir(), directconn->c); + + FILE *tf = g_fopen(str, "w"); + fwrite(buffer, 1, buf_size, tf); + fclose(tf); + + g_free(str); +#endif + + g_free(buffer); + +#if 0 + /* Let's write the length of the data. */ + ret = write(directconn->fd, &len, sizeof(len)); + + /* Let's write the data. */ + ret = write(directconn->fd, data, len); + + char *str; + str = g_strdup_printf("/home/revo/msntest/w%.4d.bin", directconn->c); + + FILE *tf = g_fopen(str, "w"); + fwrite(&len, 1, sizeof(len), tf); + fwrite(data, 1, len, tf); + fclose(tf); + + g_free(str); +#endif + + directconn->c++; + + return ret; +} + +#if 0 +void +msn_directconn_parse_nonce(MsnDirectConn *directconn, const char *nonce) +{ + guint32 t1; + guint16 t2; + guint16 t3; + guint16 t4; + guint64 t5; + + g_return_if_fail(directconn != NULL); + g_return_if_fail(nonce != NULL); + + sscanf (nonce, "%08X-%04hX-%04hX-%04hX-%012llX", &t1, &t2, &t3, &t4, &t5); + + t1 = GUINT32_TO_LE(t1); + t2 = GUINT16_TO_LE(t2); + t3 = GUINT16_TO_LE(t3); + t4 = GUINT16_TO_BE(t4); + t5 = GUINT64_TO_BE(t5); + + directconn->slpheader = g_new0(MsnSlpHeader, 1); + + directconn->slpheader->ack_id = t1; + directconn->slpheader->ack_sub_id = t2 | (t3 << 16); + directconn->slpheader->ack_size = t4 | t5; +} +#endif + +void +msn_directconn_send_msg(MsnDirectConn *directconn, MsnMessage *msg) +{ + char *body; + size_t body_len; + + body = msn_message_gen_slp_body(msg, &body_len); + + msn_directconn_write(directconn, body, body_len); +} + +static void +msn_directconn_process_msg(MsnDirectConn *directconn, MsnMessage *msg) +{ + purple_debug_info("msn", "directconn: process_msg\n"); + + msn_slplink_process_msg(directconn->slplink, msg); +} + +static void +read_cb(gpointer data, gint source, PurpleInputCondition cond) +{ + MsnDirectConn* directconn; + char *body; + size_t len, body_len; + + purple_debug_info("msn", "read_cb: %d, %d\n", source, cond); + + directconn = data; + + /* Let's read the length of the data. */ + len = read(directconn->fd, &body_len, sizeof(body_len)); + + if (len <= 0) + { + /* ERROR */ + purple_debug_error("msn", "error reading\n"); + + msn_directconn_destroy(directconn); + + return; + } + + body_len = GUINT32_FROM_LE(body_len); + + purple_debug_info("msn", "body_len=%d\n", body_len); + + if (body_len <= 0) + { + /* ERROR */ + purple_debug_error("msn", "error reading\n"); + + msn_directconn_destroy(directconn); + + return; + } + + body = g_try_malloc(body_len); + + if (body != NULL) + { + /* Let's read the data. */ + len = read(directconn->fd, body, body_len); + + purple_debug_info("msn", "len=%d\n", len); + } + else + { + purple_debug_error("msn", "Failed to allocate memory for read\n"); + len = 0; + } + + if (len > 0) + { + MsnMessage *msg; + +#ifdef DEBUG_DC + str = g_strdup_printf("/home/revo/msntest/r%.4d.bin", directconn->c); + + FILE *tf = g_fopen(str, "w"); + fwrite(body, 1, len, tf); + fclose(tf); + + g_free(str); +#endif + + directconn->c++; + + msg = msn_message_new_msnslp(); + msn_message_parse_slp_body(msg, body, body_len); + + msn_directconn_process_msg(directconn, msg); + } + else + { + /* ERROR */ + purple_debug_error("msn", "error reading\n"); + + msn_directconn_destroy(directconn); + } +} + +static void +connect_cb(gpointer data, gint source, const gchar *error_message) +{ + MsnDirectConn* directconn; + int fd; + + purple_debug_misc("msn", "directconn: connect_cb: %d\n", source); + + directconn = data; + directconn->connect_data = NULL; + + if (TRUE) + { + fd = source; + } + else + { + struct sockaddr_in client_addr; + socklen_t client; + fd = accept (source, (struct sockaddr *)&client_addr, &client); + } + + directconn->fd = fd; + + if (fd > 0) + { + directconn->inpa = purple_input_add(fd, PURPLE_INPUT_READ, read_cb, + directconn); + + if (TRUE) + { + /* Send foo. */ + msn_directconn_write(directconn, "foo", strlen("foo") + 1); + + /* Send Handshake */ + msn_directconn_send_handshake(directconn); + } + else + { + } + } + else + { + /* ERROR */ + purple_debug_error("msn", "could not add input\n"); + + if (directconn->inpa) + purple_input_remove(directconn->inpa); + + close(directconn->fd); + } +} + +gboolean +msn_directconn_connect(MsnDirectConn *directconn, const char *host, int port) +{ + MsnSession *session; + + g_return_val_if_fail(directconn != NULL, FALSE); + g_return_val_if_fail(host != NULL, TRUE); + g_return_val_if_fail(port > 0, FALSE); + + session = directconn->slplink->session; + +#if 0 + if (session->http_method) + { + servconn->http_data->gateway_host = g_strdup(host); + } +#endif + + directconn->connect_data = purple_proxy_connect(NULL, session->account, + host, port, connect_cb, directconn); + + if (directconn->connect_data != NULL) + { + return TRUE; + } + else + return FALSE; +} + +#if 0 +void +msn_directconn_listen(MsnDirectConn *directconn) +{ + int port; + int fd; + + port = 7000; + + for (fd = -1; fd < 0;) + fd = create_listener(++port); + + directconn->fd = fd; + + directconn->inpa = purple_input_add(fd, PURPLE_INPUT_READ, connect_cb, + directconn); + + directconn->port = port; + directconn->c = 0; +} +#endif + +MsnDirectConn* +msn_directconn_new(MsnSlpLink *slplink) +{ + MsnDirectConn *directconn; + + directconn = g_new0(MsnDirectConn, 1); + + directconn->slplink = slplink; + + if (slplink->directconn != NULL) + purple_debug_info("msn", "got_transresp: LEAK\n"); + + slplink->directconn = directconn; + + return directconn; +} + +void +msn_directconn_destroy(MsnDirectConn *directconn) +{ + if (directconn->connect_data != NULL) + purple_proxy_connect_cancel(directconn->connect_data); + + if (directconn->inpa != 0) + purple_input_remove(directconn->inpa); + + if (directconn->fd >= 0) + close(directconn->fd); + + if (directconn->nonce != NULL) + g_free(directconn->nonce); + + directconn->slplink->directconn = NULL; + + g_free(directconn); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libpurple/protocols/msnp9/directconn.h Mon Nov 12 16:53:54 2007 +0000 @@ -0,0 +1,63 @@ +/** + * @file directconn.h MSN direct connection functions + * + * purple + * + * Purple is the legal property of its developers, whose names are too numerous + * to list here. Please refer to the COPYRIGHT file distributed with this + * source distribution. + * + * 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 02111-1301 USA + */ +#ifndef _MSN_DIRECTCONN_H_ +#define _MSN_DIRECTCONN_H_ + +typedef struct _MsnDirectConn MsnDirectConn; + +#include "slplink.h" +#include "slp.h" +#include "msg.h" + +struct _MsnDirectConn +{ + MsnSlpLink *slplink; + MsnSlpCall *initial_call; + + PurpleProxyConnectData *connect_data; + + gboolean acked; + + char *nonce; + + int fd; + + int port; + int inpa; + + int c; +}; + +MsnDirectConn *msn_directconn_new(MsnSlpLink *slplink); +gboolean msn_directconn_connect(MsnDirectConn *directconn, + const char *host, int port); +#if 0 +void msn_directconn_listen(MsnDirectConn *directconn); +#endif +void msn_directconn_send_msg(MsnDirectConn *directconn, MsnMessage *msg); +void msn_directconn_parse_nonce(MsnDirectConn *directconn, const char *nonce); +void msn_directconn_destroy(MsnDirectConn *directconn); +void msn_directconn_send_handshake(MsnDirectConn *directconn); + +#endif /* _MSN_DIRECTCONN_H_ */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libpurple/protocols/msnp9/error.c Mon Nov 12 16:53:54 2007 +0000 @@ -0,0 +1,269 @@ +/** + * @file error.c Error functions + * + * purple + * + * Purple is the legal property of its developers, whose names are too numerous + * to list here. Please refer to the COPYRIGHT file distributed with this + * source distribution. + * + * 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 02111-1301 USA + */ +#include "msn.h" +#include "error.h" + +const char * +msn_error_get_text(unsigned int type, gboolean *debug) +{ + static char msg[MSN_BUF_LEN]; + *debug = FALSE; + + switch (type) { + case 0: + g_snprintf(msg, sizeof(msg), + _("Unable to parse message")); + *debug = TRUE; + break; + case 200: + g_snprintf(msg, sizeof(msg), + _("Syntax Error (probably a client bug)")); + *debug = TRUE; + break; + case 201: + g_snprintf(msg, sizeof(msg), + _("Invalid e-mail address")); + break; + case 205: + g_snprintf(msg, sizeof(msg), _("User does not exist")); + break; + case 206: + g_snprintf(msg, sizeof(msg), + _("Fully qualified domain name missing")); + break; + case 207: + g_snprintf(msg, sizeof(msg), _("Already logged in")); + break; + case 208: + g_snprintf(msg, sizeof(msg), _("Invalid screen name")); + break; + case 209: + g_snprintf(msg, sizeof(msg), _("Invalid friendly name")); + break; + case 210: + g_snprintf(msg, sizeof(msg), _("List full")); + break; + case 215: + g_snprintf(msg, sizeof(msg), _("Already there")); + *debug = TRUE; + break; + case 216: + g_snprintf(msg, sizeof(msg), _("Not on list")); + break; + case 217: + g_snprintf(msg, sizeof(msg), _("User is offline")); + break; + case 218: + g_snprintf(msg, sizeof(msg), _("Already in the mode")); + *debug = TRUE; + break; + case 219: + g_snprintf(msg, sizeof(msg), _("Already in opposite list")); + *debug = TRUE; + break; + case 223: + g_snprintf(msg, sizeof(msg), _("Too many groups")); + break; + case 224: + g_snprintf(msg, sizeof(msg), _("Invalid group")); + break; + case 225: + g_snprintf(msg, sizeof(msg), _("User not in group")); + break; + case 229: + g_snprintf(msg, sizeof(msg), _("Group name too long")); + break; + case 230: + g_snprintf(msg, sizeof(msg), _("Cannot remove group zero")); + *debug = TRUE; + break; + case 231: + g_snprintf(msg, sizeof(msg), + _("Tried to add a user to a group " + "that doesn't exist")); + break; + case 280: + g_snprintf(msg, sizeof(msg), _("Switchboard failed")); + *debug = TRUE; + break; + case 281: + g_snprintf(msg, sizeof(msg), _("Notify transfer failed")); + *debug = TRUE; + break; + + case 300: + g_snprintf(msg, sizeof(msg), _("Required fields missing")); + *debug = TRUE; + break; + case 301: + g_snprintf(msg, sizeof(msg), _("Too many hits to a FND")); + *debug = TRUE; + break; + case 302: + g_snprintf(msg, sizeof(msg), _("Not logged in")); + break; + + case 500: + g_snprintf(msg, sizeof(msg), _("Service temporarily unavailable")); + break; + case 501: + g_snprintf(msg, sizeof(msg), _("Database server error")); + *debug = TRUE; + break; + case 502: + g_snprintf(msg, sizeof(msg), _("Command disabled")); + *debug = TRUE; + break; + case 510: + g_snprintf(msg, sizeof(msg), _("File operation error")); + *debug = TRUE; + break; + case 520: + g_snprintf(msg, sizeof(msg), _("Memory allocation error")); + *debug = TRUE; + break; + case 540: + g_snprintf(msg, sizeof(msg), _("Wrong CHL value sent to server")); + *debug = TRUE; + break; + + case 600: + g_snprintf(msg, sizeof(msg), _("Server busy")); + break; + case 601: + g_snprintf(msg, sizeof(msg), _("Server unavailable")); + break; + case 602: + g_snprintf(msg, sizeof(msg), _("Peer notification server down")); + *debug = TRUE; + break; + case 603: + g_snprintf(msg, sizeof(msg), _("Database connect error")); + *debug = TRUE; + break; + case 604: + g_snprintf(msg, sizeof(msg), + _("Server is going down (abandon ship)")); + break; + case 605: + g_snprintf(msg, sizeof(msg), _("Server unavailable")); + break; + + case 707: + g_snprintf(msg, sizeof(msg), _("Error creating connection")); + *debug = TRUE; + break; + case 710: + g_snprintf(msg, sizeof(msg), + _("CVR parameters are either unknown or not allowed")); + *debug = TRUE; + break; + case 711: + g_snprintf(msg, sizeof(msg), _("Unable to write")); + break; + case 712: + g_snprintf(msg, sizeof(msg), _("Session overload")); + *debug = TRUE; + break; + case 713: + g_snprintf(msg, sizeof(msg), _("User is too active")); + break; + case 714: + g_snprintf(msg, sizeof(msg), _("Too many sessions")); + break; + case 715: + g_snprintf(msg, sizeof(msg), _("Passport not verified")); + break; + case 717: + g_snprintf(msg, sizeof(msg), _("Bad friend file")); + *debug = TRUE; + break; + case 731: + g_snprintf(msg, sizeof(msg), _("Not expected")); + *debug = TRUE; + break; + + case 800: + g_snprintf(msg, sizeof(msg), + _("Friendly name changes too rapidly")); + break; + + case 910: + case 912: + case 918: + case 919: + case 921: + case 922: + g_snprintf(msg, sizeof(msg), _("Server too busy")); + break; + case 911: + case 917: + g_snprintf(msg, sizeof(msg), _("Authentication failed")); + break; + case 913: + g_snprintf(msg, sizeof(msg), _("Not allowed when offline")); + break; + case 914: + case 915: + case 916: + g_snprintf(msg, sizeof(msg), _("Server unavailable")); + break; + case 920: + g_snprintf(msg, sizeof(msg), _("Not accepting new users")); + break; + case 923: + g_snprintf(msg, sizeof(msg), + _("Kids Passport without parental consent")); + break; + case 924: + g_snprintf(msg, sizeof(msg), + _("Passport account not yet verified")); + break; + case 928: + g_snprintf(msg, sizeof(msg), _("Bad ticket")); + *debug = TRUE; + break; + + default: + g_snprintf(msg, sizeof(msg), _("Unknown Error Code %d"), type); + *debug = TRUE; + break; + } + + return msg; +} + +void +msn_error_handle(MsnSession *session, unsigned int type) +{ + char buf[MSN_BUF_LEN]; + gboolean debug; + + g_snprintf(buf, sizeof(buf), _("MSN Error: %s\n"), + msn_error_get_text(type, &debug)); + if (debug) + purple_debug_warning("msn", "error %d: %s\n", type, buf); + else + purple_notify_error(session->account->gc, NULL, buf, NULL); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libpurple/protocols/msnp9/error.h Mon Nov 12 16:53:54 2007 +0000 @@ -0,0 +1,47 @@ +/** + * @file error.h Error functions + * + * purple + * + * Purple is the legal property of its developers, whose names are too numerous + * to list here. Please refer to the COPYRIGHT file distributed with this + * source distribution. + * + * 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 02111-1301 USA + */ +#ifndef _MSN_ERROR_H_ +#define _MSN_ERROR_H_ + +#include "session.h" + +/** + * Returns the string representation of an error type. + * + * @param type The error type. + * @param debug Whether this should be treated as a debug log message or a user-visible error + * + * @return The string representation of the error type. + */ +const char *msn_error_get_text(unsigned int type, gboolean *debug); + +/** + * Handles an error. + * + * @param session The current session. + * @param type The error type. + */ +void msn_error_handle(MsnSession *session, unsigned int type); + +#endif /* _MSN_ERROR_H_ */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libpurple/protocols/msnp9/group.c Mon Nov 12 16:53:54 2007 +0000 @@ -0,0 +1,89 @@ +/** + * @file group.c Group functions + * + * purple + * + * Purple is the legal property of its developers, whose names are too numerous + * to list here. Please refer to the COPYRIGHT file distributed with this + * source distribution. + * + * 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 02111-1301 USA + */ +#include "msn.h" +#include "group.h" + +MsnGroup * +msn_group_new(MsnUserList *userlist, int id, const char *name) +{ + MsnGroup *group; + + g_return_val_if_fail(id >= 0, NULL); + g_return_val_if_fail(name != NULL, NULL); + + group = g_new0(MsnGroup, 1); + + msn_userlist_add_group(userlist, group); + + group->id = id; + group->name = g_strdup(name); + + return group; +} + +void +msn_group_destroy(MsnGroup *group) +{ + g_return_if_fail(group != NULL); + + g_free(group->name); + g_free(group); +} + +void +msn_group_set_id(MsnGroup *group, int id) +{ + g_return_if_fail(group != NULL); + g_return_if_fail(id >= 0); + + group->id = id; +} + +void +msn_group_set_name(MsnGroup *group, const char *name) +{ + g_return_if_fail(group != NULL); + g_return_if_fail(name != NULL); + + if (group->name != NULL) + g_free(group->name); + + group->name = g_strdup(name); +} + +int +msn_group_get_id(const MsnGroup *group) +{ + g_return_val_if_fail(group != NULL, -1); + + return group->id; +} + +const char * +msn_group_get_name(const MsnGroup *group) +{ + g_return_val_if_fail(group != NULL, NULL); + + return group->name; +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libpurple/protocols/msnp9/group.h Mon Nov 12 16:53:54 2007 +0000 @@ -0,0 +1,103 @@ +/** + * @file group.h Group functions + * + * purple + * + * Purple is the legal property of its developers, whose names are too numerous + * to list here. Please refer to the COPYRIGHT file distributed with this + * source distribution. + * + * 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 02111-1301 USA + */ +#ifndef _MSN_GROUP_H_ +#define _MSN_GROUP_H_ + +typedef struct _MsnGroup MsnGroup; + +#include <stdio.h> + +#include "session.h" +#include "user.h" + +#include "userlist.h" + +/** + * A group. + */ +struct _MsnGroup +{ + MsnSession *session; /**< The MSN session. */ + + int id; /**< The group ID. */ + char *name; /**< The name of the group. */ +}; + +/**************************************************************************/ +/** @name Group API */ +/**************************************************************************/ +/*@{*/ + +/** + * Creates a new group structure. + * + * @param session The MSN session. + * @param id The group ID. + * @param name The name of the group. + * + * @return A new group structure. + */ +MsnGroup *msn_group_new(MsnUserList *userlist, int id, const char *name); + +/** + * Destroys a group structure. + * + * @param group The group to destroy. + */ +void msn_group_destroy(MsnGroup *group); + +/** + * Sets the ID for a group. + * + * @param group The group. + * @param id The ID. + */ +void msn_group_set_id(MsnGroup *group, int id); + +/** + * Sets the name for a group. + * + * @param group The group. + * @param name The name. + */ +void msn_group_set_name(MsnGroup *group, const char *name); + +/** + * Returns the ID for a group. + * + * @param group The group. + * + * @return The ID. + */ +int msn_group_get_id(const MsnGroup *group); + +/** + * Returns the name for a group. + * + * @param group The group. + * + * @return The name. + */ +const char *msn_group_get_name(const MsnGroup *group); +#endif /* _MSN_GROUP_H_ */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libpurple/protocols/msnp9/history.c Mon Nov 12 16:53:54 2007 +0000 @@ -0,0 +1,86 @@ +/** + * @file history.c MSN history functions + * + * purple + * + * Purple is the legal property of its developers, whose names are too numerous + * to list here. Please refer to the COPYRIGHT file distributed with this + * source distribution. + * + * 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 02111-1301 USA + */ +#include "msn.h" +#include "history.h" + +MsnHistory * +msn_history_new(void) +{ + MsnHistory *history = g_new0(MsnHistory, 1); + + history->trId = 1; + + history->queue = g_queue_new(); + + return history; +} + +void +msn_history_destroy(MsnHistory *history) +{ + MsnTransaction *trans; + + while ((trans = g_queue_pop_head(history->queue)) != NULL) + msn_transaction_destroy(trans); + + g_queue_free(history->queue); + g_free(history); +} + +MsnTransaction * +msn_history_find(MsnHistory *history, unsigned int trId) +{ + MsnTransaction *trans; + GList *list; + + for (list = history->queue->head; list != NULL; list = list->next) + { + trans = list->data; + if (trans->trId == trId) + return trans; + } + + return NULL; +} + +void +msn_history_add(MsnHistory *history, MsnTransaction *trans) +{ + GQueue *queue; + + g_return_if_fail(history != NULL); + g_return_if_fail(trans != NULL); + + queue = history->queue; + + trans->trId = history->trId++; + + g_queue_push_tail(queue, trans); + + if (queue->length > MSN_HIST_ELEMS) + { + trans = g_queue_pop_head(queue); + msn_transaction_destroy(trans); + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libpurple/protocols/msnp9/history.h Mon Nov 12 16:53:54 2007 +0000 @@ -0,0 +1,47 @@ +/** + * @file history.h MSN history functions + * + * purple + * + * Purple is the legal property of its developers, whose names are too numerous + * to list here. Please refer to the COPYRIGHT file distributed with this + * source distribution. + * + * 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 02111-1301 USA + */ +#ifndef _MSN_HISTORY_H +#define _MSN_HISTORY_H + +#define MSN_HIST_ELEMS 0x30 + +typedef struct _MsnHistory MsnHistory; + +#include "transaction.h" + +/** + * The history. + */ +struct _MsnHistory +{ + GQueue *queue; + unsigned int trId; +}; + +MsnHistory *msn_history_new(void); +void msn_history_destroy(MsnHistory *history); +MsnTransaction *msn_history_find(MsnHistory *history, unsigned int triId); +void msn_history_add(MsnHistory *history, MsnTransaction *trans); + +#endif /* _MSN_HISTORY_H */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libpurple/protocols/msnp9/httpconn.c Mon Nov 12 16:53:54 2007 +0000 @@ -0,0 +1,775 @@ +/** + * @file httpmethod.c HTTP connection method + * + * purple + * + * Purple is the legal property of its developers, whose names are too numerous + * to list here. Please refer to the COPYRIGHT file distributed with this + * source distribution. + * + * 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 02111-1301 USA + */ +#include "msn.h" +#include "debug.h" +#include "httpconn.h" + +typedef struct +{ + MsnHttpConn *httpconn; + char *body; + size_t body_len; +} MsnHttpQueueData; + +static void +msn_httpconn_process_queue(MsnHttpConn *httpconn) +{ + httpconn->waiting_response = FALSE; + + if (httpconn->queue != NULL) + { + MsnHttpQueueData *queue_data; + + queue_data = (MsnHttpQueueData *)httpconn->queue->data; + + httpconn->queue = g_list_remove(httpconn->queue, queue_data); + + msn_httpconn_write(queue_data->httpconn, + queue_data->body, + queue_data->body_len); + + g_free(queue_data->body); + g_free(queue_data); + } +} + +static gboolean +msn_httpconn_parse_data(MsnHttpConn *httpconn, const char *buf, + size_t size, char **ret_buf, size_t *ret_size, + gboolean *error) +{ + const char *s, *c; + char *header, *body; + const char *body_start; + char *tmp; + size_t body_len = 0; + gboolean wasted = FALSE; + + g_return_val_if_fail(httpconn != NULL, FALSE); + g_return_val_if_fail(buf != NULL, FALSE); + g_return_val_if_fail(size > 0, FALSE); + g_return_val_if_fail(ret_buf != NULL, FALSE); + g_return_val_if_fail(ret_size != NULL, FALSE); + g_return_val_if_fail(error != NULL, FALSE); + +#if 0 + purple_debug_info("msn", "HTTP: parsing data {%s}\n", buf); +#endif + + /* Healthy defaults. */ + body = NULL; + + *ret_buf = NULL; + *ret_size = 0; + *error = FALSE; + + /* First, some tests to see if we have a full block of stuff. */ + if (((strncmp(buf, "HTTP/1.1 200 OK\r\n", 17) != 0) && + (strncmp(buf, "HTTP/1.1 100 Continue\r\n", 23) != 0)) && + ((strncmp(buf, "HTTP/1.0 200 OK\r\n", 17) != 0) && + (strncmp(buf, "HTTP/1.0 100 Continue\r\n", 23) != 0))) + { + *error = TRUE; + + return FALSE; + } + + if (strncmp(buf, "HTTP/1.1 100 Continue\r\n", 23) == 0) + { + if ((s = strstr(buf, "\r\n\r\n")) == NULL) + return FALSE; + + s += 4; + + if (*s == '\0') + { + *ret_buf = g_strdup(""); + *ret_size = 0; + + msn_httpconn_process_queue(httpconn); + + return TRUE; + } + + buf = s; + size -= (s - buf); + } + + if ((s = strstr(buf, "\r\n\r\n")) == NULL) + /* Need to wait for the full HTTP header to arrive */ + return FALSE; + + s += 4; /* Skip \r\n */ + header = g_strndup(buf, s - buf); + body_start = s; + body_len = size - (body_start - buf); + + if ((s = purple_strcasestr(header, "Content-Length: ")) != NULL) + { + int tmp_len; + + s += strlen("Content-Length: "); + + if ((c = strchr(s, '\r')) == NULL) + { + g_free(header); + + return FALSE; + } + + tmp = g_strndup(s, c - s); + tmp_len = atoi(tmp); + g_free(tmp); + + if (body_len != tmp_len) + { + /* Need to wait for the full packet to arrive */ + + g_free(header); + +#if 0 + purple_debug_warning("msn", + "body length (%d) != content length (%d)\n", + body_len, tmp_len); +#endif + + return FALSE; + } + } + + body = g_malloc0(body_len + 1); + memcpy(body, body_start, body_len); + +#ifdef MSN_DEBUG_HTTP + purple_debug_misc("msn", "Incoming HTTP buffer (header): {%s\r\n}\n", + header); +#endif + + /* Now we should be able to process the data. */ + if ((s = purple_strcasestr(header, "X-MSN-Messenger: ")) != NULL) + { + char *full_session_id, *gw_ip, *session_action; + char *t, *session_id; + char **elems, **cur, **tokens; + + full_session_id = gw_ip = session_action = NULL; + + s += strlen("X-MSN-Messenger: "); + + if ((c = strchr(s, '\r')) == NULL) + { + msn_session_set_error(httpconn->session, + MSN_ERROR_HTTP_MALFORMED, NULL); + purple_debug_error("msn", "Malformed X-MSN-Messenger field.\n{%s}\n", + buf); + + g_free(body); + return FALSE; + } + + tmp = g_strndup(s, c - s); + + elems = g_strsplit(tmp, "; ", 0); + + for (cur = elems; *cur != NULL; cur++) + { + tokens = g_strsplit(*cur, "=", 2); + + if (strcmp(tokens[0], "SessionID") == 0) + full_session_id = tokens[1]; + else if (strcmp(tokens[0], "GW-IP") == 0) + gw_ip = tokens[1]; + else if (strcmp(tokens[0], "Session") == 0) + session_action = tokens[1]; + else + g_free(tokens[1]); + + g_free(tokens[0]); + /* Don't free each of the tokens, only the array. */ + g_free(tokens); + } + + g_strfreev(elems); + + g_free(tmp); + + if ((session_action != NULL) && (strcmp(session_action, "close") == 0)) + wasted = TRUE; + + g_free(session_action); + + t = strchr(full_session_id, '.'); + session_id = g_strndup(full_session_id, t - full_session_id); + + if (!wasted) + { + g_free(httpconn->full_session_id); + httpconn->full_session_id = full_session_id; + + g_free(httpconn->session_id); + httpconn->session_id = session_id; + + g_free(httpconn->host); + httpconn->host = gw_ip; + } + else + { + MsnServConn *servconn; + + /* It's going to die. */ + /* poor thing */ + + servconn = httpconn->servconn; + + /* I'll be honest, I don't fully understand all this, but this + * causes crashes, Stu. */ + /* if (servconn != NULL) + servconn->wasted = TRUE; */ + + g_free(full_session_id); + g_free(session_id); + g_free(gw_ip); + } + } + + g_free(header); + + *ret_buf = body; + *ret_size = body_len; + + msn_httpconn_process_queue(httpconn); + + return TRUE; +} + +static void +read_cb(gpointer data, gint source, PurpleInputCondition cond) +{ + MsnHttpConn *httpconn; + MsnServConn *servconn; + MsnSession *session; + char buf[MSN_BUF_LEN]; + char *cur, *end, *old_rx_buf; + int len, cur_len; + char *result_msg = NULL; + size_t result_len = 0; + gboolean error = FALSE; + + httpconn = data; + servconn = NULL; + session = httpconn->session; + + len = read(httpconn->fd, buf, sizeof(buf) - 1); + + if (len < 0 && errno == EAGAIN) + return; + else if (len <= 0) + { + purple_debug_error("msn", "HTTP: Read error\n"); + msn_servconn_got_error(httpconn->servconn, MSN_SERVCONN_ERROR_READ); + + return; + } + + buf[len] = '\0'; + + httpconn->rx_buf = g_realloc(httpconn->rx_buf, len + httpconn->rx_len + 1); + memcpy(httpconn->rx_buf + httpconn->rx_len, buf, len + 1); + httpconn->rx_len += len; + + if (!msn_httpconn_parse_data(httpconn, httpconn->rx_buf, httpconn->rx_len, + &result_msg, &result_len, &error)) + { + /* Either we must wait for more input, or something went wrong */ + if (error) + msn_servconn_got_error(httpconn->servconn, MSN_SERVCONN_ERROR_READ); + + return; + } + + httpconn->servconn->processing = FALSE; + + servconn = httpconn->servconn; + + if (error) + { + purple_debug_error("msn", "HTTP: Special error\n"); + msn_servconn_got_error(httpconn->servconn, MSN_SERVCONN_ERROR_READ); + + return; + } + + g_free(httpconn->rx_buf); + httpconn->rx_buf = NULL; + httpconn->rx_len = 0; + + if (result_len == 0) + { + /* Nothing to do here */ +#if 0 + purple_debug_info("msn", "HTTP: nothing to do here\n"); +#endif + g_free(result_msg); + return; + } + + g_free(servconn->rx_buf); + servconn->rx_buf = result_msg; + servconn->rx_len = result_len; + + end = old_rx_buf = servconn->rx_buf; + + servconn->processing = TRUE; + + do + { + cur = end; + + if (servconn->payload_len) + { + if (servconn->payload_len > servconn->rx_len) + /* The payload is still not complete. */ + break; + + cur_len = servconn->payload_len; + end += cur_len; + } + else + { + end = strstr(cur, "\r\n"); + + if (end == NULL) + /* The command is still not complete. */ + break; + + *end = '\0'; + end += 2; + cur_len = end - cur; + } + + servconn->rx_len -= cur_len; + + if (servconn->payload_len) + { + msn_cmdproc_process_payload(servconn->cmdproc, cur, cur_len); + servconn->payload_len = 0; + } + else + { + msn_cmdproc_process_cmd_text(servconn->cmdproc, cur); + } + } while (servconn->connected && servconn->rx_len > 0); + + if (servconn->connected) + { + if (servconn->rx_len > 0) + servconn->rx_buf = g_memdup(cur, servconn->rx_len); + else + servconn->rx_buf = NULL; + } + + servconn->processing = FALSE; + + if (servconn->wasted) + msn_servconn_destroy(servconn); + + g_free(old_rx_buf); +} + +static void +httpconn_write_cb(gpointer data, gint source, PurpleInputCondition cond) +{ + MsnHttpConn *httpconn; + int ret, writelen; + + httpconn = data; + writelen = purple_circ_buffer_get_max_read(httpconn->tx_buf); + + if (writelen == 0) + { + purple_input_remove(httpconn->tx_handler); + httpconn->tx_handler = 0; + return; + } + + ret = write(httpconn->fd, httpconn->tx_buf->outptr, writelen); + if (ret <= 0) + { + if ((errno == EAGAIN) || (errno == EWOULDBLOCK)) + /* No worries */ + return; + + /* Error! */ + msn_servconn_got_error(httpconn->servconn, MSN_SERVCONN_ERROR_WRITE); + return; + } + + purple_circ_buffer_mark_read(httpconn->tx_buf, ret); + + /* TODO: I don't think these 2 lines are needed. Remove them? */ + if (ret == writelen) + httpconn_write_cb(data, source, cond); +} + +static gboolean +write_raw(MsnHttpConn *httpconn, const char *data, size_t data_len) +{ + ssize_t res; /* result of the write operation */ + + if (httpconn->tx_handler == 0) + res = write(httpconn->fd, data, data_len); + else + { + res = -1; + errno = EAGAIN; + } + + if ((res <= 0) && ((errno != EAGAIN) && (errno != EWOULDBLOCK))) + { + msn_servconn_got_error(httpconn->servconn, MSN_SERVCONN_ERROR_WRITE); + return FALSE; + } + + if (res < 0 || res < data_len) + { + if (res < 0) + res = 0; + if (httpconn->tx_handler == 0 && httpconn->fd) + httpconn->tx_handler = purple_input_add(httpconn->fd, + PURPLE_INPUT_WRITE, httpconn_write_cb, httpconn); + purple_circ_buffer_append(httpconn->tx_buf, data + res, + data_len - res); + } + + return TRUE; +} + +static char * +msn_httpconn_proxy_auth(MsnHttpConn *httpconn) +{ + PurpleAccount *account; + PurpleProxyInfo *gpi; + const char *username, *password; + char *auth = NULL; + + account = httpconn->session->account; + + gpi = purple_proxy_get_setup(account); + + if (gpi == NULL || !(purple_proxy_info_get_type(gpi) == PURPLE_PROXY_HTTP || + purple_proxy_info_get_type(gpi) == PURPLE_PROXY_USE_ENVVAR)) + return NULL; + + username = purple_proxy_info_get_username(gpi); + password = purple_proxy_info_get_password(gpi); + + if (username != NULL) { + char *tmp; + auth = g_strdup_printf("%s:%s", username, password ? password : ""); + tmp = purple_base64_encode((const guchar *)auth, strlen(auth)); + g_free(auth); + auth = g_strdup_printf("Proxy-Authorization: Basic %s\r\n", tmp); + g_free(tmp); + } + + return auth; +} + +static gboolean +msn_httpconn_poll(gpointer data) +{ + MsnHttpConn *httpconn; + char *header; + char *auth; + + httpconn = data; + + g_return_val_if_fail(httpconn != NULL, FALSE); + + if ((httpconn->host == NULL) || (httpconn->full_session_id == NULL)) + { + /* There's no need to poll if the session is not fully established */ + return TRUE; + } + + if (httpconn->waiting_response) + { + /* There's no need to poll if we're already waiting for a response */ + return TRUE; + } + + auth = msn_httpconn_proxy_auth(httpconn); + + header = g_strdup_printf( + "POST http://%s/gateway/gateway.dll?Action=poll&SessionID=%s HTTP/1.1\r\n" + "Accept: */*\r\n" + "Accept-Language: en-us\r\n" + "User-Agent: MSMSGS\r\n" + "Host: %s\r\n" + "Proxy-Connection: Keep-Alive\r\n" + "%s" /* Proxy auth */ + "Connection: Keep-Alive\r\n" + "Pragma: no-cache\r\n" + "Content-Type: application/x-msn-messenger\r\n" + "Content-Length: 0\r\n\r\n", + httpconn->host, + httpconn->full_session_id, + httpconn->host, + auth ? auth : ""); + + g_free(auth); + + if (write_raw(httpconn, header, strlen(header))) + httpconn->waiting_response = TRUE; + + g_free(header); + + return TRUE; +} + +ssize_t +msn_httpconn_write(MsnHttpConn *httpconn, const char *body, size_t body_len) +{ + char *params; + char *data; + int header_len; + char *auth; + const char *server_types[] = { "NS", "SB" }; + const char *server_type; + char *host; + MsnServConn *servconn; + + /* TODO: remove http data from servconn */ + + g_return_val_if_fail(httpconn != NULL, 0); + g_return_val_if_fail(body != NULL, 0); + g_return_val_if_fail(body_len > 0, 0); + + servconn = httpconn->servconn; + + if (httpconn->waiting_response) + { + MsnHttpQueueData *queue_data = g_new0(MsnHttpQueueData, 1); + + queue_data->httpconn = httpconn; + queue_data->body = g_memdup(body, body_len); + queue_data->body_len = body_len; + + httpconn->queue = g_list_append(httpconn->queue, queue_data); + + return body_len; + } + + server_type = server_types[servconn->type]; + + if (httpconn->virgin) + { + host = "gateway.messenger.hotmail.com"; + + /* The first time servconn->host is the host we should connect to. */ + params = g_strdup_printf("Action=open&Server=%s&IP=%s", + server_type, + servconn->host); + httpconn->virgin = FALSE; + } + else + { + /* The rest of the times servconn->host is the gateway host. */ + host = httpconn->host; + + if (host == NULL || httpconn->full_session_id == NULL) + { + purple_debug_warning("msn", "Attempted HTTP write before session is established\n"); + return -1; + } + + params = g_strdup_printf("SessionID=%s", + httpconn->full_session_id); + } + + auth = msn_httpconn_proxy_auth(httpconn); + + data = g_strdup_printf( + "POST http://%s/gateway/gateway.dll?%s HTTP/1.1\r\n" + "Accept: */*\r\n" + "Accept-Language: en-us\r\n" + "User-Agent: MSMSGS\r\n" + "Host: %s\r\n" + "Proxy-Connection: Keep-Alive\r\n" + "%s" /* Proxy auth */ + "Connection: Keep-Alive\r\n" + "Pragma: no-cache\r\n" + "Content-Type: application/x-msn-messenger\r\n" + "Content-Length: %d\r\n\r\n", + host, + params, + host, + auth ? auth : "", + (int) body_len); + + g_free(params); + + g_free(auth); + + header_len = strlen(data); + data = g_realloc(data, header_len + body_len); + memcpy(data + header_len, body, body_len); + + if (write_raw(httpconn, data, header_len + body_len)) + httpconn->waiting_response = TRUE; + + g_free(data); + + return body_len; +} + +MsnHttpConn * +msn_httpconn_new(MsnServConn *servconn) +{ + MsnHttpConn *httpconn; + + g_return_val_if_fail(servconn != NULL, NULL); + + httpconn = g_new0(MsnHttpConn, 1); + + purple_debug_info("msn", "new httpconn (%p)\n", httpconn); + + /* TODO: Remove this */ + httpconn->session = servconn->session; + + httpconn->servconn = servconn; + + httpconn->tx_buf = purple_circ_buffer_new(MSN_BUF_LEN); + httpconn->tx_handler = 0; + + return httpconn; +} + +void +msn_httpconn_destroy(MsnHttpConn *httpconn) +{ + g_return_if_fail(httpconn != NULL); + + purple_debug_info("msn", "destroy httpconn (%p)\n", httpconn); + + if (httpconn->connected) + msn_httpconn_disconnect(httpconn); + + g_free(httpconn->full_session_id); + + g_free(httpconn->session_id); + + g_free(httpconn->host); + + purple_circ_buffer_destroy(httpconn->tx_buf); + if (httpconn->tx_handler > 0) + purple_input_remove(httpconn->tx_handler); + + g_free(httpconn); +} + +static void +connect_cb(gpointer data, gint source, const gchar *error_message) +{ + MsnHttpConn *httpconn; + + httpconn = data; + httpconn->connect_data = NULL; + httpconn->fd = source; + + if (source >= 0) + { + httpconn->inpa = purple_input_add(httpconn->fd, PURPLE_INPUT_READ, + read_cb, data); + + httpconn->timer = purple_timeout_add(2000, msn_httpconn_poll, httpconn); + + msn_httpconn_process_queue(httpconn); + } + else + { + purple_debug_error("msn", "HTTP: Connection error\n"); + msn_servconn_got_error(httpconn->servconn, MSN_SERVCONN_ERROR_CONNECT); + } +} + +gboolean +msn_httpconn_connect(MsnHttpConn *httpconn, const char *host, int port) +{ + g_return_val_if_fail(httpconn != NULL, FALSE); + g_return_val_if_fail(host != NULL, FALSE); + g_return_val_if_fail(port > 0, FALSE); + + if (httpconn->connected) + msn_httpconn_disconnect(httpconn); + + httpconn->connect_data = purple_proxy_connect(NULL, httpconn->session->account, + host, 80, connect_cb, httpconn); + + if (httpconn->connect_data != NULL) + { + httpconn->waiting_response = TRUE; + httpconn->connected = TRUE; + } + + return httpconn->connected; +} + +void +msn_httpconn_disconnect(MsnHttpConn *httpconn) +{ + g_return_if_fail(httpconn != NULL); + + if (!httpconn->connected) + return; + + if (httpconn->connect_data != NULL) + { + purple_proxy_connect_cancel(httpconn->connect_data); + httpconn->connect_data = NULL; + } + + if (httpconn->timer) + { + purple_timeout_remove(httpconn->timer); + httpconn->timer = 0; + } + + if (httpconn->inpa > 0) + { + purple_input_remove(httpconn->inpa); + httpconn->inpa = 0; + } + + close(httpconn->fd); + httpconn->fd = -1; + + g_free(httpconn->rx_buf); + httpconn->rx_buf = NULL; + httpconn->rx_len = 0; + + httpconn->connected = FALSE; + + /* msn_servconn_disconnect(httpconn->servconn); */ +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libpurple/protocols/msnp9/httpconn.h Mon Nov 12 16:53:54 2007 +0000 @@ -0,0 +1,111 @@ +/** + * @file httpconn.h HTTP connection + * + * purple + * + * Purple is the legal property of its developers, whose names are too numerous + * to list here. Please refer to the COPYRIGHT file distributed with this + * source distribution. + * + * 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 02111-1301 USA + */ +#ifndef _MSN_HTTPCONN_H_ +#define _MSN_HTTPCONN_H_ + +typedef struct _MsnHttpConn MsnHttpConn; + +#include "circbuffer.h" +#include "servconn.h" + +/** + * An HTTP Connection. + */ +struct _MsnHttpConn +{ + MsnSession *session; /**< The MSN Session. */ + MsnServConn *servconn; /**< The connection object. */ + + PurpleProxyConnectData *connect_data; + + char *full_session_id; /**< The full session id. */ + char *session_id; /**< The trimmed session id. */ + + int timer; /**< The timer for polling. */ + + gboolean waiting_response; /**< The flag that states if we are waiting + a response from the server. */ + gboolean connected; /**< The flag that states if the connection is on. */ + gboolean virgin; /**< The flag that states if this connection + should specify the host (not gateway) to + connect to. */ + + char *host; /**< The HTTP gateway host. */ + GList *queue; /**< The queue of data chunks to write. */ + + int fd; /**< The connection's file descriptor. */ + guint inpa; /**< The connection's input handler. */ + + char *rx_buf; /**< The receive buffer. */ + int rx_len; /**< The receive buffer length. */ + + PurpleCircBuffer *tx_buf; + guint tx_handler; +}; + +/** + * Creates a new HTTP connection object. + * + * @param servconn The connection object. + * + * @return The new object. + */ +MsnHttpConn *msn_httpconn_new(MsnServConn *servconn); + +/** + * Destroys an HTTP connection object. + * + * @param httpconn The HTTP connection object. + */ +void msn_httpconn_destroy(MsnHttpConn *httpconn); + +/** + * Writes a chunk of data to the HTTP connection. + * + * @param servconn The server connection. + * @param data The data to write. + * @param data_len The size of the data to write. + * + * @return The number of bytes written. + */ +ssize_t msn_httpconn_write(MsnHttpConn *httpconn, const char *data, size_t data_len); + +/** + * Connects the HTTP connection object to a host. + * + * @param httpconn The HTTP connection object. + * @param host The host to connect to. + * @param port The port to connect to. + */ +gboolean msn_httpconn_connect(MsnHttpConn *httpconn, + const char *host, int port); + +/** + * Disconnects the HTTP connection object. + * + * @param httpconn The HTTP connection object. + */ +void msn_httpconn_disconnect(MsnHttpConn *httpconn); + +#endif /* _MSN_HTTPCONN_H_ */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libpurple/protocols/msnp9/msg.c Mon Nov 12 16:53:54 2007 +0000 @@ -0,0 +1,787 @@ +/** + * @file msg.c Message functions + * + * purple + * + * Purple is the legal property of its developers, whose names are too numerous + * to list here. Please refer to the COPYRIGHT file distributed with this + * source distribution. + * + * 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 02111-1301 USA + */ +#include "msn.h" +#include "msg.h" + +MsnMessage * +msn_message_new(MsnMsgType type) +{ + MsnMessage *msg; + + msg = g_new0(MsnMessage, 1); + msg->type = type; + +#ifdef MSN_DEBUG_MSG + purple_debug_info("msn", "message new (%p)(%d)\n", msg, type); +#endif + + msg->attr_table = g_hash_table_new_full(g_str_hash, g_str_equal, + g_free, g_free); + + msn_message_ref(msg); + + return msg; +} + +void +msn_message_destroy(MsnMessage *msg) +{ + g_return_if_fail(msg != NULL); + + if (msg->ref_count > 0) + { + msn_message_unref(msg); + + return; + } + +#ifdef MSN_DEBUG_MSG + purple_debug_info("msn", "message destroy (%p)\n", msg); +#endif + + if (msg->remote_user != NULL) + g_free(msg->remote_user); + + if (msg->body != NULL) + g_free(msg->body); + + if (msg->content_type != NULL) + g_free(msg->content_type); + + if (msg->charset != NULL) + g_free(msg->charset); + + g_hash_table_destroy(msg->attr_table); + g_list_free(msg->attr_list); + + g_free(msg); +} + +MsnMessage * +msn_message_ref(MsnMessage *msg) +{ + g_return_val_if_fail(msg != NULL, NULL); + + msg->ref_count++; + +#ifdef MSN_DEBUG_MSG + purple_debug_info("msn", "message ref (%p)[%d]\n", msg, msg->ref_count); +#endif + + return msg; +} + +MsnMessage * +msn_message_unref(MsnMessage *msg) +{ + g_return_val_if_fail(msg != NULL, NULL); + g_return_val_if_fail(msg->ref_count > 0, NULL); + + msg->ref_count--; + +#ifdef MSN_DEBUG_MSG + purple_debug_info("msn", "message unref (%p)[%d]\n", msg, msg->ref_count); +#endif + + if (msg->ref_count == 0) + { + msn_message_destroy(msg); + + return NULL; + } + + return msg; +} + +MsnMessage * +msn_message_new_plain(const char *message) +{ + MsnMessage *msg; + char *message_cr; + + msg = msn_message_new(MSN_MSG_TEXT); + msn_message_set_attr(msg, "User-Agent", PACKAGE_NAME "/" DISPLAY_VERSION); + msn_message_set_content_type(msg, "text/plain"); + msn_message_set_charset(msg, "UTF-8"); + msn_message_set_flag(msg, 'A'); + msn_message_set_attr(msg, "X-MMS-IM-Format", + "FN=MS%20Sans%20Serif; EF=; CO=0; PF=0"); + + message_cr = purple_str_add_cr(message); + msn_message_set_bin_data(msg, message_cr, strlen(message_cr)); + g_free(message_cr); + + return msg; +} + +MsnMessage * +msn_message_new_msnslp(void) +{ + MsnMessage *msg; + + msg = msn_message_new(MSN_MSG_SLP); + + msn_message_set_attr(msg, "User-Agent", NULL); + + msg->msnslp_message = TRUE; + + msn_message_set_flag(msg, 'D'); + msn_message_set_content_type(msg, "application/x-msnmsgrp2p"); + + return msg; +} + +MsnMessage * +msn_message_new_nudge(void) +{ + MsnMessage *msg; + + msg = msn_message_new(MSN_MSG_NUDGE); + msn_message_set_content_type(msg, "text/x-msnmsgr-datacast\r\n"); + msn_message_set_flag(msg, 'N'); + msn_message_set_attr(msg,"ID","1\r\n"); + + return msg; +} + +void +msn_message_parse_slp_body(MsnMessage *msg, const char *body, size_t len) +{ + MsnSlpHeader header; + const char *tmp; + int body_len; + + tmp = body; + + if (len < sizeof(header)) { + g_return_if_reached(); + } + + /* Import the header. */ + memcpy(&header, tmp, sizeof(header)); + tmp += sizeof(header); + + msg->msnslp_header.session_id = GUINT32_FROM_LE(header.session_id); + msg->msnslp_header.id = GUINT32_FROM_LE(header.id); + msg->msnslp_header.offset = GUINT64_FROM_LE(header.offset); + msg->msnslp_header.total_size = GUINT64_FROM_LE(header.total_size); + msg->msnslp_header.length = GUINT32_FROM_LE(header.length); + msg->msnslp_header.flags = GUINT32_FROM_LE(header.flags); + msg->msnslp_header.ack_id = GUINT32_FROM_LE(header.ack_id); + msg->msnslp_header.ack_sub_id = GUINT32_FROM_LE(header.ack_sub_id); + msg->msnslp_header.ack_size = GUINT64_FROM_LE(header.ack_size); + + /* Import the body. */ + body_len = len - (tmp - body); + /* msg->body_len = msg->msnslp_header.length; */ + + if (body_len > 0) { + msg->body_len = len - (tmp - body); + msg->body = g_malloc0(msg->body_len + 1); + memcpy(msg->body, tmp, msg->body_len); + tmp += body_len; + } +} + +void +msn_message_parse_payload(MsnMessage *msg, + const char *payload, size_t payload_len) +{ + char *tmp_base, *tmp; + const char *content_type; + char *end; + char **elems, **cur, **tokens; + + g_return_if_fail(payload != NULL); + + tmp_base = tmp = g_malloc0(payload_len + 1); + memcpy(tmp_base, payload, payload_len); + + /* Parse the attributes. */ + end = strstr(tmp, "\r\n\r\n"); + /* TODO? some clients use \r delimiters instead of \r\n, the official client + * doesn't send such messages, but does handle receiving them. We'll just + * avoid crashing for now */ + if (end == NULL) { + g_free(tmp_base); + g_return_if_reached(); + } + *end = '\0'; + + elems = g_strsplit(tmp, "\r\n", 0); + + for (cur = elems; *cur != NULL; cur++) + { + const char *key, *value; + + tokens = g_strsplit(*cur, ": ", 2); + + key = tokens[0]; + value = tokens[1]; + + if (!strcmp(key, "MIME-Version")) + { + g_strfreev(tokens); + continue; + } + + if (!strcmp(key, "Content-Type")) + { + char *charset, *c; + + if ((c = strchr(value, ';')) != NULL) + { + if ((charset = strchr(c, '=')) != NULL) + { + charset++; + msn_message_set_charset(msg, charset); + } + + *c = '\0'; + } + + msn_message_set_content_type(msg, value); + } + else + { + msn_message_set_attr(msg, key, value); + } + + g_strfreev(tokens); + } + + g_strfreev(elems); + + /* Proceed to the end of the "\r\n\r\n" */ + tmp = end + 4; + + /* Now we *should* be at the body. */ + content_type = msn_message_get_content_type(msg); + + if (content_type != NULL && + !strcmp(content_type, "application/x-msnmsgrp2p")) + { + MsnSlpHeader header; + MsnSlpFooter footer; + int body_len; + + if (payload_len - (tmp - tmp_base) < sizeof(header)) { + g_free(tmp_base); + g_return_if_reached(); + } + + msg->msnslp_message = TRUE; + + /* Import the header. */ + memcpy(&header, tmp, sizeof(header)); + tmp += sizeof(header); + + msg->msnslp_header.session_id = GUINT32_FROM_LE(header.session_id); + msg->msnslp_header.id = GUINT32_FROM_LE(header.id); + msg->msnslp_header.offset = GUINT64_FROM_LE(header.offset); + msg->msnslp_header.total_size = GUINT64_FROM_LE(header.total_size); + msg->msnslp_header.length = GUINT32_FROM_LE(header.length); + msg->msnslp_header.flags = GUINT32_FROM_LE(header.flags); + msg->msnslp_header.ack_id = GUINT32_FROM_LE(header.ack_id); + msg->msnslp_header.ack_sub_id = GUINT32_FROM_LE(header.ack_sub_id); + msg->msnslp_header.ack_size = GUINT64_FROM_LE(header.ack_size); + + body_len = payload_len - (tmp - tmp_base) - sizeof(footer); + + /* Import the body. */ + if (body_len > 0) { + msg->body_len = body_len; + msg->body = g_malloc0(msg->body_len + 1); + memcpy(msg->body, tmp, msg->body_len); + tmp += body_len; + } + + /* Import the footer. */ + if (body_len >= 0) { + memcpy(&footer, tmp, sizeof(footer)); + tmp += sizeof(footer); + msg->msnslp_footer.value = GUINT32_FROM_BE(footer.value); + } + } + else + { + if (payload_len - (tmp - tmp_base) > 0) { + msg->body_len = payload_len - (tmp - tmp_base); + msg->body = g_malloc0(msg->body_len + 1); + memcpy(msg->body, tmp, msg->body_len); + } + } + + g_free(tmp_base); +} + +MsnMessage * +msn_message_new_from_cmd(MsnSession *session, MsnCommand *cmd) +{ + MsnMessage *msg; + + g_return_val_if_fail(cmd != NULL, NULL); + + msg = msn_message_new(MSN_MSG_UNKNOWN); + + msg->remote_user = g_strdup(cmd->params[0]); + /* msg->size = atoi(cmd->params[2]); */ + msg->cmd = cmd; + + return msg; +} + +char * +msn_message_gen_slp_body(MsnMessage *msg, size_t *ret_size) +{ + MsnSlpHeader header; + + char *tmp, *base; + const void *body; + size_t len, body_len; + + g_return_val_if_fail(msg != NULL, NULL); + + len = MSN_BUF_LEN; + + base = tmp = g_malloc(len + 1); + + body = msn_message_get_bin_data(msg, &body_len); + + header.session_id = GUINT32_TO_LE(msg->msnslp_header.session_id); + header.id = GUINT32_TO_LE(msg->msnslp_header.id); + header.offset = GUINT64_TO_LE(msg->msnslp_header.offset); + header.total_size = GUINT64_TO_LE(msg->msnslp_header.total_size); + header.length = GUINT32_TO_LE(msg->msnslp_header.length); + header.flags = GUINT32_TO_LE(msg->msnslp_header.flags); + header.ack_id = GUINT32_TO_LE(msg->msnslp_header.ack_id); + header.ack_sub_id = GUINT32_TO_LE(msg->msnslp_header.ack_sub_id); + header.ack_size = GUINT64_TO_LE(msg->msnslp_header.ack_size); + + memcpy(tmp, &header, 48); + tmp += 48; + + if (body != NULL) + { + memcpy(tmp, body, body_len); + tmp += body_len; + } + + if (ret_size != NULL) + *ret_size = tmp - base; + + return base; +} + +char * +msn_message_gen_payload(MsnMessage *msg, size_t *ret_size) +{ + GList *l; + char *n, *base, *end; + int len; + size_t body_len = 0; + const void *body; + + g_return_val_if_fail(msg != NULL, NULL); + + len = MSN_BUF_LEN; + + base = n = end = g_malloc(len + 1); + end += len; + + /* Standard header. */ + if (msg->charset == NULL) + { + g_snprintf(n, len, + "MIME-Version: 1.0\r\n" + "Content-Type: %s\r\n", + msg->content_type); + } + else + { + g_snprintf(n, len, + "MIME-Version: 1.0\r\n" + "Content-Type: %s; charset=%s\r\n", + msg->content_type, msg->charset); + } + + n += strlen(n); + + for (l = msg->attr_list; l != NULL; l = l->next) + { + const char *key; + const char *value; + + key = l->data; + value = msn_message_get_attr(msg, key); + + g_snprintf(n, end - n, "%s: %s\r\n", key, value); + n += strlen(n); + } + + n += g_strlcpy(n, "\r\n", end - n); + + body = msn_message_get_bin_data(msg, &body_len); + + if (msg->msnslp_message) + { + MsnSlpHeader header; + MsnSlpFooter footer; + + header.session_id = GUINT32_TO_LE(msg->msnslp_header.session_id); + header.id = GUINT32_TO_LE(msg->msnslp_header.id); + header.offset = GUINT64_TO_LE(msg->msnslp_header.offset); + header.total_size = GUINT64_TO_LE(msg->msnslp_header.total_size); + header.length = GUINT32_TO_LE(msg->msnslp_header.length); + header.flags = GUINT32_TO_LE(msg->msnslp_header.flags); + header.ack_id = GUINT32_TO_LE(msg->msnslp_header.ack_id); + header.ack_sub_id = GUINT32_TO_LE(msg->msnslp_header.ack_sub_id); + header.ack_size = GUINT64_TO_LE(msg->msnslp_header.ack_size); + + memcpy(n, &header, 48); + n += 48; + + if (body != NULL) + { + memcpy(n, body, body_len); + + n += body_len; + } + + footer.value = GUINT32_TO_BE(msg->msnslp_footer.value); + + memcpy(n, &footer, 4); + n += 4; + } + else + { + if (body != NULL) + { + memcpy(n, body, body_len); + n += body_len; + } + } + + if (ret_size != NULL) + { + *ret_size = n - base; + + if (*ret_size > 1664) + *ret_size = 1664; + } + + return base; +} + +void +msn_message_set_flag(MsnMessage *msg, char flag) +{ + g_return_if_fail(msg != NULL); + g_return_if_fail(flag != 0); + + msg->flag = flag; +} + +char +msn_message_get_flag(const MsnMessage *msg) +{ + g_return_val_if_fail(msg != NULL, 0); + + return msg->flag; +} + +void +msn_message_set_bin_data(MsnMessage *msg, const void *data, size_t len) +{ + g_return_if_fail(msg != NULL); + + /* There is no need to waste memory on data we cannot send anyway */ + if (len > 1664) + len = 1664; + + if (msg->body != NULL) + g_free(msg->body); + + if (data != NULL && len > 0) + { + msg->body = g_malloc0(len + 1); + memcpy(msg->body, data, len); + msg->body_len = len; + } + else + { + msg->body = NULL; + msg->body_len = 0; + } +} + +const void * +msn_message_get_bin_data(const MsnMessage *msg, size_t *len) +{ + g_return_val_if_fail(msg != NULL, NULL); + + if (len) + *len = msg->body_len; + + return msg->body; +} + +void +msn_message_set_content_type(MsnMessage *msg, const char *type) +{ + g_return_if_fail(msg != NULL); + + if (msg->content_type != NULL) + g_free(msg->content_type); + + msg->content_type = (type != NULL) ? g_strdup(type) : NULL; +} + +const char * +msn_message_get_content_type(const MsnMessage *msg) +{ + g_return_val_if_fail(msg != NULL, NULL); + + return msg->content_type; +} + +void +msn_message_set_charset(MsnMessage *msg, const char *charset) +{ + g_return_if_fail(msg != NULL); + + if (msg->charset != NULL) + g_free(msg->charset); + + msg->charset = (charset != NULL) ? g_strdup(charset) : NULL; +} + +const char * +msn_message_get_charset(const MsnMessage *msg) +{ + g_return_val_if_fail(msg != NULL, NULL); + + return msg->charset; +} + +void +msn_message_set_attr(MsnMessage *msg, const char *attr, const char *value) +{ + const char *temp; + char *new_attr; + + g_return_if_fail(msg != NULL); + g_return_if_fail(attr != NULL); + + temp = msn_message_get_attr(msg, attr); + + if (value == NULL) + { + if (temp != NULL) + { + GList *l; + + for (l = msg->attr_list; l != NULL; l = l->next) + { + if (!g_ascii_strcasecmp(l->data, attr)) + { + msg->attr_list = g_list_remove(msg->attr_list, l->data); + + break; + } + } + + g_hash_table_remove(msg->attr_table, attr); + } + + return; + } + + new_attr = g_strdup(attr); + + g_hash_table_insert(msg->attr_table, new_attr, g_strdup(value)); + + if (temp == NULL) + msg->attr_list = g_list_append(msg->attr_list, new_attr); +} + +const char * +msn_message_get_attr(const MsnMessage *msg, const char *attr) +{ + g_return_val_if_fail(msg != NULL, NULL); + g_return_val_if_fail(attr != NULL, NULL); + + return g_hash_table_lookup(msg->attr_table, attr); +} + +GHashTable * +msn_message_get_hashtable_from_body(const MsnMessage *msg) +{ + GHashTable *table; + size_t body_len; + const char *body; + char **elems, **cur, **tokens, *body_str; + + g_return_val_if_fail(msg != NULL, NULL); + + table = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free); + + body = msn_message_get_bin_data(msg, &body_len); + + g_return_val_if_fail(body != NULL, NULL); + + body_str = g_strndup(body, body_len); + elems = g_strsplit(body_str, "\r\n", 0); + g_free(body_str); + + for (cur = elems; *cur != NULL; cur++) + { + if (**cur == '\0') + break; + + tokens = g_strsplit(*cur, ": ", 2); + + if (tokens[0] != NULL && tokens[1] != NULL) + g_hash_table_insert(table, tokens[0], tokens[1]); + + g_free(tokens); + } + + g_strfreev(elems); + + return table; +} + +char * +msn_message_to_string(MsnMessage *msg) +{ + size_t body_len; + const char *body; + + g_return_val_if_fail(msg != NULL, NULL); + g_return_val_if_fail(msg->type == MSN_MSG_TEXT, NULL); + + body = msn_message_get_bin_data(msg, &body_len); + + return g_strndup(body, body_len); +} + +void +msn_message_show_readable(MsnMessage *msg, const char *info, + gboolean text_body) +{ + GString *str; + size_t body_len; + const char *body; + GList *l; + + g_return_if_fail(msg != NULL); + + str = g_string_new(NULL); + + /* Standard header. */ + if (msg->charset == NULL) + { + g_string_append_printf(str, + "MIME-Version: 1.0\r\n" + "Content-Type: %s\r\n", + msg->content_type); + } + else + { + g_string_append_printf(str, + "MIME-Version: 1.0\r\n" + "Content-Type: %s; charset=%s\r\n", + msg->content_type, msg->charset); + } + + for (l = msg->attr_list; l; l = l->next) + { + char *key; + const char *value; + + key = l->data; + value = msn_message_get_attr(msg, key); + + g_string_append_printf(str, "%s: %s\r\n", key, value); + } + + g_string_append(str, "\r\n"); + + body = msn_message_get_bin_data(msg, &body_len); + + if (msg->msnslp_message) + { + g_string_append_printf(str, "Session ID: %u\r\n", msg->msnslp_header.session_id); + g_string_append_printf(str, "ID: %u\r\n", msg->msnslp_header.id); + g_string_append_printf(str, "Offset: %" G_GUINT64_FORMAT "\r\n", msg->msnslp_header.offset); + g_string_append_printf(str, "Total size: %" G_GUINT64_FORMAT "\r\n", msg->msnslp_header.total_size); + g_string_append_printf(str, "Length: %u\r\n", msg->msnslp_header.length); + g_string_append_printf(str, "Flags: 0x%x\r\n", msg->msnslp_header.flags); + g_string_append_printf(str, "ACK ID: %u\r\n", msg->msnslp_header.ack_id); + g_string_append_printf(str, "SUB ID: %u\r\n", msg->msnslp_header.ack_sub_id); + g_string_append_printf(str, "ACK Size: %" G_GUINT64_FORMAT "\r\n", msg->msnslp_header.ack_size); + +#ifdef MSN_DEBUG_SLP_VERBOSE + if (body != NULL) + { + if (text_body) + { + g_string_append_len(str, body, body_len); + if (body[body_len - 1] == '\0') + { + str->len--; + g_string_append(str, " 0x00"); + } + g_string_append(str, "\r\n"); + } + else + { + int i; + for (i = 0; i < msg->body_len; i++) + { + g_string_append_printf(str, "%.2hhX ", body[i]); + if ((i % 16) == 15) + g_string_append(str, "\r\n"); + } + g_string_append(str, "\r\n"); + } + } +#endif + + g_string_append_printf(str, "Footer: %u\r\n", msg->msnslp_footer.value); + } + else + { + if (body != NULL) + { + g_string_append_len(str, body, body_len); + g_string_append(str, "\r\n"); + } + } + + purple_debug_info("msn", "Message %s:\n{%s}\n", info, str->str); + + g_string_free(str, TRUE); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libpurple/protocols/msnp9/msg.h Mon Nov 12 16:53:54 2007 +0000 @@ -0,0 +1,349 @@ +/** + * @file msg.h Message functions + * + * purple + * + * Purple is the legal property of its developers, whose names are too numerous + * to list here. Please refer to the COPYRIGHT file distributed with this + * source distribution. + * + * 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 02111-1301 USA + */ +#ifndef _MSN_MSG_H_ +#define _MSN_MSG_H_ + +typedef struct _MsnMessage MsnMessage; + +#include "session.h" +#include "user.h" + +#include "command.h" +#include "transaction.h" + +typedef void (*MsnMsgCb)(MsnMessage *, void *data); + +/* +typedef enum +{ + MSN_MSG_NORMAL, + MSN_MSG_SLP_SB, + MSN_MSG_SLP_DC + +} MsnMsgType; +*/ + +typedef enum +{ + MSN_MSG_UNKNOWN, + MSN_MSG_TEXT, + MSN_MSG_TYPING, + MSN_MSG_CAPS, + MSN_MSG_SLP, + MSN_MSG_NUDGE + +} MsnMsgType; + +typedef enum +{ + MSN_MSG_ERROR_NONE, /**< No error. */ + MSN_MSG_ERROR_TIMEOUT, /**< The message timedout. */ + MSN_MSG_ERROR_NAK, /**< The message could not be sent. */ + MSN_MSG_ERROR_SB, /**< The error comes from the switchboard. */ + MSN_MSG_ERROR_UNKNOWN /**< An unknown error occurred. */ + +} MsnMsgErrorType; + +typedef struct +{ + guint32 session_id; + guint32 id; + guint64 offset; + guint64 total_size; + guint32 length; + guint32 flags; + guint32 ack_id; + guint32 ack_sub_id; + guint64 ack_size; + +} MsnSlpHeader; + +typedef struct +{ + guint32 value; + +} MsnSlpFooter; + +/** + * A message. + */ +struct _MsnMessage +{ + size_t ref_count; /**< The reference count. */ + + MsnMsgType type; + + gboolean msnslp_message; + + char *remote_user; + char flag; + + char *content_type; + char *charset; + char *body; + gsize body_len; + + MsnSlpHeader msnslp_header; + MsnSlpFooter msnslp_footer; + + GHashTable *attr_table; + GList *attr_list; + + gboolean ack_ref; /**< A flag that states if this message has + been ref'ed for using it in a callback. */ + + MsnCommand *cmd; + MsnTransaction *trans; + + MsnMsgCb ack_cb; /**< The callback to call when we receive an ACK of this + message. */ + MsnMsgCb nak_cb; /**< The callback to call when we receive a NAK of this + message. */ + void *ack_data; /**< The data used by callbacks. */ + + MsnMsgErrorType error; /**< The error of the message. */ +}; + +/** + * Creates a new, empty message. + * + * @return A new message. + */ +MsnMessage *msn_message_new(MsnMsgType type); + +/** + * Creates a new, empty MSNSLP message. + * + * @return A new MSNSLP message. + */ +MsnMessage *msn_message_new_msnslp(void); + +/** + * Creates a new nudge message. + * + * @return A new nudge message. + */ +MsnMessage *msn_message_new_nudge(void); + +/** + * Creates a new plain message. + * + * @return A new plain message. + */ +MsnMessage *msn_message_new_plain(const char *message); + +/** + * Creates a MSNSLP ack message. + * + * @param acked_msg The message to acknowledge. + * + * @return A new MSNSLP ack message. + */ +MsnMessage *msn_message_new_msnslp_ack(MsnMessage *acked_msg); + +/** + * Creates a new message based off a command. + * + * @param session The MSN session. + * @param cmd The command. + * + * @return The new message. + */ +MsnMessage *msn_message_new_from_cmd(MsnSession *session, MsnCommand *cmd); + +/** + * Parses the payload of a message. + * + * @param msg The message. + * @param payload The payload. + * @param payload_len The length of the payload. + */ +void msn_message_parse_payload(MsnMessage *msg, const char *payload, + size_t payload_len); + +/** + * Destroys a message. + * + * @param msg The message to destroy. + */ +void msn_message_destroy(MsnMessage *msg); + +/** + * Increments the reference count on a message. + * + * @param msg The message. + * + * @return @a msg + */ +MsnMessage *msn_message_ref(MsnMessage *msg); + +/** + * Decrements the reference count on a message. + * + * This will destroy the structure if the count hits 0. + * + * @param msg The message. + * + * @return @a msg, or @c NULL if the new count is 0. + */ +MsnMessage *msn_message_unref(MsnMessage *msg); + +/** + * Generates the payload data of a message. + * + * @param msg The message. + * @param ret_size The returned size of the payload. + * + * @return The payload data of the message. + */ +char *msn_message_gen_payload(MsnMessage *msg, size_t *ret_size); + +/** + * Sets the flag for an outgoing message. + * + * @param msg The message. + * @param flag The flag. + */ +void msn_message_set_flag(MsnMessage *msg, char flag); + +/** + * Returns the flag for an outgoing message. + * + * @param msg The message. + * + * @return The flag. + */ +char msn_message_get_flag(const MsnMessage *msg); + +#if 0 +/** + * Sets the body of a message. + * + * @param msg The message. + * @param body The body of the message. + */ +void msn_message_set_body(MsnMessage *msg, const char *body); + +/** + * Returns the body of the message. + * + * @param msg The message. + * + * @return The body of the message. + */ +const char *msn_message_get_body(const MsnMessage *msg); +#endif +/** + * Sets the binary content of the message. + * + * @param msg The message. + * @param data The binary data. + * @param len The length of the data. + */ +void msn_message_set_bin_data(MsnMessage *msg, const void *data, size_t len); + +/** + * Returns the binary content of the message. + * + * @param msg The message. + * @param len The returned length of the data. + * + * @return The binary data. + */ +const void *msn_message_get_bin_data(const MsnMessage *msg, size_t *len); + +/** + * Sets the content type in a message. + * + * @param msg The message. + * @param type The content-type. + */ +void msn_message_set_content_type(MsnMessage *msg, const char *type); + +/** + * Returns the content type in a message. + * + * @param msg The message. + * + * @return The content-type. + */ +const char *msn_message_get_content_type(const MsnMessage *msg); + +/** + * Sets the charset in a message. + * + * @param msg The message. + * @param charset The charset. + */ +void msn_message_set_charset(MsnMessage *msg, const char *charset); + +/** + * Returns the charset in a message. + * + * @param msg The message. + * + * @return The charset. + */ +const char *msn_message_get_charset(const MsnMessage *msg); + +/** + * Sets an attribute in a message. + * + * @param msg The message. + * @param attr The attribute name. + * @param value The attribute value. + */ +void msn_message_set_attr(MsnMessage *msg, const char *attr, + const char *value); + +/** + * Returns an attribute from a message. + * + * @param msg The message. + * @param attr The attribute. + * + * @return The value, or @c NULL if not found. + */ +const char *msn_message_get_attr(const MsnMessage *msg, const char *attr); + +/** + * Parses the body and returns it in the form of a hashtable. + * + * @param msg The message. + * + * @return The resulting hashtable. + */ +GHashTable *msn_message_get_hashtable_from_body(const MsnMessage *msg); + +void msn_message_show_readable(MsnMessage *msg, const char *info, + gboolean text_body); + +void msn_message_parse_slp_body(MsnMessage *msg, const char *body, + size_t len); + +char *msn_message_gen_slp_body(MsnMessage *msg, size_t *ret_size); + +char *msn_message_to_string(MsnMessage *msg); + +#endif /* _MSN_MSG_H_ */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libpurple/protocols/msnp9/msn-utils.c Mon Nov 12 16:53:54 2007 +0000 @@ -0,0 +1,440 @@ +/** + * @file msn-utils.c Utility functions + * + * purple + * + * Purple is the legal property of its developers, whose names are too numerous + * to list here. Please refer to the COPYRIGHT file distributed with this + * source distribution. + * + * 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 02111-1301 USA + */ +#include "msn.h" +#include "msn-utils.h" + +void +msn_parse_format(const char *mime, char **pre_ret, char **post_ret) +{ + char *cur; + GString *pre = g_string_new(NULL); + GString *post = g_string_new(NULL); + unsigned int colors[3]; + + if (pre_ret != NULL) *pre_ret = NULL; + if (post_ret != NULL) *post_ret = NULL; + + cur = strstr(mime, "FN="); + + if (cur && (*(cur = cur + 3) != ';')) + { + pre = g_string_append(pre, "<FONT FACE=\""); + + while (*cur && *cur != ';') + { + pre = g_string_append_c(pre, *cur); + cur++; + } + + pre = g_string_append(pre, "\">"); + post = g_string_prepend(post, "</FONT>"); + } + + cur = strstr(mime, "EF="); + + if (cur && (*(cur = cur + 3) != ';')) + { + while (*cur && *cur != ';') + { + pre = g_string_append_c(pre, '<'); + pre = g_string_append_c(pre, *cur); + pre = g_string_append_c(pre, '>'); + post = g_string_prepend_c(post, '>'); + post = g_string_prepend_c(post, *cur); + post = g_string_prepend_c(post, '/'); + post = g_string_prepend_c(post, '<'); + cur++; + } + } + + cur = strstr(mime, "CO="); + + if (cur && (*(cur = cur + 3) != ';')) + { + int i; + + i = sscanf(cur, "%02x%02x%02x;", &colors[0], &colors[1], &colors[2]); + + if (i > 0) + { + char tag[64]; + + if (i == 1) + { + colors[1] = 0; + colors[2] = 0; + } + else if (i == 2) + { + unsigned int temp = colors[0]; + + colors[0] = colors[1]; + colors[1] = temp; + colors[2] = 0; + } + else if (i == 3) + { + unsigned int temp = colors[2]; + + colors[2] = colors[0]; + colors[0] = temp; + } + + g_snprintf(tag, sizeof(tag), + "<FONT COLOR=\"#%02hhx%02hhx%02hhx\">", + colors[0], colors[1], colors[2]); + + pre = g_string_append(pre, tag); + post = g_string_prepend(post, "</FONT>"); + } + } + + cur = strstr(mime, "RL="); + + if (cur && (*(cur = cur + 3) != ';')) + { + if (*cur == '1') + { + /* RTL text was received */ + pre = g_string_append(pre, "<SPAN style=\"direction:rtl;text-align:right;\">"); + post = g_string_prepend(post, "</SPAN>"); + } + } + + cur = g_strdup(purple_url_decode(pre->str)); + g_string_free(pre, TRUE); + + if (pre_ret != NULL) + *pre_ret = cur; + else + g_free(cur); + + cur = g_strdup(purple_url_decode(post->str)); + g_string_free(post, TRUE); + + if (post_ret != NULL) + *post_ret = cur; + else + g_free(cur); +} + +/* + * We need this because we're only supposed to encode spaces in the font + * names. purple_url_encode() isn't acceptable. + */ +static const char * +encode_spaces(const char *str) +{ + static char buf[BUF_LEN]; + const char *c; + char *d; + + g_return_val_if_fail(str != NULL, NULL); + + for (c = str, d = buf; *c != '\0'; c++) + { + if (*c == ' ') + { + *d++ = '%'; + *d++ = '2'; + *d++ = '0'; + } + else + *d++ = *c; + } + + return buf; +} + +/* + * Taken from the zephyr plugin. + * This parses HTML formatting (put out by one of the gtkimhtml widgets + * and converts it to msn formatting. It doesn't deal with the tag closing, + * but gtkimhtml widgets give valid html. + * It currently deals properly with <b>, <u>, <i>, <font face=...>, + * <font color=...>, <span dir=...>, <span style="direction: ...">. + * It ignores <font back=...> and <font size=...> + */ +void +msn_import_html(const char *html, char **attributes, char **message) +{ + int len, retcount = 0; + const char *c; + char *msg; + char *fontface = NULL; + char fonteffect[4]; + char fontcolor[7]; + char direction = '0'; + + gboolean has_bold = FALSE; + gboolean has_italic = FALSE; + gboolean has_underline = FALSE; + gboolean has_strikethrough = FALSE; + + g_return_if_fail(html != NULL); + g_return_if_fail(attributes != NULL); + g_return_if_fail(message != NULL); + + len = strlen(html); + msg = g_malloc0(len + 1); + + memset(fontcolor, 0, sizeof(fontcolor)); + strcat(fontcolor, "0"); + memset(fonteffect, 0, sizeof(fonteffect)); + + for (c = html; *c != '\0';) + { + if (*c == '<') + { + if (!g_ascii_strncasecmp(c + 1, "br>", 3)) + { + msg[retcount++] = '\r'; + msg[retcount++] = '\n'; + c += 4; + } + else if (!g_ascii_strncasecmp(c + 1, "i>", 2)) + { + if (!has_italic) + { + strcat(fonteffect, "I"); + has_italic = TRUE; + } + c += 3; + } + else if (!g_ascii_strncasecmp(c + 1, "b>", 2)) + { + if (!has_bold) + { + strcat(fonteffect, "B"); + has_bold = TRUE; + } + c += 3; + } + else if (!g_ascii_strncasecmp(c + 1, "u>", 2)) + { + if (!has_underline) + { + strcat(fonteffect, "U"); + has_underline = TRUE; + } + c += 3; + } + else if (!g_ascii_strncasecmp(c + 1, "s>", 2)) + { + if (!has_strikethrough) + { + strcat(fonteffect, "S"); + has_strikethrough = TRUE; + } + c += 3; + } + else if (!g_ascii_strncasecmp(c + 1, "a href=\"", 8)) + { + c += 9; + + if (!g_ascii_strncasecmp(c, "mailto:", 7)) + c += 7; + + while ((*c != '\0') && g_ascii_strncasecmp(c, "\">", 2)) + msg[retcount++] = *c++; + + if (*c != '\0') + c += 2; + + /* ignore descriptive string */ + while ((*c != '\0') && g_ascii_strncasecmp(c, "</a>", 4)) + c++; + + if (*c != '\0') + c += 4; + } + else if (!g_ascii_strncasecmp(c + 1, "span", 4)) + { + /* Bi-directional text support using CSS properties in span tags */ + c += 5; + + while (*c != '\0' && *c != '>') + { + while (*c == ' ') + c++; + if (!g_ascii_strncasecmp(c, "dir=\"rtl\"", 9)) + { + c += 9; + direction = '1'; + } + else if (!g_ascii_strncasecmp(c, "style=\"", 7)) + { + /* Parse inline CSS attributes */ + char *attributes; + int attr_len = 0; + c += 7; + while (*(c + attr_len) != '\0' && *(c + attr_len) != '"') + attr_len++; + if (*(c + attr_len) == '"') + { + char *attr_dir; + attributes = g_strndup(c, attr_len); + attr_dir = purple_markup_get_css_property(attributes, "direction"); + if (attr_dir && (!g_ascii_strncasecmp(attr_dir, "RTL", 3))) + direction = '1'; + g_free(attr_dir); + g_free(attributes); + } + + } + else + { + c++; + } + } + if (*c == '>') + c++; + } + else if (!g_ascii_strncasecmp(c + 1, "font", 4)) + { + c += 5; + + while ((*c != '\0') && !g_ascii_strncasecmp(c, " ", 1)) + c++; + + if (!g_ascii_strncasecmp(c, "color=\"#", 7)) + { + c += 8; + + fontcolor[0] = *(c + 4); + fontcolor[1] = *(c + 5); + fontcolor[2] = *(c + 2); + fontcolor[3] = *(c + 3); + fontcolor[4] = *c; + fontcolor[5] = *(c + 1); + + c += 8; + } + else if (!g_ascii_strncasecmp(c, "face=\"", 6)) + { + const char *end = NULL; + const char *comma = NULL; + unsigned int namelen = 0; + + c += 6; + end = strchr(c, '\"'); + comma = strchr(c, ','); + + if (comma == NULL || comma > end) + namelen = (unsigned int)(end - c); + else + namelen = (unsigned int)(comma - c); + + fontface = g_strndup(c, namelen); + c = end + 2; + } + else + { + /* Drop all unrecognized/misparsed font tags */ + while ((*c != '\0') && g_ascii_strncasecmp(c, "\">", 2)) + c++; + + if (*c != '\0') + c += 2; + } + } + else + { + while ((*c != '\0') && (*c != '>')) + c++; + if (*c != '\0') + c++; + } + } + else if (*c == '&') + { + if (!g_ascii_strncasecmp(c, "<", 4)) + { + msg[retcount++] = '<'; + c += 4; + } + else if (!g_ascii_strncasecmp(c, ">", 4)) + { + msg[retcount++] = '>'; + c += 4; + } + else if (!g_ascii_strncasecmp(c, " ", 6)) + { + msg[retcount++] = ' '; + c += 6; + } + else if (!g_ascii_strncasecmp(c, """, 6)) + { + msg[retcount++] = '"'; + c += 6; + } + else if (!g_ascii_strncasecmp(c, "&", 5)) + { + msg[retcount++] = '&'; + c += 5; + } + else if (!g_ascii_strncasecmp(c, "'", 6)) + { + msg[retcount++] = '\''; + c += 6; + } + else + msg[retcount++] = *c++; + } + else + msg[retcount++] = *c++; + } + + if (fontface == NULL) + fontface = g_strdup("MS Sans Serif"); + + *attributes = g_strdup_printf("FN=%s; EF=%s; CO=%s; PF=0; RL=%c", + encode_spaces(fontface), + fonteffect, fontcolor, direction); + *message = g_strdup(msg); + + g_free(fontface); + g_free(msg); +} + +void +msn_parse_socket(const char *str, char **ret_host, int *ret_port) +{ + char *host; + char *c; + int port; + + host = g_strdup(str); + + if ((c = strchr(host, ':')) != NULL) + { + *c = '\0'; + port = atoi(c + 1); + } + else + port = 1863; + + *ret_host = host; + *ret_port = port; +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libpurple/protocols/msnp9/msn-utils.h Mon Nov 12 16:53:54 2007 +0000 @@ -0,0 +1,51 @@ +/** + * @file msn-utils.h Utility functions + * + * purple + * + * Purple is the legal property of its developers, whose names are too numerous + * to list here. Please refer to the COPYRIGHT file distributed with this + * source distribution. + * + * 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 02111-1301 USA + */ +#ifndef _MSN_UTILS_H_ +#define _MSN_UTILS_H_ + +/** + * Parses the MSN message formatting into a format compatible with Purple. + * + * @param mime The mime header with the formatting. + * @param pre_ret The returned prefix string. + * @param post_ret The returned postfix string. + * + * @return The new message. + */ +void msn_parse_format(const char *mime, char **pre_ret, char **post_ret); + +/** + * Parses the Purple message formatting (html) into the MSN format. + * + * @param html The html message to format. + * @param attributes The returned attributes string. + * @param message The returned message string. + * + * @return The new message. + */ +void msn_import_html(const char *html, char **attributes, char **message); + +void msn_parse_socket(const char *str, char **ret_host, int *ret_port); + +#endif /* _MSN_UTILS_H_ */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libpurple/protocols/msnp9/msn.c Mon Nov 12 16:53:54 2007 +0000 @@ -0,0 +1,2221 @@ +/** + * @file msn.c The MSN protocol plugin + * + * purple + * + * Purple is the legal property of its developers, whose names are too numerous + * to list here. Please refer to the COPYRIGHT file distributed with this + * source distribution. + * + * 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 02111-1301 USA + */ +#define PHOTO_SUPPORT 1 + +#include <glib.h> + +#include "msn.h" +#include "accountopt.h" +#include "msg.h" +#include "page.h" +#include "pluginpref.h" +#include "prefs.h" +#include "session.h" +#include "state.h" +#include "util.h" +#include "cmds.h" +#include "core.h" +#include "prpl.h" +#include "msn-utils.h" +#include "version.h" + +#include "switchboard.h" +#include "notification.h" +#include "sync.h" +#include "slplink.h" + +#if PHOTO_SUPPORT +#include "imgstore.h" +#endif + +typedef struct +{ + PurpleConnection *gc; + const char *passport; + +} MsnMobileData; + +typedef struct +{ + PurpleConnection *gc; + char *name; + +} MsnGetInfoData; + +typedef struct +{ + MsnGetInfoData *info_data; + char *stripped; + char *url_buffer; + PurpleNotifyUserInfo *user_info; + char *photo_url_text; + +} MsnGetInfoStepTwoData; + +typedef struct +{ + PurpleConnection *gc; + const char *who; + char *msg; + PurpleMessageFlags flags; + time_t when; +} MsnIMData; + +static const char * +msn_normalize(const PurpleAccount *account, const char *str) +{ + static char buf[BUF_LEN]; + char *tmp; + + g_return_val_if_fail(str != NULL, NULL); + + g_snprintf(buf, sizeof(buf), "%s%s", str, + (strchr(str, '@') ? "" : "@hotmail.com")); + + tmp = g_utf8_strdown(buf, -1); + strncpy(buf, tmp, sizeof(buf)); + g_free(tmp); + + return buf; +} + +static gboolean +msn_send_attention(PurpleConnection *gc, const char *username, guint type) +{ + MsnMessage *msg; + MsnSession *session; + MsnSwitchBoard *swboard; + + msg = msn_message_new_nudge(); + session = gc->proto_data; + swboard = msn_session_get_swboard(session, username, MSN_SB_FLAG_IM); + + if (swboard == NULL) + return FALSE; + + msn_switchboard_send_msg(swboard, msg, TRUE); + + return TRUE; +} + +static GList * +msn_attention_types(PurpleAccount *account) +{ + PurpleAttentionType *attn; + static GList *list = NULL; + + if (!list) { + attn = g_new0(PurpleAttentionType, 1); + attn->name = _("Nudge"); + attn->incoming_description = _("%s has nudged you!"); + attn->outgoing_description = _("Nudging %s..."); + list = g_list_append(list, attn); + } + + return list; +} + + +static PurpleCmdRet +msn_cmd_nudge(PurpleConversation *conv, const gchar *cmd, gchar **args, gchar **error, void *data) +{ + PurpleAccount *account = purple_conversation_get_account(conv); + PurpleConnection *gc = purple_account_get_connection(account); + const gchar *username; + + username = purple_conversation_get_name(conv); + + serv_send_attention(gc, username, MSN_NUDGE); + + return PURPLE_CMD_RET_OK; +} + +static void +msn_act_id(PurpleConnection *gc, const char *entry) +{ + MsnCmdProc *cmdproc; + MsnSession *session; + PurpleAccount *account; + const char *alias; + + session = gc->proto_data; + cmdproc = session->notification->cmdproc; + account = purple_connection_get_account(gc); + + if(entry && strlen(entry)) + alias = purple_url_encode(entry); + else + alias = ""; + + if (strlen(alias) > BUDDY_ALIAS_MAXLEN) + { + purple_notify_error(gc, NULL, + _("Your new MSN friendly name is too long."), NULL); + return; + } + + msn_cmdproc_send(cmdproc, "REA", "%s %s", + purple_account_get_username(account), + alias); +} + +static void +msn_set_prp(PurpleConnection *gc, const char *type, const char *entry) +{ + MsnCmdProc *cmdproc; + MsnSession *session; + + session = gc->proto_data; + cmdproc = session->notification->cmdproc; + + if (entry == NULL || *entry == '\0') + { + msn_cmdproc_send(cmdproc, "PRP", "%s", type); + } + else + { + msn_cmdproc_send(cmdproc, "PRP", "%s %s", type, + purple_url_encode(entry)); + } +} + +static void +msn_set_home_phone_cb(PurpleConnection *gc, const char *entry) +{ + msn_set_prp(gc, "PHH", entry); +} + +static void +msn_set_work_phone_cb(PurpleConnection *gc, const char *entry) +{ + msn_set_prp(gc, "PHW", entry); +} + +static void +msn_set_mobile_phone_cb(PurpleConnection *gc, const char *entry) +{ + msn_set_prp(gc, "PHM", entry); +} + +static void +enable_msn_pages_cb(PurpleConnection *gc) +{ + msn_set_prp(gc, "MOB", "Y"); +} + +static void +disable_msn_pages_cb(PurpleConnection *gc) +{ + msn_set_prp(gc, "MOB", "N"); +} + +static void +send_to_mobile(PurpleConnection *gc, const char *who, const char *entry) +{ + MsnTransaction *trans; + MsnSession *session; + MsnCmdProc *cmdproc; + MsnPage *page; + char *payload; + size_t payload_len; + + session = gc->proto_data; + cmdproc = session->notification->cmdproc; + + page = msn_page_new(); + msn_page_set_body(page, entry); + + payload = msn_page_gen_payload(page, &payload_len); + + trans = msn_transaction_new(cmdproc, "PGD", "%s 1 %d", who, payload_len); + + msn_transaction_set_payload(trans, payload, payload_len); + + msn_page_destroy(page); + + msn_cmdproc_send_trans(cmdproc, trans); +} + +static void +send_to_mobile_cb(MsnMobileData *data, const char *entry) +{ + send_to_mobile(data->gc, data->passport, entry); + g_free(data); +} + +static void +close_mobile_page_cb(MsnMobileData *data, const char *entry) +{ + g_free(data); +} + +/* -- */ + +static void +msn_show_set_friendly_name(PurplePluginAction *action) +{ + PurpleConnection *gc; + + gc = (PurpleConnection *) action->context; + + purple_request_input(gc, NULL, _("Set your friendly name."), + _("This is the name that other MSN buddies will " + "see you as."), + purple_connection_get_display_name(gc), FALSE, FALSE, NULL, + _("OK"), G_CALLBACK(msn_act_id), + _("Cancel"), NULL, + purple_connection_get_account(gc), NULL, NULL, + gc); +} + +static void +msn_show_set_home_phone(PurplePluginAction *action) +{ + PurpleConnection *gc; + MsnSession *session; + + gc = (PurpleConnection *) action->context; + session = gc->proto_data; + + purple_request_input(gc, NULL, _("Set your home phone number."), NULL, + msn_user_get_home_phone(session->user), FALSE, FALSE, NULL, + _("OK"), G_CALLBACK(msn_set_home_phone_cb), + _("Cancel"), NULL, + purple_connection_get_account(gc), NULL, NULL, + gc); +} + +static void +msn_show_set_work_phone(PurplePluginAction *action) +{ + PurpleConnection *gc; + MsnSession *session; + + gc = (PurpleConnection *) action->context; + session = gc->proto_data; + + purple_request_input(gc, NULL, _("Set your work phone number."), NULL, + msn_user_get_work_phone(session->user), FALSE, FALSE, NULL, + _("OK"), G_CALLBACK(msn_set_work_phone_cb), + _("Cancel"), NULL, + purple_connection_get_account(gc), NULL, NULL, + gc); +} + +static void +msn_show_set_mobile_phone(PurplePluginAction *action) +{ + PurpleConnection *gc; + MsnSession *session; + + gc = (PurpleConnection *) action->context; + session = gc->proto_data; + + purple_request_input(gc, NULL, _("Set your mobile phone number."), NULL, + msn_user_get_mobile_phone(session->user), FALSE, FALSE, NULL, + _("OK"), G_CALLBACK(msn_set_mobile_phone_cb), + _("Cancel"), NULL, + purple_connection_get_account(gc), NULL, NULL, + gc); +} + +static void +msn_show_set_mobile_pages(PurplePluginAction *action) +{ + PurpleConnection *gc; + + gc = (PurpleConnection *) action->context; + + purple_request_action(gc, NULL, _("Allow MSN Mobile pages?"), + _("Do you want to allow or disallow people on " + "your buddy list to send you MSN Mobile pages " + "to your cell phone or other mobile device?"), + -1, + purple_connection_get_account(gc), NULL, NULL, + gc, 3, + _("Allow"), G_CALLBACK(enable_msn_pages_cb), + _("Disallow"), G_CALLBACK(disable_msn_pages_cb), + _("Cancel"), NULL); +} + +static void +msn_show_hotmail_inbox(PurplePluginAction *action) +{ + PurpleConnection *gc; + MsnSession *session; + + gc = (PurpleConnection *) action->context; + session = gc->proto_data; + + if (session->passport_info.file == NULL) + { + purple_notify_error(gc, NULL, + _("This Hotmail account may not be active."), NULL); + return; + } + + purple_notify_uri(gc, session->passport_info.file); +} + +static void +show_send_to_mobile_cb(PurpleBlistNode *node, gpointer ignored) +{ + PurpleBuddy *buddy; + PurpleConnection *gc; + MsnSession *session; + MsnMobileData *data; + + g_return_if_fail(PURPLE_BLIST_NODE_IS_BUDDY(node)); + + buddy = (PurpleBuddy *) node; + gc = purple_account_get_connection(buddy->account); + + session = gc->proto_data; + + data = g_new0(MsnMobileData, 1); + data->gc = gc; + data->passport = buddy->name; + + purple_request_input(gc, NULL, _("Send a mobile message."), NULL, + NULL, TRUE, FALSE, NULL, + _("Page"), G_CALLBACK(send_to_mobile_cb), + _("Close"), G_CALLBACK(close_mobile_page_cb), + purple_connection_get_account(gc), purple_buddy_get_name(buddy), NULL, + data); +} + +static gboolean +msn_offline_message(const PurpleBuddy *buddy) { + MsnUser *user; + if (buddy == NULL) + return FALSE; + user = buddy->proto_data; + return user && user->mobile; +} + +static void +initiate_chat_cb(PurpleBlistNode *node, gpointer data) +{ + PurpleBuddy *buddy; + PurpleConnection *gc; + + MsnSession *session; + MsnSwitchBoard *swboard; + + g_return_if_fail(PURPLE_BLIST_NODE_IS_BUDDY(node)); + + buddy = (PurpleBuddy *) node; + gc = purple_account_get_connection(buddy->account); + + session = gc->proto_data; + + swboard = msn_switchboard_new(session); + msn_switchboard_request(swboard); + msn_switchboard_request_add_user(swboard, buddy->name); + + /* TODO: This might move somewhere else, after USR might be */ + swboard->chat_id = session->conv_seq++; + swboard->conv = serv_got_joined_chat(gc, swboard->chat_id, "MSN Chat"); + swboard->flag = MSN_SB_FLAG_IM; + + purple_conv_chat_add_user(PURPLE_CONV_CHAT(swboard->conv), + purple_account_get_username(buddy->account), NULL, PURPLE_CBFLAGS_NONE, TRUE); +} + +static void +t_msn_xfer_init(PurpleXfer *xfer) +{ + MsnSlpLink *slplink = xfer->data; + msn_slplink_request_ft(slplink, xfer); +} + +static PurpleXfer* +msn_new_xfer(PurpleConnection *gc, const char *who) +{ + MsnSession *session; + MsnSlpLink *slplink; + PurpleXfer *xfer; + + session = gc->proto_data; + + xfer = purple_xfer_new(gc->account, PURPLE_XFER_SEND, who); + if (xfer) + { + slplink = msn_session_get_slplink(session, who); + + xfer->data = slplink; + + purple_xfer_set_init_fnc(xfer, t_msn_xfer_init); + } + + return xfer; +} + +static void +msn_send_file(PurpleConnection *gc, const char *who, const char *file) +{ + PurpleXfer *xfer = msn_new_xfer(gc, who); + + if (file) + purple_xfer_request_accepted(xfer, file); + else + purple_xfer_request(xfer); +} + +static gboolean +msn_can_receive_file(PurpleConnection *gc, const char *who) +{ + PurpleAccount *account; + char *normal; + gboolean ret; + + account = purple_connection_get_account(gc); + + normal = g_strdup(msn_normalize(account, purple_account_get_username(account))); + + ret = strcmp(normal, msn_normalize(account, who)); + + g_free(normal); + + return ret; +} + +/************************************************************************** + * Protocol Plugin ops + **************************************************************************/ + +static const char * +msn_list_icon(PurpleAccount *a, PurpleBuddy *b) +{ + return "msn"; +} + +static char * +msn_status_text(PurpleBuddy *buddy) +{ + PurplePresence *presence; + PurpleStatus *status; + + presence = purple_buddy_get_presence(buddy); + status = purple_presence_get_active_status(presence); + + if (!purple_presence_is_available(presence) && !purple_presence_is_idle(presence)) + { + return g_strdup(purple_status_get_name(status)); + } + + return NULL; +} + +static void +msn_tooltip_text(PurpleBuddy *buddy, PurpleNotifyUserInfo *user_info, gboolean full) +{ + MsnUser *user; + PurplePresence *presence = purple_buddy_get_presence(buddy); + PurpleStatus *status = purple_presence_get_active_status(presence); + + user = buddy->proto_data; + + + if (purple_presence_is_online(presence)) + { + purple_notify_user_info_add_pair(user_info, _("Status"), + (purple_presence_is_idle(presence) ? _("Idle") : purple_status_get_name(status))); + } + + if (full && user) + { + purple_notify_user_info_add_pair(user_info, _("Has you"), + ((user->list_op & (1 << MSN_LIST_RL)) ? _("Yes") : _("No"))); + } + + /* XXX: This is being shown in non-full tooltips because the + * XXX: blocked icon overlay isn't always accurate for MSN. + * XXX: This can die as soon as purple_privacy_check() knows that + * XXX: this prpl always honors both the allow and deny lists. */ + /* While the above comment may be strictly correct (the privacy API needs + * rewriteing), purple_privacy_check() is going to be more accurate at + * indicating whether a particular buddy is going to be able to message + * you, which is the important information that this is trying to convey. */ + if (full && user) + { + purple_notify_user_info_add_pair(user_info, _("Blocked"), + ((user->list_op & (1 << MSN_LIST_BL)) ? _("Yes") : _("No"))); + } +} + +static GList * +msn_status_types(PurpleAccount *account) +{ + PurpleStatusType *status; + GList *types = NULL; + + status = purple_status_type_new_full(PURPLE_STATUS_AVAILABLE, + NULL, NULL, FALSE, TRUE, FALSE); + types = g_list_append(types, status); + + status = purple_status_type_new_full(PURPLE_STATUS_AWAY, + NULL, NULL, FALSE, TRUE, FALSE); + types = g_list_append(types, status); + + status = purple_status_type_new_full(PURPLE_STATUS_AWAY, + "brb", _("Be Right Back"), FALSE, TRUE, FALSE); + types = g_list_append(types, status); + + status = purple_status_type_new_full(PURPLE_STATUS_UNAVAILABLE, + "busy", _("Busy"), FALSE, TRUE, FALSE); + types = g_list_append(types, status); + + status = purple_status_type_new_full(PURPLE_STATUS_UNAVAILABLE, + "phone", _("On the Phone"), FALSE, TRUE, FALSE); + types = g_list_append(types, status); + + status = purple_status_type_new_full(PURPLE_STATUS_AWAY, + "lunch", _("Out to Lunch"), FALSE, TRUE, FALSE); + types = g_list_append(types, status); + + status = purple_status_type_new_full(PURPLE_STATUS_INVISIBLE, + NULL, NULL, FALSE, TRUE, FALSE); + types = g_list_append(types, status); + + status = purple_status_type_new_full(PURPLE_STATUS_OFFLINE, + NULL, NULL, FALSE, TRUE, FALSE); + types = g_list_append(types, status); + + status = purple_status_type_new_full(PURPLE_STATUS_MOBILE, + "mobile", NULL, FALSE, FALSE, TRUE); + types = g_list_append(types, status); + + return types; +} + +static GList * +msn_actions(PurplePlugin *plugin, gpointer context) +{ + PurpleConnection *gc = (PurpleConnection *)context; + PurpleAccount *account; + const char *user; + + GList *m = NULL; + PurplePluginAction *act; + + act = purple_plugin_action_new(_("Set Friendly Name..."), + msn_show_set_friendly_name); + m = g_list_append(m, act); + m = g_list_append(m, NULL); + + act = purple_plugin_action_new(_("Set Home Phone Number..."), + msn_show_set_home_phone); + m = g_list_append(m, act); + + act = purple_plugin_action_new(_("Set Work Phone Number..."), + msn_show_set_work_phone); + m = g_list_append(m, act); + + act = purple_plugin_action_new(_("Set Mobile Phone Number..."), + msn_show_set_mobile_phone); + m = g_list_append(m, act); + m = g_list_append(m, NULL); + +#if 0 + act = purple_plugin_action_new(_("Enable/Disable Mobile Devices..."), + msn_show_set_mobile_support); + m = g_list_append(m, act); +#endif + + act = purple_plugin_action_new(_("Allow/Disallow Mobile Pages..."), + msn_show_set_mobile_pages); + m = g_list_append(m, act); + + account = purple_connection_get_account(gc); + user = msn_normalize(account, purple_account_get_username(account)); + + if ((strstr(user, "@hotmail.") != NULL) || + (strstr(user, "@msn.com") != NULL)) + { + m = g_list_append(m, NULL); + act = purple_plugin_action_new(_("Open Hotmail Inbox"), + msn_show_hotmail_inbox); + m = g_list_append(m, act); + } + + return m; +} + +static GList * +msn_buddy_menu(PurpleBuddy *buddy) +{ + MsnUser *user; + + GList *m = NULL; + PurpleMenuAction *act; + + g_return_val_if_fail(buddy != NULL, NULL); + + user = buddy->proto_data; + + if (user != NULL) + { + if (user->mobile) + { + act = purple_menu_action_new(_("Send to Mobile"), + PURPLE_CALLBACK(show_send_to_mobile_cb), + NULL, NULL); + m = g_list_append(m, act); + } + } + + if (g_ascii_strcasecmp(buddy->name, + purple_account_get_username(buddy->account))) + { + act = purple_menu_action_new(_("Initiate _Chat"), + PURPLE_CALLBACK(initiate_chat_cb), + NULL, NULL); + m = g_list_append(m, act); + } + + return m; +} + +static GList * +msn_blist_node_menu(PurpleBlistNode *node) +{ + if(PURPLE_BLIST_NODE_IS_BUDDY(node)) + { + return msn_buddy_menu((PurpleBuddy *) node); + } + else + { + return NULL; + } +} + +static void +msn_login(PurpleAccount *account) +{ + PurpleConnection *gc; + MsnSession *session; + const char *username; + const char *host; + gboolean http_method = FALSE; + int port; + + gc = purple_account_get_connection(account); + + if (!purple_ssl_is_supported()) + { + purple_connection_error_reason(gc, + PURPLE_CONNECTION_ERROR_NO_SSL_SUPPORT, + + _("SSL support is needed for MSN. Please install a supported " + "SSL library.")); + return; + } + + http_method = purple_account_get_bool(account, "http_method", FALSE); + + if (http_method) + host = purple_account_get_string(account, "http_method_server", MSN_HTTPCONN_SERVER); + else + host = purple_account_get_string(account, "server", MSN_SERVER); + port = purple_account_get_int(account, "port", MSN_PORT); + + session = msn_session_new(account); + + gc->proto_data = session; + gc->flags |= PURPLE_CONNECTION_HTML | PURPLE_CONNECTION_FORMATTING_WBFO | PURPLE_CONNECTION_NO_BGCOLOR | PURPLE_CONNECTION_NO_FONTSIZE | PURPLE_CONNECTION_NO_URLDESC; + + msn_session_set_login_step(session, MSN_LOGIN_STEP_START); + + /* Hmm, I don't like this. */ + /* XXX shx: Me neither */ + username = msn_normalize(account, purple_account_get_username(account)); + + if (strcmp(username, purple_account_get_username(account))) + purple_account_set_username(account, username); + + if (!msn_session_connect(session, host, port, http_method)) + purple_connection_error_reason(gc, + PURPLE_CONNECTION_ERROR_NETWORK_ERROR, + _("Failed to connect to server.")); +} + +static void +msn_close(PurpleConnection *gc) +{ + MsnSession *session; + + session = gc->proto_data; + + g_return_if_fail(session != NULL); + + msn_session_destroy(session); + + gc->proto_data = NULL; +} + +static gboolean +msn_send_me_im(gpointer data) +{ + MsnIMData *imdata = data; + serv_got_im(imdata->gc, imdata->who, imdata->msg, imdata->flags, imdata->when); + g_free(imdata->msg); + g_free(imdata); + return FALSE; +} + +static int +msn_send_im(PurpleConnection *gc, const char *who, const char *message, + PurpleMessageFlags flags) +{ + PurpleAccount *account; + PurpleBuddy *buddy = purple_find_buddy(gc->account, who); + MsnMessage *msg; + char *msgformat; + char *msgtext; + + account = purple_connection_get_account(gc); + + if (buddy) { + PurplePresence *p = purple_buddy_get_presence(buddy); + if (purple_presence_is_status_primitive_active(p, PURPLE_STATUS_MOBILE)) { + char *text = purple_markup_strip_html(message); + send_to_mobile(gc, who, text); + g_free(text); + return 1; + } + } + + msn_import_html(message, &msgformat, &msgtext); + + if (strlen(msgtext) + strlen(msgformat) + strlen(DISPLAY_VERSION) > 1564) + { + g_free(msgformat); + g_free(msgtext); + + return -E2BIG; + } + + msg = msn_message_new_plain(msgtext); + msn_message_set_attr(msg, "X-MMS-IM-Format", msgformat); + + g_free(msgformat); + g_free(msgtext); + + if (g_ascii_strcasecmp(who, purple_account_get_username(account))) + { + MsnSession *session; + MsnSwitchBoard *swboard; + + session = gc->proto_data; + swboard = msn_session_get_swboard(session, who, MSN_SB_FLAG_IM); + + msn_switchboard_send_msg(swboard, msg, TRUE); + } + else + { + char *body_str, *body_enc, *pre, *post; + const char *format; + MsnIMData *imdata = g_new0(MsnIMData, 1); + /* + * In MSN, you can't send messages to yourself, so + * we'll fake like we received it ;) + */ + body_str = msn_message_to_string(msg); + body_enc = g_markup_escape_text(body_str, -1); + g_free(body_str); + + format = msn_message_get_attr(msg, "X-MMS-IM-Format"); + msn_parse_format(format, &pre, &post); + body_str = g_strdup_printf("%s%s%s", pre ? pre : "", + body_enc ? body_enc : "", post ? post : ""); + g_free(body_enc); + g_free(pre); + g_free(post); + + serv_got_typing_stopped(gc, who); + imdata->gc = gc; + imdata->who = who; + imdata->msg = body_str; + imdata->flags = flags; + imdata->when = time(NULL); + g_idle_add(msn_send_me_im, imdata); + } + + msn_message_destroy(msg); + + return 1; +} + +static unsigned int +msn_send_typing(PurpleConnection *gc, const char *who, PurpleTypingState state) +{ + PurpleAccount *account; + MsnSession *session; + MsnSwitchBoard *swboard; + MsnMessage *msg; + + account = purple_connection_get_account(gc); + session = gc->proto_data; + + /* + * TODO: I feel like this should be "if (state != PURPLE_TYPING)" + * but this is how it was before, and I don't want to break + * anything. --KingAnt + */ + if (state == PURPLE_NOT_TYPING) + return 0; + + if (!g_ascii_strcasecmp(who, purple_account_get_username(account))) + { + /* We'll just fake it, since we're sending to ourself. */ + serv_got_typing(gc, who, MSN_TYPING_RECV_TIMEOUT, PURPLE_TYPING); + + return MSN_TYPING_SEND_TIMEOUT; + } + + swboard = msn_session_find_swboard(session, who); + + if (swboard == NULL || !msn_switchboard_can_send(swboard)) + return 0; + + swboard->flag |= MSN_SB_FLAG_IM; + + msg = msn_message_new(MSN_MSG_TYPING); + msn_message_set_content_type(msg, "text/x-msmsgscontrol"); + msn_message_set_flag(msg, 'U'); + msn_message_set_attr(msg, "TypingUser", + purple_account_get_username(account)); + msn_message_set_bin_data(msg, "\r\n", 2); + + msn_switchboard_send_msg(swboard, msg, FALSE); + + msn_message_destroy(msg); + + return MSN_TYPING_SEND_TIMEOUT; +} + +static void +msn_set_status(PurpleAccount *account, PurpleStatus *status) +{ + PurpleConnection *gc; + MsnSession *session; + + gc = purple_account_get_connection(account); + + if (gc != NULL) + { + session = gc->proto_data; + msn_change_status(session); + } +} + +static void +msn_set_idle(PurpleConnection *gc, int idle) +{ + MsnSession *session; + + session = gc->proto_data; + + msn_change_status(session); +} + +#if 0 +static void +fake_userlist_add_buddy(MsnUserList *userlist, + const char *who, int list_id, + const char *group_name) +{ + MsnUser *user; + static int group_id_c = 1; + int group_id; + + group_id = -1; + + if (group_name != NULL) + { + MsnGroup *group; + group = msn_group_new(userlist, group_id_c, group_name); + group_id = group_id_c++; + } + + user = msn_userlist_find_user(userlist, who); + + if (user == NULL) + { + user = msn_user_new(userlist, who, NULL); + msn_userlist_add_user(userlist, user); + } + else + if (user->list_op & (1 << list_id)) + { + if (list_id == MSN_LIST_FL) + { + if (group_id >= 0) + if (g_list_find(user->group_ids, + GINT_TO_POINTER(group_id))) + return; + } + else + return; + } + + if (group_id >= 0) + { + user->group_ids = g_list_append(user->group_ids, + GINT_TO_POINTER(group_id)); + } + + user->list_op |= (1 << list_id); +} +#endif + +static void +msn_add_buddy(PurpleConnection *gc, PurpleBuddy *buddy, PurpleGroup *group) +{ + MsnSession *session; + MsnUserList *userlist; + const char *who; + + session = gc->proto_data; + userlist = session->userlist; + who = msn_normalize(gc->account, buddy->name); + + if (!session->logged_in) + { +#if 0 + fake_userlist_add_buddy(session->sync_userlist, who, MSN_LIST_FL, + group ? group->name : NULL); +#else + purple_debug_error("msn", "msn_add_buddy called before connected\n"); +#endif + + return; + } + +#if 0 + if (group != NULL && group->name != NULL) + purple_debug_info("msn", "msn_add_buddy: %s, %s\n", who, group->name); + else + purple_debug_info("msn", "msn_add_buddy: %s\n", who); +#endif + +#if 0 + /* Which is the max? */ + if (session->fl_users_count >= 150) + { + purple_debug_info("msn", "Too many buddies\n"); + /* Buddy list full */ + /* TODO: purple should be notified of this */ + return; + } +#endif + + /* XXX - Would group ever be NULL here? I don't think so... + * shx: Yes it should; MSN handles non-grouped buddies, and this is only + * internal. */ + msn_userlist_add_buddy(userlist, who, MSN_LIST_FL, + group ? group->name : NULL); +} + +static void +msn_rem_buddy(PurpleConnection *gc, PurpleBuddy *buddy, PurpleGroup *group) +{ + MsnSession *session; + MsnUserList *userlist; + + session = gc->proto_data; + userlist = session->userlist; + + if (!session->logged_in) + return; + + /* XXX - Does buddy->name need to be msn_normalize'd here? --KingAnt */ + msn_userlist_rem_buddy(userlist, buddy->name, MSN_LIST_FL, group->name); +} + +static void +msn_add_permit(PurpleConnection *gc, const char *who) +{ + MsnSession *session; + MsnUserList *userlist; + MsnUser *user; + + session = gc->proto_data; + userlist = session->userlist; + user = msn_userlist_find_user(userlist, who); + + if (!session->logged_in) + return; + + if (user != NULL && user->list_op & MSN_LIST_BL_OP) + msn_userlist_rem_buddy(userlist, who, MSN_LIST_BL, NULL); + + msn_userlist_add_buddy(userlist, who, MSN_LIST_AL, NULL); +} + +static void +msn_add_deny(PurpleConnection *gc, const char *who) +{ + MsnSession *session; + MsnUserList *userlist; + MsnUser *user; + + session = gc->proto_data; + userlist = session->userlist; + user = msn_userlist_find_user(userlist, who); + + if (!session->logged_in) + return; + + if (user != NULL && user->list_op & MSN_LIST_AL_OP) + msn_userlist_rem_buddy(userlist, who, MSN_LIST_AL, NULL); + + msn_userlist_add_buddy(userlist, who, MSN_LIST_BL, NULL); +} + +static void +msn_rem_permit(PurpleConnection *gc, const char *who) +{ + MsnSession *session; + MsnUserList *userlist; + MsnUser *user; + + session = gc->proto_data; + userlist = session->userlist; + + if (!session->logged_in) + return; + + user = msn_userlist_find_user(userlist, who); + + msn_userlist_rem_buddy(userlist, who, MSN_LIST_AL, NULL); + + if (user != NULL && user->list_op & MSN_LIST_RL_OP) + msn_userlist_add_buddy(userlist, who, MSN_LIST_BL, NULL); +} + +static void +msn_rem_deny(PurpleConnection *gc, const char *who) +{ + MsnSession *session; + MsnUserList *userlist; + MsnUser *user; + + session = gc->proto_data; + userlist = session->userlist; + + if (!session->logged_in) + return; + + user = msn_userlist_find_user(userlist, who); + + msn_userlist_rem_buddy(userlist, who, MSN_LIST_BL, NULL); + + if (user != NULL && user->list_op & MSN_LIST_RL_OP) + msn_userlist_add_buddy(userlist, who, MSN_LIST_AL, NULL); +} + +static void +msn_set_permit_deny(PurpleConnection *gc) +{ + PurpleAccount *account; + MsnSession *session; + MsnCmdProc *cmdproc; + + account = purple_connection_get_account(gc); + session = gc->proto_data; + cmdproc = session->notification->cmdproc; + + if (account->perm_deny == PURPLE_PRIVACY_ALLOW_ALL || + account->perm_deny == PURPLE_PRIVACY_DENY_USERS) + { + msn_cmdproc_send(cmdproc, "BLP", "%s", "AL"); + } + else + { + msn_cmdproc_send(cmdproc, "BLP", "%s", "BL"); + } +} + +static void +msn_chat_invite(PurpleConnection *gc, int id, const char *msg, + const char *who) +{ + MsnSession *session; + MsnSwitchBoard *swboard; + + session = gc->proto_data; + + swboard = msn_session_find_swboard_with_id(session, id); + + if (swboard == NULL) + { + /* if we have no switchboard, everyone else left the chat already */ + swboard = msn_switchboard_new(session); + msn_switchboard_request(swboard); + swboard->chat_id = id; + swboard->conv = purple_find_chat(gc, id); + } + + swboard->flag |= MSN_SB_FLAG_IM; + + msn_switchboard_request_add_user(swboard, who); +} + +static void +msn_chat_leave(PurpleConnection *gc, int id) +{ + MsnSession *session; + MsnSwitchBoard *swboard; + PurpleConversation *conv; + + session = gc->proto_data; + + swboard = msn_session_find_swboard_with_id(session, id); + + /* if swboard is NULL we were the only person left anyway */ + if (swboard == NULL) + return; + + conv = swboard->conv; + + msn_switchboard_release(swboard, MSN_SB_FLAG_IM); + + /* If other switchboards managed to associate themselves with this + * conv, make sure they know it's gone! */ + if (conv != NULL) + { + while ((swboard = msn_session_find_swboard_with_conv(session, conv)) != NULL) + swboard->conv = NULL; + } +} + +static int +msn_chat_send(PurpleConnection *gc, int id, const char *message, PurpleMessageFlags flags) +{ + PurpleAccount *account; + MsnSession *session; + MsnSwitchBoard *swboard; + MsnMessage *msg; + char *msgformat; + char *msgtext; + + account = purple_connection_get_account(gc); + session = gc->proto_data; + swboard = msn_session_find_swboard_with_id(session, id); + + if (swboard == NULL) + return -EINVAL; + + if (!swboard->ready) + return 0; + + swboard->flag |= MSN_SB_FLAG_IM; + + msn_import_html(message, &msgformat, &msgtext); + + if (strlen(msgtext) + strlen(msgformat) + strlen(DISPLAY_VERSION) > 1564) + { + g_free(msgformat); + g_free(msgtext); + + return -E2BIG; + } + + msg = msn_message_new_plain(msgtext); + msn_message_set_attr(msg, "X-MMS-IM-Format", msgformat); + msn_switchboard_send_msg(swboard, msg, FALSE); + msn_message_destroy(msg); + + g_free(msgformat); + g_free(msgtext); + + serv_got_chat_in(gc, id, purple_account_get_username(account), 0, + message, time(NULL)); + + return 0; +} + +static void +msn_keepalive(PurpleConnection *gc) +{ + MsnSession *session; + + session = gc->proto_data; + + if (!session->http_method) + { + MsnCmdProc *cmdproc; + + cmdproc = session->notification->cmdproc; + + msn_cmdproc_send_quick(cmdproc, "PNG", NULL, NULL); + } +} + +static void +msn_group_buddy(PurpleConnection *gc, const char *who, + const char *old_group_name, const char *new_group_name) +{ + MsnSession *session; + MsnUserList *userlist; + + session = gc->proto_data; + userlist = session->userlist; + + msn_userlist_move_buddy(userlist, who, old_group_name, new_group_name); +} + +static void +msn_rename_group(PurpleConnection *gc, const char *old_name, + PurpleGroup *group, GList *moved_buddies) +{ + MsnSession *session; + MsnCmdProc *cmdproc; + int old_gid; + const char *enc_new_group_name; + + session = gc->proto_data; + cmdproc = session->notification->cmdproc; + enc_new_group_name = purple_url_encode(group->name); + + old_gid = msn_userlist_find_group_id(session->userlist, old_name); + + if (old_gid >= 0) + { + msn_cmdproc_send(cmdproc, "REG", "%d %s 0", old_gid, + enc_new_group_name); + } + else + { + msn_cmdproc_send(cmdproc, "ADG", "%s 0", enc_new_group_name); + } +} + +static void +msn_convo_closed(PurpleConnection *gc, const char *who) +{ + MsnSession *session; + MsnSwitchBoard *swboard; + PurpleConversation *conv; + + session = gc->proto_data; + + swboard = msn_session_find_swboard(session, who); + + /* + * Don't perform an assertion here. If swboard is NULL, then the + * switchboard was either closed by the other party, or the person + * is talking to himself. + */ + if (swboard == NULL) + return; + + conv = swboard->conv; + + /* If we release the switchboard here, it may still have messages + pending ACK which would result in incorrect unsent message errors. + Just let it timeout... This is *so* going to screw with people who + use dumb clients that report "User has closed the conversation window" */ + /* msn_switchboard_release(swboard, MSN_SB_FLAG_IM); */ + swboard->conv = NULL; + + /* If other switchboards managed to associate themselves with this + * conv, make sure they know it's gone! */ + if (conv != NULL) + { + while ((swboard = msn_session_find_swboard_with_conv(session, conv)) != NULL) + swboard->conv = NULL; + } +} + +static void +msn_set_buddy_icon(PurpleConnection *gc, PurpleStoredImage *img) +{ + MsnSession *session; + MsnUser *user; + + session = gc->proto_data; + user = session->user; + + msn_user_set_buddy_icon(user, img); + + msn_change_status(session); +} + +static void +msn_remove_group(PurpleConnection *gc, PurpleGroup *group) +{ + MsnSession *session; + MsnCmdProc *cmdproc; + int group_id; + + session = gc->proto_data; + cmdproc = session->notification->cmdproc; + + if ((group_id = msn_userlist_find_group_id(session->userlist, group->name)) >= 0) + { + msn_cmdproc_send(cmdproc, "RMG", "%d", group_id); + } +} + +/** + * Extract info text from info_data and add it to user_info + */ +static gboolean +msn_tooltip_extract_info_text(PurpleNotifyUserInfo *user_info, MsnGetInfoData *info_data) +{ + PurpleBuddy *b; + + b = purple_find_buddy(purple_connection_get_account(info_data->gc), + info_data->name); + + if (b) + { + char *tmp; + + if (b->alias && b->alias[0]) + { + char *aliastext = g_markup_escape_text(b->alias, -1); + purple_notify_user_info_add_pair(user_info, _("Alias"), aliastext); + g_free(aliastext); + } + + if (b->server_alias) + { + char *nicktext = g_markup_escape_text(b->server_alias, -1); + tmp = g_strdup_printf("<font sml=\"msn\">%s</font><br>", nicktext); + purple_notify_user_info_add_pair(user_info, _("Nickname"), tmp); + g_free(tmp); + g_free(nicktext); + } + + /* Add the tooltip information */ + msn_tooltip_text(b, user_info, TRUE); + + return TRUE; + } + + return FALSE; +} + +#if PHOTO_SUPPORT + +static char * +msn_get_photo_url(const char *url_text) +{ + char *p, *q; + + if ((p = strstr(url_text, " contactparams:photopreauthurl=\"")) != NULL) + { + p += strlen(" contactparams:photopreauthurl=\""); + } + + if (p && (strncmp(p, "http://", 8) == 0) && ((q = strchr(p, '"')) != NULL)) + return g_strndup(p, q - p); + + return NULL; +} + +static void msn_got_photo(PurpleUtilFetchUrlData *url_data, gpointer data, + const gchar *url_text, size_t len, const gchar *error_message); + +#endif + +#if 0 +static char *msn_info_date_reformat(const char *field, size_t len) +{ + char *tmp = g_strndup(field, len); + time_t t = purple_str_to_time(tmp, FALSE, NULL, NULL, NULL); + + g_free(tmp); + return g_strdup(purple_date_format_short(localtime(&t))); +} +#endif + +#define MSN_GOT_INFO_GET_FIELD(a, b) \ + found = purple_markup_extract_info_field(stripped, stripped_len, user_info, \ + "\n" a ":", 0, "\n", 0, "Undisclosed", b, 0, NULL, NULL); \ + if (found) \ + sect_info = TRUE; + +#define MSN_GOT_INFO_GET_FIELD_NO_SEARCH(a, b) \ + found = purple_markup_extract_info_field(stripped, stripped_len, user_info, \ + "\n" a ":", 0, "\n", 0, "Undisclosed", b, 0, NULL, msn_info_strip_search_link); \ + if (found) \ + sect_info = TRUE; + +static char * +msn_info_strip_search_link(const char *field, size_t len) +{ + const char *c; + if ((c = strstr(field, " (http://spaces.live.com/default.aspx?page=searchresults")) == NULL && + (c = strstr(field, " (http://spaces.msn.com/default.aspx?page=searchresults")) == NULL) + return g_strndup(field, len); + return g_strndup(field, c - field); +} + +static void +msn_got_info(PurpleUtilFetchUrlData *url_data, gpointer data, + const gchar *url_text, size_t len, const gchar *error_message) +{ + MsnGetInfoData *info_data = (MsnGetInfoData *)data; + PurpleNotifyUserInfo *user_info; + char *stripped, *p, *q, *tmp; + char *user_url = NULL; + gboolean found; + gboolean has_tooltip_text = FALSE; + gboolean has_info = FALSE; + gboolean sect_info = FALSE; + gboolean has_contact_info = FALSE; + char *url_buffer; + int stripped_len; +#if PHOTO_SUPPORT + char *photo_url_text = NULL; + MsnGetInfoStepTwoData *info2_data = NULL; +#endif + + purple_debug_info("msn", "In msn_got_info\n"); + + /* Make sure the connection is still valid */ + if (g_list_find(purple_connections_get_all(), info_data->gc) == NULL) + { + purple_debug_warning("msn", "invalid connection. ignoring buddy info.\n"); + g_free(info_data->name); + g_free(info_data); + return; + } + + user_info = purple_notify_user_info_new(); + has_tooltip_text = msn_tooltip_extract_info_text(user_info, info_data); + + if (error_message != NULL || url_text == NULL || strcmp(url_text, "") == 0) + { + tmp = g_strdup_printf("<b>%s</b>", _("Error retrieving profile")); + purple_notify_user_info_add_pair(user_info, NULL, tmp); + g_free(tmp); + + purple_notify_userinfo(info_data->gc, info_data->name, user_info, NULL, NULL); + purple_notify_user_info_destroy(user_info); + + g_free(info_data->name); + g_free(info_data); + return; + } + + url_buffer = g_strdup(url_text); + + /* If they have a homepage link, MSN masks it such that we need to + * fetch the url out before purple_markup_strip_html() nukes it */ + /* I don't think this works with the new spaces profiles - Stu 3/2/06 */ + if ((p = strstr(url_text, + "Take a look at my </font><A class=viewDesc title=\"")) != NULL) + { + p += 50; + + if ((q = strchr(p, '"')) != NULL) + user_url = g_strndup(p, q - p); + } + + /* + * purple_markup_strip_html() doesn't strip out character entities like + * and · + */ + while ((p = strstr(url_buffer, " ")) != NULL) + { + *p = ' '; /* Turn 's into ordinary blanks */ + p += 1; + memmove(p, p + 5, strlen(p + 5)); + url_buffer[strlen(url_buffer) - 5] = '\0'; + } + + while ((p = strstr(url_buffer, "·")) != NULL) + { + memmove(p, p + 6, strlen(p + 6)); + url_buffer[strlen(url_buffer) - 6] = '\0'; + } + + /* Nuke the nasty \r's that just get in the way */ + purple_str_strip_char(url_buffer, '\r'); + + /* MSN always puts in ' for apostrophes...replace them */ + while ((p = strstr(url_buffer, "'")) != NULL) + { + *p = '\''; + memmove(p + 1, p + 5, strlen(p + 5)); + url_buffer[strlen(url_buffer) - 4] = '\0'; + } + + /* Nuke the html, it's easier than trying to parse the horrid stuff */ + stripped = purple_markup_strip_html(url_buffer); + stripped_len = strlen(stripped); + + purple_debug_misc("msn", "stripped = %p\n", stripped); + purple_debug_misc("msn", "url_buffer = %p\n", url_buffer); + + /* General section header */ + if (has_tooltip_text) + purple_notify_user_info_add_section_break(user_info); + + purple_notify_user_info_add_section_header(user_info, _("General")); + + /* Extract their Name and put it in */ + MSN_GOT_INFO_GET_FIELD("Name", _("Name")); + + /* General */ + MSN_GOT_INFO_GET_FIELD("Nickname", _("Nickname")); + MSN_GOT_INFO_GET_FIELD_NO_SEARCH("Age", _("Age")); + MSN_GOT_INFO_GET_FIELD_NO_SEARCH("Gender", _("Gender")); + MSN_GOT_INFO_GET_FIELD_NO_SEARCH("Occupation", _("Occupation")); + MSN_GOT_INFO_GET_FIELD_NO_SEARCH("Location", _("Location")); + + /* Extract their Interests and put it in */ + found = purple_markup_extract_info_field(stripped, stripped_len, user_info, + "\nInterests\t", 0, " (/default.aspx?page=searchresults", 0, + "Undisclosed", _("Hobbies and Interests") /* _("Interests") */, + 0, NULL, NULL); + + if (found) + sect_info = TRUE; + + MSN_GOT_INFO_GET_FIELD("More about me", _("A Little About Me")); + + if (sect_info) + { + has_info = TRUE; + sect_info = FALSE; + } + else + { + /* Remove the section header */ + purple_notify_user_info_remove_last_item(user_info); + if (has_tooltip_text) + purple_notify_user_info_remove_last_item(user_info); + } + + /* Social */ + purple_notify_user_info_add_section_break(user_info); + purple_notify_user_info_add_section_header(user_info, _("Social")); + + MSN_GOT_INFO_GET_FIELD("Marital status", _("Marital Status")); + MSN_GOT_INFO_GET_FIELD("Interested in", _("Interests")); + MSN_GOT_INFO_GET_FIELD("Pets", _("Pets")); + MSN_GOT_INFO_GET_FIELD("Hometown", _("Hometown")); + MSN_GOT_INFO_GET_FIELD("Places lived", _("Places Lived")); + MSN_GOT_INFO_GET_FIELD("Fashion", _("Fashion")); + MSN_GOT_INFO_GET_FIELD("Humor", _("Humor")); + MSN_GOT_INFO_GET_FIELD("Music", _("Music")); + MSN_GOT_INFO_GET_FIELD("Favorite quote", _("Favorite Quote")); + + if (sect_info) + { + has_info = TRUE; + sect_info = FALSE; + } + else + { + /* Remove the section header */ + purple_notify_user_info_remove_last_item(user_info); + purple_notify_user_info_remove_last_item(user_info); + } + + /* Contact Info */ + /* Personal */ + purple_notify_user_info_add_section_break(user_info); + purple_notify_user_info_add_section_header(user_info, _("Contact Info")); + purple_notify_user_info_add_section_header(user_info, _("Personal")); + + MSN_GOT_INFO_GET_FIELD("Name", _("Name")); + MSN_GOT_INFO_GET_FIELD("Significant other", _("Significant Other")); + MSN_GOT_INFO_GET_FIELD("Home phone", _("Home Phone")); + MSN_GOT_INFO_GET_FIELD("Home phone 2", _("Home Phone 2")); + MSN_GOT_INFO_GET_FIELD("Home address", _("Home Address")); + MSN_GOT_INFO_GET_FIELD("Personal Mobile", _("Personal Mobile")); + MSN_GOT_INFO_GET_FIELD("Home fax", _("Home Fax")); + MSN_GOT_INFO_GET_FIELD("Personal e-mail", _("Personal E-Mail")); + MSN_GOT_INFO_GET_FIELD("Personal IM", _("Personal IM")); + MSN_GOT_INFO_GET_FIELD("Birthday", _("Birthday")); + MSN_GOT_INFO_GET_FIELD("Anniversary", _("Anniversary")); + MSN_GOT_INFO_GET_FIELD("Notes", _("Notes")); + + if (sect_info) + { + has_info = TRUE; + sect_info = FALSE; + has_contact_info = TRUE; + } + else + { + /* Remove the section header */ + purple_notify_user_info_remove_last_item(user_info); + } + + /* Business */ + purple_notify_user_info_add_section_header(user_info, _("Work")); + MSN_GOT_INFO_GET_FIELD("Name", _("Name")); + MSN_GOT_INFO_GET_FIELD("Job title", _("Job Title")); + MSN_GOT_INFO_GET_FIELD("Company", _("Company")); + MSN_GOT_INFO_GET_FIELD("Department", _("Department")); + MSN_GOT_INFO_GET_FIELD("Profession", _("Profession")); + MSN_GOT_INFO_GET_FIELD("Work phone 1", _("Work Phone")); + MSN_GOT_INFO_GET_FIELD("Work phone 2", _("Work Phone 2")); + MSN_GOT_INFO_GET_FIELD("Work address", _("Work Address")); + MSN_GOT_INFO_GET_FIELD("Work mobile", _("Work Mobile")); + MSN_GOT_INFO_GET_FIELD("Work pager", _("Work Pager")); + MSN_GOT_INFO_GET_FIELD("Work fax", _("Work Fax")); + MSN_GOT_INFO_GET_FIELD("Work e-mail", _("Work E-Mail")); + MSN_GOT_INFO_GET_FIELD("Work IM", _("Work IM")); + MSN_GOT_INFO_GET_FIELD("Start date", _("Start Date")); + MSN_GOT_INFO_GET_FIELD("Notes", _("Notes")); + + if (sect_info) + { + has_info = TRUE; + sect_info = FALSE; + has_contact_info = TRUE; + } + else + { + /* Remove the section header */ + purple_notify_user_info_remove_last_item(user_info); + } + + if (!has_contact_info) + { + /* Remove the Contact Info section header */ + purple_notify_user_info_remove_last_item(user_info); + } + +#if 0 /* these probably don't show up any more */ + /* + * The fields, 'A Little About Me', 'Favorite Things', 'Hobbies + * and Interests', 'Favorite Quote', and 'My Homepage' may or may + * not appear, in any combination. However, they do appear in + * certain order, so we can successively search to pin down the + * distinct values. + */ + + /* Check if they have A Little About Me */ + found = purple_markup_extract_info_field(stripped, stripped_len, s, + " A Little About Me \n\n", 0, "Favorite Things", '\n', NULL, + _("A Little About Me"), 0, NULL, NULL); + + if (!found) + { + found = purple_markup_extract_info_field(stripped, stripped_len, s, + " A Little About Me \n\n", 0, "Hobbies and Interests", '\n', + NULL, _("A Little About Me"), 0, NULL, NULL); + } + + if (!found) + { + found = purple_markup_extract_info_field(stripped, stripped_len, s, + " A Little About Me \n\n", 0, "Favorite Quote", '\n', NULL, + _("A Little About Me"), 0, NULL, NULL); + } + + if (!found) + { + found = purple_markup_extract_info_field(stripped, stripped_len, s, + " A Little About Me \n\n", 0, "My Homepage \n\nTake a look", + '\n', + NULL, _("A Little About Me"), 0, NULL, NULL); + } + + if (!found) + { + purple_markup_extract_info_field(stripped, stripped_len, s, + " A Little About Me \n\n", 0, "last updated", '\n', NULL, + _("A Little About Me"), 0, NULL, NULL); + } + + if (found) + has_info = TRUE; + + /* Check if they have Favorite Things */ + found = purple_markup_extract_info_field(stripped, stripped_len, s, + " Favorite Things \n\n", 0, "Hobbies and Interests", '\n', NULL, + _("Favorite Things"), 0, NULL, NULL); + + if (!found) + { + found = purple_markup_extract_info_field(stripped, stripped_len, s, + " Favorite Things \n\n", 0, "Favorite Quote", '\n', NULL, + _("Favorite Things"), 0, NULL, NULL); + } + + if (!found) + { + found = purple_markup_extract_info_field(stripped, stripped_len, s, + " Favorite Things \n\n", 0, "My Homepage \n\nTake a look", '\n', + NULL, _("Favorite Things"), 0, NULL, NULL); + } + + if (!found) + { + purple_markup_extract_info_field(stripped, stripped_len, s, + " Favorite Things \n\n", 0, "last updated", '\n', NULL, + _("Favorite Things"), 0, NULL, NULL); + } + + if (found) + has_info = TRUE; + + /* Check if they have Hobbies and Interests */ + found = purple_markup_extract_info_field(stripped, stripped_len, s, + " Hobbies and Interests \n\n", 0, "Favorite Quote", '\n', NULL, + _("Hobbies and Interests"), 0, NULL, NULL); + + if (!found) + { + found = purple_markup_extract_info_field(stripped, stripped_len, s, + " Hobbies and Interests \n\n", 0, "My Homepage \n\nTake a look", + '\n', NULL, _("Hobbies and Interests"), 0, NULL, NULL); + } + + if (!found) + { + purple_markup_extract_info_field(stripped, stripped_len, s, + " Hobbies and Interests \n\n", 0, "last updated", '\n', NULL, + _("Hobbies and Interests"), 0, NULL, NULL); + } + + if (found) + has_info = TRUE; + + /* Check if they have Favorite Quote */ + found = purple_markup_extract_info_field(stripped, stripped_len, s, + "Favorite Quote \n\n", 0, "My Homepage \n\nTake a look", '\n', NULL, + _("Favorite Quote"), 0, NULL, NULL); + + if (!found) + { + purple_markup_extract_info_field(stripped, stripped_len, s, + "Favorite Quote \n\n", 0, "last updated", '\n', NULL, + _("Favorite Quote"), 0, NULL, NULL); + } + + if (found) + has_info = TRUE; + + /* Extract the last updated date and put it in */ + found = purple_markup_extract_info_field(stripped, stripped_len, s, + " last updated:", 1, "\n", 0, NULL, _("Last Updated"), 0, + NULL, msn_info_date_reformat); + + if (found) + has_info = TRUE; +#endif + + /* If we were able to fetch a homepage url earlier, stick it in there */ + if (user_url != NULL) + { + tmp = g_strdup_printf("<a href=\"%s\">%s</a>", user_url, user_url); + purple_notify_user_info_add_pair(user_info, _("Homepage"), tmp); + g_free(tmp); + g_free(user_url); + + has_info = TRUE; + } + + if (!has_info) + { + /* MSN doesn't actually distinguish between "unknown member" and + * a known member with an empty profile. Try to explain this fact. + * Note that if we have a nonempty tooltip_text, we know the user + * exists. + */ + /* This doesn't work with the new spaces profiles - Stu 3/2/06 + char *p = strstr(url_buffer, "Unknown Member </TITLE>"); + * This might not work for long either ... */ + /* Nope, it failed some time before 5/2/07 :( + char *p = strstr(url_buffer, "form id=\"SpacesSearch\" name=\"SpacesSearch\""); + * Let's see how long this one holds out for ... */ + char *p = strstr(url_buffer, "<form id=\"profile_form\" name=\"profile_form\" action=\"http://spaces.live.com/profile.aspx?cid=0\""); + PurpleBuddy *b = purple_find_buddy + (purple_connection_get_account(info_data->gc), info_data->name); + purple_notify_user_info_add_pair(user_info, _("Error retrieving profile"), + ((p && b) ? _("The user has not created a public profile.") : + (p ? _("MSN reported not being able to find the user's profile. " + "This either means that the user does not exist, " + "or that the user exists " + "but has not created a public profile.") : + _("Could not find " /* This should never happen */ + "any information in the user's profile. " + "The user most likely does not exist.")))); + } + + /* put a link to the actual profile URL */ + tmp = g_strdup_printf("<a href=\"%s%s\">%s%s</a>", + PROFILE_URL, info_data->name, PROFILE_URL, info_data->name); + purple_notify_user_info_add_pair(user_info, _("Profile URL"), tmp); + g_free(tmp); + +#if PHOTO_SUPPORT + /* Find the URL to the photo; must be before the marshalling [Bug 994207] */ + photo_url_text = msn_get_photo_url(url_text); + + /* Marshall the existing state */ + info2_data = g_malloc0(sizeof(MsnGetInfoStepTwoData)); + info2_data->info_data = info_data; + info2_data->stripped = stripped; + info2_data->url_buffer = url_buffer; + info2_data->user_info = user_info; + info2_data->photo_url_text = photo_url_text; + + /* Try to put the photo in there too, if there's one */ + if (photo_url_text) + { + purple_util_fetch_url(photo_url_text, FALSE, NULL, FALSE, msn_got_photo, + info2_data); + } + else + { + /* Emulate a callback */ + /* TODO: Huh? */ + msn_got_photo(NULL, info2_data, NULL, 0, NULL); + } +} + +static void +msn_got_photo(PurpleUtilFetchUrlData *url_data, gpointer user_data, + const gchar *url_text, size_t len, const gchar *error_message) +{ + MsnGetInfoStepTwoData *info2_data = (MsnGetInfoStepTwoData *)user_data; + int id = -1; + + /* Unmarshall the saved state */ + MsnGetInfoData *info_data = info2_data->info_data; + char *stripped = info2_data->stripped; + char *url_buffer = info2_data->url_buffer; + PurpleNotifyUserInfo *user_info = info2_data->user_info; + char *photo_url_text = info2_data->photo_url_text; + + /* Make sure the connection is still valid if we got here by fetching a photo url */ + if (url_text && (error_message != NULL || + g_list_find(purple_connections_get_all(), info_data->gc) == NULL)) + { + purple_debug_warning("msn", "invalid connection. ignoring buddy photo info.\n"); + g_free(stripped); + g_free(url_buffer); + g_free(user_info); + g_free(info_data->name); + g_free(info_data); + g_free(photo_url_text); + g_free(info2_data); + + return; + } + + /* Try to put the photo in there too, if there's one and is readable */ + if (user_data && url_text && len != 0) + { + if (strstr(url_text, "400 Bad Request") + || strstr(url_text, "403 Forbidden") + || strstr(url_text, "404 Not Found")) + { + + purple_debug_info("msn", "Error getting %s: %s\n", + photo_url_text, url_text); + } + else + { + char buf[1024]; + purple_debug_info("msn", "%s is %d bytes\n", photo_url_text, len); + id = purple_imgstore_add_with_id(g_memdup(url_text, len), len, NULL); + g_snprintf(buf, sizeof(buf), "<img id=\"%d\"><br>", id); + purple_notify_user_info_prepend_pair(user_info, NULL, buf); + } + } + + /* We continue here from msn_got_info, as if nothing has happened */ +#endif + purple_notify_userinfo(info_data->gc, info_data->name, user_info, NULL, NULL); + + g_free(stripped); + g_free(url_buffer); + purple_notify_user_info_destroy(user_info); + g_free(info_data->name); + g_free(info_data); +#if PHOTO_SUPPORT + g_free(photo_url_text); + g_free(info2_data); + if (id != -1) + purple_imgstore_unref_by_id(id); +#endif +} + +static void +msn_get_info(PurpleConnection *gc, const char *name) +{ + MsnGetInfoData *data; + char *url; + + data = g_new0(MsnGetInfoData, 1); + data->gc = gc; + data->name = g_strdup(name); + + url = g_strdup_printf("%s%s", PROFILE_URL, name); + + purple_util_fetch_url(url, FALSE, + "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)", + TRUE, msn_got_info, data); + + g_free(url); +} + +static gboolean msn_load(PurplePlugin *plugin) +{ + msn_notification_init(); + msn_switchboard_init(); + msn_sync_init(); + + return TRUE; +} + +static gboolean msn_unload(PurplePlugin *plugin) +{ + msn_notification_end(); + msn_switchboard_end(); + msn_sync_end(); + + return TRUE; +} + +static PurpleAccount *find_acct(const char *prpl, const char *acct_id) +{ + PurpleAccount *acct = NULL; + + /* If we have a specific acct, use it */ + if (acct_id) { + acct = purple_accounts_find(acct_id, prpl); + if (acct && !purple_account_is_connected(acct)) + acct = NULL; + } else { /* Otherwise find an active account for the protocol */ + GList *l = purple_accounts_get_all(); + while (l) { + if (!strcmp(prpl, purple_account_get_protocol_id(l->data)) + && purple_account_is_connected(l->data)) { + acct = l->data; + break; + } + l = l->next; + } + } + + return acct; +} + +static gboolean msn_uri_handler(const char *proto, const char *cmd, GHashTable *params) +{ + char *acct_id = g_hash_table_lookup(params, "account"); + PurpleAccount *acct; + + if (g_ascii_strcasecmp(proto, "msnim")) + return FALSE; + + acct = find_acct("prpl-msn", acct_id); + + if (!acct) + return FALSE; + + /* msnim:chat?contact=user@domain.tld */ + if (!g_ascii_strcasecmp(cmd, "Chat")) { + char *sname = g_hash_table_lookup(params, "contact"); + if (sname) { + PurpleConversation *conv = purple_find_conversation_with_account( + PURPLE_CONV_TYPE_IM, sname, acct); + if (conv == NULL) + conv = purple_conversation_new(PURPLE_CONV_TYPE_IM, acct, sname); + purple_conversation_present(conv); + } + /*else + **If pidgindialogs_im() was in the core, we could use it here. + * It is all purple_request_* based, but I'm not sure it really belongs in the core + pidgindialogs_im();*/ + + return TRUE; + } + /* msnim:add?contact=user@domain.tld */ + else if (!g_ascii_strcasecmp(cmd, "Add")) { + char *name = g_hash_table_lookup(params, "contact"); + purple_blist_request_add_buddy(acct, name, NULL, NULL); + return TRUE; + } + + return FALSE; +} + + +static PurplePluginProtocolInfo prpl_info = +{ + OPT_PROTO_MAIL_CHECK, + NULL, /* user_splits */ + NULL, /* protocol_options */ + {"png", 0, 0, 96, 96, 0, PURPLE_ICON_SCALE_SEND}, /* icon_spec */ + msn_list_icon, /* list_icon */ + NULL, /* list_emblems */ + msn_status_text, /* status_text */ + msn_tooltip_text, /* tooltip_text */ + msn_status_types, /* away_states */ + msn_blist_node_menu, /* blist_node_menu */ + NULL, /* chat_info */ + NULL, /* chat_info_defaults */ + msn_login, /* login */ + msn_close, /* close */ + msn_send_im, /* send_im */ + NULL, /* set_info */ + msn_send_typing, /* send_typing */ + msn_get_info, /* get_info */ + msn_set_status, /* set_away */ + msn_set_idle, /* set_idle */ + NULL, /* change_passwd */ + msn_add_buddy, /* add_buddy */ + NULL, /* add_buddies */ + msn_rem_buddy, /* remove_buddy */ + NULL, /* remove_buddies */ + msn_add_permit, /* add_permit */ + msn_add_deny, /* add_deny */ + msn_rem_permit, /* rem_permit */ + msn_rem_deny, /* rem_deny */ + msn_set_permit_deny, /* set_permit_deny */ + NULL, /* join_chat */ + NULL, /* reject chat invite */ + NULL, /* get_chat_name */ + msn_chat_invite, /* chat_invite */ + msn_chat_leave, /* chat_leave */ + NULL, /* chat_whisper */ + msn_chat_send, /* chat_send */ + msn_keepalive, /* keepalive */ + NULL, /* register_user */ + NULL, /* get_cb_info */ + NULL, /* get_cb_away */ + NULL, /* alias_buddy */ + msn_group_buddy, /* group_buddy */ + msn_rename_group, /* rename_group */ + NULL, /* buddy_free */ + msn_convo_closed, /* convo_closed */ + msn_normalize, /* normalize */ + msn_set_buddy_icon, /* set_buddy_icon */ + msn_remove_group, /* remove_group */ + NULL, /* get_cb_real_name */ + NULL, /* set_chat_topic */ + NULL, /* find_blist_chat */ + NULL, /* roomlist_get_list */ + NULL, /* roomlist_cancel */ + NULL, /* roomlist_expand_category */ + msn_can_receive_file, /* can_receive_file */ + msn_send_file, /* send_file */ + msn_new_xfer, /* new_xfer */ + msn_offline_message, /* offline_message */ + NULL, /* whiteboard_prpl_ops */ + NULL, /* send_raw */ + NULL, /* roomlist_room_serialize */ + NULL, /* unregister_user */ + msn_send_attention, /* send_attention */ + msn_attention_types, /* attention_types */ + + /* padding */ + NULL +}; + +static PurplePluginInfo info = +{ + PURPLE_PLUGIN_MAGIC, + PURPLE_MAJOR_VERSION, + PURPLE_MINOR_VERSION, + PURPLE_PLUGIN_PROTOCOL, /**< type */ + NULL, /**< ui_requirement */ + 0, /**< flags */ + NULL, /**< dependencies */ + PURPLE_PRIORITY_DEFAULT, /**< priority */ + + "prpl-msn", /**< id */ + "MSN", /**< name */ + DISPLAY_VERSION, /**< version */ + /** summary */ + N_("MSN Protocol Plugin"), + /** description */ + N_("MSN Protocol Plugin"), + "Christian Hammond <chipx86@gnupdate.org>", /**< author */ + PURPLE_WEBSITE, /**< homepage */ + + msn_load, /**< load */ + msn_unload, /**< unload */ + NULL, /**< destroy */ + + NULL, /**< ui_info */ + &prpl_info, /**< extra_info */ + NULL, /**< prefs_info */ + msn_actions, + + /* padding */ + NULL, + NULL, + NULL, + NULL +}; + +static void +init_plugin(PurplePlugin *plugin) +{ + PurpleAccountOption *option; + + option = purple_account_option_string_new(_("Server"), "server", + MSN_SERVER); + prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, + option); + + option = purple_account_option_int_new(_("Port"), "port", 1863); + prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, + option); + + option = purple_account_option_bool_new(_("Use HTTP Method"), + "http_method", FALSE); + prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, + option); + + option = purple_account_option_string_new(_("HTTP Method Server"), + "http_method_server", MSN_HTTPCONN_SERVER); + prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, + option); + + option = purple_account_option_bool_new(_("Show custom smileys"), + "custom_smileys", TRUE); + prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, + option); + + purple_cmd_register("nudge", "", PURPLE_CMD_P_PRPL, + PURPLE_CMD_FLAG_IM | PURPLE_CMD_FLAG_PRPL_ONLY, + "prpl-msn", msn_cmd_nudge, + _("nudge: nudge a user to get their attention"), NULL); + + purple_prefs_remove("/plugins/prpl/msn"); + + purple_signal_connect(purple_get_core(), "uri-handler", plugin, + PURPLE_CALLBACK(msn_uri_handler), NULL); +} + +PURPLE_INIT_PLUGIN(msn, init_plugin, info);
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libpurple/protocols/msnp9/msn.h Mon Nov 12 16:53:54 2007 +0000 @@ -0,0 +1,134 @@ +/** + * @file msn.h The MSN protocol plugin + * + * purple + * + * Purple is the legal property of its developers, whose names are too numerous + * to list here. Please refer to the COPYRIGHT file distributed with this + * source distribution. + * + * 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 02111-1301 USA + */ +#ifndef _MSN_H_ +#define _MSN_H_ + +/* #define MSN_DEBUG_MSG 1 */ +/* #define MSN_DEBUG_SLPMSG 1 */ +/* #define MSN_DEBUG_HTTP 1 */ + +/* #define MSN_DEBUG_SLP 1 */ +/* #define MSN_DEBUG_SLP_VERBOSE 1 */ +/* #define MSN_DEBUG_SLP_FILES 1 */ + +/* #define MSN_DEBUG_NS 1 */ +/* #define MSN_DEBUG_SB 1 */ + +#include "internal.h" + +#include "account.h" +#include "accountopt.h" +#include "blist.h" +#include "connection.h" +#include "conversation.h" +#include "debug.h" +#include "cipher.h" +#include "notify.h" +#include "privacy.h" +#include "proxy.h" +#include "prpl.h" +#include "request.h" +#include "servconn.h" +#include "sslconn.h" +#include "util.h" + +#include "ft.h" + +#define MSN_BUF_LEN 8192 + +#define USEROPT_MSNSERVER 3 +#define MSN_SERVER "messenger.hotmail.com" +#define MSN_HTTPCONN_SERVER "gateway.messenger.hotmail.com" +#define USEROPT_MSNPORT 4 +#define MSN_PORT 1863 + +#define MSN_TYPING_RECV_TIMEOUT 6 +#define MSN_TYPING_SEND_TIMEOUT 4 + +#define HOTMAIL_URL "http://www.hotmail.com/cgi-bin/folders" +#define PASSPORT_URL "http://lc1.law13.hotmail.passport.com/cgi-bin/dologin?login=" +#define PROFILE_URL "http://spaces.live.com/profile.aspx?mem=" + +#define USEROPT_HOTMAIL 0 + +#define BUDDY_ALIAS_MAXLEN 387 + +#define MSN_FT_GUID "{5D3E02AB-6190-11d3-BBBB-00C04F795683}" + +#define MSN_CLIENTINFO \ + "Client-Name: Purple/" VERSION "\r\n" \ + "Chat-Logging: Y\r\n" + +/* Index into attention_types */ +#define MSN_NUDGE 0 + +typedef enum +{ + MSN_LIST_FL_OP = 0x01, + MSN_LIST_AL_OP = 0x02, + MSN_LIST_BL_OP = 0x04, + MSN_LIST_RL_OP = 0x08 + +} MsnListOp; + +typedef enum +{ + MSN_CLIENT_CAP_WIN_MOBILE = 0x00001, + MSN_CLIENT_CAP_UNKNOWN_1 = 0x00002, + MSN_CLIENT_CAP_INK_GIF = 0x00004, + MSN_CLIENT_CAP_INK_ISF = 0x00008, + MSN_CLIENT_CAP_VIDEO_CHAT = 0x00010, + MSN_CLIENT_CAP_BASE = 0x00020, + MSN_CLIENT_CAP_MSNMOBILE = 0x00040, + MSN_CLIENT_CAP_MSNDIRECT = 0x00080, + MSN_CLIENT_CAP_WEBMSGR = 0x00100, + MSN_CLIENT_CAP_DIRECTIM = 0x04000, + MSN_CLIENT_CAP_WINKS = 0x08000, + MSN_CLIENT_CAP_SEARCH = 0x10000 + +} MsnClientCaps; + +typedef enum +{ + MSN_CLIENT_VER_5_0 = 0x00, + MSN_CLIENT_VER_6_0 = 0x10, /* MSNC1 */ + MSN_CLIENT_VER_6_1 = 0x20, /* MSNC2 */ + MSN_CLIENT_VER_6_2 = 0x30, /* MSNC3 */ + MSN_CLIENT_VER_7_0 = 0x40, /* MSNC4 */ + MSN_CLIENT_VER_7_5 = 0x50 /* MSNC5 */ + +} MsnClientVerId; + +#define MSN_CLIENT_ID_VERSION MSN_CLIENT_VER_7_0 +#define MSN_CLIENT_ID_RESERVED_1 0x00 +#define MSN_CLIENT_ID_RESERVED_2 0x00 +#define MSN_CLIENT_ID_CAPABILITIES MSN_CLIENT_CAP_BASE + +#define MSN_CLIENT_ID \ + ((MSN_CLIENT_ID_VERSION << 24) | \ + (MSN_CLIENT_ID_RESERVED_1 << 16) | \ + (MSN_CLIENT_ID_RESERVED_2 << 8) | \ + (MSN_CLIENT_ID_CAPABILITIES)) + +#endif /* _MSN_H_ */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libpurple/protocols/msnp9/nexus.c Mon Nov 12 16:53:54 2007 +0000 @@ -0,0 +1,511 @@ +/** + * @file nexus.c MSN Nexus functions + * + * purple + * + * Purple is the legal property of its developers, whose names are too numerous + * to list here. Please refer to the COPYRIGHT file distributed with this + * source distribution. + * + * 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 02111-1301 USA + */ +#include "msn.h" +#include "nexus.h" +#include "notification.h" + +/************************************************************************** + * Main + **************************************************************************/ + +MsnNexus * +msn_nexus_new(MsnSession *session) +{ + MsnNexus *nexus; + + nexus = g_new0(MsnNexus, 1); + nexus->session = session; + nexus->challenge_data = g_hash_table_new_full(g_str_hash, + g_str_equal, g_free, g_free); + + return nexus; +} + +void +msn_nexus_destroy(MsnNexus *nexus) +{ + if (nexus->gsc) + purple_ssl_close(nexus->gsc); + + g_free(nexus->login_host); + + g_free(nexus->login_path); + + if (nexus->challenge_data != NULL) + g_hash_table_destroy(nexus->challenge_data); + + if (nexus->input_handler > 0) + purple_input_remove(nexus->input_handler); + g_free(nexus->write_buf); + g_free(nexus->read_buf); + + g_free(nexus); +} + +/************************************************************************** + * Util + **************************************************************************/ + +static gssize +msn_ssl_read(MsnNexus *nexus) +{ + gssize len; + char temp_buf[4096]; + + if ((len = purple_ssl_read(nexus->gsc, temp_buf, + sizeof(temp_buf))) > 0) + { + nexus->read_buf = g_realloc(nexus->read_buf, + nexus->read_len + len + 1); + strncpy(nexus->read_buf + nexus->read_len, temp_buf, len); + nexus->read_len += len; + nexus->read_buf[nexus->read_len] = '\0'; + } + + return len; +} + +static void +nexus_write_cb(gpointer data, gint source, PurpleInputCondition cond) +{ + MsnNexus *nexus = data; + int len, total_len; + + total_len = strlen(nexus->write_buf); + + len = purple_ssl_write(nexus->gsc, + nexus->write_buf + nexus->written_len, + total_len - nexus->written_len); + + if (len < 0 && errno == EAGAIN) + return; + else if (len <= 0) { + purple_input_remove(nexus->input_handler); + nexus->input_handler = 0; + /* TODO: notify of the error */ + return; + } + nexus->written_len += len; + + if (nexus->written_len < total_len) + return; + + purple_input_remove(nexus->input_handler); + nexus->input_handler = 0; + + g_free(nexus->write_buf); + nexus->write_buf = NULL; + nexus->written_len = 0; + + nexus->written_cb(nexus, source, 0); +} + +/************************************************************************** + * Login + **************************************************************************/ + +static void +login_connect_cb(gpointer data, PurpleSslConnection *gsc, + PurpleInputCondition cond); + +static void +login_error_cb(PurpleSslConnection *gsc, PurpleSslErrorType error, void *data) +{ + MsnNexus *nexus; + MsnSession *session; + + nexus = data; + g_return_if_fail(nexus != NULL); + + nexus->gsc = NULL; + + session = nexus->session; + g_return_if_fail(session != NULL); + + msn_session_set_error(session, MSN_ERROR_AUTH, _("Unable to connect")); + /* the above line will result in nexus being destroyed, so we don't want + * to destroy it here, or we'd crash */ +} + +static void +nexus_login_written_cb(gpointer data, gint source, PurpleInputCondition cond) +{ + MsnNexus *nexus = data; + MsnSession *session; + int len; + + session = nexus->session; + g_return_if_fail(session != NULL); + + if (nexus->input_handler == 0) + /* TODO: Use purple_ssl_input_add()? */ + nexus->input_handler = purple_input_add(nexus->gsc->fd, + PURPLE_INPUT_READ, nexus_login_written_cb, nexus); + + + len = msn_ssl_read(nexus); + + if (len < 0 && errno == EAGAIN) + return; + else if (len < 0) { + purple_input_remove(nexus->input_handler); + nexus->input_handler = 0; + g_free(nexus->read_buf); + nexus->read_buf = NULL; + nexus->read_len = 0; + /* TODO: error handling */ + return; + } + + if (g_strstr_len(nexus->read_buf, nexus->read_len, + "\r\n\r\n") == NULL) + return; + + purple_input_remove(nexus->input_handler); + nexus->input_handler = 0; + + purple_ssl_close(nexus->gsc); + nexus->gsc = NULL; + + purple_debug_misc("msn", "ssl buffer: {%s}\n", nexus->read_buf); + + if (strstr(nexus->read_buf, "HTTP/1.1 302") != NULL) + { + /* Redirect. */ + char *location, *c; + + location = strstr(nexus->read_buf, "Location: "); + if (location == NULL) + { + g_free(nexus->read_buf); + nexus->read_buf = NULL; + nexus->read_len = 0; + + return; + } + location = strchr(location, ' ') + 1; + + if ((c = strchr(location, '\r')) != NULL) + *c = '\0'; + + /* Skip the http:// */ + if ((c = strchr(location, '/')) != NULL) + location = c + 2; + + if ((c = strchr(location, '/')) != NULL) + { + g_free(nexus->login_path); + nexus->login_path = g_strdup(c); + + *c = '\0'; + } + + g_free(nexus->login_host); + nexus->login_host = g_strdup(location); + + nexus->gsc = purple_ssl_connect(session->account, + nexus->login_host, PURPLE_SSL_DEFAULT_PORT, + login_connect_cb, login_error_cb, nexus); + } + else if (strstr(nexus->read_buf, "HTTP/1.1 401 Unauthorized") != NULL) + { + const char *error; + + if ((error = strstr(nexus->read_buf, "WWW-Authenticate")) != NULL) + { + if ((error = strstr(error, "cbtxt=")) != NULL) + { + const char *c; + char *temp; + + error += strlen("cbtxt="); + + if ((c = strchr(error, '\n')) == NULL) + c = error + strlen(error); + + temp = g_strndup(error, c - error); + error = purple_url_decode(temp); + g_free(temp); + if ((temp = strstr(error, " Do one of the following or try again:")) != NULL) + *temp = '\0'; + } + } + + msn_session_set_error(session, MSN_ERROR_AUTH, error); + } + else if (strstr(nexus->read_buf, "HTTP/1.1 503 Service Unavailable")) + { + msn_session_set_error(session, MSN_ERROR_SERV_UNAVAILABLE, NULL); + } + else if (strstr(nexus->read_buf, "HTTP/1.1 200 OK")) + { + char *base, *c; + char *login_params; + +#if 0 + /* All your base are belong to us. */ + base = buffer; + + /* For great cookie! */ + while ((base = strstr(base, "Set-Cookie: ")) != NULL) + { + base += strlen("Set-Cookie: "); + + c = strchr(base, ';'); + + session->login_cookies = + g_list_append(session->login_cookies, + g_strndup(base, c - base)); + } +#endif + + base = strstr(nexus->read_buf, "Authentication-Info: "); + + g_return_if_fail(base != NULL); + + base = strstr(base, "from-PP='"); + base += strlen("from-PP='"); + c = strchr(base, '\''); + + login_params = g_strndup(base, c - base); + + msn_got_login_params(session, login_params); + + g_free(login_params); + + msn_nexus_destroy(nexus); + session->nexus = NULL; + return; + } + + g_free(nexus->read_buf); + nexus->read_buf = NULL; + nexus->read_len = 0; + +} + +/* this guards against missing hash entries */ +static char * +nexus_challenge_data_lookup(GHashTable *challenge_data, const char *key) +{ + char *entry; + + return (entry = (char *)g_hash_table_lookup(challenge_data, key)) ? + entry : "(null)"; +} + +void +login_connect_cb(gpointer data, PurpleSslConnection *gsc, + PurpleInputCondition cond) +{ + MsnNexus *nexus; + MsnSession *session; + char *username, *password; + char *request_str, *head, *tail; + char *buffer = NULL; + guint32 ctint; + + nexus = data; + g_return_if_fail(nexus != NULL); + + session = nexus->session; + g_return_if_fail(session != NULL); + + msn_session_set_login_step(session, MSN_LOGIN_STEP_GET_COOKIE); + + username = + g_strdup(purple_url_encode(purple_account_get_username(session->account))); + + password = + g_strndup(purple_url_encode(purple_connection_get_password(session->account->gc)), 16); + + ctint = strtoul((char *)g_hash_table_lookup(nexus->challenge_data, "ct"), NULL, 10) + 200; + + head = g_strdup_printf( + "GET %s HTTP/1.1\r\n" + "Authorization: Passport1.4 OrgVerb=GET,OrgURL=%s,sign-in=%s", + nexus->login_path, + (char *)g_hash_table_lookup(nexus->challenge_data, "ru"), + username); + + tail = g_strdup_printf( + "lc=%s,id=%s,tw=%s,fs=%s,ru=%s,ct=%" G_GUINT32_FORMAT ",kpp=%s,kv=%s,ver=%s,tpf=%s\r\n" + "User-Agent: MSMSGS\r\n" + "Host: %s\r\n" + "Connection: Keep-Alive\r\n" + "Cache-Control: no-cache\r\n", + nexus_challenge_data_lookup(nexus->challenge_data, "lc"), + nexus_challenge_data_lookup(nexus->challenge_data, "id"), + nexus_challenge_data_lookup(nexus->challenge_data, "tw"), + nexus_challenge_data_lookup(nexus->challenge_data, "fs"), + nexus_challenge_data_lookup(nexus->challenge_data, "ru"), + ctint, + nexus_challenge_data_lookup(nexus->challenge_data, "kpp"), + nexus_challenge_data_lookup(nexus->challenge_data, "kv"), + nexus_challenge_data_lookup(nexus->challenge_data, "ver"), + nexus_challenge_data_lookup(nexus->challenge_data, "tpf"), + nexus->login_host); + + buffer = g_strdup_printf("%s,pwd=XXXXXXXX,%s\r\n", head, tail); + request_str = g_strdup_printf("%s,pwd=%s,%s\r\n", head, password, tail); + + purple_debug_misc("msn", "Sending: {%s}\n", buffer); + + g_free(buffer); + g_free(head); + g_free(tail); + g_free(username); + g_free(password); + + nexus->write_buf = request_str; + nexus->written_len = 0; + + nexus->read_len = 0; + + nexus->written_cb = nexus_login_written_cb; + + nexus->input_handler = purple_input_add(gsc->fd, PURPLE_INPUT_WRITE, + nexus_write_cb, nexus); + + nexus_write_cb(nexus, gsc->fd, PURPLE_INPUT_WRITE); + + return; + + +} + +static void +nexus_connect_written_cb(gpointer data, gint source, PurpleInputCondition cond) +{ + MsnNexus *nexus = data; + int len; + char *da_login; + char *base, *c; + + if (nexus->input_handler == 0) + /* TODO: Use purple_ssl_input_add()? */ + nexus->input_handler = purple_input_add(nexus->gsc->fd, + PURPLE_INPUT_READ, nexus_connect_written_cb, nexus); + + /* Get the PassportURLs line. */ + len = msn_ssl_read(nexus); + + if (len < 0 && errno == EAGAIN) + return; + else if (len < 0) { + purple_input_remove(nexus->input_handler); + nexus->input_handler = 0; + g_free(nexus->read_buf); + nexus->read_buf = NULL; + nexus->read_len = 0; + /* TODO: error handling */ + return; + } + + if (g_strstr_len(nexus->read_buf, nexus->read_len, + "\r\n\r\n") == NULL) + return; + + purple_input_remove(nexus->input_handler); + nexus->input_handler = 0; + + base = strstr(nexus->read_buf, "PassportURLs"); + + if (base == NULL) + { + g_free(nexus->read_buf); + nexus->read_buf = NULL; + nexus->read_len = 0; + return; + } + + if ((da_login = strstr(base, "DALogin=")) != NULL) + { + /* skip over "DALogin=" */ + da_login += 8; + + if ((c = strchr(da_login, ',')) != NULL) + *c = '\0'; + + if ((c = strchr(da_login, '/')) != NULL) + { + nexus->login_path = g_strdup(c); + *c = '\0'; + } + + nexus->login_host = g_strdup(da_login); + } + + g_free(nexus->read_buf); + nexus->read_buf = NULL; + nexus->read_len = 0; + + purple_ssl_close(nexus->gsc); + + /* Now begin the connection to the login server. */ + nexus->gsc = purple_ssl_connect(nexus->session->account, + nexus->login_host, PURPLE_SSL_DEFAULT_PORT, + login_connect_cb, login_error_cb, nexus); +} + + +/************************************************************************** + * Connect + **************************************************************************/ + +static void +nexus_connect_cb(gpointer data, PurpleSslConnection *gsc, + PurpleInputCondition cond) +{ + MsnNexus *nexus; + MsnSession *session; + + nexus = data; + g_return_if_fail(nexus != NULL); + + session = nexus->session; + g_return_if_fail(session != NULL); + + msn_session_set_login_step(session, MSN_LOGIN_STEP_AUTH); + + nexus->write_buf = g_strdup("GET /rdr/pprdr.asp\r\n\r\n"); + nexus->written_len = 0; + + nexus->read_len = 0; + + nexus->written_cb = nexus_connect_written_cb; + + nexus->input_handler = purple_input_add(gsc->fd, PURPLE_INPUT_WRITE, + nexus_write_cb, nexus); + + nexus_write_cb(nexus, gsc->fd, PURPLE_INPUT_WRITE); +} + +void +msn_nexus_connect(MsnNexus *nexus) +{ + nexus->gsc = purple_ssl_connect(nexus->session->account, + "nexus.passport.com", PURPLE_SSL_DEFAULT_PORT, + nexus_connect_cb, login_error_cb, nexus); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libpurple/protocols/msnp9/nexus.h Mon Nov 12 16:53:54 2007 +0000 @@ -0,0 +1,52 @@ +/** + * @file nexus.h MSN Nexus functions + * + * purple + * + * Purple is the legal property of its developers, whose names are too numerous + * to list here. Please refer to the COPYRIGHT file distributed with this + * source distribution. + * + * 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 02111-1301 USA + */ +#ifndef _MSN_NEXUS_H_ +#define _MSN_NEXUS_H_ + +typedef struct _MsnNexus MsnNexus; + +struct _MsnNexus +{ + MsnSession *session; + + char *login_host; + char *login_path; + GHashTable *challenge_data; + PurpleSslConnection *gsc; + + guint input_handler; + + char *write_buf; + gsize written_len; + PurpleInputFunction written_cb; + + char *read_buf; + gsize read_len; +}; + +void msn_nexus_connect(MsnNexus *nexus); +MsnNexus *msn_nexus_new(MsnSession *session); +void msn_nexus_destroy(MsnNexus *nexus); + +#endif /* _MSN_NEXUS_H_ */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libpurple/protocols/msnp9/notification.c Mon Nov 12 16:53:54 2007 +0000 @@ -0,0 +1,1464 @@ +/** + * @file notification.c Notification server functions + * + * purple + * + * Purple is the legal property of its developers, whose names are too numerous + * to list here. Please refer to the COPYRIGHT file distributed with this + * source distribution. + * + * 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 02111-1301 USA + */ +#include "msn.h" +#include "notification.h" +#include "state.h" +#include "error.h" +#include "msn-utils.h" +#include "page.h" + +#include "userlist.h" +#include "sync.h" +#include "slplink.h" + +static MsnTable *cbs_table; + +/************************************************************************** + * Main + **************************************************************************/ + +static void +destroy_cb(MsnServConn *servconn) +{ + MsnNotification *notification; + + notification = servconn->cmdproc->data; + g_return_if_fail(notification != NULL); + + msn_notification_destroy(notification); +} + +MsnNotification * +msn_notification_new(MsnSession *session) +{ + MsnNotification *notification; + MsnServConn *servconn; + + g_return_val_if_fail(session != NULL, NULL); + + notification = g_new0(MsnNotification, 1); + + notification->session = session; + notification->servconn = servconn = msn_servconn_new(session, MSN_SERVCONN_NS); + msn_servconn_set_destroy_cb(servconn, destroy_cb); + + notification->cmdproc = servconn->cmdproc; + notification->cmdproc->data = notification; + notification->cmdproc->cbs_table = cbs_table; + + return notification; +} + +void +msn_notification_destroy(MsnNotification *notification) +{ + notification->cmdproc->data = NULL; + + msn_servconn_set_destroy_cb(notification->servconn, NULL); + + msn_servconn_destroy(notification->servconn); + + g_free(notification); +} + +/************************************************************************** + * Connect + **************************************************************************/ + +static void +connect_cb(MsnServConn *servconn) +{ + MsnCmdProc *cmdproc; + MsnSession *session; + PurpleAccount *account; + char **a, **c, *vers; + int i; + + g_return_if_fail(servconn != NULL); + + cmdproc = servconn->cmdproc; + session = servconn->session; + account = session->account; + + /* Allocate an array for CVR0, NULL, and all the versions */ + a = c = g_new0(char *, session->protocol_ver - 8 + 3); + + for (i = session->protocol_ver; i >= 8; i--) + *c++ = g_strdup_printf("MSNP%d", i); + + *c++ = g_strdup("CVR0"); + + vers = g_strjoinv(" ", a); + + if (session->login_step == MSN_LOGIN_STEP_START) + msn_session_set_login_step(session, MSN_LOGIN_STEP_HANDSHAKE); + else + msn_session_set_login_step(session, MSN_LOGIN_STEP_HANDSHAKE2); + + msn_cmdproc_send(cmdproc, "VER", "%s", vers); + + g_strfreev(a); + g_free(vers); +} + +gboolean +msn_notification_connect(MsnNotification *notification, const char *host, int port) +{ + MsnServConn *servconn; + + g_return_val_if_fail(notification != NULL, FALSE); + + servconn = notification->servconn; + + msn_servconn_set_connect_cb(servconn, connect_cb); + notification->in_use = msn_servconn_connect(servconn, host, port); + + return notification->in_use; +} + +void +msn_notification_disconnect(MsnNotification *notification) +{ + g_return_if_fail(notification != NULL); + g_return_if_fail(notification->in_use); + + msn_servconn_disconnect(notification->servconn); + + notification->in_use = FALSE; +} + +/************************************************************************** + * Util + **************************************************************************/ + +static void +group_error_helper(MsnSession *session, const char *msg, int group_id, int error) +{ + PurpleAccount *account; + PurpleConnection *gc; + char *reason = NULL; + char *title = NULL; + + account = session->account; + gc = purple_account_get_connection(account); + + if (error == 224) + { + if (group_id == 0) + { + return; + } + else + { + const char *group_name; + group_name = + msn_userlist_find_group_name(session->userlist, + group_id); + reason = g_strdup_printf(_("%s is not a valid group."), + group_name); + } + } + else + { + reason = g_strdup(_("Unknown error.")); + } + + title = g_strdup_printf(_("%s on %s (%s)"), msg, + purple_account_get_username(account), + purple_account_get_protocol_name(account)); + purple_notify_error(gc, NULL, title, reason); + g_free(title); + g_free(reason); +} + +/************************************************************************** + * Login + **************************************************************************/ + +void +msn_got_login_params(MsnSession *session, const char *login_params) +{ + MsnCmdProc *cmdproc; + + cmdproc = session->notification->cmdproc; + + msn_session_set_login_step(session, MSN_LOGIN_STEP_AUTH_END); + + msn_cmdproc_send(cmdproc, "USR", "TWN S %s", login_params); +} + +static void +cvr_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd) +{ + PurpleAccount *account; + + account = cmdproc->session->account; + + msn_cmdproc_send(cmdproc, "USR", "TWN I %s", + purple_account_get_username(account)); +} + +static void +usr_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd) +{ + MsnSession *session; + PurpleAccount *account; + PurpleConnection *gc; + + session = cmdproc->session; + account = session->account; + gc = purple_account_get_connection(account); + + if (!g_ascii_strcasecmp(cmd->params[1], "OK")) + { + /* OK */ + const char *friendly = purple_url_decode(cmd->params[3]); + + purple_connection_set_display_name(gc, friendly); + + msn_session_set_login_step(session, MSN_LOGIN_STEP_SYN); + + msn_cmdproc_send(cmdproc, "SYN", "%s", "0"); + } + else if (!g_ascii_strcasecmp(cmd->params[1], "TWN")) + { + /* Passport authentication */ + char **elems, **cur, **tokens; + + session->nexus = msn_nexus_new(session); + + /* Parse the challenge data. */ + + elems = g_strsplit(cmd->params[3], ",", 0); + + for (cur = elems; *cur != NULL; cur++) + { + tokens = g_strsplit(*cur, "=", 2); + g_hash_table_insert(session->nexus->challenge_data, tokens[0], tokens[1]); + /* Don't free each of the tokens, only the array. */ + g_free(tokens); + } + + g_strfreev(elems); + + msn_session_set_login_step(session, MSN_LOGIN_STEP_AUTH_START); + + msn_nexus_connect(session->nexus); + } +} + +static void +usr_error(MsnCmdProc *cmdproc, MsnTransaction *trans, int error) +{ + MsnErrorType msnerr = 0; + + switch (error) + { + case 500: + case 601: + case 910: + case 921: + msnerr = MSN_ERROR_SERV_UNAVAILABLE; + break; + case 911: + msnerr = MSN_ERROR_AUTH; + break; + default: + return; + break; + } + + msn_session_set_error(cmdproc->session, msnerr, NULL); +} + +static void +ver_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd) +{ + MsnSession *session; + PurpleAccount *account; + gboolean protocol_supported = FALSE; + char proto_str[8]; + size_t i; + + session = cmdproc->session; + account = session->account; + + g_snprintf(proto_str, sizeof(proto_str), "MSNP%d", session->protocol_ver); + + for (i = 1; i < cmd->param_count; i++) + { + if (!strcmp(cmd->params[i], proto_str)) + { + protocol_supported = TRUE; + break; + } + } + + if (!protocol_supported) + { + msn_session_set_error(session, MSN_ERROR_UNSUPPORTED_PROTOCOL, + NULL); + return; + } + + msn_cmdproc_send(cmdproc, "CVR", + "0x0409 winnt 5.1 i386 MSNMSGR 6.0.0602 MSMSGS %s", + purple_account_get_username(account)); +} + +/************************************************************************** + * Log out + **************************************************************************/ + +static void +out_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd) +{ + if (!g_ascii_strcasecmp(cmd->params[0], "OTH")) + msn_session_set_error(cmdproc->session, MSN_ERROR_SIGN_OTHER, + NULL); + else if (!g_ascii_strcasecmp(cmd->params[0], "SSD")) + msn_session_set_error(cmdproc->session, MSN_ERROR_SERV_DOWN, NULL); +} + +void +msn_notification_close(MsnNotification *notification) +{ + g_return_if_fail(notification != NULL); + + if (!notification->in_use) + return; + + msn_cmdproc_send_quick(notification->cmdproc, "OUT", NULL, NULL); + + msn_notification_disconnect(notification); +} + +/************************************************************************** + * Messages + **************************************************************************/ + +static void +msg_cmd_post(MsnCmdProc *cmdproc, MsnCommand *cmd, char *payload, + size_t len) +{ + MsnMessage *msg; + + msg = msn_message_new_from_cmd(cmdproc->session, cmd); + + msn_message_parse_payload(msg, payload, len); +#ifdef MSN_DEBUG_NS + msn_message_show_readable(msg, "Notification", TRUE); +#endif + + msn_cmdproc_process_msg(cmdproc, msg); + + msn_message_destroy(msg); +} + +static void +msg_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd) +{ + /* NOTE: cmd is not always cmdproc->last_cmd, sometimes cmd is a queued + * command and we are processing it */ + + if (cmd->payload == NULL) + { + cmdproc->last_cmd->payload_cb = msg_cmd_post; + cmdproc->servconn->payload_len = atoi(cmd->params[2]); + } + else + { + g_return_if_fail(cmd->payload_cb != NULL); + + cmd->payload_cb(cmdproc, cmd, cmd->payload, cmd->payload_len); + } +} + +/************************************************************************** + * Challenges + **************************************************************************/ + +static void +chl_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd) +{ + MsnTransaction *trans; + char buf[33]; + const char *challenge_resp; + PurpleCipher *cipher; + PurpleCipherContext *context; + guchar digest[16]; + int i; + + cipher = purple_ciphers_find_cipher("md5"); + context = purple_cipher_context_new(cipher, NULL); + + purple_cipher_context_append(context, (const guchar *)cmd->params[1], + strlen(cmd->params[1])); + + challenge_resp = "VT6PX?UQTM4WM%YR"; + + purple_cipher_context_append(context, (const guchar *)challenge_resp, + strlen(challenge_resp)); + purple_cipher_context_digest(context, sizeof(digest), digest, NULL); + purple_cipher_context_destroy(context); + + for (i = 0; i < 16; i++) + g_snprintf(buf + (i*2), 3, "%02x", digest[i]); + + trans = msn_transaction_new(cmdproc, "QRY", "%s 32", "PROD0038W!61ZTF9"); + + msn_transaction_set_payload(trans, buf, 32); + + msn_cmdproc_send_trans(cmdproc, trans); +} + +/************************************************************************** + * Buddy Lists + **************************************************************************/ + +static void +add_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd) +{ + MsnSession *session; + MsnUser *user; + const char *list; + const char *passport; + const char *friendly; + MsnListId list_id; + int group_id; + + list = cmd->params[1]; + passport = cmd->params[3]; + friendly = purple_url_decode(cmd->params[4]); + + session = cmdproc->session; + + user = msn_userlist_find_user(session->userlist, passport); + + if (user == NULL) + { + user = msn_user_new(session->userlist, passport, friendly); + msn_userlist_add_user(session->userlist, user); + } + else + msn_user_set_friendly_name(user, friendly); + + list_id = msn_get_list_id(list); + + if (cmd->param_count >= 6) + group_id = atoi(cmd->params[5]); + else + group_id = -1; + + msn_got_add_user(session, user, list_id, group_id); + msn_user_update(user); +} + +static void +add_error(MsnCmdProc *cmdproc, MsnTransaction *trans, int error) +{ + MsnSession *session; + PurpleAccount *account; + PurpleConnection *gc; + const char *list, *passport; + char *reason = NULL; + char *msg = NULL; + char **params; + + session = cmdproc->session; + account = session->account; + gc = purple_account_get_connection(account); + params = g_strsplit(trans->params, " ", 0); + + list = params[0]; + passport = params[1]; + + if (!strcmp(list, "FL")) + msg = g_strdup_printf(_("Unable to add user on %s (%s)"), + purple_account_get_username(account), + purple_account_get_protocol_name(account)); + else if (!strcmp(list, "BL")) + msg = g_strdup_printf(_("Unable to block user on %s (%s)"), + purple_account_get_username(account), + purple_account_get_protocol_name(account)); + else if (!strcmp(list, "AL")) + msg = g_strdup_printf(_("Unable to permit user on %s (%s)"), + purple_account_get_username(account), + purple_account_get_protocol_name(account)); + + if (!strcmp(list, "FL")) + { + if (error == 210) + { + reason = g_strdup_printf(_("%s could not be added because " + "your buddy list is full."), passport); + } + } + + if (reason == NULL) + { + if (error == 208) + { + reason = g_strdup_printf(_("%s is not a valid passport account."), + passport); + } + else if (error == 500) + { + reason = g_strdup(_("Service Temporarily Unavailable.")); + } + else + { + reason = g_strdup(_("Unknown error.")); + } + } + + if (msg != NULL) + { + purple_notify_error(gc, NULL, msg, reason); + g_free(msg); + } + + if (!strcmp(list, "FL")) + { + PurpleBuddy *buddy; + + buddy = purple_find_buddy(account, passport); + + if (buddy != NULL) + purple_blist_remove_buddy(buddy); + } + + g_free(reason); + + g_strfreev(params); +} + +static void +adg_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd) +{ + MsnSession *session; + gint group_id; + const char *group_name; + + session = cmdproc->session; + + group_id = atoi(cmd->params[3]); + + group_name = purple_url_decode(cmd->params[2]); + + msn_group_new(session->userlist, group_id, group_name); + + /* There is a user that must me moved to this group */ + if (cmd->trans->data) + { + /* msn_userlist_move_buddy(); */ + MsnUserList *userlist = cmdproc->session->userlist; + MsnMoveBuddy *data = cmd->trans->data; + + if (data->old_group_name != NULL) + { + msn_userlist_rem_buddy(userlist, data->who, MSN_LIST_FL, data->old_group_name); + g_free(data->old_group_name); + } + + msn_userlist_add_buddy(userlist, data->who, MSN_LIST_FL, group_name); + g_free(data->who); + + } +} + +static void +qng_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd) +{ + MsnSession *session; + static int count = 0; + const char *passport; + PurpleAccount *account; + + session = cmdproc->session; + account = session->account; + + if (session->passport_info.file == NULL) + return; + + passport = purple_normalize(account, purple_account_get_username(account)); + + if ((strstr(passport, "@hotmail.") != NULL) || + (strstr(passport, "@msn.com") != NULL)) + return; + + if (count++ < 26) + return; + + count = 0; + msn_cmdproc_send(cmdproc, "URL", "%s", "INBOX"); +} + + +static void +fln_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd) +{ + MsnSlpLink *slplink; + MsnUser *user; + + user = msn_userlist_find_user(cmdproc->session->userlist, cmd->params[0]); + + user->status = "offline"; + msn_user_update(user); + + slplink = msn_session_find_slplink(cmdproc->session, cmd->params[0]); + + if (slplink != NULL) + msn_slplink_destroy(slplink); + +} + +static void +iln_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd) +{ + MsnSession *session; + PurpleAccount *account; + PurpleConnection *gc; + MsnUser *user; + MsnObject *msnobj; + const char *state, *passport, *friendly; + + session = cmdproc->session; + account = session->account; + gc = purple_account_get_connection(account); + + state = cmd->params[1]; + passport = cmd->params[2]; + friendly = purple_url_decode(cmd->params[3]); + + user = msn_userlist_find_user(session->userlist, passport); + + serv_got_alias(gc, passport, friendly); + + msn_user_set_friendly_name(user, friendly); + + if (session->protocol_ver >= 9 && cmd->param_count == 6) + { + msnobj = msn_object_new_from_string(purple_url_decode(cmd->params[5])); + msn_user_set_object(user, msnobj); + } + + msn_user_set_state(user, state); + msn_user_update(user); +} + +static void +ipg_cmd_post(MsnCmdProc *cmdproc, MsnCommand *cmd, char *payload, size_t len) +{ +#if 0 + purple_debug_misc("msn", "Incoming Page: {%s}\n", payload); +#endif +} + +static void +ipg_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd) +{ + cmdproc->servconn->payload_len = atoi(cmd->params[0]); + cmdproc->last_cmd->payload_cb = ipg_cmd_post; +} + +static void +nln_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd) +{ + MsnSession *session; + PurpleAccount *account; + PurpleConnection *gc; + MsnUser *user; + MsnObject *msnobj; + int clientid; + const char *state, *passport, *friendly, *old_friendly; + + session = cmdproc->session; + account = session->account; + gc = purple_account_get_connection(account); + + state = cmd->params[0]; + passport = cmd->params[1]; + friendly = purple_url_decode(cmd->params[2]); + + user = msn_userlist_find_user(session->userlist, passport); + + old_friendly = msn_user_get_friendly_name(user); + if (!old_friendly || (old_friendly && (!friendly || strcmp(old_friendly, friendly)))) + { + serv_got_alias(gc, passport, friendly); + msn_user_set_friendly_name(user, friendly); + } + + if (session->protocol_ver >= 9) + { + if (cmd->param_count == 5) + { + msnobj = + msn_object_new_from_string(purple_url_decode(cmd->params[4])); + msn_user_set_object(user, msnobj); + } + else + { + msn_user_set_object(user, NULL); + } + } + + clientid = atoi(cmd->params[3]); + user->mobile = (clientid & MSN_CLIENT_CAP_MSNMOBILE); + + msn_user_set_state(user, state); + msn_user_update(user); +} + +#if 0 +static void +chg_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd) +{ + char *state = cmd->params[1]; + int state_id = 0; + + if (!strcmp(state, "NLN")) + state_id = MSN_ONLINE; + else if (!strcmp(state, "BSY")) + state_id = MSN_BUSY; + else if (!strcmp(state, "IDL")) + state_id = MSN_IDLE; + else if (!strcmp(state, "BRB")) + state_id = MSN_BRB; + else if (!strcmp(state, "AWY")) + state_id = MSN_AWAY; + else if (!strcmp(state, "PHN")) + state_id = MSN_PHONE; + else if (!strcmp(state, "LUN")) + state_id = MSN_LUNCH; + else if (!strcmp(state, "HDN")) + state_id = MSN_HIDDEN; + + cmdproc->session->state = state_id; +} +#endif + + +static void +not_cmd_post(MsnCmdProc *cmdproc, MsnCommand *cmd, char *payload, size_t len) +{ +#if 0 + MSN_SET_PARAMS("NOT %d\r\n%s", cmdproc->servconn->payload, payload); + purple_debug_misc("msn", "Notification: {%s}\n", payload); +#endif +} + +static void +not_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd) +{ + cmdproc->servconn->payload_len = atoi(cmd->params[0]); + cmdproc->last_cmd->payload_cb = not_cmd_post; +} + +static void +rea_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd) +{ + /* TODO: This might be for us too */ + + MsnSession *session; + PurpleConnection *gc; + const char *friendly; + + session = cmdproc->session; + gc = session->account->gc; + friendly = purple_url_decode(cmd->params[3]); + + purple_connection_set_display_name(gc, friendly); +} + +static void +prp_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd) +{ + MsnSession *session = cmdproc->session; + const char *type, *value; + + g_return_if_fail(cmd->param_count >= 3); + + type = cmd->params[2]; + + if (cmd->param_count == 4) + { + value = cmd->params[3]; + if (!strcmp(type, "PHH")) + msn_user_set_home_phone(session->user, purple_url_decode(value)); + else if (!strcmp(type, "PHW")) + msn_user_set_work_phone(session->user, purple_url_decode(value)); + else if (!strcmp(type, "PHM")) + msn_user_set_mobile_phone(session->user, purple_url_decode(value)); + } + else + { + if (!strcmp(type, "PHH")) + msn_user_set_home_phone(session->user, NULL); + else if (!strcmp(type, "PHW")) + msn_user_set_work_phone(session->user, NULL); + else if (!strcmp(type, "PHM")) + msn_user_set_mobile_phone(session->user, NULL); + } +} + +static void +reg_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd) +{ + MsnSession *session; + int group_id; + const char *group_name; + + session = cmdproc->session; + group_id = atoi(cmd->params[2]); + group_name = purple_url_decode(cmd->params[3]); + + msn_userlist_rename_group_id(session->userlist, group_id, group_name); +} + +static void +reg_error(MsnCmdProc *cmdproc, MsnTransaction *trans, int error) +{ + int group_id; + char **params; + + params = g_strsplit(trans->params, " ", 0); + + group_id = atoi(params[0]); + + group_error_helper(cmdproc->session, _("Unable to rename group"), group_id, error); + + g_strfreev(params); +} + +static void +rem_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd) +{ + MsnSession *session; + MsnUser *user; + const char *list; + const char *passport; + MsnListId list_id; + int group_id; + + session = cmdproc->session; + list = cmd->params[1]; + passport = cmd->params[3]; + user = msn_userlist_find_user(session->userlist, passport); + + g_return_if_fail(user != NULL); + + list_id = msn_get_list_id(list); + + if (cmd->param_count == 5) + group_id = atoi(cmd->params[4]); + else + group_id = -1; + + msn_got_rem_user(session, user, list_id, group_id); + msn_user_update(user); +} + +static void +rmg_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd) +{ + MsnSession *session; + int group_id; + + session = cmdproc->session; + group_id = atoi(cmd->params[2]); + + msn_userlist_remove_group_id(session->userlist, group_id); +} + +static void +rmg_error(MsnCmdProc *cmdproc, MsnTransaction *trans, int error) +{ + int group_id; + char **params; + + params = g_strsplit(trans->params, " ", 0); + + group_id = atoi(params[0]); + + group_error_helper(cmdproc->session, _("Unable to delete group"), group_id, error); + + g_strfreev(params); +} + +static void +syn_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd) +{ + MsnSession *session; + MsnSync *sync; + int total_users; + + session = cmdproc->session; + + if (cmd->param_count == 2) + { + /* + * This can happen if we sent a SYN with an up-to-date + * buddy list revision, but we send 0 to get a full list. + * So, error out. + */ + + msn_session_set_error(cmdproc->session, MSN_ERROR_BAD_BLIST, NULL); + return; + } + + total_users = atoi(cmd->params[2]); + + sync = msn_sync_new(session); + sync->total_users = total_users; + sync->old_cbs_table = cmdproc->cbs_table; + + session->sync = sync; + cmdproc->cbs_table = sync->cbs_table; +} + +/************************************************************************** + * Misc commands + **************************************************************************/ + +static void +url_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd) +{ + MsnSession *session; + PurpleAccount *account; + const char *rru; + const char *url; + PurpleCipher *cipher; + PurpleCipherContext *context; + guchar digest[16]; + FILE *fd; + char *buf; + char buf2[3]; + char sendbuf[64]; + int i; + + session = cmdproc->session; + account = session->account; + + rru = cmd->params[1]; + url = cmd->params[2]; + + buf = g_strdup_printf("%s%lu%s", + session->passport_info.mspauth ? session->passport_info.mspauth : "BOGUS", + time(NULL) - session->passport_info.sl, + purple_connection_get_password(account->gc)); + + cipher = purple_ciphers_find_cipher("md5"); + context = purple_cipher_context_new(cipher, NULL); + + purple_cipher_context_append(context, (const guchar *)buf, strlen(buf)); + purple_cipher_context_digest(context, sizeof(digest), digest, NULL); + purple_cipher_context_destroy(context); + + g_free(buf); + + memset(sendbuf, 0, sizeof(sendbuf)); + + for (i = 0; i < 16; i++) + { + g_snprintf(buf2, sizeof(buf2), "%02x", digest[i]); + strcat(sendbuf, buf2); + } + + if (session->passport_info.file != NULL) + { + g_unlink(session->passport_info.file); + g_free(session->passport_info.file); + } + + if ((fd = purple_mkstemp(&session->passport_info.file, FALSE)) == NULL) + { + purple_debug_error("msn", + "Error opening temp passport file: %s\n", + strerror(errno)); + } + else + { +#ifdef _WIN32 + fputs("<!-- saved from url=(0013)about:internet -->\n", fd); +#endif + fputs("<html>\n" + "<head>\n" + "<noscript>\n" + "<meta http-equiv=\"Refresh\" content=\"0; " + "url=http://www.hotmail.com\">\n" + "</noscript>\n" + "</head>\n\n", + fd); + + fprintf(fd, "<body onload=\"document.pform.submit(); \">\n"); + fprintf(fd, "<form name=\"pform\" action=\"%s\" method=\"POST\">\n\n", + url); + fprintf(fd, "<input type=\"hidden\" name=\"mode\" value=\"ttl\">\n"); + fprintf(fd, "<input type=\"hidden\" name=\"login\" value=\"%s\">\n", + purple_account_get_username(account)); + fprintf(fd, "<input type=\"hidden\" name=\"username\" value=\"%s\">\n", + purple_account_get_username(account)); + if (session->passport_info.sid != NULL) + fprintf(fd, "<input type=\"hidden\" name=\"sid\" value=\"%s\">\n", + session->passport_info.sid); + if (session->passport_info.kv != NULL) + fprintf(fd, "<input type=\"hidden\" name=\"kv\" value=\"%s\">\n", + session->passport_info.kv); + fprintf(fd, "<input type=\"hidden\" name=\"id\" value=\"2\">\n"); + fprintf(fd, "<input type=\"hidden\" name=\"sl\" value=\"%ld\">\n", + time(NULL) - session->passport_info.sl); + fprintf(fd, "<input type=\"hidden\" name=\"rru\" value=\"%s\">\n", + rru); + if (session->passport_info.mspauth != NULL) + fprintf(fd, "<input type=\"hidden\" name=\"auth\" value=\"%s\">\n", + session->passport_info.mspauth); + fprintf(fd, "<input type=\"hidden\" name=\"creds\" value=\"%s\">\n", + sendbuf); /* TODO Digest me (huh? -- ChipX86) */ + fprintf(fd, "<input type=\"hidden\" name=\"svc\" value=\"mail\">\n"); + fprintf(fd, "<input type=\"hidden\" name=\"js\" value=\"yes\">\n"); + fprintf(fd, "</form></body>\n"); + fprintf(fd, "</html>\n"); + + if (fclose(fd)) + { + purple_debug_error("msn", + "Error closing temp passport file: %s\n", + strerror(errno)); + + g_unlink(session->passport_info.file); + g_free(session->passport_info.file); + session->passport_info.file = NULL; + } +#ifdef _WIN32 + else + { + /* + * Renaming file with .html extension, so that the + * win32 open_url will work. + */ + char *tmp; + + if ((tmp = + g_strdup_printf("%s.html", + session->passport_info.file)) != NULL) + { + if (g_rename(session->passport_info.file, + tmp) == 0) + { + g_free(session->passport_info.file); + session->passport_info.file = tmp; + } + else + g_free(tmp); + } + } +#endif + } +} +/************************************************************************** + * Switchboards + **************************************************************************/ + +static void +rng_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd) +{ + MsnSession *session; + MsnSwitchBoard *swboard; + const char *session_id; + char *host; + int port; + + session = cmdproc->session; + session_id = cmd->params[0]; + + msn_parse_socket(cmd->params[1], &host, &port); + + if (session->http_method) + port = 80; + + swboard = msn_switchboard_new(session); + + msn_switchboard_set_invited(swboard, TRUE); + msn_switchboard_set_session_id(swboard, cmd->params[0]); + msn_switchboard_set_auth_key(swboard, cmd->params[3]); + swboard->im_user = g_strdup(cmd->params[4]); + /* msn_switchboard_add_user(swboard, cmd->params[4]); */ + + if (!msn_switchboard_connect(swboard, host, port)) + msn_switchboard_destroy(swboard); + + g_free(host); +} + +static void +xfr_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd) +{ + char *host; + int port; + + if (strcmp(cmd->params[1], "SB") && strcmp(cmd->params[1], "NS")) + { + /* Maybe we can have a generic bad command error. */ + purple_debug_error("msn", "Bad XFR command (%s)\n", cmd->params[1]); + return; + } + + msn_parse_socket(cmd->params[2], &host, &port); + + if (!strcmp(cmd->params[1], "SB")) + { + purple_debug_error("msn", "This shouldn't be handled here.\n"); + } + else if (!strcmp(cmd->params[1], "NS")) + { + MsnSession *session; + + session = cmdproc->session; + + msn_session_set_login_step(session, MSN_LOGIN_STEP_TRANSFER); + + msn_notification_connect(session->notification, host, port); + } + + g_free(host); +} + +/************************************************************************** + * Message Types + **************************************************************************/ + +static void +profile_msg(MsnCmdProc *cmdproc, MsnMessage *msg) +{ + MsnSession *session; + const char *value; + + session = cmdproc->session; + + if (strcmp(msg->remote_user, "Hotmail")) + /* This isn't an official message. */ + return; + + if ((value = msn_message_get_attr(msg, "kv")) != NULL) + { + g_free(session->passport_info.kv); + session->passport_info.kv = g_strdup(value); + } + + if ((value = msn_message_get_attr(msg, "sid")) != NULL) + { + g_free(session->passport_info.sid); + session->passport_info.sid = g_strdup(value); + } + + if ((value = msn_message_get_attr(msg, "MSPAuth")) != NULL) + { + g_free(session->passport_info.mspauth); + session->passport_info.mspauth = g_strdup(value); + } + + if ((value = msn_message_get_attr(msg, "ClientIP")) != NULL) + { + g_free(session->passport_info.client_ip); + session->passport_info.client_ip = g_strdup(value); + } + + if ((value = msn_message_get_attr(msg, "ClientPort")) != NULL) + session->passport_info.client_port = ntohs(atoi(value)); + + if ((value = msn_message_get_attr(msg, "LoginTime")) != NULL) + session->passport_info.sl = atol(value); +} + +static void +initial_email_msg(MsnCmdProc *cmdproc, MsnMessage *msg) +{ + MsnSession *session; + PurpleConnection *gc; + GHashTable *table; + const char *unread; + + session = cmdproc->session; + gc = session->account->gc; + + if (strcmp(msg->remote_user, "Hotmail")) + /* This isn't an official message. */ + return; + + if (session->passport_info.file == NULL) + { + MsnTransaction *trans; + trans = msn_transaction_new(cmdproc, "URL", "%s", "INBOX"); + msn_transaction_queue_cmd(trans, msg->cmd); + + msn_cmdproc_send_trans(cmdproc, trans); + + return; + } + + if (!purple_account_get_check_mail(session->account)) + return; + + table = msn_message_get_hashtable_from_body(msg); + + unread = g_hash_table_lookup(table, "Inbox-Unread"); + + if (unread != NULL) + { + int count = atoi(unread); + + if (count > 0) + { + const char *passport; + const char *url; + + passport = msn_user_get_passport(session->user); + url = session->passport_info.file; + + purple_notify_emails(gc, atoi(unread), FALSE, NULL, NULL, + &passport, &url, NULL, NULL); + } + } + + g_hash_table_destroy(table); +} + +static void +email_msg(MsnCmdProc *cmdproc, MsnMessage *msg) +{ + MsnSession *session; + PurpleConnection *gc; + GHashTable *table; + char *from, *subject, *tmp; + + session = cmdproc->session; + gc = session->account->gc; + + if (strcmp(msg->remote_user, "Hotmail")) + /* This isn't an official message. */ + return; + + if (session->passport_info.file == NULL) + { + MsnTransaction *trans; + trans = msn_transaction_new(cmdproc, "URL", "%s", "INBOX"); + msn_transaction_queue_cmd(trans, msg->cmd); + + msn_cmdproc_send_trans(cmdproc, trans); + + return; + } + + if (!purple_account_get_check_mail(session->account)) + return; + + table = msn_message_get_hashtable_from_body(msg); + + from = subject = NULL; + + tmp = g_hash_table_lookup(table, "From"); + if (tmp != NULL) + from = purple_mime_decode_field(tmp); + + tmp = g_hash_table_lookup(table, "Subject"); + if (tmp != NULL) + subject = purple_mime_decode_field(tmp); + + purple_notify_email(gc, + (subject != NULL ? subject : ""), + (from != NULL ? from : ""), + msn_user_get_passport(session->user), + session->passport_info.file, NULL, NULL); + + g_free(from); + g_free(subject); + + g_hash_table_destroy(table); +} + +static void +system_msg(MsnCmdProc *cmdproc, MsnMessage *msg) +{ + GHashTable *table; + const char *type_s; + + if (strcmp(msg->remote_user, "Hotmail")) + /* This isn't an official message. */ + return; + + table = msn_message_get_hashtable_from_body(msg); + + if ((type_s = g_hash_table_lookup(table, "Type")) != NULL) + { + int type = atoi(type_s); + char buf[MSN_BUF_LEN]; + int minutes; + + switch (type) + { + case 1: + minutes = atoi(g_hash_table_lookup(table, "Arg1")); + g_snprintf(buf, sizeof(buf), dngettext(PACKAGE, + "The MSN server will shut down for maintenance " + "in %d minute. You will automatically be " + "signed out at that time. Please finish any " + "conversations in progress.\n\nAfter the " + "maintenance has been completed, you will be " + "able to successfully sign in.", + "The MSN server will shut down for maintenance " + "in %d minutes. You will automatically be " + "signed out at that time. Please finish any " + "conversations in progress.\n\nAfter the " + "maintenance has been completed, you will be " + "able to successfully sign in.", minutes), + minutes); + default: + break; + } + + if (*buf != '\0') + purple_notify_info(cmdproc->session->account->gc, NULL, buf, NULL); + } + + g_hash_table_destroy(table); +} + +void +msn_notification_add_buddy(MsnNotification *notification, const char *list, + const char *who, const char *store_name, + int group_id) +{ + MsnCmdProc *cmdproc; + cmdproc = notification->servconn->cmdproc; + + if (group_id < 0 && !strcmp(list, "FL")) + group_id = 0; + + if (group_id >= 0) + { + msn_cmdproc_send(cmdproc, "ADD", "%s %s %s %d", + list, who, store_name, group_id); + } + else + { + msn_cmdproc_send(cmdproc, "ADD", "%s %s %s", list, who, store_name); + } +} + +void +msn_notification_rem_buddy(MsnNotification *notification, const char *list, + const char *who, int group_id) +{ + MsnCmdProc *cmdproc; + cmdproc = notification->servconn->cmdproc; + + if (group_id >= 0) + { + msn_cmdproc_send(cmdproc, "REM", "%s %s %d", list, who, group_id); + } + else + { + msn_cmdproc_send(cmdproc, "REM", "%s %s", list, who); + } +} + +/************************************************************************** + * Init + **************************************************************************/ + +void +msn_notification_init(void) +{ + /* TODO: check prp, blp */ + + cbs_table = msn_table_new(); + + /* Synchronous */ + msn_table_add_cmd(cbs_table, "CHG", "CHG", NULL); + msn_table_add_cmd(cbs_table, "CHG", "ILN", iln_cmd); + msn_table_add_cmd(cbs_table, "ADD", "ADD", add_cmd); + msn_table_add_cmd(cbs_table, "ADD", "ILN", iln_cmd); + msn_table_add_cmd(cbs_table, "REM", "REM", rem_cmd); + msn_table_add_cmd(cbs_table, "USR", "USR", usr_cmd); + msn_table_add_cmd(cbs_table, "USR", "XFR", xfr_cmd); + msn_table_add_cmd(cbs_table, "SYN", "SYN", syn_cmd); + msn_table_add_cmd(cbs_table, "CVR", "CVR", cvr_cmd); + msn_table_add_cmd(cbs_table, "VER", "VER", ver_cmd); + msn_table_add_cmd(cbs_table, "REA", "REA", rea_cmd); + msn_table_add_cmd(cbs_table, "PRP", "PRP", prp_cmd); + /* msn_table_add_cmd(cbs_table, "BLP", "BLP", blp_cmd); */ + msn_table_add_cmd(cbs_table, "BLP", "BLP", NULL); + msn_table_add_cmd(cbs_table, "REG", "REG", reg_cmd); + msn_table_add_cmd(cbs_table, "ADG", "ADG", adg_cmd); + msn_table_add_cmd(cbs_table, "RMG", "RMG", rmg_cmd); + msn_table_add_cmd(cbs_table, "XFR", "XFR", xfr_cmd); + + /* Asynchronous */ + msn_table_add_cmd(cbs_table, NULL, "IPG", ipg_cmd); + msn_table_add_cmd(cbs_table, NULL, "MSG", msg_cmd); + msn_table_add_cmd(cbs_table, NULL, "NOT", not_cmd); + + msn_table_add_cmd(cbs_table, NULL, "CHL", chl_cmd); + msn_table_add_cmd(cbs_table, NULL, "REM", rem_cmd); + msn_table_add_cmd(cbs_table, NULL, "ADD", add_cmd); + + msn_table_add_cmd(cbs_table, NULL, "QRY", NULL); + msn_table_add_cmd(cbs_table, NULL, "QNG", qng_cmd); + msn_table_add_cmd(cbs_table, NULL, "FLN", fln_cmd); + msn_table_add_cmd(cbs_table, NULL, "NLN", nln_cmd); + msn_table_add_cmd(cbs_table, NULL, "ILN", iln_cmd); + msn_table_add_cmd(cbs_table, NULL, "OUT", out_cmd); + msn_table_add_cmd(cbs_table, NULL, "RNG", rng_cmd); + + msn_table_add_cmd(cbs_table, NULL, "URL", url_cmd); + + msn_table_add_cmd(cbs_table, "fallback", "XFR", xfr_cmd); + + msn_table_add_error(cbs_table, "ADD", add_error); + msn_table_add_error(cbs_table, "REG", reg_error); + msn_table_add_error(cbs_table, "RMG", rmg_error); + /* msn_table_add_error(cbs_table, "REA", rea_error); */ + msn_table_add_error(cbs_table, "USR", usr_error); + + msn_table_add_msg_type(cbs_table, + "text/x-msmsgsprofile", + profile_msg); + msn_table_add_msg_type(cbs_table, + "text/x-msmsgsinitialemailnotification", + initial_email_msg); + msn_table_add_msg_type(cbs_table, + "text/x-msmsgsemailnotification", + email_msg); + msn_table_add_msg_type(cbs_table, + "application/x-msmsgssystemmessage", + system_msg); +} + +void +msn_notification_end(void) +{ + msn_table_destroy(cbs_table); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libpurple/protocols/msnp9/notification.h Mon Nov 12 16:53:54 2007 +0000 @@ -0,0 +1,70 @@ +/** + * @file notification.h Notification server functions + * + * purple + * + * Purple is the legal property of its developers, whose names are too numerous + * to list here. Please refer to the COPYRIGHT file distributed with this + * source distribution. + * + * 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 02111-1301 USA + */ +#ifndef _MSN_NOTIFICATION_H_ +#define _MSN_NOTIFICATION_H_ + +typedef struct _MsnNotification MsnNotification; + +#include "session.h" +#include "servconn.h" +#include "cmdproc.h" + +struct _MsnNotification +{ + MsnSession *session; + MsnCmdProc *cmdproc; + MsnServConn *servconn; + + gboolean in_use; +}; + +#include "state.h" + +void msn_notification_end(void); +void msn_notification_init(void); + +void msn_notification_add_buddy(MsnNotification *notification, + const char *list, const char *who, + const char *store_name, int group_id); +void msn_notification_rem_buddy(MsnNotification *notification, + const char *list, const char *who, + int group_id); +MsnNotification *msn_notification_new(MsnSession *session); +void msn_notification_destroy(MsnNotification *notification); +gboolean msn_notification_connect(MsnNotification *notification, + const char *host, int port); +void msn_notification_disconnect(MsnNotification *notification); + +/** + * Closes a notification. + * + * It's first closed, and then disconnected. + * + * @param notification The notification object to close. + */ +void msn_notification_close(MsnNotification *notification); + +void msn_got_login_params(MsnSession *session, const char *login_params); + +#endif /* _MSN_NOTIFICATION_H_ */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libpurple/protocols/msnp9/object.c Mon Nov 12 16:53:54 2007 +0000 @@ -0,0 +1,345 @@ +/** + * @file object.c MSNObject API + * + * purple + * + * Purple is the legal property of its developers, whose names are too numerous + * to list here. Please refer to the COPYRIGHT file distributed with this + * source distribution. + * + * 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 02111-1301 USA + */ +#include "object.h" +#include "debug.h" + +#define GET_STRING_TAG(field, id) \ + if ((tag = strstr(str, id "=\"")) != NULL) \ + { \ + tag += strlen(id "=\""); \ + c = strchr(tag, '"'); \ + if (c != NULL) \ + { \ + if (obj->field != NULL) \ + g_free(obj->field); \ + obj->field = g_strndup(tag, c - tag); \ + } \ + } + +#define GET_INT_TAG(field, id) \ + if ((tag = strstr(str, id "=\"")) != NULL) \ + { \ + char buf[16]; \ + size_t offset; \ + tag += strlen(id "=\""); \ + c = strchr(tag, '"'); \ + if (c != NULL) \ + { \ + memset(buf, 0, sizeof(buf)); \ + offset = c - tag; \ + if (offset >= sizeof(buf)) \ + offset = sizeof(buf) - 1; \ + strncpy(buf, tag, offset); \ + obj->field = atoi(buf); \ + } \ + } + +static GList *local_objs; + +MsnObject * +msn_object_new(void) +{ + MsnObject *obj; + + obj = g_new0(MsnObject, 1); + + msn_object_set_type(obj, MSN_OBJECT_UNKNOWN); + msn_object_set_friendly(obj, "AAA="); + + return obj; +} + +MsnObject * +msn_object_new_from_string(const char *str) +{ + MsnObject *obj; + char *tag, *c; + + g_return_val_if_fail(str != NULL, NULL); + + if (strncmp(str, "<msnobj ", 8)) + return NULL; + + obj = msn_object_new(); + + GET_STRING_TAG(creator, "Creator"); + GET_INT_TAG(size, "Size"); + GET_INT_TAG(type, "Type"); + GET_STRING_TAG(location, "Location"); + GET_STRING_TAG(friendly, "Friendly"); + GET_STRING_TAG(sha1d, "SHA1D"); + GET_STRING_TAG(sha1c, "SHA1C"); + + /* If we are missing any of the required elements then discard the object */ + /* SHA1C is not always sent anymore */ + if (obj->creator == NULL || obj->size == 0 || obj->type == 0 + || obj->location == NULL || obj->friendly == NULL + || obj->sha1d == NULL /*|| obj->sha1c == NULL*/) { + purple_debug_error("msn", "Discarding invalid msnobj: '%s'\n", str); + msn_object_destroy(obj); + obj = NULL; + } + + return obj; +} + +void +msn_object_destroy(MsnObject *obj) +{ + g_return_if_fail(obj != NULL); + + g_free(obj->creator); + g_free(obj->location); + g_free(obj->friendly); + g_free(obj->sha1d); + g_free(obj->sha1c); + + purple_imgstore_unref(obj->img); + + if (obj->local) + local_objs = g_list_remove(local_objs, obj); + + g_free(obj); +} + +char * +msn_object_to_string(const MsnObject *obj) +{ + char *str; + const char *sha1c; + + g_return_val_if_fail(obj != NULL, NULL); + + sha1c = msn_object_get_sha1c(obj); + + str = g_strdup_printf("<msnobj Creator=\"%s\" Size=\"%d\" Type=\"%d\" " + "Location=\"%s\" Friendly=\"%s\" SHA1D=\"%s\"" + "%s%s%s/>", + msn_object_get_creator(obj), + msn_object_get_size(obj), + msn_object_get_type(obj), + msn_object_get_location(obj), + msn_object_get_friendly(obj), + msn_object_get_sha1d(obj), + sha1c ? " SHA1C=\"" : "", + sha1c ? sha1c : "", + sha1c ? "\"" : ""); + + return str; +} + +void +msn_object_set_creator(MsnObject *obj, const char *creator) +{ + g_return_if_fail(obj != NULL); + + if (obj->creator != NULL) + g_free(obj->creator); + + obj->creator = (creator == NULL ? NULL : g_strdup(creator)); +} + +void +msn_object_set_size(MsnObject *obj, int size) +{ + g_return_if_fail(obj != NULL); + + obj->size = size; +} + +void +msn_object_set_type(MsnObject *obj, MsnObjectType type) +{ + g_return_if_fail(obj != NULL); + + obj->type = type; +} + +void +msn_object_set_location(MsnObject *obj, const char *location) +{ + g_return_if_fail(obj != NULL); + + if (obj->location != NULL) + g_free(obj->location); + + obj->location = (location == NULL ? NULL : g_strdup(location)); +} + +void +msn_object_set_friendly(MsnObject *obj, const char *friendly) +{ + g_return_if_fail(obj != NULL); + + if (obj->friendly != NULL) + g_free(obj->friendly); + + obj->friendly = (friendly == NULL ? NULL : g_strdup(friendly)); +} + +void +msn_object_set_sha1d(MsnObject *obj, const char *sha1d) +{ + g_return_if_fail(obj != NULL); + + if (obj->sha1d != NULL) + g_free(obj->sha1d); + + obj->sha1d = (sha1d == NULL ? NULL : g_strdup(sha1d)); +} + +void +msn_object_set_sha1c(MsnObject *obj, const char *sha1c) +{ + g_return_if_fail(obj != NULL); + + if (obj->sha1c != NULL) + g_free(obj->sha1c); + + obj->sha1c = (sha1c == NULL ? NULL : g_strdup(sha1c)); +} + +const char * +msn_object_get_creator(const MsnObject *obj) +{ + g_return_val_if_fail(obj != NULL, NULL); + + return obj->creator; +} + +int +msn_object_get_size(const MsnObject *obj) +{ + g_return_val_if_fail(obj != NULL, 0); + + return obj->size; +} + +MsnObjectType +msn_object_get_type(const MsnObject *obj) +{ + g_return_val_if_fail(obj != NULL, MSN_OBJECT_UNKNOWN); + + return obj->type; +} + +const char * +msn_object_get_location(const MsnObject *obj) +{ + g_return_val_if_fail(obj != NULL, NULL); + + return obj->location; +} + +const char * +msn_object_get_friendly(const MsnObject *obj) +{ + g_return_val_if_fail(obj != NULL, NULL); + + return obj->friendly; +} + +const char * +msn_object_get_sha1d(const MsnObject *obj) +{ + g_return_val_if_fail(obj != NULL, NULL); + + return obj->sha1d; +} + +const char * +msn_object_get_sha1c(const MsnObject *obj) +{ + g_return_val_if_fail(obj != NULL, NULL); + + return obj->sha1c; +} + +const char * +msn_object_get_sha1(const MsnObject *obj) +{ + g_return_val_if_fail(obj != NULL, NULL); + + if(obj->sha1c != NULL) { + return obj->sha1c; + } else { + return obj->sha1d; + } +} + +static MsnObject * +msn_object_find_local(const char *sha1) +{ + GList *l; + + g_return_val_if_fail(sha1 != NULL, NULL); + + for (l = local_objs; l != NULL; l = l->next) + { + MsnObject *local_obj = l->data; + + if (!strcmp(msn_object_get_sha1(local_obj), sha1)) + return local_obj; + } + + return NULL; + +} + +void +msn_object_set_local(MsnObject *obj) +{ + g_return_if_fail(obj != NULL); + + obj->local = TRUE; + + local_objs = g_list_append(local_objs, obj); +} + +void +msn_object_set_image(MsnObject *obj, PurpleStoredImage *img) +{ + g_return_if_fail(obj != NULL); + g_return_if_fail(img != NULL); + + /* obj->local = TRUE; */ + + purple_imgstore_unref(obj->img); + obj->img = purple_imgstore_ref(img); +} + +PurpleStoredImage * +msn_object_get_image(const MsnObject *obj) +{ + MsnObject *local_obj; + + g_return_val_if_fail(obj != NULL, NULL); + + local_obj = msn_object_find_local(msn_object_get_sha1(obj)); + + if (local_obj != NULL) + return local_obj->img; + + return NULL; +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libpurple/protocols/msnp9/object.h Mon Nov 12 16:53:54 2007 +0000 @@ -0,0 +1,229 @@ +/** + * @file object.h MSNObject API + * + * purple + * + * Purple is the legal property of its developers, whose names are too numerous + * to list here. Please refer to the COPYRIGHT file distributed with this + * source distribution. + * + * 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 02111-1301 USA + */ +#ifndef _MSN_OBJECT_H_ +#define _MSN_OBJECT_H_ + +#include "imgstore.h" + +#include "internal.h" + +typedef enum +{ + MSN_OBJECT_UNKNOWN = -1, /**< Unknown object */ + MSN_OBJECT_RESERVED1 = 1, /**< Reserved */ + MSN_OBJECT_EMOTICON = 2, /**< Custom Emoticon */ + MSN_OBJECT_USERTILE = 3, /**< UserTile (buddy icon) */ + MSN_OBJECT_RESERVED2 = 4, /**< Reserved */ + MSN_OBJECT_BACKGROUND = 5 /**< Background */ + +} MsnObjectType; + +typedef struct +{ + gboolean local; + + char *creator; + int size; + MsnObjectType type; + PurpleStoredImage *img; + char *location; + char *friendly; + char *sha1d; + char *sha1c; + +} MsnObject; + +/** + * Creates a MsnObject structure. + * + * @return A new MsnObject structure. + */ +MsnObject *msn_object_new(void); + +/** + * Creates a MsnObject structure from a string. + * + * @param str The string. + * + * @return The new MsnObject structure. + */ +MsnObject *msn_object_new_from_string(const char *str); + +/** + * Destroys an MsnObject structure. + * + * @param obj The object structure. + */ +void msn_object_destroy(MsnObject *obj); + +/** + * Outputs a string representation of an MsnObject. + * + * @param obj The object. + * + * @return The string representation. This must be freed. + */ +char *msn_object_to_string(const MsnObject *obj); + +/** + * Sets the creator field in a MsnObject. + * + * @param creator The creator value. + */ +void msn_object_set_creator(MsnObject *obj, const char *creator); + +/** + * Sets the size field in a MsnObject. + * + * @param size The size value. + */ +void msn_object_set_size(MsnObject *obj, int size); + +/** + * Sets the type field in a MsnObject. + * + * @param type The type value. + */ +void msn_object_set_type(MsnObject *obj, MsnObjectType type); + +/** + * Sets the location field in a MsnObject. + * + * @param location The location value. + */ +void msn_object_set_location(MsnObject *obj, const char *location); + +/** + * Sets the friendly name field in a MsnObject. + * + * @param friendly The friendly name value. + */ +void msn_object_set_friendly(MsnObject *obj, const char *friendly); + +/** + * Sets the SHA1D field in a MsnObject. + * + * @param sha1d The sha1d value. + */ +void msn_object_set_sha1d(MsnObject *obj, const char *sha1d); + +/** + * Sets the SHA1C field in a MsnObject. + * + * @param sha1c The sha1c value. + */ +void msn_object_set_sha1c(MsnObject *obj, const char *sha1c); + +/** + * Associates an image with a MsnObject. + * + * @param obj The object. + * @param img The image to associate. + */ +void msn_object_set_image(MsnObject *obj, PurpleStoredImage *img); + +/** + * Returns a MsnObject's creator value. + * + * @param obj The object. + * + * @return The creator value. + */ +const char *msn_object_get_creator(const MsnObject *obj); + +/** + * Returns a MsnObject's size value. + * + * @param obj The object. + * + * @return The size value. + */ +int msn_object_get_size(const MsnObject *obj); + +/** + * Returns a MsnObject's type. + * + * @param obj The object. + * + * @return The object type. + */ +MsnObjectType msn_object_get_type(const MsnObject *obj); + +/** + * Returns a MsnObject's location value. + * + * @param obj The object. + * + * @return The location value. + */ +const char *msn_object_get_location(const MsnObject *obj); + +/** + * Returns a MsnObject's friendly name value. + * + * @param obj The object. + * + * @return The friendly name value. + */ +const char *msn_object_get_friendly(const MsnObject *obj); + +/** + * Returns a MsnObject's SHA1D value. + * + * @param obj The object. + * + * @return The SHA1D value. + */ +const char *msn_object_get_sha1d(const MsnObject *obj); + +/** + * Returns a MsnObject's SHA1C value. + * + * @param obj The object. + * + * @return The SHA1C value. + */ +const char *msn_object_get_sha1c(const MsnObject *obj); + +/** + * Returns a MsnObject's SHA1C value if it exists, otherwise SHA1D. + * + * @param obj The object. + * + * @return The SHA1C value. + */ +const char *msn_object_get_sha1(const MsnObject *obj); + +/** + * Returns the image associated with the MsnObject. + * + * @param obj The object. + * + * @return The associated image. + */ +PurpleStoredImage *msn_object_get_image(const MsnObject *obj); + +void msn_object_set_local(MsnObject *obj); + +#endif /* _MSN_OBJECT_H_ */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libpurple/protocols/msnp9/page.c Mon Nov 12 16:53:54 2007 +0000 @@ -0,0 +1,89 @@ +/** + * @file page.c Paging functions + * + * purple + * + * Purple is the legal property of its developers, whose names are too numerous + * to list here. Please refer to the COPYRIGHT file distributed with this + * source distribution. + * + * 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 02111-1301 USA + */ +#include "msn.h" +#include "page.h" + +MsnPage * +msn_page_new(void) +{ + MsnPage *page; + + page = g_new0(MsnPage, 1); + + return page; +} + +void +msn_page_destroy(MsnPage *page) +{ + g_return_if_fail(page != NULL); + + if (page->body != NULL) + g_free(page->body); + + if (page->from_location != NULL) + g_free(page->from_location); + + if (page->from_phone != NULL) + g_free(page->from_phone); + + g_free(page); +} + +char * +msn_page_gen_payload(const MsnPage *page, size_t *ret_size) +{ + char *str; + + g_return_val_if_fail(page != NULL, NULL); + + str = + g_strdup_printf("<TEXT xml:space=\"preserve\" enc=\"utf-8\">%s</TEXT>", + msn_page_get_body(page)); + + if (ret_size != NULL) + *ret_size = strlen(str); + + return str; +} + +void +msn_page_set_body(MsnPage *page, const char *body) +{ + g_return_if_fail(page != NULL); + g_return_if_fail(body != NULL); + + if (page->body != NULL) + g_free(page->body); + + page->body = g_strdup(body); +} + +const char * +msn_page_get_body(const MsnPage *page) +{ + g_return_val_if_fail(page != NULL, NULL); + + return page->body; +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libpurple/protocols/msnp9/page.h Mon Nov 12 16:53:54 2007 +0000 @@ -0,0 +1,81 @@ +/** + * @file page.h Paging functions + * + * purple + * + * Purple is the legal property of its developers, whose names are too numerous + * to list here. Please refer to the COPYRIGHT file distributed with this + * source distribution. + * + * 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 02111-1301 USA + */ +#ifndef _MSN_PAGE_H_ +#define _MSN_PAGE_H_ + +typedef struct _MsnPage MsnPage; + +#include "session.h" + +/** + * A page. + */ +struct _MsnPage +{ + char *from_location; + char *from_phone; + + char *body; +}; + +/** + * Creates a new, empty page. + * + * @return A new page. + */ +MsnPage *msn_page_new(void); + +/** + * Destroys a page. + */ +void msn_page_destroy(MsnPage *page); + +/** + * Generates the payload data of a page. + * + * @param page The page. + * @param ret_size The returned size of the payload. + * + * @return The payload data of a page. + */ +char *msn_page_gen_payload(const MsnPage *page, size_t *ret_size); + +/** + * Sets the body of a page. + * + * @param page The page. + * @param body The body of the page. + */ +void msn_page_set_body(MsnPage *page, const char *body); + +/** + * Returns the body of the page. + * + * @param page The page. + * + * @return The body of the page. + */ +const char *msn_page_get_body(const MsnPage *page); + +#endif /* _MSN_PAGE_H_ */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libpurple/protocols/msnp9/servconn.c Mon Nov 12 16:53:54 2007 +0000 @@ -0,0 +1,550 @@ +/** + * @file servconn.c Server connection functions + * + * purple + * + * Purple is the legal property of its developers, whose names are too numerous + * to list here. Please refer to the COPYRIGHT file distributed with this + * source distribution. + * + * 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 02111-1301 USA + */ +#include "msn.h" +#include "servconn.h" +#include "error.h" + +static void read_cb(gpointer data, gint source, PurpleInputCondition cond); + +/************************************************************************** + * Main + **************************************************************************/ + +MsnServConn * +msn_servconn_new(MsnSession *session, MsnServConnType type) +{ + MsnServConn *servconn; + + g_return_val_if_fail(session != NULL, NULL); + + servconn = g_new0(MsnServConn, 1); + + servconn->type = type; + + servconn->session = session; + servconn->cmdproc = msn_cmdproc_new(session); + servconn->cmdproc->servconn = servconn; + + servconn->httpconn = msn_httpconn_new(servconn); + + servconn->num = session->servconns_count++; + + servconn->tx_buf = purple_circ_buffer_new(MSN_BUF_LEN); + servconn->tx_handler = 0; + + return servconn; +} + +void +msn_servconn_destroy(MsnServConn *servconn) +{ + g_return_if_fail(servconn != NULL); + + if (servconn->processing) + { + servconn->wasted = TRUE; + return; + } + + if (servconn->connected) + msn_servconn_disconnect(servconn); + + if (servconn->destroy_cb) + servconn->destroy_cb(servconn); + + if (servconn->httpconn != NULL) + msn_httpconn_destroy(servconn->httpconn); + + g_free(servconn->host); + + purple_circ_buffer_destroy(servconn->tx_buf); + if (servconn->tx_handler > 0) + purple_input_remove(servconn->tx_handler); + + msn_cmdproc_destroy(servconn->cmdproc); + g_free(servconn); +} + +void +msn_servconn_set_connect_cb(MsnServConn *servconn, + void (*connect_cb)(MsnServConn *)) +{ + g_return_if_fail(servconn != NULL); + servconn->connect_cb = connect_cb; +} + +void +msn_servconn_set_disconnect_cb(MsnServConn *servconn, + void (*disconnect_cb)(MsnServConn *)) +{ + g_return_if_fail(servconn != NULL); + + servconn->disconnect_cb = disconnect_cb; +} + +void +msn_servconn_set_destroy_cb(MsnServConn *servconn, + void (*destroy_cb)(MsnServConn *)) +{ + g_return_if_fail(servconn != NULL); + + servconn->destroy_cb = destroy_cb; +} + +/************************************************************************** + * Utility + **************************************************************************/ + +void +msn_servconn_got_error(MsnServConn *servconn, MsnServConnError error) +{ + char *tmp; + const char *reason; + + const char *names[] = { "Notification", "Switchboard" }; + const char *name; + + name = names[servconn->type]; + + switch (error) + { + case MSN_SERVCONN_ERROR_CONNECT: + reason = _("Unable to connect"); break; + case MSN_SERVCONN_ERROR_WRITE: + reason = _("Writing error"); break; + case MSN_SERVCONN_ERROR_READ: + reason = _("Reading error"); break; + default: + reason = _("Unknown error"); break; + } + + purple_debug_error("msn", "Connection error from %s server (%s): %s\n", + name, servconn->host, reason); + tmp = g_strdup_printf(_("Connection error from %s server:\n%s"), + name, reason); + + if (servconn->type == MSN_SERVCONN_NS) + { + msn_session_set_error(servconn->session, MSN_ERROR_SERVCONN, tmp); + } + else if (servconn->type == MSN_SERVCONN_SB) + { + MsnSwitchBoard *swboard; + swboard = servconn->cmdproc->data; + if (swboard != NULL) + swboard->error = MSN_SB_ERROR_CONNECTION; + } + + msn_servconn_disconnect(servconn); + + g_free(tmp); +} + +/************************************************************************** + * Connect + **************************************************************************/ + +static void +connect_cb(gpointer data, gint source, const gchar *error_message) +{ + MsnServConn *servconn; + + servconn = data; + servconn->connect_data = NULL; + servconn->processing = FALSE; + + if (servconn->wasted) + { + if (source >= 0) + close(source); + msn_servconn_destroy(servconn); + return; + } + + servconn->fd = source; + + if (source >= 0) + { + servconn->connected = TRUE; + + /* Someone wants to know we connected. */ + servconn->connect_cb(servconn); + servconn->inpa = purple_input_add(servconn->fd, PURPLE_INPUT_READ, + read_cb, data); + } + else + { + purple_debug_error("msn", "Connection error: %s\n", error_message); + msn_servconn_got_error(servconn, MSN_SERVCONN_ERROR_CONNECT); + } +} + +gboolean +msn_servconn_connect(MsnServConn *servconn, const char *host, int port) +{ + MsnSession *session; + + g_return_val_if_fail(servconn != NULL, FALSE); + g_return_val_if_fail(host != NULL, FALSE); + g_return_val_if_fail(port > 0, FALSE); + + session = servconn->session; + + if (servconn->connected) + msn_servconn_disconnect(servconn); + + g_free(servconn->host); + servconn->host = g_strdup(host); + + if (session->http_method) + { + /* HTTP Connection. */ + + if (!servconn->httpconn->connected) + if (!msn_httpconn_connect(servconn->httpconn, host, port)) + return FALSE; + + servconn->connected = TRUE; + servconn->httpconn->virgin = TRUE; + + /* Someone wants to know we connected. */ + servconn->connect_cb(servconn); + + return TRUE; + } + + servconn->connect_data = purple_proxy_connect(NULL, session->account, + host, port, connect_cb, servconn); + + if (servconn->connect_data != NULL) + { + servconn->processing = TRUE; + return TRUE; + } + else + return FALSE; +} + +void +msn_servconn_disconnect(MsnServConn *servconn) +{ + g_return_if_fail(servconn != NULL); + + if (!servconn->connected) + { + /* We could not connect. */ + if (servconn->disconnect_cb != NULL) + servconn->disconnect_cb(servconn); + + return; + } + + if (servconn->session->http_method) + { + /* Fake disconnection. */ + if (servconn->disconnect_cb != NULL) + servconn->disconnect_cb(servconn); + + return; + } + + if (servconn->connect_data != NULL) + { + purple_proxy_connect_cancel(servconn->connect_data); + servconn->connect_data = NULL; + } + + if (servconn->inpa > 0) + { + purple_input_remove(servconn->inpa); + servconn->inpa = 0; + } + + close(servconn->fd); + + servconn->rx_buf = NULL; + servconn->rx_len = 0; + servconn->payload_len = 0; + + servconn->connected = FALSE; + + if (servconn->disconnect_cb != NULL) + servconn->disconnect_cb(servconn); +} + +static void +servconn_write_cb(gpointer data, gint source, PurpleInputCondition cond) +{ + MsnServConn *servconn = data; + int ret, writelen; + + writelen = purple_circ_buffer_get_max_read(servconn->tx_buf); + + if (writelen == 0) { + purple_input_remove(servconn->tx_handler); + servconn->tx_handler = 0; + return; + } + + ret = write(servconn->fd, servconn->tx_buf->outptr, writelen); + + if (ret < 0 && errno == EAGAIN) + return; + else if (ret <= 0) { + msn_servconn_got_error(servconn, MSN_SERVCONN_ERROR_WRITE); + return; + } + + purple_circ_buffer_mark_read(servconn->tx_buf, ret); +} + +ssize_t +msn_servconn_write(MsnServConn *servconn, const char *buf, size_t len) +{ + ssize_t ret = 0; + + g_return_val_if_fail(servconn != NULL, 0); + + if (!servconn->session->http_method) + { + if (servconn->tx_handler == 0) { + switch (servconn->type) + { + case MSN_SERVCONN_NS: + case MSN_SERVCONN_SB: + ret = write(servconn->fd, buf, len); + break; +#if 0 + case MSN_SERVCONN_DC: + ret = write(servconn->fd, &buf, sizeof(len)); + ret = write(servconn->fd, buf, len); + break; +#endif + default: + ret = write(servconn->fd, buf, len); + break; + } + } else { + ret = -1; + errno = EAGAIN; + } + + if (ret < 0 && errno == EAGAIN) + ret = 0; + if (ret >= 0 && ret < len) { + if (servconn->tx_handler == 0) + servconn->tx_handler = purple_input_add( + servconn->fd, PURPLE_INPUT_WRITE, + servconn_write_cb, servconn); + purple_circ_buffer_append(servconn->tx_buf, buf + ret, + len - ret); + } + } + else + { + ret = msn_httpconn_write(servconn->httpconn, buf, len); + } + + if (ret == -1) + { + msn_servconn_got_error(servconn, MSN_SERVCONN_ERROR_WRITE); + } + + return ret; +} + +static void +read_cb(gpointer data, gint source, PurpleInputCondition cond) +{ + MsnServConn *servconn; + MsnSession *session; + char buf[MSN_BUF_LEN]; + char *cur, *end, *old_rx_buf; + int len, cur_len; + + servconn = data; + session = servconn->session; + + len = read(servconn->fd, buf, sizeof(buf) - 1); + + if (len < 0 && errno == EAGAIN) + return; + else if (len <= 0) + { + purple_debug_error("msn", "servconn read error, len: %d error: %s\n", len, strerror(errno)); + msn_servconn_got_error(servconn, MSN_SERVCONN_ERROR_READ); + + return; + } + + buf[len] = '\0'; + + servconn->rx_buf = g_realloc(servconn->rx_buf, len + servconn->rx_len + 1); + memcpy(servconn->rx_buf + servconn->rx_len, buf, len + 1); + servconn->rx_len += len; + + end = old_rx_buf = servconn->rx_buf; + + servconn->processing = TRUE; + + do + { + cur = end; + + if (servconn->payload_len) + { + if (servconn->payload_len > servconn->rx_len) + /* The payload is still not complete. */ + break; + + cur_len = servconn->payload_len; + end += cur_len; + } + else + { + end = strstr(cur, "\r\n"); + + if (end == NULL) + /* The command is still not complete. */ + break; + + *end = '\0'; + end += 2; + cur_len = end - cur; + } + + servconn->rx_len -= cur_len; + + if (servconn->payload_len) + { + msn_cmdproc_process_payload(servconn->cmdproc, cur, cur_len); + servconn->payload_len = 0; + } + else + { + msn_cmdproc_process_cmd_text(servconn->cmdproc, cur); + } + } while (servconn->connected && !servconn->wasted && servconn->rx_len > 0); + + if (servconn->connected && !servconn->wasted) + { + if (servconn->rx_len > 0) + servconn->rx_buf = g_memdup(cur, servconn->rx_len); + else + servconn->rx_buf = NULL; + } + + servconn->processing = FALSE; + + if (servconn->wasted) + msn_servconn_destroy(servconn); + + g_free(old_rx_buf); +} + +#if 0 +static int +create_listener(int port) +{ + int fd; + const int on = 1; + +#if 0 + struct addrinfo hints; + struct addrinfo *c, *res; + char port_str[5]; + + snprintf(port_str, sizeof(port_str), "%d", port); + + memset(&hints, 0, sizeof(hints)); + + hints.ai_flags = AI_PASSIVE; + hints.ai_family = AF_UNSPEC; + hints.ai_socktype = SOCK_STREAM; + + if (getaddrinfo(NULL, port_str, &hints, &res) != 0) + { + purple_debug_error("msn", "Could not get address info: %s.\n", + port_str); + return -1; + } + + for (c = res; c != NULL; c = c->ai_next) + { + fd = socket(c->ai_family, c->ai_socktype, c->ai_protocol); + + if (fd < 0) + continue; + + setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)); + + if (bind(fd, c->ai_addr, c->ai_addrlen) == 0) + break; + + close(fd); + } + + if (c == NULL) + { + purple_debug_error("msn", "Could not find socket: %s.\n", port_str); + return -1; + } + + freeaddrinfo(res); +#else + struct sockaddr_in sockin; + + fd = socket(AF_INET, SOCK_STREAM, 0); + + if (fd < 0) + return -1; + + if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (char *)&on, sizeof(on)) != 0) + { + close(fd); + return -1; + } + + memset(&sockin, 0, sizeof(struct sockaddr_in)); + sockin.sin_family = AF_INET; + sockin.sin_port = htons(port); + + if (bind(fd, (struct sockaddr *)&sockin, sizeof(struct sockaddr_in)) != 0) + { + close(fd); + return -1; + } +#endif + + if (listen (fd, 4) != 0) + { + close (fd); + return -1; + } + + fcntl(fd, F_SETFL, O_NONBLOCK); + + return fd; +} +#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libpurple/protocols/msnp9/servconn.h Mon Nov 12 16:53:54 2007 +0000 @@ -0,0 +1,171 @@ +/** + * @file servconn.h Server connection functions + * + * purple + * + * Purple is the legal property of its developers, whose names are too numerous + * to list here. Please refer to the COPYRIGHT file distributed with this + * source distribution. + * + * 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 02111-1301 USA + */ +#ifndef _MSN_SERVCONN_H_ +#define _MSN_SERVCONN_H_ + +typedef struct _MsnServConn MsnServConn; + +#include "session.h" +#include "cmdproc.h" + +#include "proxy.h" +#include "httpconn.h" + +/** + * Connection error types. + */ +typedef enum +{ + MSN_SERVCONN_ERROR_NONE, + MSN_SERVCONN_ERROR_CONNECT, + MSN_SERVCONN_ERROR_WRITE, + MSN_SERVCONN_ERROR_READ, + +} MsnServConnError; + +/** + * Connection types. + */ +typedef enum +{ + MSN_SERVCONN_NS, + MSN_SERVCONN_SB + +} MsnServConnType; + +/** + * A Connection. + */ +struct _MsnServConn +{ + MsnServConnType type; /**< The type of this connection. */ + MsnSession *session; /**< The MSN session of this connection. */ + MsnCmdProc *cmdproc; /**< The command processor of this connection. */ + + PurpleProxyConnectData *connect_data; + + gboolean connected; /**< A flag that states if it's connected. */ + gboolean processing; /**< A flag that states if something is working + with this connection. */ + gboolean wasted; /**< A flag that states if it should be destroyed. */ + + char *host; /**< The host this connection is connected or should be + connected to. */ + int num; /**< A number id of this connection. */ + + MsnHttpConn *httpconn; /**< The HTTP connection this connection should use. */ + + int fd; /**< The connection's file descriptor. */ + int inpa; /**< The connection's input handler. */ + + char *rx_buf; /**< The receive buffer. */ + int rx_len; /**< The receive buffer lenght. */ + + size_t payload_len; /**< The length of the payload. + It's only set when we've received a command that + has a payload. */ + + PurpleCircBuffer *tx_buf; + guint tx_handler; + + void (*connect_cb)(MsnServConn *); /**< The callback to call when connecting. */ + void (*disconnect_cb)(MsnServConn *); /**< The callback to call when disconnecting. */ + void (*destroy_cb)(MsnServConn *); /**< The callback to call when destroying. */ +}; + +/** + * Creates a new connection object. + * + * @param session The session. + * @param type The type of the connection. + */ +MsnServConn *msn_servconn_new(MsnSession *session, MsnServConnType type); + +/** + * Destroys a connection object. + * + * @param servconn The connection. + */ +void msn_servconn_destroy(MsnServConn *servconn); + +/** + * Connects to a host. + * + * @param servconn The connection. + * @param host The host. + * @param port The port. + */ +gboolean msn_servconn_connect(MsnServConn *servconn, const char *host, int port); + +/** + * Disconnects. + * + * @param servconn The connection. + */ +void msn_servconn_disconnect(MsnServConn *servconn); + +/** + * Sets the connect callback. + * + * @param servconn The servconn. + * @param connect_cb The connect callback. + */ +void msn_servconn_set_connect_cb(MsnServConn *servconn, + void (*connect_cb)(MsnServConn *)); +/** + * Sets the disconnect callback. + * + * @param servconn The servconn. + * @param disconnect_cb The disconnect callback. + */ +void msn_servconn_set_disconnect_cb(MsnServConn *servconn, + void (*disconnect_cb)(MsnServConn *)); +/** + * Sets the destroy callback. + * + * @param servconn The servconn that's being destroyed. + * @param destroy_cb The destroy callback. + */ +void msn_servconn_set_destroy_cb(MsnServConn *servconn, + void (*destroy_cb)(MsnServConn *)); + +/** + * Writes a chunck of data to the servconn. + * + * @param servconn The servconn. + * @param buf The data to write. + * @param size The size of the data. + */ +ssize_t msn_servconn_write(MsnServConn *servconn, const char *buf, + size_t size); + +/** + * Function to call whenever an error related to a switchboard occurs. + * + * @param servconn The servconn. + * @param error The error that happened. + */ +void msn_servconn_got_error(MsnServConn *servconn, MsnServConnError error); + +#endif /* _MSN_SERVCONN_H_ */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libpurple/protocols/msnp9/session.c Mon Nov 12 16:53:54 2007 +0000 @@ -0,0 +1,431 @@ +/** + * @file session.c MSN session functions + * + * purple + * + * Purple is the legal property of its developers, whose names are too numerous + * to list here. Please refer to the COPYRIGHT file distributed with this + * source distribution. + * + * 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 02111-1301 USA + */ +#include "msn.h" +#include "session.h" +#include "notification.h" + +#include "dialog.h" + +MsnSession * +msn_session_new(PurpleAccount *account) +{ + MsnSession *session; + + g_return_val_if_fail(account != NULL, NULL); + + session = g_new0(MsnSession, 1); + + session->account = account; + session->notification = msn_notification_new(session); + session->userlist = msn_userlist_new(session); + + session->user = msn_user_new(session->userlist, + purple_account_get_username(account), NULL); + + session->protocol_ver = 9; + session->conv_seq = 1; + + return session; +} + +void +msn_session_destroy(MsnSession *session) +{ + g_return_if_fail(session != NULL); + + session->destroying = TRUE; + + if (session->connected) + msn_session_disconnect(session); + + if (session->notification != NULL) + msn_notification_destroy(session->notification); + + while (session->switches != NULL) + msn_switchboard_destroy(session->switches->data); + + while (session->slplinks != NULL) + msn_slplink_destroy(session->slplinks->data); + + msn_userlist_destroy(session->userlist); + + g_free(session->passport_info.kv); + g_free(session->passport_info.sid); + g_free(session->passport_info.mspauth); + g_free(session->passport_info.client_ip); + + if (session->passport_info.file != NULL) + { + g_unlink(session->passport_info.file); + g_free(session->passport_info.file); + } + + if (session->sync != NULL) + msn_sync_destroy(session->sync); + + if (session->nexus != NULL) + msn_nexus_destroy(session->nexus); + + if (session->user != NULL) + msn_user_destroy(session->user); + + g_free(session); +} + +gboolean +msn_session_connect(MsnSession *session, const char *host, int port, + gboolean http_method) +{ + g_return_val_if_fail(session != NULL, FALSE); + g_return_val_if_fail(!session->connected, TRUE); + + session->connected = TRUE; + session->http_method = http_method; + + if (session->notification == NULL) + { + purple_debug_error("msn", "This shouldn't happen\n"); + g_return_val_if_reached(FALSE); + } + + if (msn_notification_connect(session->notification, host, port)) + { + return TRUE; + } + + return FALSE; +} + +void +msn_session_disconnect(MsnSession *session) +{ + g_return_if_fail(session != NULL); + g_return_if_fail(session->connected); + + session->connected = FALSE; + + while (session->switches != NULL) + msn_switchboard_close(session->switches->data); + + if (session->notification != NULL) + msn_notification_close(session->notification); +} + +/* TODO: This must go away when conversation is redesigned */ +MsnSwitchBoard * +msn_session_find_swboard(MsnSession *session, const char *username) +{ + GList *l; + + g_return_val_if_fail(session != NULL, NULL); + g_return_val_if_fail(username != NULL, NULL); + + for (l = session->switches; l != NULL; l = l->next) + { + MsnSwitchBoard *swboard; + + swboard = l->data; + + if ((swboard->im_user != NULL) && !strcmp(username, swboard->im_user)) + return swboard; + } + + return NULL; +} + +MsnSwitchBoard * +msn_session_find_swboard_with_conv(MsnSession *session, PurpleConversation *conv) +{ + GList *l; + + g_return_val_if_fail(session != NULL, NULL); + g_return_val_if_fail(conv != NULL, NULL); + + for (l = session->switches; l != NULL; l = l->next) + { + MsnSwitchBoard *swboard; + + swboard = l->data; + + if (swboard->conv == conv) + return swboard; + } + + return NULL; +} + +MsnSwitchBoard * +msn_session_find_swboard_with_id(const MsnSession *session, int chat_id) +{ + GList *l; + + g_return_val_if_fail(session != NULL, NULL); + g_return_val_if_fail(chat_id >= 0, NULL); + + for (l = session->switches; l != NULL; l = l->next) + { + MsnSwitchBoard *swboard; + + swboard = l->data; + + if (swboard->chat_id == chat_id) + return swboard; + } + + return NULL; +} + +MsnSwitchBoard * +msn_session_get_swboard(MsnSession *session, const char *username, + MsnSBFlag flag) +{ + MsnSwitchBoard *swboard; + + g_return_val_if_fail(session != NULL, NULL); + + swboard = msn_session_find_swboard(session, username); + + if (swboard == NULL) + { + swboard = msn_switchboard_new(session); + swboard->im_user = g_strdup(username); + msn_switchboard_request(swboard); + msn_switchboard_request_add_user(swboard, username); + } + + swboard->flag |= flag; + + return swboard; +} + +static void +msn_session_sync_users(MsnSession *session) +{ + PurpleBlistNode *gnode, *cnode, *bnode; + PurpleConnection *gc = purple_account_get_connection(session->account); + + g_return_if_fail(gc != NULL); + + /* The core used to use msn_add_buddy to add all buddies before + * being logged in. This no longer happens, so we manually iterate + * over the whole buddy list to identify sync issues. */ + + for (gnode = purple_blist_get_root(); gnode; gnode = gnode->next) { + PurpleGroup *group = (PurpleGroup *)gnode; + const char *group_name = group->name; + if(!PURPLE_BLIST_NODE_IS_GROUP(gnode)) + continue; + for(cnode = gnode->child; cnode; cnode = cnode->next) { + if(!PURPLE_BLIST_NODE_IS_CONTACT(cnode)) + continue; + for(bnode = cnode->child; bnode; bnode = bnode->next) { + PurpleBuddy *b; + if(!PURPLE_BLIST_NODE_IS_BUDDY(bnode)) + continue; + b = (PurpleBuddy *)bnode; + if(purple_buddy_get_account(b) == purple_connection_get_account(gc)) { + MsnUser *remote_user; + gboolean found = FALSE; + + remote_user = msn_userlist_find_user(session->userlist, purple_buddy_get_name(b)); + + if ((remote_user != NULL) && (remote_user->list_op & MSN_LIST_FL_OP)) + { + int group_id; + GList *l; + + group_id = msn_userlist_find_group_id(remote_user->userlist, + group_name); + + for (l = remote_user->group_ids; l != NULL; l = l->next) + { + if (group_id == GPOINTER_TO_INT(l->data)) + { + found = TRUE; + break; + } + } + + } + + if (!found) + { + /* The user was not on the server list or not in that group + * on the server list */ + msn_show_sync_issue(session, purple_buddy_get_name(b), group_name); + } + } + } + } + } +} + +void +msn_session_set_error(MsnSession *session, MsnErrorType error, + const char *info) +{ + PurpleConnection *gc; + PurpleConnectionError reason; + char *msg; + + gc = purple_account_get_connection(session->account); + + switch (error) + { + case MSN_ERROR_SERVCONN: + reason = PURPLE_CONNECTION_ERROR_NETWORK_ERROR; + msg = g_strdup(info); + break; + case MSN_ERROR_UNSUPPORTED_PROTOCOL: + reason = PURPLE_CONNECTION_ERROR_NETWORK_ERROR; + msg = g_strdup(_("Our protocol is not supported by the " + "server.")); + break; + case MSN_ERROR_HTTP_MALFORMED: + reason = PURPLE_CONNECTION_ERROR_NETWORK_ERROR; + msg = g_strdup(_("Error parsing HTTP.")); + break; + case MSN_ERROR_SIGN_OTHER: + reason = PURPLE_CONNECTION_ERROR_NAME_IN_USE; + msg = g_strdup(_("You have signed on from another location.")); + if (!purple_account_get_remember_password(session->account)) + purple_account_set_password(session->account, NULL); + break; + case MSN_ERROR_SERV_UNAVAILABLE: + reason = PURPLE_CONNECTION_ERROR_NETWORK_ERROR; + msg = g_strdup(_("The MSN servers are temporarily " + "unavailable. Please wait and try " + "again.")); + break; + case MSN_ERROR_SERV_DOWN: + reason = PURPLE_CONNECTION_ERROR_NETWORK_ERROR; + msg = g_strdup(_("The MSN servers are going down " + "temporarily.")); + break; + case MSN_ERROR_AUTH: + reason = PURPLE_CONNECTION_ERROR_AUTHENTICATION_FAILED; + msg = g_strdup_printf(_("Unable to authenticate: %s"), + (info == NULL ) ? + _("Unknown error") : info); + break; + case MSN_ERROR_BAD_BLIST: + reason = PURPLE_CONNECTION_ERROR_NETWORK_ERROR; + msg = g_strdup(_("Your MSN buddy list is temporarily " + "unavailable. Please wait and try " + "again.")); + break; + default: + reason = PURPLE_CONNECTION_ERROR_NETWORK_ERROR; + msg = g_strdup(_("Unknown error.")); + break; + } + + msn_session_disconnect(session); + + purple_connection_error_reason (gc, reason, msg); + + g_free(msg); +} + +static const char * +get_login_step_text(MsnSession *session) +{ + const char *steps_text[] = { + _("Connecting"), + _("Handshaking"), + _("Transferring"), + _("Handshaking"), + _("Starting authentication"), + _("Getting cookie"), + _("Authenticating"), + _("Sending cookie"), + _("Retrieving buddy list") + }; + + return steps_text[session->login_step]; +} + +void +msn_session_set_login_step(MsnSession *session, MsnLoginStep step) +{ + PurpleConnection *gc; + + /* Prevent the connection progress going backwards, eg. if we get + * transferred several times during login */ + if (session->login_step > step) + return; + + /* If we're already logged in, we're probably here because of a + * mid-session XFR from the notification server, so we don't want to + * popup the connection progress dialog */ + if (session->logged_in) + return; + + gc = session->account->gc; + + session->login_step = step; + + purple_connection_update_progress(gc, get_login_step_text(session), step, + MSN_LOGIN_STEPS); +} + +void +msn_session_finish_login(MsnSession *session) +{ + PurpleAccount *account; + PurpleConnection *gc; + PurpleStoredImage *img; + const char *passport; + + if (session->logged_in) + return; + + account = session->account; + gc = purple_account_get_connection(account); + + img = purple_buddy_icons_find_account_icon(session->account); + msn_user_set_buddy_icon(session->user, img); + purple_imgstore_unref(img); + + session->logged_in = TRUE; + + msn_change_status(session); + + purple_connection_set_state(gc, PURPLE_CONNECTED); + + /* Sync users */ + msn_session_sync_users(session); + /* It seems that some accounts that haven't accessed hotmail for a while + * and @msn.com accounts don't automatically get the initial email + * notification so we always request it on login + */ + + passport = purple_normalize(account, purple_account_get_username(account)); + + if ((strstr(passport, "@hotmail.") != NULL) || + (strstr(passport, "@msn.com") != NULL)) + { + msn_cmdproc_send(session->notification->cmdproc, "URL", "%s", "INBOX"); + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libpurple/protocols/msnp9/session.h Mon Nov 12 16:53:54 2007 +0000 @@ -0,0 +1,227 @@ +/** + * @file session.h MSN session functions + * + * purple + * + * Purple is the legal property of its developers, whose names are too numerous + * to list here. Please refer to the COPYRIGHT file distributed with this + * source distribution. + * + * 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 02111-1301 USA + */ +#ifndef _MSN_SESSION_H_ +#define _MSN_SESSION_H_ + +typedef struct _MsnSession MsnSession; + +#include "sslconn.h" + +#include "user.h" +#include "slpcall.h" + +#include "notification.h" +#include "switchboard.h" +#include "group.h" + +#include "cmdproc.h" +#include "nexus.h" +#include "httpconn.h" + +#include "userlist.h" +#include "sync.h" + +/** + * Types of errors. + */ +typedef enum +{ + MSN_ERROR_SERVCONN, + MSN_ERROR_UNSUPPORTED_PROTOCOL, + MSN_ERROR_HTTP_MALFORMED, + MSN_ERROR_AUTH, + MSN_ERROR_BAD_BLIST, + MSN_ERROR_SIGN_OTHER, + MSN_ERROR_SERV_DOWN, + MSN_ERROR_SERV_UNAVAILABLE + +} MsnErrorType; + +/** + * Login steps. + */ +typedef enum +{ + MSN_LOGIN_STEP_START, + MSN_LOGIN_STEP_HANDSHAKE, + MSN_LOGIN_STEP_TRANSFER, + MSN_LOGIN_STEP_HANDSHAKE2, + MSN_LOGIN_STEP_AUTH_START, + MSN_LOGIN_STEP_AUTH, + MSN_LOGIN_STEP_GET_COOKIE, + MSN_LOGIN_STEP_AUTH_END, + MSN_LOGIN_STEP_SYN, + MSN_LOGIN_STEP_END + +} MsnLoginStep; + +#define MSN_LOGIN_STEPS MSN_LOGIN_STEP_END + +struct _MsnSession +{ + PurpleAccount *account; + MsnUser *user; + + guint protocol_ver; + + MsnLoginStep login_step; /**< The current step in the login process. */ + + gboolean connected; + gboolean logged_in; /**< A temporal flag to ignore local buddy list adds. */ + gboolean destroying; /**< A flag that states if the session is being destroyed. */ + gboolean http_method; + + MsnNotification *notification; + MsnNexus *nexus; + MsnSync *sync; + + MsnUserList *userlist; + + int servconns_count; /**< The count of server connections. */ + GList *switches; /**< The list of all the switchboards. */ + GList *directconns; /**< The list of all the directconnections. */ + GList *slplinks; /**< The list of all the slplinks. */ + + int conv_seq; /**< The current conversation sequence number. */ + + struct + { + char *kv; + char *sid; + char *mspauth; + unsigned long sl; + char *file; + char *client_ip; + int client_port; + + } passport_info; +}; + +/** + * Creates an MSN session. + * + * @param account The account. + * + * @return The new MSN session. + */ +MsnSession *msn_session_new(PurpleAccount *account); + +/** + * Destroys an MSN session. + * + * @param session The MSN session to destroy. + */ +void msn_session_destroy(MsnSession *session); + +/** + * Connects to and initiates an MSN session. + * + * @param session The MSN session. + * @param host The dispatch server host. + * @param port The dispatch server port. + * @param http_method Whether to use or not http_method. + * + * @return @c TRUE on success, @c FALSE on failure. + */ +gboolean msn_session_connect(MsnSession *session, + const char *host, int port, + gboolean http_method); + +/** + * Disconnects from an MSN session. + * + * @param session The MSN session. + */ +void msn_session_disconnect(MsnSession *session); + + /** + * Finds a switchboard with the given username. + * + * @param session The MSN session. + * @param username The username to search for. + * + * @return The switchboard, if found. + */ +MsnSwitchBoard *msn_session_find_swboard(MsnSession *session, + const char *username); + + /** + * Finds a switchboard with the given conversation. + * + * @param session The MSN session. + * @param conv The conversation to search for. + * + * @return The switchboard, if found. + */ +MsnSwitchBoard *msn_session_find_swboard_with_conv(MsnSession *session, + PurpleConversation *conv); +/** + * Finds a switchboard with the given chat ID. + * + * @param session The MSN session. + * @param chat_id The chat ID to search for. + * + * @return The switchboard, if found. + */ +MsnSwitchBoard *msn_session_find_swboard_with_id(const MsnSession *session, + int chat_id); + +/** + * Returns a switchboard to communicate with certain username. + * + * @param session The MSN session. + * @param username The username to search for. + * @param flag The flag of the switchboard + * + * @return The switchboard. + */ +MsnSwitchBoard *msn_session_get_swboard(MsnSession *session, + const char *username, MsnSBFlag flag); + +/** + * Sets an error for the MSN session. + * + * @param session The MSN session. + * @param error The error. + * @param info Extra information. + */ +void msn_session_set_error(MsnSession *session, MsnErrorType error, + const char *info); + +/** + * Sets the current step in the login proccess. + * + * @param session The MSN session. + * @param step The current step. + */ +void msn_session_set_login_step(MsnSession *session, MsnLoginStep step); + +/** + * Finish the login proccess. + * + * @param session The MSN session. + */ +void msn_session_finish_login(MsnSession *session); + +#endif /* _MSN_SESSION_H_ */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libpurple/protocols/msnp9/slp.c Mon Nov 12 16:53:54 2007 +0000 @@ -0,0 +1,1109 @@ +/** + * @file msnslp.c MSNSLP support + * + * purple + * + * Purple is the legal property of its developers, whose names are too numerous + * to list here. Please refer to the COPYRIGHT file distributed with this + * source distribution. + * + * 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 02111-1301 USA + */ +#include "msn.h" +#include "slp.h" +#include "slpcall.h" +#include "slpmsg.h" +#include "slpsession.h" + +#include "object.h" +#include "user.h" +#include "switchboard.h" + +/* ms to delay between sending buddy icon requests to the server. */ +#define BUDDY_ICON_DELAY 20000 + +static void send_ok(MsnSlpCall *slpcall, const char *branch, + const char *type, const char *content); + +static void send_decline(MsnSlpCall *slpcall, const char *branch, + const char *type, const char *content); + +void msn_request_user_display(MsnUser *user); + +/************************************************************************** + * Util + **************************************************************************/ + +static char * +get_token(const char *str, const char *start, const char *end) +{ + const char *c, *c2; + + if ((c = strstr(str, start)) == NULL) + return NULL; + + c += strlen(start); + + if (end != NULL) + { + if ((c2 = strstr(c, end)) == NULL) + return NULL; + + return g_strndup(c, c2 - c); + } + else + { + /* This has to be changed */ + return g_strdup(c); + } + +} + +/************************************************************************** + * Xfer + **************************************************************************/ + +static void +msn_xfer_init(PurpleXfer *xfer) +{ + MsnSlpCall *slpcall; + /* MsnSlpLink *slplink; */ + char *content; + + purple_debug_info("msn", "xfer_init\n"); + + slpcall = xfer->data; + + /* Send Ok */ + content = g_strdup_printf("SessionID: %lu\r\n\r\n", + slpcall->session_id); + + send_ok(slpcall, slpcall->branch, "application/x-msnmsgr-sessionreqbody", + content); + + g_free(content); + msn_slplink_unleash(slpcall->slplink); +} + +void +msn_xfer_cancel(PurpleXfer *xfer) +{ + MsnSlpCall *slpcall; + char *content; + + g_return_if_fail(xfer != NULL); + g_return_if_fail(xfer->data != NULL); + + slpcall = xfer->data; + + if (purple_xfer_get_status(xfer) == PURPLE_XFER_STATUS_CANCEL_LOCAL) + { + if (slpcall->started) + { + msn_slp_call_close(slpcall); + } + else + { + content = g_strdup_printf("SessionID: %lu\r\n\r\n", + slpcall->session_id); + + send_decline(slpcall, slpcall->branch, "application/x-msnmsgr-sessionreqbody", + content); + + g_free(content); + msn_slplink_unleash(slpcall->slplink); + + msn_slp_call_destroy(slpcall); + } + } +} + +void +msn_xfer_progress_cb(MsnSlpCall *slpcall, gsize total_length, gsize len, gsize offset) +{ + PurpleXfer *xfer; + + xfer = slpcall->xfer; + + xfer->bytes_sent = (offset + len); + xfer->bytes_remaining = total_length - (offset + len); + + purple_xfer_update_progress(xfer); +} + +void +msn_xfer_end_cb(MsnSlpCall *slpcall, MsnSession *session) +{ + if ((purple_xfer_get_status(slpcall->xfer) != PURPLE_XFER_STATUS_DONE) && + (purple_xfer_get_status(slpcall->xfer) != PURPLE_XFER_STATUS_CANCEL_REMOTE) && + (purple_xfer_get_status(slpcall->xfer) != PURPLE_XFER_STATUS_CANCEL_LOCAL)) + { + purple_xfer_cancel_remote(slpcall->xfer); + } +} + +void +msn_xfer_completed_cb(MsnSlpCall *slpcall, const guchar *body, + gsize size) +{ + PurpleXfer *xfer = slpcall->xfer; + purple_xfer_set_completed(xfer, TRUE); + purple_xfer_end(xfer); +} + +/************************************************************************** + * SLP Control + **************************************************************************/ + +#if 0 +static void +got_transresp(MsnSlpCall *slpcall, const char *nonce, + const char *ips_str, int port) +{ + MsnDirectConn *directconn; + char **ip_addrs, **c; + + directconn = msn_directconn_new(slpcall->slplink); + + directconn->initial_call = slpcall; + + /* msn_directconn_parse_nonce(directconn, nonce); */ + directconn->nonce = g_strdup(nonce); + + ip_addrs = g_strsplit(ips_str, " ", -1); + + for (c = ip_addrs; *c != NULL; c++) + { + purple_debug_info("msn", "ip_addr = %s\n", *c); + if (msn_directconn_connect(directconn, *c, port)) + break; + } + + g_strfreev(ip_addrs); +} +#endif + +static void +send_ok(MsnSlpCall *slpcall, const char *branch, + const char *type, const char *content) +{ + MsnSlpLink *slplink; + MsnSlpMessage *slpmsg; + + slplink = slpcall->slplink; + + /* 200 OK */ + slpmsg = msn_slpmsg_sip_new(slpcall, 1, + "MSNSLP/1.0 200 OK", + branch, type, content); + +#ifdef MSN_DEBUG_SLP + slpmsg->info = "SLP 200 OK"; + slpmsg->text_body = TRUE; +#endif + + msn_slplink_queue_slpmsg(slplink, slpmsg); + + msn_slp_call_session_init(slpcall); +} + +static void +send_decline(MsnSlpCall *slpcall, const char *branch, + const char *type, const char *content) +{ + MsnSlpLink *slplink; + MsnSlpMessage *slpmsg; + + slplink = slpcall->slplink; + + /* 603 Decline */ + slpmsg = msn_slpmsg_sip_new(slpcall, 1, + "MSNSLP/1.0 603 Decline", + branch, type, content); + +#ifdef MSN_DEBUG_SLP + slpmsg->info = "SLP 603 Decline"; + slpmsg->text_body = TRUE; +#endif + + msn_slplink_queue_slpmsg(slplink, slpmsg); +} + +#define MAX_FILE_NAME_LEN 0x226 + +static void +got_sessionreq(MsnSlpCall *slpcall, const char *branch, + const char *euf_guid, const char *context) +{ + if (!strcmp(euf_guid, "A4268EEC-FEC5-49E5-95C3-F126696BDBF6")) + { + /* Emoticon or UserDisplay */ + char *content; + gsize len; + MsnSlpSession *slpsession; + MsnSlpLink *slplink; + MsnSlpMessage *slpmsg; + MsnObject *obj; + char *msnobj_data; + PurpleStoredImage *img; + int type; + + /* Send Ok */ + content = g_strdup_printf("SessionID: %lu\r\n\r\n", + slpcall->session_id); + + send_ok(slpcall, branch, "application/x-msnmsgr-sessionreqbody", + content); + + g_free(content); + + slplink = slpcall->slplink; + + msnobj_data = (char *)purple_base64_decode(context, &len); + obj = msn_object_new_from_string(msnobj_data); + type = msn_object_get_type(obj); + g_free(msnobj_data); + + if (!(type == MSN_OBJECT_USERTILE)) + { + purple_debug_error("msn", "Wrong object?\n"); + msn_object_destroy(obj); + g_return_if_reached(); + } + + img = msn_object_get_image(obj); + if (img == NULL) + { + purple_debug_error("msn", "Wrong object.\n"); + msn_object_destroy(obj); + g_return_if_reached(); + } + + msn_object_destroy(obj); + + slpsession = msn_slplink_find_slp_session(slplink, + slpcall->session_id); + + /* DATA PREP */ + slpmsg = msn_slpmsg_new(slplink); + slpmsg->slpcall = slpcall; + slpmsg->slpsession = slpsession; + slpmsg->session_id = slpsession->id; + msn_slpmsg_set_body(slpmsg, NULL, 4); +#ifdef MSN_DEBUG_SLP + slpmsg->info = "SLP DATA PREP"; +#endif + msn_slplink_queue_slpmsg(slplink, slpmsg); + + /* DATA */ + slpmsg = msn_slpmsg_new(slplink); + slpmsg->slpcall = slpcall; + slpmsg->slpsession = slpsession; + slpmsg->flags = 0x20; +#ifdef MSN_DEBUG_SLP + slpmsg->info = "SLP DATA"; +#endif + msn_slpmsg_set_image(slpmsg, img); + msn_slplink_queue_slpmsg(slplink, slpmsg); + } + else if (!strcmp(euf_guid, "5D3E02AB-6190-11D3-BBBB-00C04F795683")) + { + /* File Transfer */ + PurpleAccount *account; + PurpleXfer *xfer; + char *bin; + gsize bin_len; + guint32 file_size; + char *file_name; + gunichar2 *uni_name; + + account = slpcall->slplink->session->account; + + slpcall->cb = msn_xfer_completed_cb; + slpcall->end_cb = msn_xfer_end_cb; + slpcall->progress_cb = msn_xfer_progress_cb; + slpcall->branch = g_strdup(branch); + + slpcall->pending = TRUE; + + xfer = purple_xfer_new(account, PURPLE_XFER_RECEIVE, + slpcall->slplink->remote_user); + if (xfer) + { + bin = (char *)purple_base64_decode(context, &bin_len); + file_size = GUINT32_FROM_LE(*(gsize *)(bin + 8)); + + uni_name = (gunichar2 *)(bin + 20); + while(*uni_name != 0 && ((char *)uni_name - (bin + 20)) < MAX_FILE_NAME_LEN) { + *uni_name = GUINT16_FROM_LE(*uni_name); + uni_name++; + } + + file_name = g_utf16_to_utf8((const gunichar2 *)(bin + 20), -1, + NULL, NULL, NULL); + + g_free(bin); + + purple_xfer_set_filename(xfer, file_name); + purple_xfer_set_size(xfer, file_size); + purple_xfer_set_init_fnc(xfer, msn_xfer_init); + purple_xfer_set_request_denied_fnc(xfer, msn_xfer_cancel); + purple_xfer_set_cancel_recv_fnc(xfer, msn_xfer_cancel); + + slpcall->xfer = xfer; + purple_xfer_ref(slpcall->xfer); + + xfer->data = slpcall; + + purple_xfer_request(xfer); + } + } +} + +void +send_bye(MsnSlpCall *slpcall, const char *type) +{ + MsnSlpLink *slplink; + MsnSlpMessage *slpmsg; + char *header; + + slplink = slpcall->slplink; + + g_return_if_fail(slplink != NULL); + + header = g_strdup_printf("BYE MSNMSGR:%s MSNSLP/1.0", + slplink->local_user); + + slpmsg = msn_slpmsg_sip_new(slpcall, 0, header, + "A0D624A6-6C0C-4283-A9E0-BC97B4B46D32", + type, + "\r\n"); + g_free(header); + +#ifdef MSN_DEBUG_SLP + slpmsg->info = "SLP BYE"; + slpmsg->text_body = TRUE; +#endif + + msn_slplink_queue_slpmsg(slplink, slpmsg); +} + +static void +got_invite(MsnSlpCall *slpcall, + const char *branch, const char *type, const char *content) +{ + MsnSlpLink *slplink; + + slplink = slpcall->slplink; + + if (!strcmp(type, "application/x-msnmsgr-sessionreqbody")) + { + char *euf_guid, *context; + char *temp; + + euf_guid = get_token(content, "EUF-GUID: {", "}\r\n"); + + temp = get_token(content, "SessionID: ", "\r\n"); + if (temp != NULL) + slpcall->session_id = atoi(temp); + g_free(temp); + + temp = get_token(content, "AppID: ", "\r\n"); + if (temp != NULL) + slpcall->app_id = atoi(temp); + g_free(temp); + + context = get_token(content, "Context: ", "\r\n"); + + if (context != NULL) + got_sessionreq(slpcall, branch, euf_guid, context); + + g_free(context); + g_free(euf_guid); + } + else if (!strcmp(type, "application/x-msnmsgr-transreqbody")) + { + /* A direct connection? */ + + char *listening, *nonce; + char *content; + + if (FALSE) + { +#if 0 + MsnDirectConn *directconn; + /* const char *ip_addr; */ + char *ip_port; + int port; + + /* ip_addr = purple_prefs_get_string("/purple/ft/public_ip"); */ + ip_port = "5190"; + listening = "true"; + nonce = rand_guid(); + + directconn = msn_directconn_new(slplink); + + /* msn_directconn_parse_nonce(directconn, nonce); */ + directconn->nonce = g_strdup(nonce); + + msn_directconn_listen(directconn); + + port = directconn->port; + + content = g_strdup_printf( + "Bridge: TCPv1\r\n" + "Listening: %s\r\n" + "Nonce: {%s}\r\n" + "Ipv4Internal-Addrs: 192.168.0.82\r\n" + "Ipv4Internal-Port: %d\r\n" + "\r\n", + listening, + nonce, + port); +#endif + } + else + { + listening = "false"; + nonce = g_strdup("00000000-0000-0000-0000-000000000000"); + + content = g_strdup_printf( + "Bridge: TCPv1\r\n" + "Listening: %s\r\n" + "Nonce: {%s}\r\n" + "\r\n", + listening, + nonce); + } + + send_ok(slpcall, branch, + "application/x-msnmsgr-transrespbody", content); + + g_free(content); + g_free(nonce); + } + else if (!strcmp(type, "application/x-msnmsgr-transrespbody")) + { +#if 0 + char *ip_addrs; + char *temp; + char *nonce; + int port; + + nonce = get_token(content, "Nonce: {", "}\r\n"); + ip_addrs = get_token(content, "IPv4Internal-Addrs: ", "\r\n"); + + temp = get_token(content, "IPv4Internal-Port: ", "\r\n"); + if (temp != NULL) + port = atoi(temp); + else + port = -1; + g_free(temp); + + if (ip_addrs == NULL) + return; + + if (port > 0) + got_transresp(slpcall, nonce, ip_addrs, port); + + g_free(nonce); + g_free(ip_addrs); +#endif + } +} + +static void +got_ok(MsnSlpCall *slpcall, + const char *type, const char *content) +{ + g_return_if_fail(slpcall != NULL); + g_return_if_fail(type != NULL); + + if (!strcmp(type, "application/x-msnmsgr-sessionreqbody")) + { +#if 0 + if (slpcall->type == MSN_SLPCALL_DC) + { + /* First let's try a DirectConnection. */ + + MsnSlpLink *slplink; + MsnSlpMessage *slpmsg; + char *header; + char *content; + char *branch; + + slplink = slpcall->slplink; + + branch = rand_guid(); + + content = g_strdup_printf( + "Bridges: TRUDPv1 TCPv1\r\n" + "NetID: 0\r\n" + "Conn-Type: Direct-Connect\r\n" + "UPnPNat: false\r\n" + "ICF: false\r\n" + ); + + header = g_strdup_printf("INVITE MSNMSGR:%s MSNSLP/1.0", + slplink->remote_user); + + slpmsg = msn_slp_sipmsg_new(slpcall, 0, header, branch, + "application/x-msnmsgr-transreqbody", + content); + +#ifdef MSN_DEBUG_SLP + slpmsg->info = "SLP INVITE"; + slpmsg->text_body = TRUE; +#endif + msn_slplink_send_slpmsg(slplink, slpmsg); + + g_free(header); + g_free(content); + + g_free(branch); + } + else + { + msn_slp_call_session_init(slpcall); + } +#else + msn_slp_call_session_init(slpcall); +#endif + } + else if (!strcmp(type, "application/x-msnmsgr-transreqbody")) + { + /* Do we get this? */ + purple_debug_info("msn", "OK with transreqbody\n"); + } + else if (!strcmp(type, "application/x-msnmsgr-transrespbody")) + { +#if 0 + char *ip_addrs; + char *temp; + char *nonce; + int port; + + nonce = get_token(content, "Nonce: {", "}\r\n"); + ip_addrs = get_token(content, "IPv4Internal-Addrs: ", "\r\n"); + + temp = get_token(content, "IPv4Internal-Port: ", "\r\n"); + if (temp != NULL) + port = atoi(temp); + else + port = -1; + g_free(temp); + + if (ip_addrs == NULL) + return; + + if (port > 0) + got_transresp(slpcall, nonce, ip_addrs, port); + + g_free(nonce); + g_free(ip_addrs); +#endif + } +} + +MsnSlpCall * +msn_slp_sip_recv(MsnSlpLink *slplink, const char *body) +{ + MsnSlpCall *slpcall; + + if (body == NULL) + { + purple_debug_warning("msn", "received bogus message\n"); + return NULL; + } + + if (!strncmp(body, "INVITE", strlen("INVITE"))) + { + char *branch; + char *content; + char *content_type; + + slpcall = msn_slp_call_new(slplink); + + /* From: <msnmsgr:buddy@hotmail.com> */ +#if 0 + slpcall->remote_user = get_token(body, "From: <msnmsgr:", ">\r\n"); +#endif + + branch = get_token(body, ";branch={", "}"); + + slpcall->id = get_token(body, "Call-ID: {", "}"); + +#if 0 + long content_len = -1; + + temp = get_token(body, "Content-Length: ", "\r\n"); + if (temp != NULL) + content_len = atoi(temp); + g_free(temp); +#endif + content_type = get_token(body, "Content-Type: ", "\r\n"); + + content = get_token(body, "\r\n\r\n", NULL); + + got_invite(slpcall, branch, content_type, content); + + g_free(branch); + g_free(content_type); + g_free(content); + } + else if (!strncmp(body, "MSNSLP/1.0 ", strlen("MSNSLP/1.0 "))) + { + char *content; + char *content_type; + /* Make sure this is "OK" */ + const char *status = body + strlen("MSNSLP/1.0 "); + char *call_id; + + call_id = get_token(body, "Call-ID: {", "}"); + slpcall = msn_slplink_find_slp_call(slplink, call_id); + g_free(call_id); + + g_return_val_if_fail(slpcall != NULL, NULL); + + if (strncmp(status, "200 OK", 6)) + { + /* It's not valid. Kill this off. */ + char temp[32]; + const char *c; + + /* Eww */ + if ((c = strchr(status, '\r')) || (c = strchr(status, '\n')) || + (c = strchr(status, '\0'))) + { + size_t offset = c - status; + if (offset >= sizeof(temp)) + offset = sizeof(temp) - 1; + + strncpy(temp, status, offset); + temp[offset] = '\0'; + } + + purple_debug_error("msn", "Received non-OK result: %s\n", temp); + + slpcall->wasted = TRUE; + + /* msn_slp_call_destroy(slpcall); */ + return slpcall; + } + + content_type = get_token(body, "Content-Type: ", "\r\n"); + + content = get_token(body, "\r\n\r\n", NULL); + + got_ok(slpcall, content_type, content); + + g_free(content_type); + g_free(content); + } + else if (!strncmp(body, "BYE", strlen("BYE"))) + { + char *call_id; + + call_id = get_token(body, "Call-ID: {", "}"); + slpcall = msn_slplink_find_slp_call(slplink, call_id); + g_free(call_id); + + if (slpcall != NULL) + slpcall->wasted = TRUE; + + /* msn_slp_call_destroy(slpcall); */ + } + else + slpcall = NULL; + + return slpcall; +} + +/************************************************************************** + * Msg Callbacks + **************************************************************************/ + +void +msn_p2p_msg(MsnCmdProc *cmdproc, MsnMessage *msg) +{ + MsnSession *session; + MsnSlpLink *slplink; + + session = cmdproc->servconn->session; + slplink = msn_session_get_slplink(session, msg->remote_user); + + if (slplink->swboard == NULL) + { + /* We will need this in order to change its flags. */ + slplink->swboard = (MsnSwitchBoard *)cmdproc->data; + /* If swboard is NULL, something has probably gone wrong earlier on + * I didn't want to do this, but MSN 7 is somehow causing us to crash + * here, I couldn't reproduce it to debug more, and people are + * reporting bugs. Hopefully this doesn't cause more crashes. Stu. + */ + if (slplink->swboard != NULL) + slplink->swboard->slplinks = g_list_prepend(slplink->swboard->slplinks, slplink); + else + purple_debug_error("msn", "msn_p2p_msg, swboard is NULL, ouch!\n"); + } + + msn_slplink_process_msg(slplink, msg); +} + +static void +got_emoticon(MsnSlpCall *slpcall, + const guchar *data, gsize size) +{ + + PurpleConversation *conv; + PurpleConnection *gc; + const char *who; + + gc = slpcall->slplink->session->account->gc; + who = slpcall->slplink->remote_user; + + if ((conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_ANY, who, gc->account))) { + + /* FIXME: it would be better if we wrote the data as we received it + instead of all at once, calling write multiple times and + close once at the very end + */ + purple_conv_custom_smiley_write(conv, slpcall->data_info, data, size); + purple_conv_custom_smiley_close(conv, slpcall->data_info); + } +#ifdef MSN_DEBUG_UD + purple_debug_info("msn", "Got smiley: %s\n", slpcall->data_info); +#endif +} + +void +msn_emoticon_msg(MsnCmdProc *cmdproc, MsnMessage *msg) +{ + MsnSession *session; + MsnSlpLink *slplink; + MsnObject *obj; + char **tokens; + char *smile, *body_str; + const char *body, *who, *sha1; + guint tok; + size_t body_len; + + PurpleConversation *conv; + + session = cmdproc->servconn->session; + + if (!purple_account_get_bool(session->account, "custom_smileys", TRUE)) + return; + + body = msn_message_get_bin_data(msg, &body_len); + body_str = g_strndup(body, body_len); + + /* MSN Messenger 7 may send more than one MSNObject in a single message... + * Maybe 10 tokens is a reasonable max value. */ + tokens = g_strsplit(body_str, "\t", 10); + + g_free(body_str); + + for (tok = 0; tok < 9; tok += 2) { + if (tokens[tok] == NULL || tokens[tok + 1] == NULL) { + break; + } + + smile = tokens[tok]; + obj = msn_object_new_from_string(purple_url_decode(tokens[tok + 1])); + + if (obj == NULL) + break; + + who = msn_object_get_creator(obj); + sha1 = msn_object_get_sha1(obj); + + slplink = msn_session_get_slplink(session, who); + + conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_ANY, who, + session->account); + + /* If the conversation doesn't exist then this is a custom smiley + * used in the first message in a MSN conversation: we need to create + * the conversation now, otherwise the custom smiley won't be shown. + * This happens because every GtkIMHtml has its own smiley tree: if + * the conversation doesn't exist then we cannot associate the new + * smiley with its GtkIMHtml widget. */ + if (!conv) { + conv = purple_conversation_new(PURPLE_CONV_TYPE_IM, session->account, who); + } + + if (purple_conv_custom_smiley_add(conv, smile, "sha1", sha1, TRUE)) { + msn_slplink_request_object(slplink, smile, got_emoticon, NULL, obj); + } + + msn_object_destroy(obj); + obj = NULL; + who = NULL; + sha1 = NULL; + } + g_strfreev(tokens); +} + +static gboolean +buddy_icon_cached(PurpleConnection *gc, MsnObject *obj) +{ + PurpleAccount *account; + PurpleBuddy *buddy; + const char *old; + const char *new; + + g_return_val_if_fail(obj != NULL, FALSE); + + account = purple_connection_get_account(gc); + + buddy = purple_find_buddy(account, msn_object_get_creator(obj)); + if (buddy == NULL) + return FALSE; + + old = purple_buddy_icons_get_checksum_for_user(buddy); + new = msn_object_get_sha1(obj); + + if (new == NULL) + return FALSE; + + /* If the old and new checksums are the same, and the file actually exists, + * then return TRUE */ + if (old != NULL && !strcmp(old, new)) + return TRUE; + + return FALSE; +} + +static void +msn_release_buddy_icon_request(MsnUserList *userlist) +{ + MsnUser *user; + + g_return_if_fail(userlist != NULL); + +#ifdef MSN_DEBUG_UD + purple_debug_info("msn", "Releasing buddy icon request\n"); +#endif + + if (userlist->buddy_icon_window > 0) + { + GQueue *queue; + PurpleAccount *account; + const char *username; + + queue = userlist->buddy_icon_requests; + + if (g_queue_is_empty(userlist->buddy_icon_requests)) + return; + + user = g_queue_pop_head(queue); + + account = userlist->session->account; + username = user->passport; + + userlist->buddy_icon_window--; + msn_request_user_display(user); + +#ifdef MSN_DEBUG_UD + purple_debug_info("msn", "msn_release_buddy_icon_request(): buddy_icon_window-- yields =%d\n", + userlist->buddy_icon_window); +#endif + } +} + +/* + * Called on a timeout from end_user_display(). Frees a buddy icon window slow and dequeues the next + * buddy icon request if there is one. + */ +static gboolean +msn_release_buddy_icon_request_timeout(gpointer data) +{ + MsnUserList *userlist = (MsnUserList *)data; + + /* Free one window slot */ + userlist->buddy_icon_window++; + + /* Clear the tag for our former request timer */ + userlist->buddy_icon_request_timer = 0; + + msn_release_buddy_icon_request(userlist); + + return FALSE; +} + +void +msn_queue_buddy_icon_request(MsnUser *user) +{ + PurpleAccount *account; + MsnObject *obj; + GQueue *queue; + + g_return_if_fail(user != NULL); + + account = user->userlist->session->account; + + obj = msn_user_get_object(user); + + if (obj == NULL) + { + purple_buddy_icons_set_for_user(account, user->passport, NULL, 0, NULL); + return; + } + + if (!buddy_icon_cached(account->gc, obj)) + { + MsnUserList *userlist; + + userlist = user->userlist; + queue = userlist->buddy_icon_requests; + +#ifdef MSN_DEBUG_UD + purple_debug_info("msn", "Queueing buddy icon request for %s (buddy_icon_window = %i)\n", + user->passport, userlist->buddy_icon_window); +#endif + + g_queue_push_tail(queue, user); + + if (userlist->buddy_icon_window > 0) + msn_release_buddy_icon_request(userlist); + } +} + +static void +got_user_display(MsnSlpCall *slpcall, + const guchar *data, gsize size) +{ + MsnUserList *userlist; + const char *info; + PurpleAccount *account; + + g_return_if_fail(slpcall != NULL); + + info = slpcall->data_info; +#ifdef MSN_DEBUG_UD + purple_debug_info("msn", "Got User Display: %s\n", slpcall->slplink->remote_user); +#endif + + userlist = slpcall->slplink->session->userlist; + account = slpcall->slplink->session->account; + + purple_buddy_icons_set_for_user(account, slpcall->slplink->remote_user, + g_memdup(data, size), size, info); + +#if 0 + /* Free one window slot */ + userlist->buddy_icon_window++; + + purple_debug_info("msn", "got_user_display(): buddy_icon_window++ yields =%d\n", + userlist->buddy_icon_window); + + msn_release_buddy_icon_request(userlist); +#endif +} + +static void +end_user_display(MsnSlpCall *slpcall, MsnSession *session) +{ + MsnUserList *userlist; + + g_return_if_fail(session != NULL); + +#ifdef MSN_DEBUG_UD + purple_debug_info("msn", "End User Display\n"); +#endif + + userlist = session->userlist; + + /* If the session is being destroyed we better stop doing anything. */ + if (session->destroying) + return; + + /* Delay before freeing a buddy icon window slot and requesting the next icon, if appropriate. + * If we don't delay, we'll rapidly hit the MSN equivalent of AIM's rate limiting; the server will + * send us an error 800 like so: + * + * C: NS 000: XFR 21 SB + * S: NS 000: 800 21 + */ + if (userlist->buddy_icon_request_timer) { + /* Free the window slot used by this previous request */ + userlist->buddy_icon_window++; + + /* Clear our pending timeout */ + purple_timeout_remove(userlist->buddy_icon_request_timer); + } + + /* Wait BUDDY_ICON_DELAY ms before freeing our window slot and requesting the next icon. */ + userlist->buddy_icon_request_timer = purple_timeout_add(BUDDY_ICON_DELAY, + msn_release_buddy_icon_request_timeout, userlist); +} + +void +msn_request_user_display(MsnUser *user) +{ + PurpleAccount *account; + MsnSession *session; + MsnSlpLink *slplink; + MsnObject *obj; + const char *info; + + session = user->userlist->session; + account = session->account; + + slplink = msn_session_get_slplink(session, user->passport); + + obj = msn_user_get_object(user); + + info = msn_object_get_sha1(obj); + + if (g_ascii_strcasecmp(user->passport, + purple_account_get_username(account))) + { + msn_slplink_request_object(slplink, info, got_user_display, + end_user_display, obj); + } + else + { + MsnObject *my_obj = NULL; + gconstpointer data = NULL; + size_t len = 0; + +#ifdef MSN_DEBUG_UD + purple_debug_info("msn", "Requesting our own user display\n"); +#endif + + my_obj = msn_user_get_object(session->user); + + if (my_obj != NULL) + { + PurpleStoredImage *img = msn_object_get_image(my_obj); + data = purple_imgstore_get_data(img); + len = purple_imgstore_get_size(img); + } + + purple_buddy_icons_set_for_user(account, user->passport, g_memdup(data, len), len, info); + + /* Free one window slot */ + session->userlist->buddy_icon_window++; + +#ifdef MSN_DEBUG_UD + purple_debug_info("msn", "msn_request_user_display(): buddy_icon_window++ yields =%d\n", + session->userlist->buddy_icon_window); +#endif + + msn_release_buddy_icon_request(session->userlist); + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libpurple/protocols/msnp9/slp.h Mon Nov 12 16:53:54 2007 +0000 @@ -0,0 +1,48 @@ +/** + * @file slp.h MSNSLP support + * + * purple + * + * Purple is the legal property of its developers, whose names are too numerous + * to list here. Please refer to the COPYRIGHT file distributed with this + * source distribution. + * + * 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 02111-1301 USA + */ +#ifndef _MSN_SLP_H_ +#define _MSN_SLP_H_ + +#include "slpcall.h" +#include "session.h" +#include "internal.h" +#include "ft.h" + +void msn_xfer_progress_cb(MsnSlpCall *slpcall, gsize total_length, gsize + len, gsize offset); + +MsnSlpCall * msn_slp_sip_recv(MsnSlpLink *slplink, + const char *body); + +void send_bye(MsnSlpCall *slpcall, const char *type); + +void msn_xfer_completed_cb(MsnSlpCall *slpcall, + const guchar *body, gsize size); + +void msn_xfer_cancel(PurpleXfer *xfer); +void msn_xfer_end_cb(MsnSlpCall *slpcall, MsnSession *session); + +void msn_queue_buddy_icon_request(MsnUser *user); + +#endif /* _MSN_SLP_H_ */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libpurple/protocols/msnp9/slpcall.c Mon Nov 12 16:53:54 2007 +0000 @@ -0,0 +1,270 @@ +/** + * @file slpcall.c SLP Call Functions + * + * purple + * + * Purple is the legal property of its developers, whose names are too numerous + * to list here. Please refer to the COPYRIGHT file distributed with this + * source distribution. + * + * 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 02111-1301 USA + */ +#include "msn.h" +#include "slpcall.h" +#include "slpsession.h" + +#include "slp.h" + +/* #define MSN_DEBUG_SLPCALL */ + +/************************************************************************** + * Util + **************************************************************************/ + +static char * +rand_guid() +{ + return g_strdup_printf("%4X%4X-%4X-%4X-%4X-%4X%4X%4X", + rand() % 0xAAFF + 0x1111, + rand() % 0xAAFF + 0x1111, + rand() % 0xAAFF + 0x1111, + rand() % 0xAAFF + 0x1111, + rand() % 0xAAFF + 0x1111, + rand() % 0xAAFF + 0x1111, + rand() % 0xAAFF + 0x1111, + rand() % 0xAAFF + 0x1111); +} + +/************************************************************************** + * Main + **************************************************************************/ + +MsnSlpCall * +msn_slp_call_new(MsnSlpLink *slplink) +{ + MsnSlpCall *slpcall; + + g_return_val_if_fail(slplink != NULL, NULL); + + slpcall = g_new0(MsnSlpCall, 1); + +#ifdef MSN_DEBUG_SLPCALL + purple_debug_info("msn", "slpcall_new: slpcall(%p)\n", slpcall); +#endif + + slpcall->slplink = slplink; + + msn_slplink_add_slpcall(slplink, slpcall); + + slpcall->timer = purple_timeout_add(MSN_SLPCALL_TIMEOUT, msn_slp_call_timeout, slpcall); + + return slpcall; +} + +void +msn_slp_call_destroy(MsnSlpCall *slpcall) +{ + GList *e; + MsnSession *session; + +#ifdef MSN_DEBUG_SLPCALL + purple_debug_info("msn", "slpcall_destroy: slpcall(%p)\n", slpcall); +#endif + + g_return_if_fail(slpcall != NULL); + + if (slpcall->timer) + purple_timeout_remove(slpcall->timer); + + if (slpcall->id != NULL) + g_free(slpcall->id); + + if (slpcall->branch != NULL) + g_free(slpcall->branch); + + if (slpcall->data_info != NULL) + g_free(slpcall->data_info); + + for (e = slpcall->slplink->slp_msgs; e != NULL; ) + { + MsnSlpMessage *slpmsg = e->data; + e = e->next; + +#ifdef MSN_DEBUG_SLPCALL_VERBOSE + purple_debug_info("msn", "slpcall_destroy: trying slpmsg(%p)\n", + slpmsg); +#endif + + if (slpmsg->slpcall == slpcall) + { + msn_slpmsg_destroy(slpmsg); + } + } + + session = slpcall->slplink->session; + + msn_slplink_remove_slpcall(slpcall->slplink, slpcall); + + if (slpcall->end_cb != NULL) + slpcall->end_cb(slpcall, session); + + if (slpcall->xfer != NULL) + purple_xfer_unref(slpcall->xfer); + + g_free(slpcall); +} + +void +msn_slp_call_init(MsnSlpCall *slpcall, MsnSlpCallType type) +{ + slpcall->session_id = rand() % 0xFFFFFF00 + 4; + slpcall->id = rand_guid(); + slpcall->type = type; +} + +void +msn_slp_call_session_init(MsnSlpCall *slpcall) +{ + MsnSlpSession *slpsession; + + slpsession = msn_slp_session_new(slpcall); + + if (slpcall->session_init_cb) + slpcall->session_init_cb(slpsession); + + slpcall->started = TRUE; +} + +void +msn_slp_call_invite(MsnSlpCall *slpcall, const char *euf_guid, + int app_id, const char *context) +{ + MsnSlpLink *slplink; + MsnSlpMessage *slpmsg; + char *header; + char *content; + + g_return_if_fail(slpcall != NULL); + g_return_if_fail(context != NULL); + + slplink = slpcall->slplink; + + slpcall->branch = rand_guid(); + + content = g_strdup_printf( + "EUF-GUID: {%s}\r\n" + "SessionID: %lu\r\n" + "AppID: %d\r\n" + "Context: %s\r\n\r\n", + euf_guid, + slpcall->session_id, + app_id, + context); + + header = g_strdup_printf("INVITE MSNMSGR:%s MSNSLP/1.0", + slplink->remote_user); + + slpmsg = msn_slpmsg_sip_new(slpcall, 0, header, slpcall->branch, + "application/x-msnmsgr-sessionreqbody", content); + +#ifdef MSN_DEBUG_SLP + slpmsg->info = "SLP INVITE"; + slpmsg->text_body = TRUE; +#endif + + msn_slplink_send_slpmsg(slplink, slpmsg); + + g_free(header); + g_free(content); +} + +void +msn_slp_call_close(MsnSlpCall *slpcall) +{ + g_return_if_fail(slpcall != NULL); + g_return_if_fail(slpcall->slplink != NULL); + + send_bye(slpcall, "application/x-msnmsgr-sessionclosebody"); + msn_slplink_unleash(slpcall->slplink); + msn_slp_call_destroy(slpcall); +} + +gboolean +msn_slp_call_timeout(gpointer data) +{ + MsnSlpCall *slpcall; + + slpcall = data; + +#ifdef MSN_DEBUG_SLPCALL + purple_debug_info("msn", "slpcall_timeout: slpcall(%p)\n", slpcall); +#endif + + if (!slpcall->pending && !slpcall->progress) + { + msn_slp_call_destroy(slpcall); + return FALSE; + } + + slpcall->progress = FALSE; + + return TRUE; +} + +MsnSlpCall * +msn_slp_process_msg(MsnSlpLink *slplink, MsnSlpMessage *slpmsg) +{ + MsnSlpCall *slpcall; + const guchar *body; + gsize body_len; + + slpcall = NULL; + body = slpmsg->buffer; + body_len = slpmsg->size; + + if (slpmsg->flags == 0x0) + { + char *body_str; + + body_str = g_strndup((const char *)body, body_len); + slpcall = msn_slp_sip_recv(slplink, body_str); + g_free(body_str); + } + else if (slpmsg->flags == 0x20 || slpmsg->flags == 0x1000030) + { + slpcall = msn_slplink_find_slp_call_with_session_id(slplink, slpmsg->session_id); + + if (slpcall != NULL) + { + if (slpcall->timer) + purple_timeout_remove(slpcall->timer); + + slpcall->cb(slpcall, body, body_len); + + slpcall->wasted = TRUE; + } + } +#if 0 + else if (slpmsg->flags == 0x100) + { + slpcall = slplink->directconn->initial_call; + + if (slpcall != NULL) + msn_slp_call_session_init(slpcall); + } +#endif + + return slpcall; +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libpurple/protocols/msnp9/slpcall.h Mon Nov 12 16:53:54 2007 +0000 @@ -0,0 +1,91 @@ +/** + * @file slpcall.h SLP Call functions + * + * purple + * + * Purple is the legal property of its developers, whose names are too numerous + * to list here. Please refer to the COPYRIGHT file distributed with this + * source distribution. + * + * 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 02111-1301 USA + */ +#ifndef _MSN_SLPCALL_H_ +#define _MSN_SLPCALL_H_ + +#include "internal.h" + +typedef struct _MsnSlpCall MsnSlpCall; + +#include "slplink.h" +#include "slpsession.h" + +/* The official client seems to timeout slp calls after 5 minutes */ +#define MSN_SLPCALL_TIMEOUT 300000 + +typedef enum +{ + MSN_SLPCALL_ANY, + MSN_SLPCALL_DC, + +} MsnSlpCallType; + +struct _MsnSlpCall +{ + /* MsnSession *session; */ + MsnSlpLink *slplink; + + MsnSlpCallType type; + + /* Call-ID */ + char *id; + char *branch; + + long session_id; + long app_id; + + gboolean pending; /**< A flag that states if we should wait for this + slpcall to start and do not time out. */ + gboolean progress; /**< A flag that states if there has been progress since + the last time out. */ + gboolean wasted; /**< A flag that states if this slpcall is going to be + destroyed. */ + gboolean started; /**< A flag that states if this slpcall's session has + been initiated. */ + + void (*progress_cb)(MsnSlpCall *slpcall, + gsize total_length, gsize len, gsize offset); + void (*session_init_cb)(MsnSlpSession *slpsession); + + /* Can be checksum, or smile */ + char *data_info; + + void *xfer; + + MsnSlpCb cb; + void (*end_cb)(MsnSlpCall *slpcall, MsnSession *session); + + int timer; +}; + +MsnSlpCall *msn_slp_call_new(MsnSlpLink *slplink); +void msn_slp_call_init(MsnSlpCall *slpcall, MsnSlpCallType type); +void msn_slp_call_session_init(MsnSlpCall *slpcall); +void msn_slp_call_destroy(MsnSlpCall *slpcall); +void msn_slp_call_invite(MsnSlpCall *slpcall, const char *euf_guid, + int app_id, const char *context); +void msn_slp_call_close(MsnSlpCall *slpcall); +gboolean msn_slp_call_timeout(gpointer data); + +#endif /* _MSN_SLPCALL_H_ */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libpurple/protocols/msnp9/slplink.c Mon Nov 12 16:53:54 2007 +0000 @@ -0,0 +1,811 @@ +/** + * @file slplink.c MSNSLP Link support + * + * purple + * + * Purple is the legal property of its developers, whose names are too numerous + * to list here. Please refer to the COPYRIGHT file distributed with this + * source distribution. + * + * 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 02111-1301 USA + */ +#include "msn.h" +#include "slplink.h" + +#include "switchboard.h" +#include "slp.h" + +void msn_slplink_send_msgpart(MsnSlpLink *slplink, MsnSlpMessage *slpmsg); + +#ifdef MSN_DEBUG_SLP_FILES +static int m_sc = 0; +static int m_rc = 0; + +static void +debug_msg_to_file(MsnMessage *msg, gboolean send) +{ + char *tmp; + char *dir; + char *pload; + FILE *tf; + int c; + gsize pload_size; + + dir = send ? "send" : "recv"; + c = send ? m_sc++ : m_rc++; + tmp = g_strdup_printf("%s/msntest/%s/%03d", g_get_home_dir(), dir, c); + tf = g_fopen(tmp, "wb"); + if (tf == NULL) + { + purple_debug_error("msn", "could not open debug file\n"); + return; + } + pload = msn_message_gen_payload(msg, &pload_size); + fwrite(pload, 1, pload_size, tf); + fclose(tf); + g_free(tmp); +} +#endif + +/************************************************************************** + * Main + **************************************************************************/ + +MsnSlpLink * +msn_slplink_new(MsnSession *session, const char *username) +{ + MsnSlpLink *slplink; + + g_return_val_if_fail(session != NULL, NULL); + + slplink = g_new0(MsnSlpLink, 1); + +#ifdef MSN_DEBUG_SLPLINK + purple_debug_info("msn", "slplink_new: slplink(%p)\n", slplink); +#endif + + slplink->session = session; + slplink->slp_seq_id = rand() % 0xFFFFFF00 + 4; + + slplink->local_user = g_strdup(msn_user_get_passport(session->user)); + slplink->remote_user = g_strdup(username); + + slplink->slp_msg_queue = g_queue_new(); + + session->slplinks = + g_list_append(session->slplinks, slplink); + + return slplink; +} + +void +msn_slplink_destroy(MsnSlpLink *slplink) +{ + MsnSession *session; + +#ifdef MSN_DEBUG_SLPLINK + purple_debug_info("msn", "slplink_destroy: slplink(%p)\n", slplink); +#endif + + g_return_if_fail(slplink != NULL); + + if (slplink->swboard != NULL) + slplink->swboard->slplinks = g_list_remove(slplink->swboard->slplinks, slplink); + + session = slplink->session; + + if (slplink->local_user != NULL) + g_free(slplink->local_user); + + if (slplink->remote_user != NULL) + g_free(slplink->remote_user); + + if (slplink->directconn != NULL) + msn_directconn_destroy(slplink->directconn); + + while (slplink->slp_calls != NULL) + msn_slp_call_destroy(slplink->slp_calls->data); + + session->slplinks = + g_list_remove(session->slplinks, slplink); + + g_free(slplink); +} + +MsnSlpLink * +msn_session_find_slplink(MsnSession *session, const char *who) +{ + GList *l; + + for (l = session->slplinks; l != NULL; l = l->next) + { + MsnSlpLink *slplink; + + slplink = l->data; + + if (!strcmp(slplink->remote_user, who)) + return slplink; + } + + return NULL; +} + +MsnSlpLink * +msn_session_get_slplink(MsnSession *session, const char *username) +{ + MsnSlpLink *slplink; + + g_return_val_if_fail(session != NULL, NULL); + g_return_val_if_fail(username != NULL, NULL); + + slplink = msn_session_find_slplink(session, username); + + if (slplink == NULL) + slplink = msn_slplink_new(session, username); + + return slplink; +} + +MsnSlpSession * +msn_slplink_find_slp_session(MsnSlpLink *slplink, long session_id) +{ + GList *l; + MsnSlpSession *slpsession; + + for (l = slplink->slp_sessions; l != NULL; l = l->next) + { + slpsession = l->data; + + if (slpsession->id == session_id) + return slpsession; + } + + return NULL; +} + +void +msn_slplink_add_slpcall(MsnSlpLink *slplink, MsnSlpCall *slpcall) +{ + if (slplink->swboard != NULL) + slplink->swboard->flag |= MSN_SB_FLAG_FT; + + slplink->slp_calls = g_list_append(slplink->slp_calls, slpcall); +} + +void +msn_slplink_remove_slpcall(MsnSlpLink *slplink, MsnSlpCall *slpcall) +{ + slplink->slp_calls = g_list_remove(slplink->slp_calls, slpcall); + + /* The slplink has no slpcalls in it. If no one is using it, we might + * destroy the switchboard, but we should be careful not to use the slplink + * again. */ + if (slplink->slp_calls == NULL) + { + if (slplink->swboard != NULL) + { + if (msn_switchboard_release(slplink->swboard, MSN_SB_FLAG_FT)) + /* I'm not sure this is the best thing to do, but it's better + * than nothing. */ + slpcall->slplink = NULL; + } + } +} + +MsnSlpCall * +msn_slplink_find_slp_call(MsnSlpLink *slplink, const char *id) +{ + GList *l; + MsnSlpCall *slpcall; + + if (!id) + return NULL; + + for (l = slplink->slp_calls; l != NULL; l = l->next) + { + slpcall = l->data; + + if (slpcall->id && !strcmp(slpcall->id, id)) + return slpcall; + } + + return NULL; +} + +MsnSlpCall * +msn_slplink_find_slp_call_with_session_id(MsnSlpLink *slplink, long id) +{ + GList *l; + MsnSlpCall *slpcall; + + for (l = slplink->slp_calls; l != NULL; l = l->next) + { + slpcall = l->data; + + if (slpcall->session_id == id) + return slpcall; + } + + return NULL; +} + +void +msn_slplink_send_msg(MsnSlpLink *slplink, MsnMessage *msg) +{ + if (slplink->directconn != NULL) + { + msn_directconn_send_msg(slplink->directconn, msg); + } + else + { + if (slplink->swboard == NULL) + { + slplink->swboard = msn_session_get_swboard(slplink->session, + slplink->remote_user, MSN_SB_FLAG_FT); + + if (slplink->swboard == NULL) + return; + + /* If swboard is destroyed we will be too */ + slplink->swboard->slplinks = g_list_prepend(slplink->swboard->slplinks, slplink); + } + + msn_switchboard_send_msg(slplink->swboard, msg, TRUE); + } +} + +/* We have received the message ack */ +static void +msg_ack(MsnMessage *msg, void *data) +{ + MsnSlpMessage *slpmsg; + long long real_size; + + slpmsg = data; + + real_size = (slpmsg->flags == 0x2) ? 0 : slpmsg->size; + + slpmsg->offset += msg->msnslp_header.length; + + if (slpmsg->offset < real_size) + { + msn_slplink_send_msgpart(slpmsg->slplink, slpmsg); + } + else + { + /* The whole message has been sent */ + if (slpmsg->flags == 0x20 || slpmsg->flags == 0x1000030) + { + if (slpmsg->slpcall != NULL) + { + if (slpmsg->slpcall->cb) + slpmsg->slpcall->cb(slpmsg->slpcall, + NULL, 0); + } + } + } + + slpmsg->msgs = g_list_remove(slpmsg->msgs, msg); +} + +/* We have received the message nak. */ +static void +msg_nak(MsnMessage *msg, void *data) +{ + MsnSlpMessage *slpmsg; + + slpmsg = data; + + msn_slplink_send_msgpart(slpmsg->slplink, slpmsg); + + slpmsg->msgs = g_list_remove(slpmsg->msgs, msg); +} + +void +msn_slplink_send_msgpart(MsnSlpLink *slplink, MsnSlpMessage *slpmsg) +{ + MsnMessage *msg; + long long real_size; + size_t len = 0; + + /* Maybe we will want to create a new msg for this slpmsg instead of + * reusing the same one all the time. */ + msg = slpmsg->msg; + + real_size = (slpmsg->flags == 0x2) ? 0 : slpmsg->size; + + if (slpmsg->offset < real_size) + { + if (slpmsg->fp) + { + char data[1202]; + len = fread(data, 1, sizeof(data), slpmsg->fp); + msn_message_set_bin_data(msg, data, len); + } + else + { + len = slpmsg->size - slpmsg->offset; + + if (len > 1202) + len = 1202; + + msn_message_set_bin_data(msg, slpmsg->buffer + slpmsg->offset, len); + } + + msg->msnslp_header.offset = slpmsg->offset; + msg->msnslp_header.length = len; + } + +#ifdef MSN_DEBUG_SLP + msn_message_show_readable(msg, slpmsg->info, slpmsg->text_body); +#endif + +#ifdef MSN_DEBUG_SLP_FILES + debug_msg_to_file(msg, TRUE); +#endif + + slpmsg->msgs = + g_list_append(slpmsg->msgs, msg); + msn_slplink_send_msg(slplink, msg); + + if ((slpmsg->flags == 0x20 || slpmsg->flags == 0x1000030) && + (slpmsg->slpcall != NULL)) + { + slpmsg->slpcall->progress = TRUE; + + if (slpmsg->slpcall->progress_cb != NULL) + { + slpmsg->slpcall->progress_cb(slpmsg->slpcall, slpmsg->size, + len, slpmsg->offset); + } + } + + /* slpmsg->offset += len; */ +} + +void +msn_slplink_release_slpmsg(MsnSlpLink *slplink, MsnSlpMessage *slpmsg) +{ + MsnMessage *msg; + + slpmsg->msg = msg = msn_message_new_msnslp(); + + if (slpmsg->flags == 0x0) + { + msg->msnslp_header.session_id = slpmsg->session_id; + msg->msnslp_header.ack_id = rand() % 0xFFFFFF00; + } + else if (slpmsg->flags == 0x2) + { + msg->msnslp_header.session_id = slpmsg->session_id; + msg->msnslp_header.ack_id = slpmsg->ack_id; + msg->msnslp_header.ack_size = slpmsg->ack_size; + msg->msnslp_header.ack_sub_id = slpmsg->ack_sub_id; + } + else if (slpmsg->flags == 0x20 || slpmsg->flags == 0x1000030) + { + MsnSlpSession *slpsession; + slpsession = slpmsg->slpsession; + + g_return_if_fail(slpsession != NULL); + msg->msnslp_header.session_id = slpsession->id; + msg->msnslp_footer.value = slpsession->app_id; + msg->msnslp_header.ack_id = rand() % 0xFFFFFF00; + } + else if (slpmsg->flags == 0x100) + { + msg->msnslp_header.ack_id = slpmsg->ack_id; + msg->msnslp_header.ack_sub_id = slpmsg->ack_sub_id; + msg->msnslp_header.ack_size = slpmsg->ack_size; + } + + msg->msnslp_header.id = slpmsg->id; + msg->msnslp_header.flags = slpmsg->flags; + + msg->msnslp_header.total_size = slpmsg->size; + + msn_message_set_attr(msg, "P2P-Dest", slplink->remote_user); + + msg->ack_cb = msg_ack; + msg->nak_cb = msg_nak; + msg->ack_data = slpmsg; + + msn_slplink_send_msgpart(slplink, slpmsg); + + msn_message_destroy(msg); +} + +void +msn_slplink_queue_slpmsg(MsnSlpLink *slplink, MsnSlpMessage *slpmsg) +{ + slpmsg->id = slplink->slp_seq_id++; + + g_queue_push_head(slplink->slp_msg_queue, slpmsg); +} + +void +msn_slplink_send_slpmsg(MsnSlpLink *slplink, MsnSlpMessage *slpmsg) +{ + slpmsg->id = slplink->slp_seq_id++; + + msn_slplink_release_slpmsg(slplink, slpmsg); +} + +void +msn_slplink_unleash(MsnSlpLink *slplink) +{ + MsnSlpMessage *slpmsg; + + /* Send the queued msgs in the order they came. */ + + while ((slpmsg = g_queue_pop_tail(slplink->slp_msg_queue)) != NULL) + { + msn_slplink_release_slpmsg(slplink, slpmsg); + } +} + +void +msn_slplink_send_ack(MsnSlpLink *slplink, MsnMessage *msg) +{ + MsnSlpMessage *slpmsg; + + slpmsg = msn_slpmsg_new(slplink); + + slpmsg->session_id = msg->msnslp_header.session_id; + slpmsg->size = msg->msnslp_header.total_size; + slpmsg->flags = 0x02; + slpmsg->ack_id = msg->msnslp_header.id; + slpmsg->ack_sub_id = msg->msnslp_header.ack_id; + slpmsg->ack_size = msg->msnslp_header.total_size; + +#ifdef MSN_DEBUG_SLP + slpmsg->info = "SLP ACK"; +#endif + + msn_slplink_send_slpmsg(slplink, slpmsg); +} + +static void +send_file_cb(MsnSlpSession *slpsession) +{ + MsnSlpCall *slpcall; + MsnSlpMessage *slpmsg; + struct stat st; + PurpleXfer *xfer; + + slpcall = slpsession->slpcall; + slpmsg = msn_slpmsg_new(slpcall->slplink); + slpmsg->slpcall = slpcall; + slpmsg->flags = 0x1000030; + slpmsg->slpsession = slpsession; +#ifdef MSN_DEBUG_SLP + slpmsg->info = "SLP FILE"; +#endif + xfer = (PurpleXfer *)slpcall->xfer; + purple_xfer_start(slpcall->xfer, 0, NULL, 0); + slpmsg->fp = xfer->dest_fp; + if (g_stat(purple_xfer_get_local_filename(xfer), &st) == 0) + slpmsg->size = st.st_size; + xfer->dest_fp = NULL; /* Disable double fclose() */ + + msn_slplink_send_slpmsg(slpcall->slplink, slpmsg); +} + +void +msn_slplink_process_msg(MsnSlpLink *slplink, MsnMessage *msg) +{ + MsnSlpMessage *slpmsg; + const char *data; + gsize offset; + gsize len; + +#ifdef MSN_DEBUG_SLP + msn_slpmsg_show(msg); +#endif + +#ifdef MSN_DEBUG_SLP_FILES + debug_msg_to_file(msg, FALSE); +#endif + + if (msg->msnslp_header.total_size < msg->msnslp_header.length) + { + purple_debug_error("msn", "This can't be good\n"); + g_return_if_reached(); + } + + slpmsg = NULL; + data = msn_message_get_bin_data(msg, &len); + + /* + OVERHEAD! + if (msg->msnslp_header.length < msg->msnslp_header.total_size) + */ + + offset = msg->msnslp_header.offset; + + if (offset == 0) + { + slpmsg = msn_slpmsg_new(slplink); + slpmsg->id = msg->msnslp_header.id; + slpmsg->session_id = msg->msnslp_header.session_id; + slpmsg->size = msg->msnslp_header.total_size; + slpmsg->flags = msg->msnslp_header.flags; + + if (slpmsg->session_id) + { + if (slpmsg->slpcall == NULL) + slpmsg->slpcall = msn_slplink_find_slp_call_with_session_id(slplink, slpmsg->session_id); + + if (slpmsg->slpcall != NULL) + { + if (slpmsg->flags == 0x20 || slpmsg->flags == 0x1000030) + { + PurpleXfer *xfer; + + xfer = slpmsg->slpcall->xfer; + + if (xfer != NULL) + { + purple_xfer_start(slpmsg->slpcall->xfer, + 0, NULL, 0); + slpmsg->fp = ((PurpleXfer *)slpmsg->slpcall->xfer)->dest_fp; + xfer->dest_fp = NULL; /* Disable double fclose() */ + } + } + } + } + if (!slpmsg->fp && slpmsg->size) + { + slpmsg->buffer = g_try_malloc(slpmsg->size); + if (slpmsg->buffer == NULL) + { + purple_debug_error("msn", "Failed to allocate buffer for slpmsg\n"); + return; + } + } + } + else + { + slpmsg = msn_slplink_message_find(slplink, msg->msnslp_header.session_id, msg->msnslp_header.id); + } + + if (slpmsg == NULL) + { + /* Probably the transfer was canceled */ + purple_debug_error("msn", "Couldn't find slpmsg\n"); + return; + } + + if (slpmsg->fp) + { + /* fseek(slpmsg->fp, offset, SEEK_SET); */ + len = fwrite(data, 1, len, slpmsg->fp); + } + else if (slpmsg->size) + { + if ((offset + len) > slpmsg->size) + { + purple_debug_error("msn", "Oversized slpmsg\n"); + g_return_if_reached(); + } + else + memcpy(slpmsg->buffer + offset, data, len); + } + + if ((slpmsg->flags == 0x20 || slpmsg->flags == 0x1000030) && + (slpmsg->slpcall != NULL)) + { + slpmsg->slpcall->progress = TRUE; + + if (slpmsg->slpcall->progress_cb != NULL) + { + slpmsg->slpcall->progress_cb(slpmsg->slpcall, slpmsg->size, + len, offset); + } + } + +#if 0 + if (slpmsg->buffer == NULL) + return; +#endif + + if (msg->msnslp_header.offset + msg->msnslp_header.length + >= msg->msnslp_header.total_size) + { + /* All the pieces of the slpmsg have been received */ + MsnSlpCall *slpcall; + + slpcall = msn_slp_process_msg(slplink, slpmsg); + + if (slpmsg->flags == 0x100) + { + MsnDirectConn *directconn; + + directconn = slplink->directconn; + + if (!directconn->acked) + msn_directconn_send_handshake(directconn); + } + else if (slpmsg->flags == 0x0 || slpmsg->flags == 0x20 || + slpmsg->flags == 0x1000030) + { + /* Release all the messages and send the ACK */ + + msn_slplink_send_ack(slplink, msg); + msn_slplink_unleash(slplink); + } + + msn_slpmsg_destroy(slpmsg); + + if (slpcall != NULL && slpcall->wasted) + msn_slp_call_destroy(slpcall); + } +} + +MsnSlpMessage * +msn_slplink_message_find(MsnSlpLink *slplink, long session_id, long id) +{ + GList *e; + + for (e = slplink->slp_msgs; e != NULL; e = e->next) + { + MsnSlpMessage *slpmsg = e->data; + + if ((slpmsg->session_id == session_id) && (slpmsg->id == id)) + return slpmsg; + } + + return NULL; +} + +typedef struct +{ + guint32 length; + guint32 unk1; + guint32 file_size; + guint32 unk2; + guint32 unk3; +} MsnContextHeader; + +#define MAX_FILE_NAME_LEN 0x226 + +static gchar * +gen_context(const char *file_name, const char *file_path) +{ + struct stat st; + gsize size = 0; + MsnContextHeader header; + gchar *u8 = NULL; + guchar *base; + guchar *n; + gchar *ret; + gunichar2 *uni = NULL; + glong currentChar = 0; + glong uni_len = 0; + gsize len; + + if (g_stat(file_path, &st) == 0) + size = st.st_size; + + if(!file_name) { + u8 = purple_utf8_try_convert(g_basename(file_path)); + file_name = u8; + } + + uni = g_utf8_to_utf16(file_name, -1, NULL, &uni_len, NULL); + + if(u8) { + g_free(u8); + file_name = NULL; + u8 = NULL; + } + + len = sizeof(MsnContextHeader) + MAX_FILE_NAME_LEN + 4; + + header.length = GUINT32_TO_LE(len); + header.unk1 = GUINT32_TO_LE(2); + header.file_size = GUINT32_TO_LE(size); + header.unk2 = GUINT32_TO_LE(0); + header.unk3 = GUINT32_TO_LE(0); + + base = g_malloc(len + 1); + n = base; + + memcpy(n, &header, sizeof(MsnContextHeader)); + n += sizeof(MsnContextHeader); + + memset(n, 0x00, MAX_FILE_NAME_LEN); + for(currentChar = 0; currentChar < uni_len; currentChar++) { + *((gunichar2 *)n + currentChar) = GUINT16_TO_LE(uni[currentChar]); + } + n += MAX_FILE_NAME_LEN; + + memset(n, 0xFF, 4); + n += 4; + + g_free(uni); + ret = purple_base64_encode(base, len); + g_free(base); + return ret; +} + +void +msn_slplink_request_ft(MsnSlpLink *slplink, PurpleXfer *xfer) +{ + MsnSlpCall *slpcall; + char *context; + const char *fn; + const char *fp; + + fn = purple_xfer_get_filename(xfer); + fp = purple_xfer_get_local_filename(xfer); + + g_return_if_fail(slplink != NULL); + g_return_if_fail(fp != NULL); + + slpcall = msn_slp_call_new(slplink); + msn_slp_call_init(slpcall, MSN_SLPCALL_DC); + + slpcall->session_init_cb = send_file_cb; + slpcall->end_cb = msn_xfer_end_cb; + slpcall->progress_cb = msn_xfer_progress_cb; + slpcall->cb = msn_xfer_completed_cb; + slpcall->xfer = xfer; + purple_xfer_ref(slpcall->xfer); + + slpcall->pending = TRUE; + + purple_xfer_set_cancel_send_fnc(xfer, msn_xfer_cancel); + + xfer->data = slpcall; + + context = gen_context(fn, fp); + + msn_slp_call_invite(slpcall, "5D3E02AB-6190-11D3-BBBB-00C04F795683", 2, + context); + + g_free(context); +} + +void +msn_slplink_request_object(MsnSlpLink *slplink, + const char *info, + MsnSlpCb cb, + MsnSlpEndCb end_cb, + const MsnObject *obj) +{ + MsnSlpCall *slpcall; + char *msnobj_data; + char *msnobj_base64; + + g_return_if_fail(slplink != NULL); + g_return_if_fail(obj != NULL); + + msnobj_data = msn_object_to_string(obj); + msnobj_base64 = purple_base64_encode((const guchar *)msnobj_data, strlen(msnobj_data)); + g_free(msnobj_data); + + slpcall = msn_slp_call_new(slplink); + msn_slp_call_init(slpcall, MSN_SLPCALL_ANY); + + slpcall->data_info = g_strdup(info); + slpcall->cb = cb; + slpcall->end_cb = end_cb; + + msn_slp_call_invite(slpcall, "A4268EEC-FEC5-49E5-95C3-F126696BDBF6", 1, + msnobj_base64); + + g_free(msnobj_base64); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libpurple/protocols/msnp9/slplink.h Mon Nov 12 16:53:54 2007 +0000 @@ -0,0 +1,97 @@ +/** + * @file slplink.h MSNSLP Link support + * + * purple + * + * Purple is the legal property of its developers, whose names are too numerous + * to list here. Please refer to the COPYRIGHT file distributed with this + * source distribution. + * + * 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 02111-1301 USA + */ +#ifndef _MSN_SLPLINK_H_ +#define _MSN_SLPLINK_H_ + +typedef struct _MsnSlpLink MsnSlpLink; + +#include "directconn.h" +#include "slpcall.h" +#include "slpmsg.h" + +#include "switchboard.h" + +#include "ft.h" + +#include "session.h" + +typedef void (*MsnSlpCb)(MsnSlpCall *slpcall, + const guchar *data, gsize size); +typedef void (*MsnSlpEndCb)(MsnSlpCall *slpcall, MsnSession *session); + +struct _MsnSlpLink +{ + MsnSession *session; + MsnSwitchBoard *swboard; + + char *local_user; + char *remote_user; + + int slp_seq_id; + + MsnDirectConn *directconn; + + GList *slp_calls; + GList *slp_sessions; + GList *slp_msgs; + + GQueue *slp_msg_queue; +}; + +MsnSlpLink *msn_slplink_new(MsnSession *session, const char *username); +void msn_slplink_destroy(MsnSlpLink *slplink); +MsnSlpLink *msn_session_find_slplink(MsnSession *session, + const char *who); +MsnSlpLink *msn_session_get_slplink(MsnSession *session, const char *username); +MsnSlpSession *msn_slplink_find_slp_session(MsnSlpLink *slplink, + long session_id); +void msn_slplink_add_slpcall(MsnSlpLink *slplink, MsnSlpCall *slpcall); +void msn_slplink_remove_slpcall(MsnSlpLink *slplink, MsnSlpCall *slpcall); +MsnSlpCall *msn_slplink_find_slp_call(MsnSlpLink *slplink, + const char *id); +MsnSlpCall *msn_slplink_find_slp_call_with_session_id(MsnSlpLink *slplink, long id); +void msn_slplink_send_msg(MsnSlpLink *slplink, MsnMessage *msg); +void msn_slplink_release_slpmsg(MsnSlpLink *slplink, + MsnSlpMessage *slpmsg); +void msn_slplink_queue_slpmsg(MsnSlpLink *slplink, MsnSlpMessage *slpmsg); +void msn_slplink_send_slpmsg(MsnSlpLink *slplink, + MsnSlpMessage *slpmsg); +void msn_slplink_unleash(MsnSlpLink *slplink); +void msn_slplink_send_ack(MsnSlpLink *slplink, MsnMessage *msg); +void msn_slplink_process_msg(MsnSlpLink *slplink, MsnMessage *msg); +MsnSlpMessage *msn_slplink_message_find(MsnSlpLink *slplink, long session_id, long id); +void msn_slplink_append_slp_msg(MsnSlpLink *slplink, MsnSlpMessage *slpmsg); +void msn_slplink_remove_slp_msg(MsnSlpLink *slplink, + MsnSlpMessage *slpmsg); +void msn_slplink_request_ft(MsnSlpLink *slplink, PurpleXfer *xfer); + +void msn_slplink_request_object(MsnSlpLink *slplink, + const char *info, + MsnSlpCb cb, + MsnSlpEndCb end_cb, + const MsnObject *obj); + +MsnSlpCall *msn_slp_process_msg(MsnSlpLink *slplink, MsnSlpMessage *slpmsg); + +#endif /* _MSN_SLPLINK_H_ */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libpurple/protocols/msnp9/slpmsg.c Mon Nov 12 16:53:54 2007 +0000 @@ -0,0 +1,239 @@ +/** + * @file slpmsg.h SLP Message functions + * + * purple + * + * Purple is the legal property of its developers, whose names are too numerous + * to list here. Please refer to the COPYRIGHT file distributed with this + * source distribution. + * + * 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 02111-1301 USA + */ +#include "msn.h" +#include "slpmsg.h" +#include "slplink.h" + +/************************************************************************** + * SLP Message + **************************************************************************/ + +MsnSlpMessage * +msn_slpmsg_new(MsnSlpLink *slplink) +{ + MsnSlpMessage *slpmsg; + + slpmsg = g_new0(MsnSlpMessage, 1); + +#ifdef MSN_DEBUG_SLPMSG + purple_debug_info("msn", "slpmsg new (%p)\n", slpmsg); +#endif + + slpmsg->slplink = slplink; + + slplink->slp_msgs = + g_list_append(slplink->slp_msgs, slpmsg); + + return slpmsg; +} + +void +msn_slpmsg_destroy(MsnSlpMessage *slpmsg) +{ + MsnSlpLink *slplink; + GList *cur; + + g_return_if_fail(slpmsg != NULL); + +#ifdef MSN_DEBUG_SLPMSG + purple_debug_info("msn", "slpmsg destroy (%p)\n", slpmsg); +#endif + + slplink = slpmsg->slplink; + + if (slpmsg->fp != NULL) + fclose(slpmsg->fp); + + purple_imgstore_unref(slpmsg->img); + + /* We don't want to free the data of the PurpleStoredImage, + * but to avoid code duplication, it's sharing buffer. */ + if (slpmsg->img == NULL) + g_free(slpmsg->buffer); + +#ifdef MSN_DEBUG_SLP + /* + if (slpmsg->info != NULL) + g_free(slpmsg->info); + */ +#endif + + for (cur = slpmsg->msgs; cur != NULL; cur = cur->next) + { + /* Something is pointing to this slpmsg, so we should remove that + * pointer to prevent a crash. */ + /* Ex: a user goes offline and after that we receive an ACK */ + + MsnMessage *msg = cur->data; + +#ifdef MSN_DEBUG_SLPMSG + purple_debug_info("msn", "Unlink slpmsg callbacks.\n"); +#endif + + msg->ack_cb = NULL; + msg->nak_cb = NULL; + msg->ack_data = NULL; + } + + slplink->slp_msgs = g_list_remove(slplink->slp_msgs, slpmsg); + + g_free(slpmsg); +} + +void +msn_slpmsg_set_body(MsnSlpMessage *slpmsg, const char *body, + long long size) +{ + /* We can only have one data source at a time. */ + g_return_if_fail(slpmsg->buffer == NULL); + g_return_if_fail(slpmsg->img == NULL); + g_return_if_fail(slpmsg->fp == NULL); + + if (body != NULL) + slpmsg->buffer = g_memdup(body, size); + else + slpmsg->buffer = g_new0(guchar, size); + + slpmsg->size = size; +} + +void +msn_slpmsg_set_image(MsnSlpMessage *slpmsg, PurpleStoredImage *img) +{ + /* We can only have one data source at a time. */ + g_return_if_fail(slpmsg->buffer == NULL); + g_return_if_fail(slpmsg->img == NULL); + g_return_if_fail(slpmsg->fp == NULL); + + slpmsg->img = purple_imgstore_ref(img); + slpmsg->buffer = (guchar *)purple_imgstore_get_data(img); + slpmsg->size = purple_imgstore_get_size(img); +} + +void +msn_slpmsg_open_file(MsnSlpMessage *slpmsg, const char *file_name) +{ + struct stat st; + + /* We can only have one data source at a time. */ + g_return_if_fail(slpmsg->buffer == NULL); + g_return_if_fail(slpmsg->img == NULL); + g_return_if_fail(slpmsg->fp == NULL); + + slpmsg->fp = g_fopen(file_name, "rb"); + + if (g_stat(file_name, &st) == 0) + slpmsg->size = st.st_size; +} + +#ifdef MSN_DEBUG_SLP +void +msn_slpmsg_show(MsnMessage *msg) +{ + const char *info; + gboolean text; + guint32 flags; + + text = FALSE; + + flags = GUINT32_TO_LE(msg->msnslp_header.flags); + + switch (flags) + { + case 0x0: + info = "SLP CONTROL"; + text = TRUE; + break; + case 0x2: + info = "SLP ACK"; break; + case 0x20: + case 0x1000030: + info = "SLP DATA"; break; + default: + info = "SLP UNKNOWN"; break; + } + + msn_message_show_readable(msg, info, text); +} +#endif + +MsnSlpMessage * +msn_slpmsg_sip_new(MsnSlpCall *slpcall, int cseq, + const char *header, const char *branch, + const char *content_type, const char *content) +{ + MsnSlpLink *slplink; + MsnSlpMessage *slpmsg; + char *body; + gsize body_len; + gsize content_len; + + g_return_val_if_fail(slpcall != NULL, NULL); + g_return_val_if_fail(header != NULL, NULL); + + slplink = slpcall->slplink; + + /* Let's remember that "content" should end with a 0x00 */ + + content_len = (content != NULL) ? strlen(content) + 1 : 0; + + body = g_strdup_printf( + "%s\r\n" + "To: <msnmsgr:%s>\r\n" + "From: <msnmsgr:%s>\r\n" + "Via: MSNSLP/1.0/TLP ;branch={%s}\r\n" + "CSeq: %d\r\n" + "Call-ID: {%s}\r\n" + "Max-Forwards: 0\r\n" + "Content-Type: %s\r\n" + "Content-Length: %" G_GSIZE_FORMAT "\r\n" + "\r\n", + header, + slplink->remote_user, + slplink->local_user, + branch, + cseq, + slpcall->id, + content_type, + content_len); + + body_len = strlen(body); + + if (content_len > 0) + { + body_len += content_len; + body = g_realloc(body, body_len); + g_strlcat(body, content, body_len); + } + + slpmsg = msn_slpmsg_new(slplink); + msn_slpmsg_set_body(slpmsg, body, body_len); + + slpmsg->sip = TRUE; + slpmsg->slpcall = slpcall; + + g_free(body); + + return slpmsg; +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libpurple/protocols/msnp9/slpmsg.h Mon Nov 12 16:53:54 2007 +0000 @@ -0,0 +1,109 @@ +/** + * @file slpmsg.h SLP Message functions + * + * purple + * + * Purple is the legal property of its developers, whose names are too numerous + * to list here. Please refer to the COPYRIGHT file distributed with this + * source distribution. + * + * 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 02111-1301 USA + */ +#ifndef _MSN_SLPMSG_H_ +#define _MSN_SLPMSG_H_ + +typedef struct _MsnSlpMessage MsnSlpMessage; + +#include "imgstore.h" + +#include "slpsession.h" +#include "slpcall.h" +#include "slplink.h" +#include "session.h" +#include "msg.h" + +#include "slp.h" + +/** + * A SLP Message This contains everything that we will need to send a SLP + * Message even if has to be sent in several parts. + */ +struct _MsnSlpMessage +{ + MsnSlpSession *slpsession; + MsnSlpCall *slpcall; /**< The slpcall to which this slp message belongs (if applicable). */ + MsnSlpLink *slplink; /**< The slplink through which this slp message is being sent. */ + MsnSession *session; + + long session_id; + long id; + long ack_id; + long ack_sub_id; + long long ack_size; + long app_id; + + gboolean sip; /**< A flag that states if this is a SIP slp message. */ + int ref_count; /**< The reference count. */ + long flags; + + FILE *fp; + PurpleStoredImage *img; + guchar *buffer; + long long offset; + long long size; + + GList *msgs; /**< The real messages. */ + +#if 1 + MsnMessage *msg; /**< The temporary real message that will be sent. */ +#endif + +#ifdef MSN_DEBUG_SLP + char *info; + gboolean text_body; +#endif +}; + +/** + * Creates a new slp message + * + * @param slplink The slplink through which this slp message will be sent. + * @return The created slp message. + */ +MsnSlpMessage *msn_slpmsg_new(MsnSlpLink *slplink); + +/** + * Destroys a slp message + * + * @param slpmsg The slp message to destory. + */ +void msn_slpmsg_destroy(MsnSlpMessage *slpmsg); + +void msn_slpmsg_set_body(MsnSlpMessage *slpmsg, const char *body, + long long size); +void msn_slpmsg_set_image(MsnSlpMessage *slpmsg, PurpleStoredImage *img); +void msn_slpmsg_open_file(MsnSlpMessage *slpmsg, + const char *file_name); +MsnSlpMessage * msn_slpmsg_sip_new(MsnSlpCall *slpcall, int cseq, + const char *header, + const char *branch, + const char *content_type, + const char *content); + +#ifdef MSN_DEBUG_SLP +void msn_slpmsg_show(MsnMessage *msg); +#endif + +#endif /* _MSN_SLPMSG_H_ */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libpurple/protocols/msnp9/slpsession.c Mon Nov 12 16:53:54 2007 +0000 @@ -0,0 +1,77 @@ +/** + * @file slpsession.h SLP Session functions + * + * purple + * + * Purple is the legal property of its developers, whose names are too numerous + * to list here. Please refer to the COPYRIGHT file distributed with this + * source distribution. + * + * 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 02111-1301 USA + */ +#include "slpsession.h" + +/************************************************************************** + * SLP Session + **************************************************************************/ + +MsnSlpSession * +msn_slp_session_new(MsnSlpCall *slpcall) +{ + MsnSlpSession *slpsession; + + g_return_val_if_fail(slpcall != NULL, NULL); + + slpsession = g_new0(MsnSlpSession, 1); + + slpsession->slpcall = slpcall; + slpsession->id = slpcall->session_id; + slpsession->call_id = slpcall->id; + slpsession->app_id = slpcall->app_id; + + slpcall->slplink->slp_sessions = + g_list_append(slpcall->slplink->slp_sessions, slpsession); + + return slpsession; +} + +void +msn_slp_session_destroy(MsnSlpSession *slpsession) +{ + g_return_if_fail(slpsession != NULL); + + if (slpsession->call_id != NULL) + g_free(slpsession->call_id); + + slpsession->slpcall->slplink->slp_sessions = + g_list_remove(slpsession->slpcall->slplink->slp_sessions, slpsession); + + g_free(slpsession); +} + +#if 0 +static void +msn_slp_session_send_slpmsg(MsnSlpSession *slpsession, MsnSlpMessage *slpmsg) +{ + slpmsg->slpsession = slpsession; + +#if 0 + slpmsg->session_id = slpsession->id; + slpmsg->app_id = slpsession->app_id; +#endif + + msn_slplink_send_slpmsg(slpsession->slpcall->slplink, slpmsg); +} +#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libpurple/protocols/msnp9/slpsession.h Mon Nov 12 16:53:54 2007 +0000 @@ -0,0 +1,48 @@ +/** + * @file slpsession.h SLP Session functions + * + * purple + * + * Purple is the legal property of its developers, whose names are too numerous + * to list here. Please refer to the COPYRIGHT file distributed with this + * source distribution. + * + * 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 02111-1301 USA + */ +#ifndef _MSN_SLPSESSION_H_ +#define _MSN_SLPSESSION_H_ + +typedef struct _MsnSlpSession MsnSlpSession; + +#include "slpcall.h" +#include "slpsession.h" +#include "slpmsg.h" + +struct _MsnSlpSession +{ + /* MsnSlpLink *slplink; */ + MsnSlpCall *slpcall; + + long id; + + long app_id; + char *call_id; +}; + +MsnSlpSession *msn_slp_session_new(MsnSlpCall *slpcall); +void msn_slp_session_destroy(MsnSlpSession *slpsession); +void msn_slpsession_send_slpmsg(MsnSlpSession *slpsession, + MsnSlpMessage *slpmsg); +#endif /* _MSN_SLPSESSION_H_ */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libpurple/protocols/msnp9/state.c Mon Nov 12 16:53:54 2007 +0000 @@ -0,0 +1,132 @@ +/** + * @file state.c State functions and definitions + * + * purple + * + * Purple is the legal property of its developers, whose names are too numerous + * to list here. Please refer to the COPYRIGHT file distributed with this + * source distribution. + * + * 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 02111-1301 USA + */ +#include "msn.h" +#include "state.h" + +static const char *away_text[] = +{ + N_("Available"), + N_("Available"), + N_("Busy"), + N_("Idle"), + N_("Be Right Back"), + N_("Away From Computer"), + N_("On The Phone"), + N_("Out To Lunch"), + N_("Available"), + N_("Available") +}; + +void +msn_change_status(MsnSession *session) +{ + PurpleAccount *account; + MsnCmdProc *cmdproc; + MsnUser *user; + MsnObject *msnobj; + const char *state_text; + + g_return_if_fail(session != NULL); + g_return_if_fail(session->notification != NULL); + + account = session->account; + cmdproc = session->notification->cmdproc; + user = session->user; + state_text = msn_state_get_text(msn_state_from_account(account)); + + /* If we're not logged in yet, don't send the status to the server, + * it will be sent when login completes + */ + if (!session->logged_in) + return; + + msnobj = msn_user_get_object(user); + + if (msnobj == NULL) + { + msn_cmdproc_send(cmdproc, "CHG", "%s %d", state_text, + MSN_CLIENT_ID); + } + else + { + char *msnobj_str; + + msnobj_str = msn_object_to_string(msnobj); + + msn_cmdproc_send(cmdproc, "CHG", "%s %d %s", state_text, + MSN_CLIENT_ID, purple_url_encode(msnobj_str)); + + g_free(msnobj_str); + } +} + +const char * +msn_away_get_text(MsnAwayType type) +{ + g_return_val_if_fail(type <= MSN_HIDDEN, NULL); + + return _(away_text[type]); +} + +const char * +msn_state_get_text(MsnAwayType state) +{ + static char *status_text[] = + { "NLN", "NLN", "BSY", "IDL", "BRB", "AWY", "PHN", "LUN", "HDN", "HDN" }; + + return status_text[state]; +} + +MsnAwayType +msn_state_from_account(PurpleAccount *account) +{ + MsnAwayType msnstatus; + PurplePresence *presence; + PurpleStatus *status; + const char *status_id; + + presence = purple_account_get_presence(account); + status = purple_presence_get_active_status(presence); + status_id = purple_status_get_id(status); + + if (!strcmp(status_id, "away")) + msnstatus = MSN_AWAY; + else if (!strcmp(status_id, "brb")) + msnstatus = MSN_BRB; + else if (!strcmp(status_id, "busy")) + msnstatus = MSN_BUSY; + else if (!strcmp(status_id, "phone")) + msnstatus = MSN_PHONE; + else if (!strcmp(status_id, "lunch")) + msnstatus = MSN_LUNCH; + else if (!strcmp(status_id, "invisible")) + msnstatus = MSN_HIDDEN; + else + msnstatus = MSN_ONLINE; + + if ((msnstatus == MSN_ONLINE) && purple_presence_is_idle(presence)) + msnstatus = MSN_IDLE; + + return msnstatus; +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libpurple/protocols/msnp9/state.h Mon Nov 12 16:53:54 2007 +0000 @@ -0,0 +1,64 @@ +/** + * @file state.h State functions and definitions + * + * purple + * + * Purple is the legal property of its developers, whose names are too numerous + * to list here. Please refer to the COPYRIGHT file distributed with this + * source distribution. + * + * 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 02111-1301 USA + */ +#ifndef _MSN_STATE_H_ +#define _MSN_STATE_H_ + +/** + * Away types. + */ +typedef enum +{ + MSN_ONLINE = 1, + MSN_BUSY = 2, + MSN_IDLE = 3, + MSN_BRB = 4, + MSN_AWAY = 5, + MSN_PHONE = 6, + MSN_LUNCH = 7, + MSN_OFFLINE = 8, + MSN_HIDDEN = 9 + +} MsnAwayType; + +/** + * Changes the status of the user. + * + * @param session The MSN session. + */ +void msn_change_status(MsnSession *session); + +/** + * Returns the string representation of an away type. + * + * @param type The away type. + * + * @return The string representation of the away type. + */ +const char *msn_away_get_text(MsnAwayType type); + +const char *msn_state_get_text(MsnAwayType state); + +MsnAwayType msn_state_from_account(PurpleAccount *account); + +#endif /* _MSN_STATE_H_ */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libpurple/protocols/msnp9/switchboard.c Mon Nov 12 16:53:54 2007 +0000 @@ -0,0 +1,1294 @@ +/** + * @file switchboard.c MSN switchboard functions + * + * purple + * + * Purple is the legal property of its developers, whose names are too numerous + * to list here. Please refer to the COPYRIGHT file distributed with this + * source distribution. + * + * 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 02111-1301 USA + */ +#include "msn.h" +#include "prefs.h" +#include "switchboard.h" +#include "notification.h" +#include "msn-utils.h" + +#include "error.h" + +static MsnTable *cbs_table; + +static void msg_error_helper(MsnCmdProc *cmdproc, MsnMessage *msg, + MsnMsgErrorType error); + +/************************************************************************** + * Main + **************************************************************************/ + +MsnSwitchBoard * +msn_switchboard_new(MsnSession *session) +{ + MsnSwitchBoard *swboard; + MsnServConn *servconn; + + g_return_val_if_fail(session != NULL, NULL); + + swboard = g_new0(MsnSwitchBoard, 1); + + swboard->session = session; + swboard->servconn = servconn = msn_servconn_new(session, MSN_SERVCONN_SB); + swboard->cmdproc = servconn->cmdproc; + + swboard->msg_queue = g_queue_new(); + swboard->empty = TRUE; + + swboard->cmdproc->data = swboard; + swboard->cmdproc->cbs_table = cbs_table; + + session->switches = g_list_append(session->switches, swboard); + + return swboard; +} + +void +msn_switchboard_destroy(MsnSwitchBoard *swboard) +{ + MsnSession *session; + MsnMessage *msg; + GList *l; + +#ifdef MSN_DEBUG_SB + purple_debug_info("msn", "switchboard_destroy: swboard(%p)\n", swboard); +#endif + + g_return_if_fail(swboard != NULL); + + if (swboard->destroying) + return; + + swboard->destroying = TRUE; + + /* If it linked us is because its looking for trouble */ + while (swboard->slplinks != NULL) + msn_slplink_destroy(swboard->slplinks->data); + + /* Destroy the message queue */ + while ((msg = g_queue_pop_head(swboard->msg_queue)) != NULL) + { + if (swboard->error != MSN_SB_ERROR_NONE) + { + /* The messages could not be sent due to a switchboard error */ + msg_error_helper(swboard->cmdproc, msg, + MSN_MSG_ERROR_SB); + } + msn_message_unref(msg); + } + + g_queue_free(swboard->msg_queue); + + /* msg_error_helper will both remove the msg from ack_list and + unref it, so we don't need to do either here */ + while ((l = swboard->ack_list) != NULL) + msg_error_helper(swboard->cmdproc, l->data, MSN_MSG_ERROR_SB); + + g_free(swboard->im_user); + g_free(swboard->auth_key); + g_free(swboard->session_id); + + for (l = swboard->users; l != NULL; l = l->next) + g_free(l->data); + + session = swboard->session; + session->switches = g_list_remove(session->switches, swboard); + +#if 0 + /* This should never happen or we are in trouble. */ + if (swboard->servconn != NULL) + msn_servconn_destroy(swboard->servconn); +#endif + + swboard->cmdproc->data = NULL; + + msn_servconn_set_disconnect_cb(swboard->servconn, NULL); + + msn_servconn_destroy(swboard->servconn); + + g_free(swboard); +} + +void +msn_switchboard_set_auth_key(MsnSwitchBoard *swboard, const char *key) +{ + g_return_if_fail(swboard != NULL); + g_return_if_fail(key != NULL); + + swboard->auth_key = g_strdup(key); +} + +const char * +msn_switchboard_get_auth_key(MsnSwitchBoard *swboard) +{ + g_return_val_if_fail(swboard != NULL, NULL); + + return swboard->auth_key; +} + +void +msn_switchboard_set_session_id(MsnSwitchBoard *swboard, const char *id) +{ + g_return_if_fail(swboard != NULL); + g_return_if_fail(id != NULL); + + if (swboard->session_id != NULL) + g_free(swboard->session_id); + + swboard->session_id = g_strdup(id); +} + +const char * +msn_switchboard_get_session_id(MsnSwitchBoard *swboard) +{ + g_return_val_if_fail(swboard != NULL, NULL); + + return swboard->session_id; +} + +void +msn_switchboard_set_invited(MsnSwitchBoard *swboard, gboolean invited) +{ + g_return_if_fail(swboard != NULL); + + swboard->invited = invited; +} + +gboolean +msn_switchboard_is_invited(MsnSwitchBoard *swboard) +{ + g_return_val_if_fail(swboard != NULL, FALSE); + + return swboard->invited; +} + +/************************************************************************** + * Utility + **************************************************************************/ + +static void +send_clientcaps(MsnSwitchBoard *swboard) +{ + MsnMessage *msg; + + msg = msn_message_new(MSN_MSG_CAPS); + msn_message_set_content_type(msg, "text/x-clientcaps"); + msn_message_set_flag(msg, 'U'); + msn_message_set_bin_data(msg, MSN_CLIENTINFO, strlen(MSN_CLIENTINFO)); + + msn_switchboard_send_msg(swboard, msg, TRUE); + + msn_message_destroy(msg); +} + +static void +msn_switchboard_add_user(MsnSwitchBoard *swboard, const char *user) +{ + MsnCmdProc *cmdproc; + PurpleAccount *account; + + g_return_if_fail(swboard != NULL); + + cmdproc = swboard->cmdproc; + account = cmdproc->session->account; + + swboard->users = g_list_prepend(swboard->users, g_strdup(user)); + swboard->current_users++; + swboard->empty = FALSE; + +#ifdef MSN_DEBUG_CHAT + purple_debug_info("msn", "user=[%s], total=%d\n", user, + swboard->current_users); +#endif + + if (!(swboard->flag & MSN_SB_FLAG_IM) && (swboard->conv != NULL)) + { + /* This is a helper switchboard. */ + purple_debug_error("msn", "switchboard_add_user: conv != NULL\n"); + return; + } + + if ((swboard->conv != NULL) && + (purple_conversation_get_type(swboard->conv) == PURPLE_CONV_TYPE_CHAT)) + { + purple_conv_chat_add_user(PURPLE_CONV_CHAT(swboard->conv), user, NULL, + PURPLE_CBFLAGS_NONE, TRUE); + } + else if (swboard->current_users > 1 || swboard->total_users > 1) + { + if (swboard->conv == NULL || + purple_conversation_get_type(swboard->conv) != PURPLE_CONV_TYPE_CHAT) + { + GList *l; + +#ifdef MSN_DEBUG_CHAT + purple_debug_info("msn", "[chat] Switching to chat.\n"); +#endif + +#if 0 + /* this is bad - it causes msn_switchboard_close to be called on the + * switchboard we're in the middle of using :( */ + if (swboard->conv != NULL) + purple_conversation_destroy(swboard->conv); +#endif + + swboard->chat_id = cmdproc->session->conv_seq++; + swboard->flag |= MSN_SB_FLAG_IM; + swboard->conv = serv_got_joined_chat(account->gc, + swboard->chat_id, + "MSN Chat"); + + for (l = swboard->users; l != NULL; l = l->next) + { + const char *tmp_user; + + tmp_user = l->data; + +#ifdef MSN_DEBUG_CHAT + purple_debug_info("msn", "[chat] Adding [%s].\n", tmp_user); +#endif + + purple_conv_chat_add_user(PURPLE_CONV_CHAT(swboard->conv), + tmp_user, NULL, PURPLE_CBFLAGS_NONE, TRUE); + } + +#ifdef MSN_DEBUG_CHAT + purple_debug_info("msn", "[chat] We add ourselves.\n"); +#endif + + purple_conv_chat_add_user(PURPLE_CONV_CHAT(swboard->conv), + purple_account_get_username(account), + NULL, PURPLE_CBFLAGS_NONE, TRUE); + + g_free(swboard->im_user); + swboard->im_user = NULL; + } + } + else if (swboard->conv == NULL) + { + swboard->conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM, + user, account); + } + else + { + purple_debug_warning("msn", "switchboard_add_user: This should not happen!\n"); + } +} + +static PurpleConversation * +msn_switchboard_get_conv(MsnSwitchBoard *swboard) +{ + PurpleAccount *account; + + g_return_val_if_fail(swboard != NULL, NULL); + + if (swboard->conv != NULL) + return swboard->conv; + + purple_debug_error("msn", "Switchboard with unassigned conversation\n"); + + account = swboard->session->account; + + return (swboard->conv = purple_conversation_new(PURPLE_CONV_TYPE_IM, + account, swboard->im_user)); +} + +static void +msn_switchboard_report_user(MsnSwitchBoard *swboard, PurpleMessageFlags flags, const char *msg) +{ + PurpleConversation *conv; + + g_return_if_fail(swboard != NULL); + g_return_if_fail(msg != NULL); + + if ((conv = msn_switchboard_get_conv(swboard)) != NULL) + { + purple_conversation_write(conv, NULL, msg, flags, time(NULL)); + } +} + +static void +swboard_error_helper(MsnSwitchBoard *swboard, int reason, const char *passport) +{ + g_return_if_fail(swboard != NULL); + + purple_debug_warning("msg", "Error: Unable to call the user %s for reason %i\n", + passport ? passport : "(null)", reason); + + /* TODO: if current_users > 0, this is probably a chat and an invite failed, + * we should report that in the chat or something */ + if (swboard->current_users == 0) + { + swboard->error = reason; + msn_switchboard_close(swboard); + } +} + +static void +cal_error_helper(MsnTransaction *trans, int reason) +{ + MsnSwitchBoard *swboard; + const char *passport; + char **params; + + params = g_strsplit(trans->params, " ", 0); + + passport = params[0]; + + swboard = trans->data; + + purple_debug_warning("msn", "cal_error_helper: command %s failed for reason %i\n",trans->command,reason); + + swboard_error_helper(swboard, reason, passport); + + g_strfreev(params); +} + +static void +msg_error_helper(MsnCmdProc *cmdproc, MsnMessage *msg, MsnMsgErrorType error) +{ + MsnSwitchBoard *swboard; + + g_return_if_fail(cmdproc != NULL); + g_return_if_fail(msg != NULL); + + if ((error != MSN_MSG_ERROR_SB) && (msg->nak_cb != NULL)) + msg->nak_cb(msg, msg->ack_data); + + swboard = cmdproc->data; + + /* This is not good, and should be fixed somewhere else. */ + g_return_if_fail(swboard != NULL); + + if (msg->type == MSN_MSG_TEXT) + { + const char *format, *str_reason; + char *body_str, *body_enc, *pre, *post; + +#if 0 + if (swboard->conv == NULL) + { + if (msg->ack_ref) + msn_message_unref(msg); + + return; + } +#endif + + if (error == MSN_MSG_ERROR_TIMEOUT) + { + str_reason = _("Message may have not been sent " + "because a timeout occurred:"); + } + else if (error == MSN_MSG_ERROR_SB) + { + switch (swboard->error) + { + case MSN_SB_ERROR_OFFLINE: + str_reason = _("Message could not be sent, " + "not allowed while invisible:"); + break; + case MSN_SB_ERROR_USER_OFFLINE: + str_reason = _("Message could not be sent " + "because the user is offline:"); + break; + case MSN_SB_ERROR_CONNECTION: + str_reason = _("Message could not be sent " + "because a connection error occurred:"); + break; + case MSN_SB_ERROR_TOO_FAST: + str_reason = _("Message could not be sent " + "because we are sending too quickly:"); + break; + case MSN_SB_ERROR_AUTHFAILED: + str_reason = _("Message could not be sent " + "because we were unable to establish a " + "session with the server. This is " + "likely a server problem, try again in " + "a few minutes:"); + break; + default: + str_reason = _("Message could not be sent " + "because an error with " + "the switchboard occurred:"); + break; + } + } + else + { + str_reason = _("Message may have not been sent " + "because an unknown error occurred:"); + } + + body_str = msn_message_to_string(msg); + body_enc = g_markup_escape_text(body_str, -1); + g_free(body_str); + + format = msn_message_get_attr(msg, "X-MMS-IM-Format"); + msn_parse_format(format, &pre, &post); + body_str = g_strdup_printf("%s%s%s", pre ? pre : "", + body_enc ? body_enc : "", post ? post : ""); + g_free(body_enc); + g_free(pre); + g_free(post); + + msn_switchboard_report_user(swboard, PURPLE_MESSAGE_ERROR, + str_reason); + msn_switchboard_report_user(swboard, PURPLE_MESSAGE_RAW, + body_str); + + g_free(body_str); + } + + /* If a timeout occures we will want the msg around just in case we + * receive the ACK after the timeout. */ + if (msg->ack_ref && error != MSN_MSG_ERROR_TIMEOUT) + { + swboard->ack_list = g_list_remove(swboard->ack_list, msg); + msn_message_unref(msg); + } +} + +/************************************************************************** + * Message Stuff + **************************************************************************/ + +/** Called when a message times out. */ +static void +msg_timeout(MsnCmdProc *cmdproc, MsnTransaction *trans) +{ + MsnMessage *msg; + + msg = trans->data; + + msg_error_helper(cmdproc, msg, MSN_MSG_ERROR_TIMEOUT); +} + +/** Called when we receive an error of a message. */ +static void +msg_error(MsnCmdProc *cmdproc, MsnTransaction *trans, int error) +{ + msg_error_helper(cmdproc, trans->data, MSN_MSG_ERROR_UNKNOWN); +} + +#if 0 +/** Called when we receive an ack of a special message. */ +static void +msg_ack(MsnCmdProc *cmdproc, MsnCommand *cmd) +{ + MsnMessage *msg; + + msg = cmd->trans->data; + + if (msg->ack_cb != NULL) + msg->ack_cb(msg->ack_data); + + msn_message_unref(msg); +} + +/** Called when we receive a nak of a special message. */ +static void +msg_nak(MsnCmdProc *cmdproc, MsnCommand *cmd) +{ + MsnMessage *msg; + + msg = cmd->trans->data; + + msn_message_unref(msg); +} +#endif + +static void +release_msg(MsnSwitchBoard *swboard, MsnMessage *msg) +{ + MsnCmdProc *cmdproc; + MsnTransaction *trans; + char *payload; + gsize payload_len; + + g_return_if_fail(swboard != NULL); + g_return_if_fail(msg != NULL); + + cmdproc = swboard->cmdproc; + + payload = msn_message_gen_payload(msg, &payload_len); + +#ifdef MSN_DEBUG_SB + msn_message_show_readable(msg, "SB SEND", FALSE); +#endif + + trans = msn_transaction_new(cmdproc, "MSG", "%c %d", + msn_message_get_flag(msg), payload_len); + + /* Data for callbacks */ + msn_transaction_set_data(trans, msg); + + if (msg->type == MSN_MSG_TEXT) + { + msg->ack_ref = TRUE; + msn_message_ref(msg); + swboard->ack_list = g_list_append(swboard->ack_list, msg); + msn_transaction_set_timeout_cb(trans, msg_timeout); + } + else if (msg->type == MSN_MSG_SLP) + { + msg->ack_ref = TRUE; + msn_message_ref(msg); + swboard->ack_list = g_list_append(swboard->ack_list, msg); + msn_transaction_set_timeout_cb(trans, msg_timeout); +#if 0 + if (msg->ack_cb != NULL) + { + msn_transaction_add_cb(trans, "ACK", msg_ack); + msn_transaction_add_cb(trans, "NAK", msg_nak); + } +#endif + } + + trans->payload = payload; + trans->payload_len = payload_len; + + msg->trans = trans; + + msn_cmdproc_send_trans(cmdproc, trans); +} + +static void +queue_msg(MsnSwitchBoard *swboard, MsnMessage *msg) +{ + g_return_if_fail(swboard != NULL); + g_return_if_fail(msg != NULL); + + purple_debug_info("msn", "Appending message to queue.\n"); + + g_queue_push_tail(swboard->msg_queue, msg); + + msn_message_ref(msg); +} + +static void +process_queue(MsnSwitchBoard *swboard) +{ + MsnMessage *msg; + + g_return_if_fail(swboard != NULL); + + purple_debug_info("msn", "Processing queue\n"); + + while ((msg = g_queue_pop_head(swboard->msg_queue)) != NULL) + { + purple_debug_info("msn", "Sending message\n"); + release_msg(swboard, msg); + msn_message_unref(msg); + } +} + +gboolean +msn_switchboard_can_send(MsnSwitchBoard *swboard) +{ + g_return_val_if_fail(swboard != NULL, FALSE); + + if (swboard->empty || !g_queue_is_empty(swboard->msg_queue)) + return FALSE; + + return TRUE; +} + +void +msn_switchboard_send_msg(MsnSwitchBoard *swboard, MsnMessage *msg, + gboolean queue) +{ + g_return_if_fail(swboard != NULL); + g_return_if_fail(msg != NULL); + + if (msn_switchboard_can_send(swboard)) + release_msg(swboard, msg); + else if (queue) + queue_msg(swboard, msg); +} + +/************************************************************************** + * Switchboard Commands + **************************************************************************/ + +static void +ans_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd) +{ + MsnSwitchBoard *swboard; + + swboard = cmdproc->data; + swboard->ready = TRUE; +} + +static void +bye_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd) +{ + MsnSwitchBoard *swboard; + const char *user; + + swboard = cmdproc->data; + user = cmd->params[0]; + + /* cmdproc->data is set to NULL when the switchboard is destroyed; + * we may get a bye shortly thereafter. */ + g_return_if_fail(swboard != NULL); + + if (!(swboard->flag & MSN_SB_FLAG_IM) && (swboard->conv != NULL)) + purple_debug_error("msn_switchboard", "bye_cmd: helper bug\n"); + + if (swboard->conv == NULL) + { + /* This is a helper switchboard */ + msn_switchboard_destroy(swboard); + } + else if ((swboard->current_users > 1) || + (purple_conversation_get_type(swboard->conv) == PURPLE_CONV_TYPE_CHAT)) + { + /* This is a switchboard used for a chat */ + purple_conv_chat_remove_user(PURPLE_CONV_CHAT(swboard->conv), user, NULL); + swboard->current_users--; + if (swboard->current_users == 0) + msn_switchboard_destroy(swboard); + } + else + { + /* This is a switchboard used for a im session */ + msn_switchboard_destroy(swboard); + } +} + +static void +iro_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd) +{ + PurpleAccount *account; + PurpleConnection *gc; + MsnSwitchBoard *swboard; + + account = cmdproc->session->account; + gc = account->gc; + swboard = cmdproc->data; + + swboard->total_users = atoi(cmd->params[2]); + + msn_switchboard_add_user(swboard, cmd->params[3]); +} + +static void +joi_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd) +{ + MsnSession *session; + PurpleAccount *account; + PurpleConnection *gc; + MsnSwitchBoard *swboard; + const char *passport; + + passport = cmd->params[0]; + + session = cmdproc->session; + account = session->account; + gc = account->gc; + swboard = cmdproc->data; + + msn_switchboard_add_user(swboard, passport); + + process_queue(swboard); + + if (!session->http_method) + send_clientcaps(swboard); + + if (swboard->closed) + msn_switchboard_close(swboard); +} + +static void +msg_cmd_post(MsnCmdProc *cmdproc, MsnCommand *cmd, char *payload, size_t len) +{ + MsnMessage *msg; + + msg = msn_message_new_from_cmd(cmdproc->session, cmd); + + msn_message_parse_payload(msg, payload, len); +#ifdef MSN_DEBUG_SB + msn_message_show_readable(msg, "SB RECV", FALSE); +#endif + + if (msg->remote_user != NULL) + g_free (msg->remote_user); + + msg->remote_user = g_strdup(cmd->params[0]); + msn_cmdproc_process_msg(cmdproc, msg); + + msn_message_destroy(msg); +} + +static void +msg_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd) +{ + cmdproc->servconn->payload_len = atoi(cmd->params[2]); + cmdproc->last_cmd->payload_cb = msg_cmd_post; +} + +static void +nak_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd) +{ + MsnMessage *msg; + + msg = cmd->trans->data; + g_return_if_fail(msg != NULL); + + msg_error_helper(cmdproc, msg, MSN_MSG_ERROR_NAK); +} + +static void +ack_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd) +{ + MsnSwitchBoard *swboard; + MsnMessage *msg; + + msg = cmd->trans->data; + + if (msg->ack_cb != NULL) + msg->ack_cb(msg, msg->ack_data); + + swboard = cmdproc->data; + if (swboard) + swboard->ack_list = g_list_remove(swboard->ack_list, msg); + msn_message_unref(msg); +} + +static void +out_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd) +{ + PurpleConnection *gc; + MsnSwitchBoard *swboard; + + gc = cmdproc->session->account->gc; + swboard = cmdproc->data; + + if (swboard->current_users > 1) + serv_got_chat_left(gc, swboard->chat_id); + + msn_switchboard_disconnect(swboard); +} + +static void +usr_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd) +{ + MsnSwitchBoard *swboard; + + swboard = cmdproc->data; + +#if 0 + GList *l; + + for (l = swboard->users; l != NULL; l = l->next) + { + const char *user; + user = l->data; + + msn_cmdproc_send(cmdproc, "CAL", "%s", user); + } +#endif + + swboard->ready = TRUE; + msn_cmdproc_process_queue(cmdproc); +} + +/************************************************************************** + * Message Handlers + **************************************************************************/ +static void +plain_msg(MsnCmdProc *cmdproc, MsnMessage *msg) +{ + PurpleConnection *gc; + MsnSwitchBoard *swboard; + const char *body; + char *body_str; + char *body_enc; + char *body_final; + size_t body_len; + const char *passport; + const char *value; + + gc = cmdproc->session->account->gc; + swboard = cmdproc->data; + + body = msn_message_get_bin_data(msg, &body_len); + body_str = g_strndup(body, body_len); + body_enc = g_markup_escape_text(body_str, -1); + g_free(body_str); + + passport = msg->remote_user; + + if (!strcmp(passport, "messenger@microsoft.com") && + strstr(body, "immediate security update")) + { + return; + } + +#if 0 + if ((value = msn_message_get_attr(msg, "User-Agent")) != NULL) + { + purple_debug_misc("msn", "User-Agent = '%s'\n", value); + } +#endif + + if ((value = msn_message_get_attr(msg, "X-MMS-IM-Format")) != NULL) + { + char *pre, *post; + + msn_parse_format(value, &pre, &post); + + body_final = g_strdup_printf("%s%s%s", pre ? pre : "", + body_enc ? body_enc : "", post ? post : ""); + + g_free(pre); + g_free(post); + g_free(body_enc); + } + else + { + body_final = body_enc; + } + + swboard->flag |= MSN_SB_FLAG_IM; + + if (swboard->current_users > 1 || + ((swboard->conv != NULL) && + purple_conversation_get_type(swboard->conv) == PURPLE_CONV_TYPE_CHAT)) + { + /* If current_users is always ok as it should then there is no need to + * check if this is a chat. */ + if (swboard->current_users <= 1) + purple_debug_misc("msn", "plain_msg: current_users(%d)\n", + swboard->current_users); + + serv_got_chat_in(gc, swboard->chat_id, passport, 0, body_final, + time(NULL)); + if (swboard->conv == NULL) + { + swboard->conv = purple_find_chat(gc, swboard->chat_id); + swboard->flag |= MSN_SB_FLAG_IM; + } + } + else + { + serv_got_im(gc, passport, body_final, 0, time(NULL)); + if (swboard->conv == NULL) + { + swboard->conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM, + passport, purple_connection_get_account(gc)); + swboard->flag |= MSN_SB_FLAG_IM; + } + } + + g_free(body_final); +} + +static void +control_msg(MsnCmdProc *cmdproc, MsnMessage *msg) +{ + PurpleConnection *gc; + MsnSwitchBoard *swboard; + char *passport; + + gc = cmdproc->session->account->gc; + swboard = cmdproc->data; + passport = msg->remote_user; + + if (swboard->current_users == 1 && + msn_message_get_attr(msg, "TypingUser") != NULL) + { + serv_got_typing(gc, passport, MSN_TYPING_RECV_TIMEOUT, + PURPLE_TYPING); + } +} + +static void +clientcaps_msg(MsnCmdProc *cmdproc, MsnMessage *msg) +{ +#if 0 + MsnSession *session; + MsnSwitchBoard *swboard; + MsnUser *user; + GHashTable *clientcaps; + const char *value; + + char *passport = msg->sender; + + session = cmdproc->session; + swboard = cmdproc->servconn->swboard; + + clientcaps = msn_message_get_hashtable_from_body(msg); +#endif +} + +static void +nudge_msg(MsnCmdProc *cmdproc, MsnMessage *msg) +{ + MsnSwitchBoard *swboard; + PurpleAccount *account; + const char *user; + + swboard = cmdproc->data; + account = cmdproc->session->account; + user = msg->remote_user; + + serv_got_attention(account->gc, user, MSN_NUDGE); +} + +/************************************************************************** + * Connect stuff + **************************************************************************/ +static void +ans_usr_error(MsnCmdProc *cmdproc, MsnTransaction *trans, int error); + +static void +connect_cb(MsnServConn *servconn) +{ + MsnSwitchBoard *swboard; + MsnTransaction *trans; + MsnCmdProc *cmdproc; + PurpleAccount *account; + + cmdproc = servconn->cmdproc; + g_return_if_fail(cmdproc != NULL); + + account = cmdproc->session->account; + swboard = cmdproc->data; + g_return_if_fail(swboard != NULL); + + if (msn_switchboard_is_invited(swboard)) + { + swboard->empty = FALSE; + + trans = msn_transaction_new(cmdproc, "ANS", "%s %s %s", + purple_account_get_username(account), + swboard->auth_key, swboard->session_id); + } + else + { + trans = msn_transaction_new(cmdproc, "USR", "%s %s", + purple_account_get_username(account), + swboard->auth_key); + } + + msn_transaction_set_error_cb(trans, ans_usr_error); + msn_transaction_set_data(trans, swboard); + msn_cmdproc_send_trans(cmdproc, trans); +} + +static void +ans_usr_error(MsnCmdProc *cmdproc, MsnTransaction *trans, int error) +{ + MsnSwitchBoard *swboard; + char **params; + char *passport; + int reason = MSN_SB_ERROR_UNKNOWN; + + if (error == 911) + { + reason = MSN_SB_ERROR_AUTHFAILED; + } + + purple_debug_warning("msn", "ans_usr_error: command %s gave error %i\n", trans->command, error); + + params = g_strsplit(trans->params, " ", 0); + passport = params[0]; + swboard = trans->data; + + swboard_error_helper(swboard, reason, passport); + + g_strfreev(params); +} + +static void +disconnect_cb(MsnServConn *servconn) +{ + MsnSwitchBoard *swboard; + + swboard = servconn->cmdproc->data; + g_return_if_fail(swboard != NULL); + + msn_servconn_set_disconnect_cb(swboard->servconn, NULL); + + msn_switchboard_destroy(swboard); +} + +gboolean +msn_switchboard_connect(MsnSwitchBoard *swboard, const char *host, int port) +{ + g_return_val_if_fail(swboard != NULL, FALSE); + + msn_servconn_set_connect_cb(swboard->servconn, connect_cb); + msn_servconn_set_disconnect_cb(swboard->servconn, disconnect_cb); + + return msn_servconn_connect(swboard->servconn, host, port); +} + +void +msn_switchboard_disconnect(MsnSwitchBoard *swboard) +{ + g_return_if_fail(swboard != NULL); + + msn_servconn_disconnect(swboard->servconn); +} + +/************************************************************************** + * Call stuff + **************************************************************************/ +static void +got_cal(MsnCmdProc *cmdproc, MsnCommand *cmd) +{ +#if 0 + MsnSwitchBoard *swboard; + const char *user; + + swboard = cmdproc->data; + + user = cmd->params[0]; + + msn_switchboard_add_user(swboard, user); +#endif +} + +static void +cal_timeout(MsnCmdProc *cmdproc, MsnTransaction *trans) +{ + purple_debug_warning("msn", "cal_timeout: command %s timed out\n", trans->command); + + cal_error_helper(trans, MSN_SB_ERROR_UNKNOWN); +} + +static void +cal_error(MsnCmdProc *cmdproc, MsnTransaction *trans, int error) +{ + int reason = MSN_SB_ERROR_UNKNOWN; + + if (error == 215) + { + purple_debug_info("msn", "Invited user already in switchboard\n"); + return; + } + else if (error == 217) + { + reason = MSN_SB_ERROR_USER_OFFLINE; + } + + purple_debug_warning("msn", "cal_error: command %s gave error %i\n", trans->command, error); + + cal_error_helper(trans, reason); +} + +void +msn_switchboard_request_add_user(MsnSwitchBoard *swboard, const char *user) +{ + MsnTransaction *trans; + MsnCmdProc *cmdproc; + + g_return_if_fail(swboard != NULL); + + cmdproc = swboard->cmdproc; + + trans = msn_transaction_new(cmdproc, "CAL", "%s", user); + /* this doesn't do anything, but users seem to think that + * 'Unhandled command' is some kind of error, so we don't report it */ + msn_transaction_add_cb(trans, "CAL", got_cal); + + msn_transaction_set_data(trans, swboard); + msn_transaction_set_timeout_cb(trans, cal_timeout); + + if (swboard->ready) + msn_cmdproc_send_trans(cmdproc, trans); + else + msn_cmdproc_queue_trans(cmdproc, trans); +} + +/************************************************************************** + * Create & Transfer stuff + **************************************************************************/ + +static void +got_swboard(MsnCmdProc *cmdproc, MsnCommand *cmd) +{ + MsnSwitchBoard *swboard; + char *host; + int port; + swboard = cmd->trans->data; + + if (g_list_find(cmdproc->session->switches, swboard) == NULL) + /* The conversation window was closed. */ + return; + + msn_switchboard_set_auth_key(swboard, cmd->params[4]); + + msn_parse_socket(cmd->params[2], &host, &port); + + if (!msn_switchboard_connect(swboard, host, port)) + msn_switchboard_destroy(swboard); + + g_free(host); +} + +static void +xfr_error(MsnCmdProc *cmdproc, MsnTransaction *trans, int error) +{ + MsnSwitchBoard *swboard; + int reason = MSN_SB_ERROR_UNKNOWN; + + if (error == 913) + reason = MSN_SB_ERROR_OFFLINE; + else if (error == 800) + reason = MSN_SB_ERROR_TOO_FAST; + + swboard = trans->data; + + purple_debug_info("msn", "xfr_error %i for %s: trans %x, command %s, reason %i\n", + error, (swboard->im_user ? swboard->im_user : "(null)"), trans, + (trans->command ? trans->command : "(null)"), reason); + + swboard_error_helper(swboard, reason, swboard->im_user); +} + +void +msn_switchboard_request(MsnSwitchBoard *swboard) +{ + MsnCmdProc *cmdproc; + MsnTransaction *trans; + + g_return_if_fail(swboard != NULL); + + cmdproc = swboard->session->notification->cmdproc; + + trans = msn_transaction_new(cmdproc, "XFR", "%s", "SB"); + msn_transaction_add_cb(trans, "XFR", got_swboard); + + msn_transaction_set_data(trans, swboard); + msn_transaction_set_error_cb(trans, xfr_error); + + msn_cmdproc_send_trans(cmdproc, trans); +} + +void +msn_switchboard_close(MsnSwitchBoard *swboard) +{ + g_return_if_fail(swboard != NULL); + + if (swboard->error != MSN_SB_ERROR_NONE) + { + msn_switchboard_destroy(swboard); + } + else if (g_queue_is_empty(swboard->msg_queue) || + !swboard->session->connected) + { + MsnCmdProc *cmdproc; + cmdproc = swboard->cmdproc; + msn_cmdproc_send_quick(cmdproc, "OUT", NULL, NULL); + + msn_switchboard_destroy(swboard); + } + else + { + swboard->closed = TRUE; + } +} + +gboolean +msn_switchboard_release(MsnSwitchBoard *swboard, MsnSBFlag flag) +{ + g_return_val_if_fail(swboard != NULL, FALSE); + + swboard->flag &= ~flag; + + if (flag == MSN_SB_FLAG_IM) + /* Forget any conversation that used to be associated with this + * swboard. */ + swboard->conv = NULL; + + if (swboard->flag == 0) + { + msn_switchboard_close(swboard); + return TRUE; + } + + return FALSE; +} + +/************************************************************************** + * Init stuff + **************************************************************************/ + +void +msn_switchboard_init(void) +{ + cbs_table = msn_table_new(); + + msn_table_add_cmd(cbs_table, "ANS", "ANS", ans_cmd); + msn_table_add_cmd(cbs_table, "ANS", "IRO", iro_cmd); + + msn_table_add_cmd(cbs_table, "MSG", "ACK", ack_cmd); + msn_table_add_cmd(cbs_table, "MSG", "NAK", nak_cmd); + + msn_table_add_cmd(cbs_table, "USR", "USR", usr_cmd); + + msn_table_add_cmd(cbs_table, NULL, "MSG", msg_cmd); + msn_table_add_cmd(cbs_table, NULL, "JOI", joi_cmd); + msn_table_add_cmd(cbs_table, NULL, "BYE", bye_cmd); + msn_table_add_cmd(cbs_table, NULL, "OUT", out_cmd); + +#if 0 + /* They might skip the history */ + msn_table_add_cmd(cbs_table, NULL, "ACK", NULL); +#endif + + msn_table_add_error(cbs_table, "MSG", msg_error); + msn_table_add_error(cbs_table, "CAL", cal_error); + + /* Register the message type callbacks. */ + msn_table_add_msg_type(cbs_table, "text/plain", + plain_msg); + msn_table_add_msg_type(cbs_table, "text/x-msmsgscontrol", + control_msg); + msn_table_add_msg_type(cbs_table, "text/x-clientcaps", + clientcaps_msg); + msn_table_add_msg_type(cbs_table, "text/x-clientinfo", + clientcaps_msg); + msn_table_add_msg_type(cbs_table, "application/x-msnmsgrp2p", + msn_p2p_msg); + msn_table_add_msg_type(cbs_table, "text/x-mms-emoticon", + msn_emoticon_msg); + msn_table_add_msg_type(cbs_table, "text/x-mms-animemoticon", + msn_emoticon_msg); + msn_table_add_msg_type(cbs_table, "text/x-msnmsgr-datacast", + nudge_msg); +#if 0 + msn_table_add_msg_type(cbs_table, "text/x-msmmsginvite", + msn_invite_msg); +#endif +} + +void +msn_switchboard_end(void) +{ + msn_table_destroy(cbs_table); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libpurple/protocols/msnp9/switchboard.h Mon Nov 12 16:53:54 2007 +0000 @@ -0,0 +1,277 @@ +/** + * @file switchboard.h MSN switchboard functions + * + * purple + * + * Purple is the legal property of its developers, whose names are too numerous + * to list here. Please refer to the COPYRIGHT file distributed with this + * source distribution. + * + * 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 02111-1301 USA + */ +#ifndef _MSN_SWITCHBOARD_H_ +#define _MSN_SWITCHBOARD_H_ + +typedef struct _MsnSwitchBoard MsnSwitchBoard; + +#include "conversation.h" + +#include "msg.h" +#include "user.h" + +#include "servconn.h" + +#include "slplink.h" + +/** + * A switchboard error. + */ +typedef enum +{ + MSN_SB_ERROR_NONE, /**< No error. */ + MSN_SB_ERROR_CAL, /**< The user could not join (answer the call). */ + MSN_SB_ERROR_OFFLINE, /**< The account is offline. */ + MSN_SB_ERROR_USER_OFFLINE, /**< The user to call is offline. */ + MSN_SB_ERROR_CONNECTION, /**< There was a connection error. */ + MSN_SB_ERROR_TOO_FAST, /**< We are sending too fast */ + MSN_SB_ERROR_AUTHFAILED, /**< Authentication failed joining the switchboard session */ + MSN_SB_ERROR_UNKNOWN /**< An unknown error occurred. */ + +} MsnSBErrorType; + +/** + * A switchboard flag. + */ +typedef enum +{ + MSN_SB_FLAG_IM = 0x01, /**< This switchboard is being used for a conversation. */ + MSN_SB_FLAG_FT = 0x02, /**< This switchboard is being used for file transfer. */ + +} MsnSBFlag; + +/** + * A switchboard. + * + * A place where a bunch of users send messages to the rest of the users. + */ +struct _MsnSwitchBoard +{ + MsnSession *session; + MsnServConn *servconn; + MsnCmdProc *cmdproc; + char *im_user; + + MsnSBFlag flag; + char *auth_key; + char *session_id; + + PurpleConversation *conv; /**< The conversation that displays the + messages of this switchboard, or @c NULL if + this is a helper switchboard. */ + + gboolean empty; /**< A flag that states if the swithcboard has no + users in it. */ + gboolean invited; /**< A flag that states if we were invited to the + switchboard. */ + gboolean ready; /**< A flag that states if this switchboard is + ready to be used. */ + gboolean closed; /**< A flag that states if the switchboard has + been closed by the user. */ + gboolean destroying; /**< A flag that states if the switchboard is + alredy on the process of destruction. */ + + int current_users; + int total_users; + GList *users; + + int chat_id; + + GQueue *msg_queue; /**< Queue of messages to send. */ + GList *ack_list; /**< List of messages waiting for an ack. */ + + MsnSBErrorType error; /**< The error that occurred in this switchboard + (if applicable). */ + GList *slplinks; /**< The list of slplinks that are using this switchboard. */ +}; + +/** + * Initialize the variables for switchboard creation. + */ +void msn_switchboard_init(void); + +/** + * Destroy the variables for switchboard creation. + */ +void msn_switchboard_end(void); + +/** + * Creates a new switchboard. + * + * @param session The MSN session. + * + * @return The new switchboard. + */ +MsnSwitchBoard *msn_switchboard_new(MsnSession *session); + +/** + * Destroys a switchboard. + * + * @param swboard The switchboard to destroy. + */ +void msn_switchboard_destroy(MsnSwitchBoard *swboard); + +/** + * Sets the auth key the switchboard must use when connecting. + * + * @param swboard The switchboard. + * @param key The auth key. + */ +void msn_switchboard_set_auth_key(MsnSwitchBoard *swboard, const char *key); + +/** + * Returns the auth key the switchboard must use when connecting. + * + * @param swboard The switchboard. + * + * @return The auth key. + */ +const char *msn_switchboard_get_auth_key(MsnSwitchBoard *swboard); + +/** + * Sets the session ID the switchboard must use when connecting. + * + * @param swboard The switchboard. + * @param id The session ID. + */ +void msn_switchboard_set_session_id(MsnSwitchBoard *swboard, const char *id); + +/** + * Returns the session ID the switchboard must use when connecting. + * + * @param swboard The switchboard. + * + * @return The session ID. + */ +const char *msn_switchboard_get_session_id(MsnSwitchBoard *swboard); + +/** + * Sets whether or not we were invited to this switchboard. + * + * @param swboard The switchboard. + * @param invite @c TRUE if invited, @c FALSE otherwise. + */ +void msn_switchboard_set_invited(MsnSwitchBoard *swboard, gboolean invited); + +/** + * Returns whether or not we were invited to this switchboard. + * + * @param swboard The switchboard. + * + * @return @c TRUE if invited, @c FALSE otherwise. + */ +gboolean msn_switchboard_is_invited(MsnSwitchBoard *swboard); + +/** + * Connects to a switchboard. + * + * @param swboard The switchboard. + * @param host The switchboard server host. + * @param port The switcbharod server port. + * + * @return @c TRUE if able to connect, or @c FALSE otherwise. + */ +gboolean msn_switchboard_connect(MsnSwitchBoard *swboard, + const char *host, int port); + +/** + * Disconnects from a switchboard. + * + * @param swboard The switchboard to disconnect from. + */ +void msn_switchboard_disconnect(MsnSwitchBoard *swboard); + +/** + * Closes the switchboard. + * + * Called when a conversation is closed. + * + * @param swboard The switchboard to close. + */ +void msn_switchboard_close(MsnSwitchBoard *swboard); + +/** + * Release a switchboard from a certain function. + * + * @param swboard The switchboard to release. + * @param flag The flag that states the function. + * + * @return @c TRUE if the switchboard was closed, @c FALSE otherwise. + */ +gboolean msn_switchboard_release(MsnSwitchBoard *swboard, MsnSBFlag flag); + +/** + * Returns whether or not we currently can send a message through this + * switchboard. + * + * @param swboard The switchboard. + * + * @return @c TRUE if a message can be sent, @c FALSE otherwise. + */ +gboolean msn_switchboard_can_send(MsnSwitchBoard *swboard); + +/** + * Sends a message through this switchboard. + * + * @param swboard The switchboard. + * @param msg The message. + * @param queue A flag that states if we want this message to be queued (in + * the case it cannot currently be sent). + * + * @return @c TRUE if a message can be sent, @c FALSE otherwise. + */ +void msn_switchboard_send_msg(MsnSwitchBoard *swboard, MsnMessage *msg, + gboolean queue); + +gboolean msn_switchboard_chat_leave(MsnSwitchBoard *swboard); +gboolean msn_switchboard_chat_invite(MsnSwitchBoard *swboard, const char *who); + +void msn_switchboard_request(MsnSwitchBoard *swboard); +void msn_switchboard_request_add_user(MsnSwitchBoard *swboard, const char *user); + +/** + * Processes peer to peer messages. + * + * @param cmdproc The command processor. + * @param msg The message. + */ +void msn_p2p_msg(MsnCmdProc *cmdproc, MsnMessage *msg); + +/** + * Processes emoticon messages. + * + * @param cmdproc The command processor. + * @param msg The message. + */ +void msn_emoticon_msg(MsnCmdProc *cmdproc, MsnMessage *msg); + +/** + * Processes INVITE messages. + * + * @param cmdproc The command processor. + * @param msg The message. + */ +void msn_invite_msg(MsnCmdProc *cmdproc, MsnMessage *msg); + +#endif /* _MSN_SWITCHBOARD_H_ */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libpurple/protocols/msnp9/sync.c Mon Nov 12 16:53:54 2007 +0000 @@ -0,0 +1,258 @@ +/** + * @file sync.c MSN list synchronization functions + * + * purple + * + * Purple is the legal property of its developers, whose names are too numerous + * to list here. Please refer to the COPYRIGHT file distributed with this + * source distribution. + * + * 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 02111-1301 USA + */ +#include "msn.h" +#include "sync.h" +#include "state.h" + +static MsnTable *cbs_table; + +static void +blp_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd) +{ + PurpleConnection *gc = cmdproc->session->account->gc; + const char *list_name; + + list_name = cmd->params[0]; + + if (!g_ascii_strcasecmp(list_name, "AL")) + { + /* + * If the current setting is AL, messages from users who + * are not in BL will be delivered. + * + * In other words, deny some. + */ + gc->account->perm_deny = PURPLE_PRIVACY_DENY_USERS; + } + else + { + /* If the current setting is BL, only messages from people + * who are in the AL will be delivered. + * + * In other words, permit some. + */ + gc->account->perm_deny = PURPLE_PRIVACY_ALLOW_USERS; + } +} + +static void +prp_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd) +{ + MsnSession *session = cmdproc->session; + const char *type, *value; + + type = cmd->params[0]; + value = cmd->params[1]; + + if (cmd->param_count == 2) + { + if (!strcmp(type, "PHH")) + msn_user_set_home_phone(session->user, purple_url_decode(value)); + else if (!strcmp(type, "PHW")) + msn_user_set_work_phone(session->user, purple_url_decode(value)); + else if (!strcmp(type, "PHM")) + msn_user_set_mobile_phone(session->user, purple_url_decode(value)); + } + else + { + if (!strcmp(type, "PHH")) + msn_user_set_home_phone(session->user, NULL); + else if (!strcmp(type, "PHW")) + msn_user_set_work_phone(session->user, NULL); + else if (!strcmp(type, "PHM")) + msn_user_set_mobile_phone(session->user, NULL); + } +} + +static void +lsg_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd) +{ + MsnSession *session = cmdproc->session; + const char *name; + int group_id; + + group_id = atoi(cmd->params[0]); + name = purple_url_decode(cmd->params[1]); + + msn_group_new(session->userlist, group_id, name); + + /* HACK */ + if (group_id == 0) + { + /* Group of ungroupped buddies */ + if (session->sync->total_users == 0) + { + cmdproc->cbs_table = session->sync->old_cbs_table; + + msn_session_finish_login(session); + + msn_sync_destroy(session->sync); + session->sync = NULL; + } + return; + } + + if ((purple_find_group(name)) == NULL) + { + PurpleGroup *g = purple_group_new(name); + purple_blist_add_group(g, NULL); + } +} + +static void +lst_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd) +{ + MsnSession *session = cmdproc->session; + char *passport = NULL; + const char *friend = NULL; + int list_op; + MsnUser *user; + + passport = cmd->params[0]; + friend = purple_url_decode(cmd->params[1]); + list_op = atoi(cmd->params[2]); + + user = msn_user_new(session->userlist, passport, friend); + + msn_userlist_add_user(session->userlist, user); + + session->sync->last_user = user; + + /* TODO: This can be improved */ + + if (list_op & MSN_LIST_FL_OP) + { + char **c; + char **tokens; + const char *group_nums; + GSList *group_ids; + + group_nums = cmd->params[3]; + + group_ids = NULL; + + tokens = g_strsplit(group_nums, ",", -1); + + for (c = tokens; *c != NULL; c++) + { + int id; + + id = atoi(*c); + group_ids = g_slist_append(group_ids, GINT_TO_POINTER(id)); + } + + g_strfreev(tokens); + + msn_got_lst_user(session, user, list_op, group_ids); + + g_slist_free(group_ids); + } + else + { + msn_got_lst_user(session, user, list_op, NULL); + } + + session->sync->num_users++; + + if (session->sync->num_users == session->sync->total_users) + { + cmdproc->cbs_table = session->sync->old_cbs_table; + + msn_session_finish_login(session); + + msn_sync_destroy(session->sync); + session->sync = NULL; + } +} + +static void +bpr_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd) +{ + MsnSync *sync = cmdproc->session->sync; + const char *type, *value; + MsnUser *user; + + user = sync->last_user; + + g_return_if_fail(user != NULL); + + type = cmd->params[0]; + value = cmd->params[1]; + + if (value) + { + if (!strcmp(type, "MOB")) + { + if (!strcmp(value, "Y")) + user->mobile = TRUE; + } + else if (!strcmp(type, "PHH")) + msn_user_set_home_phone(user, purple_url_decode(value)); + else if (!strcmp(type, "PHW")) + msn_user_set_work_phone(user, purple_url_decode(value)); + else if (!strcmp(type, "PHM")) + msn_user_set_mobile_phone(user, purple_url_decode(value)); + } +} + +void +msn_sync_init(void) +{ + /* TODO: check prp, blp, bpr */ + + cbs_table = msn_table_new(); + + /* Syncing */ + msn_table_add_cmd(cbs_table, NULL, "GTC", NULL); + msn_table_add_cmd(cbs_table, NULL, "BLP", blp_cmd); + msn_table_add_cmd(cbs_table, NULL, "PRP", prp_cmd); + msn_table_add_cmd(cbs_table, NULL, "LSG", lsg_cmd); + msn_table_add_cmd(cbs_table, NULL, "LST", lst_cmd); + msn_table_add_cmd(cbs_table, NULL, "BPR", bpr_cmd); +} + +void +msn_sync_end(void) +{ + msn_table_destroy(cbs_table); +} + +MsnSync * +msn_sync_new(MsnSession *session) +{ + MsnSync *sync; + + sync = g_new0(MsnSync, 1); + + sync->session = session; + sync->cbs_table = cbs_table; + + return sync; +} + +void +msn_sync_destroy(MsnSync *sync) +{ + g_free(sync); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libpurple/protocols/msnp9/sync.h Mon Nov 12 16:53:54 2007 +0000 @@ -0,0 +1,52 @@ +/** + * @file sync.h MSN list synchronization functions + * + * purple + * + * Purple is the legal property of its developers, whose names are too numerous + * to list here. Please refer to the COPYRIGHT file distributed with this + * source distribution. + * + * 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 02111-1301 USA + */ +#ifndef _MSN_SYNC_H_ +#define _MSN_SYNC_H_ + +typedef struct _MsnSync MsnSync; + +#include "session.h" +#include "table.h" +#include "user.h" + +struct _MsnSync +{ + MsnSession *session; + MsnTable *cbs_table; + MsnTable *old_cbs_table; + + int num_users; + int total_users; + int num_groups; + int total_groups; + MsnUser *last_user; +}; + +void msn_sync_init(void); +void msn_sync_end(void); + +MsnSync * msn_sync_new(MsnSession *session); +void msn_sync_destroy(MsnSync *sync); + +#endif /* _MSN_SYNC_H_ */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libpurple/protocols/msnp9/table.c Mon Nov 12 16:53:54 2007 +0000 @@ -0,0 +1,132 @@ +/** + * @file table.c MSN helper structure + * + * purple + * + * Purple is the legal property of its developers, whose names are too numerous + * to list here. Please refer to the COPYRIGHT file distributed with this + * source distribution. + * + * 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 02111-1301 USA + */ +#include "msn.h" +#include "table.h" + +static void +null_cmd_cb(MsnCmdProc *cmdproc, MsnCommand *cmd) +{ +} + +static void +null_error_cb(MsnCmdProc *cmdproc, MsnTransaction *trans, int error) +{ +} + +MsnTable * +msn_table_new() +{ + MsnTable *table; + + table = g_new0(MsnTable, 1); + + table->cmds = g_hash_table_new_full(g_str_hash, g_str_equal, NULL, (GDestroyNotify)g_hash_table_destroy); + table->msgs = g_hash_table_new_full(g_str_hash, g_str_equal, NULL, NULL); + table->errors = g_hash_table_new_full(g_str_hash, g_str_equal, NULL, NULL); + + table->async = g_hash_table_new_full(g_str_hash, g_str_equal, NULL, NULL); + table->fallback = g_hash_table_new_full(g_str_hash, g_str_equal, NULL, NULL); + + return table; +} + +void +msn_table_destroy(MsnTable *table) +{ + g_return_if_fail(table != NULL); + + g_hash_table_destroy(table->cmds); + g_hash_table_destroy(table->msgs); + g_hash_table_destroy(table->errors); + + g_hash_table_destroy(table->async); + g_hash_table_destroy(table->fallback); + + g_free(table); +} + +void +msn_table_add_cmd(MsnTable *table, + char *command, char *answer, MsnTransCb cb) +{ + GHashTable *cbs; + + g_return_if_fail(table != NULL); + g_return_if_fail(answer != NULL); + + cbs = NULL; + + if (command == NULL) + { + cbs = table->async; + } + else if (strcmp(command, "fallback") == 0) + { + cbs = table->fallback; + } + else + { + cbs = g_hash_table_lookup(table->cmds, command); + + if (cbs == NULL) + { + cbs = g_hash_table_new_full(g_str_hash, g_str_equal, NULL, NULL); + g_hash_table_insert(table->cmds, command, cbs); + } + } + + if (cb == NULL) + cb = null_cmd_cb; + + g_hash_table_insert(cbs, answer, cb); +} + +void +msn_table_add_error(MsnTable *table, + char *answer, MsnErrorCb cb) +{ + g_return_if_fail(table != NULL); + g_return_if_fail(answer != NULL); + + if (cb == NULL) + cb = null_error_cb; + + g_hash_table_insert(table->errors, answer, cb); +} + +void +msn_table_add_msg_type(MsnTable *table, + char *type, MsnMsgTypeCb cb) +{ + g_return_if_fail(table != NULL); + g_return_if_fail(type != NULL); + g_return_if_fail(cb != NULL); + +#if 0 + if (cb == NULL) + cb = null_msg_cb; +#endif + + g_hash_table_insert(table->msgs, type, cb); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libpurple/protocols/msnp9/table.h Mon Nov 12 16:53:54 2007 +0000 @@ -0,0 +1,53 @@ +/** + * @file table.h MSN helper structure + * + * purple + * + * Purple is the legal property of its developers, whose names are too numerous + * to list here. Please refer to the COPYRIGHT file distributed with this + * source distribution. + * + * 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 02111-1301 USA + */ +#ifndef _MSN_TABLE_H_ +#define _MSN_TABLE_H_ + +typedef struct _MsnTable MsnTable; + +#include "cmdproc.h" +#include "transaction.h" +#include "msg.h" + +typedef void (*MsnMsgTypeCb)(MsnCmdProc *cmdproc, MsnMessage *msg); + +struct _MsnTable +{ + GHashTable *cmds; + GHashTable *msgs; + GHashTable *errors; + + GHashTable *async; + GHashTable *fallback; +}; + +MsnTable *msn_table_new(void); +void msn_table_destroy(MsnTable *table); + +void msn_table_add_cmd(MsnTable *table, char *command, char *answer, + MsnTransCb cb); +void msn_table_add_error(MsnTable *table, char *answer, MsnErrorCb cb); +void msn_table_add_msg_type(MsnTable *table, char *type, MsnMsgTypeCb cb); + +#endif /* _MSN_TABLE_H_ */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libpurple/protocols/msnp9/transaction.c Mon Nov 12 16:53:54 2007 +0000 @@ -0,0 +1,221 @@ +/** + * @file transaction.c MSN transaction functions + * + * purple + * + * Purple is the legal property of its developers, whose names are too numerous + * to list here. Please refer to the COPYRIGHT file distributed with this + * source distribution. + * + * 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 02111-1301 USA + */ +#include "msn.h" +#include "transaction.h" + +MsnTransaction * +msn_transaction_new(MsnCmdProc *cmdproc, const char *command, + const char *format, ...) +{ + MsnTransaction *trans; + va_list arg; + + g_return_val_if_fail(command != NULL, NULL); + + trans = g_new0(MsnTransaction, 1); + + trans->cmdproc = cmdproc; + trans->command = g_strdup(command); + + if (format != NULL) + { + va_start(arg, format); + trans->params = g_strdup_vprintf(format, arg); + va_end(arg); + } + + /* trans->queue = g_queue_new(); */ + + return trans; +} + +void +msn_transaction_destroy(MsnTransaction *trans) +{ + g_return_if_fail(trans != NULL); + + g_free(trans->command); + g_free(trans->params); + g_free(trans->payload); + +#if 0 + if (trans->pendent_cmd != NULL) + msn_message_unref(trans->pendent_msg); +#endif + +#if 0 + MsnTransaction *elem; + if (trans->queue != NULL) + { + while ((elem = g_queue_pop_head(trans->queue)) != NULL) + msn_transaction_destroy(elem); + + g_queue_free(trans->queue); + } +#endif + + if (trans->callbacks != NULL && trans->has_custom_callbacks) + g_hash_table_destroy(trans->callbacks); + + if (trans->timer) + purple_timeout_remove(trans->timer); + + g_free(trans); +} + +char * +msn_transaction_to_string(MsnTransaction *trans) +{ + char *str; + + g_return_val_if_fail(trans != NULL, FALSE); + + if (trans->params != NULL) + str = g_strdup_printf("%s %u %s\r\n", trans->command, trans->trId, trans->params); + else + str = g_strdup_printf("%s %u\r\n", trans->command, trans->trId); + + return str; +} + +void +msn_transaction_queue_cmd(MsnTransaction *trans, MsnCommand *cmd) +{ + purple_debug_info("msn", "queueing command.\n"); + trans->pendent_cmd = cmd; + msn_command_ref(cmd); +} + +void +msn_transaction_unqueue_cmd(MsnTransaction *trans, MsnCmdProc *cmdproc) +{ + MsnCommand *cmd; + + if (!cmdproc->servconn->connected) + return; + + purple_debug_info("msn", "unqueueing command.\n"); + cmd = trans->pendent_cmd; + + g_return_if_fail(cmd != NULL); + + msn_cmdproc_process_cmd(cmdproc, cmd); + msn_command_unref(cmd); + + trans->pendent_cmd = NULL; +} + +#if 0 +void +msn_transaction_queue(MsnTransaction *trans, MsnTransaction *elem) +{ + if (trans->queue == NULL) + trans->queue = g_queue_new(); + + g_queue_push_tail(trans->queue, elem); +} + +void +msn_transaction_unqueue(MsnTransaction *trans, MsnCmdProc *cmdproc) +{ + MsnTransaction *elem; + + while ((elem = g_queue_pop_head(trans->queue)) != NULL) + msn_cmdproc_send_trans(cmdproc, elem); +} +#endif + +void +msn_transaction_set_payload(MsnTransaction *trans, + const char *payload, int payload_len) +{ + g_return_if_fail(trans != NULL); + g_return_if_fail(payload != NULL); + + trans->payload = g_strdup(payload); + trans->payload_len = payload_len ? payload_len : strlen(trans->payload); +} + +void +msn_transaction_set_data(MsnTransaction *trans, void *data) +{ + g_return_if_fail(trans != NULL); + + trans->data = data; +} + +void +msn_transaction_add_cb(MsnTransaction *trans, char *answer, + MsnTransCb cb) +{ + g_return_if_fail(trans != NULL); + g_return_if_fail(answer != NULL); + + if (trans->callbacks == NULL) + { + trans->has_custom_callbacks = TRUE; + trans->callbacks = g_hash_table_new_full(g_str_hash, g_str_equal, NULL, + NULL); + } + else if (trans->has_custom_callbacks != TRUE) + g_return_if_reached (); + + g_hash_table_insert(trans->callbacks, answer, cb); +} + +static gboolean +transaction_timeout(gpointer data) +{ + MsnTransaction *trans; + + trans = data; + g_return_val_if_fail(trans != NULL, FALSE); + +#if 0 + purple_debug_info("msn", "timed out: %s %d %s\n", trans->command, trans->trId, trans->params); +#endif + + if (trans->timeout_cb != NULL) + trans->timeout_cb(trans->cmdproc, trans); + + return FALSE; +} + +void +msn_transaction_set_timeout_cb(MsnTransaction *trans, MsnTimeoutCb cb) +{ + if (trans->timer) + { + purple_debug_error("msn", "This shouldn't be happening\n"); + purple_timeout_remove(trans->timer); + } + trans->timeout_cb = cb; + trans->timer = purple_timeout_add(60000, transaction_timeout, trans); +} + +void +msn_transaction_set_error_cb(MsnTransaction *trans, MsnErrorCb cb) +{ + trans->error_cb = cb; +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libpurple/protocols/msnp9/transaction.h Mon Nov 12 16:53:54 2007 +0000 @@ -0,0 +1,80 @@ +/** + * @file transaction.h MSN transaction functions + * + * purple + * + * Purple is the legal property of its developers, whose names are too numerous + * to list here. Please refer to the COPYRIGHT file distributed with this + * source distribution. + * + * 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 02111-1301 USA + */ +#ifndef _MSN_TRANSACTION_H +#define _MSN_TRANSACTION_H + +typedef struct _MsnTransaction MsnTransaction; + +#include "command.h" +#include "cmdproc.h" + +typedef void (*MsnTransCb)(MsnCmdProc *cmdproc, MsnCommand *cmd); +typedef void (*MsnTimeoutCb)(MsnCmdProc *cmdproc, MsnTransaction *trans); +typedef void (*MsnErrorCb)(MsnCmdProc *cmdproc, MsnTransaction *trans, + int error); + +/** + * A transaction. A sending command that will initiate the transaction. + */ +struct _MsnTransaction +{ + MsnCmdProc *cmdproc; + unsigned int trId; + + char *command; + char *params; + + int timer; + + void *data; /**< The data to be used on the different callbacks. */ + GHashTable *callbacks; + gboolean has_custom_callbacks; + MsnErrorCb error_cb; + MsnTimeoutCb timeout_cb; + + char *payload; + size_t payload_len; + + GQueue *queue; + MsnCommand *pendent_cmd; /**< The command that is waiting for the result of + this transaction. */ +}; + +MsnTransaction *msn_transaction_new(MsnCmdProc *cmdproc, + const char *command, + const char *format, ...); +void msn_transaction_destroy(MsnTransaction *trans); + +char *msn_transaction_to_string(MsnTransaction *trans); +void msn_transaction_queue_cmd(MsnTransaction *trans, MsnCommand *cmd); +void msn_transaction_unqueue_cmd(MsnTransaction *trans, MsnCmdProc *cmdproc); +void msn_transaction_set_payload(MsnTransaction *trans, + const char *payload, int payload_len); +void msn_transaction_set_data(MsnTransaction *trans, void *data); +void msn_transaction_add_cb(MsnTransaction *trans, char *answer, + MsnTransCb cb); +void msn_transaction_set_error_cb(MsnTransaction *trans, MsnErrorCb cb); +void msn_transaction_set_timeout_cb(MsnTransaction *trans, MsnTimeoutCb cb); + +#endif /* _MSN_TRANSACTION_H */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libpurple/protocols/msnp9/user.c Mon Nov 12 16:53:54 2007 +0000 @@ -0,0 +1,392 @@ +/** + * @file user.c User functions + * + * purple + * + * Purple is the legal property of its developers, whose names are too numerous + * to list here. Please refer to the COPYRIGHT file distributed with this + * source distribution. + * + * 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 02111-1301 USA + */ +#include "msn.h" +#include "user.h" +#include "slp.h" + +MsnUser * +msn_user_new(MsnUserList *userlist, const char *passport, + const char *store_name) +{ + MsnUser *user; + + user = g_new0(MsnUser, 1); + + user->userlist = userlist; + + msn_user_set_passport(user, passport); + msn_user_set_store_name(user, store_name); + + /* + * XXX This seems to reset the friendly name from what it should be + * to the passport when moving users. So, screw it :) + */ +#if 0 + if (name != NULL) + msn_user_set_name(user, name); +#endif + + return user; +} + +void +msn_user_destroy(MsnUser *user) +{ + g_return_if_fail(user != NULL); + + if (user->clientcaps != NULL) + g_hash_table_destroy(user->clientcaps); + + if (user->group_ids != NULL) + g_list_free(user->group_ids); + + if (user->msnobj != NULL) + msn_object_destroy(user->msnobj); + + g_free(user->passport); + g_free(user->friendly_name); + g_free(user->store_name); + g_free(user->phone.home); + g_free(user->phone.work); + g_free(user->phone.mobile); + + g_free(user); +} + +void +msn_user_update(MsnUser *user) +{ + PurpleAccount *account; + + account = user->userlist->session->account; + + if (user->status != NULL) { + if (!strcmp(user->status, "offline") && user->mobile) { + purple_prpl_got_user_status(account, user->passport, "offline", NULL); + purple_prpl_got_user_status(account, user->passport, "mobile", NULL); + } else { + purple_prpl_got_user_status(account, user->passport, user->status, NULL); + purple_prpl_got_user_status_deactive(account, user->passport, "mobile"); + } + } + + if (user->idle) + purple_prpl_got_user_idle(account, user->passport, TRUE, -1); + else + purple_prpl_got_user_idle(account, user->passport, FALSE, 0); +} + +void +msn_user_set_state(MsnUser *user, const char *state) +{ + const char *status; + + if (!g_ascii_strcasecmp(state, "BSY")) + status = "busy"; + else if (!g_ascii_strcasecmp(state, "BRB")) + status = "brb"; + else if (!g_ascii_strcasecmp(state, "AWY")) + status = "away"; + else if (!g_ascii_strcasecmp(state, "PHN")) + status = "phone"; + else if (!g_ascii_strcasecmp(state, "LUN")) + status = "lunch"; + else + status = "available"; + + if (!g_ascii_strcasecmp(state, "IDL")) + user->idle = TRUE; + else + user->idle = FALSE; + + user->status = status; +} + +void +msn_user_set_passport(MsnUser *user, const char *passport) +{ + g_return_if_fail(user != NULL); + + g_free(user->passport); + user->passport = g_strdup(passport); +} + +void +msn_user_set_friendly_name(MsnUser *user, const char *name) +{ + g_return_if_fail(user != NULL); + + g_free(user->friendly_name); + user->friendly_name = g_strdup(name); +} + +void +msn_user_set_store_name(MsnUser *user, const char *name) +{ + g_return_if_fail(user != NULL); + + g_free(user->store_name); + user->store_name = g_strdup(name); +} + +void +msn_user_set_buddy_icon(MsnUser *user, PurpleStoredImage *img) +{ + MsnObject *msnobj = msn_user_get_object(user); + + g_return_if_fail(user != NULL); + + if (img == NULL) + msn_user_set_object(user, NULL); + else + { + PurpleCipherContext *ctx; + char *buf; + gconstpointer data = purple_imgstore_get_data(img); + size_t size = purple_imgstore_get_size(img); + char *base64; + unsigned char digest[20]; + + if (msnobj == NULL) + { + msnobj = msn_object_new(); + msn_object_set_local(msnobj); + msn_object_set_type(msnobj, MSN_OBJECT_USERTILE); + msn_object_set_location(msnobj, "TFR2C2.tmp"); + msn_object_set_creator(msnobj, msn_user_get_passport(user)); + + msn_user_set_object(user, msnobj); + } + + msn_object_set_image(msnobj, img); + + /* Compute the SHA1D field. */ + memset(digest, 0, sizeof(digest)); + + ctx = purple_cipher_context_new_by_name("sha1", NULL); + purple_cipher_context_append(ctx, data, size); + purple_cipher_context_digest(ctx, sizeof(digest), digest, NULL); + + base64 = purple_base64_encode(digest, sizeof(digest)); + msn_object_set_sha1d(msnobj, base64); + g_free(base64); + + msn_object_set_size(msnobj, size); + + /* Compute the SHA1C field. */ + buf = g_strdup_printf( + "Creator%sSize%dType%dLocation%sFriendly%sSHA1D%s", + msn_object_get_creator(msnobj), + msn_object_get_size(msnobj), + msn_object_get_type(msnobj), + msn_object_get_location(msnobj), + msn_object_get_friendly(msnobj), + msn_object_get_sha1d(msnobj)); + + memset(digest, 0, sizeof(digest)); + + purple_cipher_context_reset(ctx, NULL); + purple_cipher_context_append(ctx, (const guchar *)buf, strlen(buf)); + purple_cipher_context_digest(ctx, sizeof(digest), digest, NULL); + purple_cipher_context_destroy(ctx); + g_free(buf); + + base64 = purple_base64_encode(digest, sizeof(digest)); + msn_object_set_sha1c(msnobj, base64); + g_free(base64); + } +} + +void +msn_user_add_group_id(MsnUser *user, int id) +{ + MsnUserList *userlist; + PurpleAccount *account; + PurpleBuddy *b; + PurpleGroup *g; + const char *passport; + const char *group_name; + + g_return_if_fail(user != NULL); + g_return_if_fail(id >= 0); + + user->group_ids = g_list_append(user->group_ids, GINT_TO_POINTER(id)); + + userlist = user->userlist; + account = userlist->session->account; + passport = msn_user_get_passport(user); + + group_name = msn_userlist_find_group_name(userlist, id); + + g = purple_find_group(group_name); + + if ((id == 0) && (g == NULL)) + { + g = purple_group_new(group_name); + purple_blist_add_group(g, NULL); + } + + b = purple_find_buddy_in_group(account, passport, g); + + if (b == NULL) + { + b = purple_buddy_new(account, passport, NULL); + + purple_blist_add_buddy(b, NULL, g, NULL); + } + + b->proto_data = user; +} + +void +msn_user_remove_group_id(MsnUser *user, int id) +{ + g_return_if_fail(user != NULL); + g_return_if_fail(id >= 0); + + user->group_ids = g_list_remove(user->group_ids, GINT_TO_POINTER(id)); +} + +void +msn_user_set_home_phone(MsnUser *user, const char *number) +{ + g_return_if_fail(user != NULL); + + if (user->phone.home != NULL) + g_free(user->phone.home); + + user->phone.home = (number == NULL ? NULL : g_strdup(number)); +} + +void +msn_user_set_work_phone(MsnUser *user, const char *number) +{ + g_return_if_fail(user != NULL); + + if (user->phone.work != NULL) + g_free(user->phone.work); + + user->phone.work = (number == NULL ? NULL : g_strdup(number)); +} + +void +msn_user_set_mobile_phone(MsnUser *user, const char *number) +{ + g_return_if_fail(user != NULL); + + if (user->phone.mobile != NULL) + g_free(user->phone.mobile); + + user->phone.mobile = (number == NULL ? NULL : g_strdup(number)); +} + +void +msn_user_set_object(MsnUser *user, MsnObject *obj) +{ + g_return_if_fail(user != NULL); + + if (user->msnobj != NULL) + msn_object_destroy(user->msnobj); + + user->msnobj = obj; + + if (user->list_op & MSN_LIST_FL_OP) + msn_queue_buddy_icon_request(user); +} + +void +msn_user_set_client_caps(MsnUser *user, GHashTable *info) +{ + g_return_if_fail(user != NULL); + g_return_if_fail(info != NULL); + + if (user->clientcaps != NULL) + g_hash_table_destroy(user->clientcaps); + + user->clientcaps = info; +} + +const char * +msn_user_get_passport(const MsnUser *user) +{ + g_return_val_if_fail(user != NULL, NULL); + + return user->passport; +} + +const char * +msn_user_get_friendly_name(const MsnUser *user) +{ + g_return_val_if_fail(user != NULL, NULL); + + return user->friendly_name; +} + +const char * +msn_user_get_store_name(const MsnUser *user) +{ + g_return_val_if_fail(user != NULL, NULL); + + return user->store_name; +} + +const char * +msn_user_get_home_phone(const MsnUser *user) +{ + g_return_val_if_fail(user != NULL, NULL); + + return user->phone.home; +} + +const char * +msn_user_get_work_phone(const MsnUser *user) +{ + g_return_val_if_fail(user != NULL, NULL); + + return user->phone.work; +} + +const char * +msn_user_get_mobile_phone(const MsnUser *user) +{ + g_return_val_if_fail(user != NULL, NULL); + + return user->phone.mobile; +} + +MsnObject * +msn_user_get_object(const MsnUser *user) +{ + g_return_val_if_fail(user != NULL, NULL); + + return user->msnobj; +} + +GHashTable * +msn_user_get_client_caps(const MsnUser *user) +{ + g_return_val_if_fail(user != NULL, NULL); + + return user->clientcaps; +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libpurple/protocols/msnp9/user.h Mon Nov 12 16:53:54 2007 +0000 @@ -0,0 +1,284 @@ +/** + * @file user.h User functions + * + * purple + * + * Purple is the legal property of its developers, whose names are too numerous + * to list here. Please refer to the COPYRIGHT file distributed with this + * source distribution. + * + * 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 02111-1301 USA + */ +#ifndef _MSN_USER_H_ +#define _MSN_USER_H_ + +typedef struct _MsnUser MsnUser; + +#include "session.h" +#include "object.h" + +#include "userlist.h" + +/** + * A user. + */ +struct _MsnUser +{ +#if 0 + MsnSession *session; /**< The MSN session. */ +#endif + MsnUserList *userlist; + + char *passport; /**< The passport account. */ + char *store_name; /**< The name stored in the server. */ + char *friendly_name; /**< The friendly name. */ + + const char *status; /**< The state of the user. */ + gboolean idle; /**< The idle state of the user. */ + + struct + { + char *home; /**< Home phone number. */ + char *work; /**< Work phone number. */ + char *mobile; /**< Mobile phone number. */ + + } phone; + + gboolean authorized; /**< Authorized to add this user. */ + gboolean mobile; /**< Signed up with MSN Mobile. */ + + GList *group_ids; /**< The group IDs. */ + + MsnObject *msnobj; /**< The user's MSN Object. */ + + GHashTable *clientcaps; /**< The client's capabilities. */ + + int list_op; +}; + +/**************************************************************************/ +/** @name User API */ +/**************************************************************************/ +/*@{*/ + +/** + * Creates a new user structure. + * + * @param session The MSN session. + * @param passport The initial passport. + * @param stored_name The initial stored name. + * + * @return A new user structure. + */ +MsnUser *msn_user_new(MsnUserList *userlist, const char *passport, + const char *store_name); + +/** + * Destroys a user structure. + * + * @param user The user to destroy. + */ +void msn_user_destroy(MsnUser *user); + + +/** + * Updates the user. + * + * Communicates with the core to update the ui, etc. + * + * @param user The user to update. + */ +void msn_user_update(MsnUser *user); + +/** + * Sets the new state of user. + * + * @param user The user. + * @param state The state string. + */ +void msn_user_set_state(MsnUser *user, const char *state); + +/** + * Sets the passport account for a user. + * + * @param user The user. + * @param passport The passport account. + */ +void msn_user_set_passport(MsnUser *user, const char *passport); + +/** + * Sets the friendly name for a user. + * + * @param user The user. + * @param name The friendly name. + */ +void msn_user_set_friendly_name(MsnUser *user, const char *name); + +/** + * Sets the store name for a user. + * + * @param user The user. + * @param name The store name. + */ +void msn_user_set_store_name(MsnUser *user, const char *name); + +/** + * Sets the buddy icon for a local user. + * + * @param user The user. + * @param img The buddy icon image + */ +void msn_user_set_buddy_icon(MsnUser *user, PurpleStoredImage *img); + +/** + * Sets the group ID list for a user. + * + * @param user The user. + * @param ids The group ID list. + */ +void msn_user_set_group_ids(MsnUser *user, GList *ids); + +/** + * Adds the group ID for a user. + * + * @param user The user. + * @param id The group ID. + */ +void msn_user_add_group_id(MsnUser *user, int id); + +/** + * Removes the group ID from a user. + * + * @param user The user. + * @param id The group ID. + */ +void msn_user_remove_group_id(MsnUser *user, int id); + +/** + * Sets the home phone number for a user. + * + * @param user The user. + * @param number The home phone number. + */ +void msn_user_set_home_phone(MsnUser *user, const char *number); + +/** + * Sets the work phone number for a user. + * + * @param user The user. + * @param number The work phone number. + */ +void msn_user_set_work_phone(MsnUser *user, const char *number); + +/** + * Sets the mobile phone number for a user. + * + * @param user The user. + * @param number The mobile phone number. + */ +void msn_user_set_mobile_phone(MsnUser *user, const char *number); + +/** + * Sets the MSNObject for a user. + * + * @param user The user. + * @param obj The MSNObject. + */ +void msn_user_set_object(MsnUser *user, MsnObject *obj); + +/** + * Sets the client information for a user. + * + * @param user The user. + * @param info The client information. + */ +void msn_user_set_client_caps(MsnUser *user, GHashTable *info); + + +/** + * Returns the passport account for a user. + * + * @param user The user. + * + * @return The passport account. + */ +const char *msn_user_get_passport(const MsnUser *user); + +/** + * Returns the friendly name for a user. + * + * @param user The user. + * + * @return The friendly name. + */ +const char *msn_user_get_friendly_name(const MsnUser *user); + +/** + * Returns the store name for a user. + * + * @param user The user. + * + * @return The store name. + */ +const char *msn_user_get_store_name(const MsnUser *user); + +/** + * Returns the home phone number for a user. + * + * @param user The user. + * + * @return The user's home phone number. + */ +const char *msn_user_get_home_phone(const MsnUser *user); + +/** + * Returns the work phone number for a user. + * + * @param user The user. + * + * @return The user's work phone number. + */ +const char *msn_user_get_work_phone(const MsnUser *user); + +/** + * Returns the mobile phone number for a user. + * + * @param user The user. + * + * @return The user's mobile phone number. + */ +const char *msn_user_get_mobile_phone(const MsnUser *user); + +/** + * Returns the MSNObject for a user. + * + * @param user The user. + * + * @return The MSNObject. + */ +MsnObject *msn_user_get_object(const MsnUser *user); + +/** + * Returns the client information for a user. + * + * @param user The user. + * + * @return The client information. + */ +GHashTable *msn_user_get_client_caps(const MsnUser *user); + +/*@}*/ + +#endif /* _MSN_USER_H_ */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libpurple/protocols/msnp9/userlist.c Mon Nov 12 16:53:54 2007 +0000 @@ -0,0 +1,699 @@ +/** + * @file userlist.c MSN user list support + * + * purple + * + * Purple is the legal property of its developers, whose names are too numerous + * to list here. Please refer to the COPYRIGHT file distributed with this + * source distribution. + * + * 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 02111-1301 USA + */ +#include "msn.h" +#include "userlist.h" + +const char *lists[] = { "FL", "AL", "BL", "RL" }; + +typedef struct +{ + PurpleConnection *gc; + char *who; + char *friendly; + +} MsnPermitAdd; + +/************************************************************************** + * Callbacks + **************************************************************************/ +static void +msn_accept_add_cb(gpointer data) +{ + MsnPermitAdd *pa = data; + MsnSession *session = pa->gc->proto_data; + MsnUserList *userlist = session->userlist; + + msn_userlist_add_buddy(userlist, pa->who, MSN_LIST_AL, NULL); + + g_free(pa->who); + g_free(pa->friendly); + g_free(pa); +} + +static void +msn_cancel_add_cb(gpointer data) +{ + MsnPermitAdd *pa = data; + MsnSession *session = pa->gc->proto_data; + MsnUserList *userlist = session->userlist; + + msn_userlist_add_buddy(userlist, pa->who, MSN_LIST_BL, NULL); + + g_free(pa->who); + g_free(pa->friendly); + g_free(pa); +} + +static void +got_new_entry(PurpleConnection *gc, const char *passport, const char *friendly) +{ + MsnPermitAdd *pa; + + pa = g_new0(MsnPermitAdd, 1); + pa->who = g_strdup(passport); + pa->friendly = g_strdup(friendly); + pa->gc = gc; + + purple_account_request_authorization(purple_connection_get_account(gc), passport, NULL, friendly, NULL, + purple_find_buddy(purple_connection_get_account(gc), passport) != NULL, + msn_accept_add_cb, msn_cancel_add_cb, pa); +} + +/************************************************************************** + * Utility functions + **************************************************************************/ + +static gboolean +user_is_in_group(MsnUser *user, int group_id) +{ + if (user == NULL) + return FALSE; + + if (group_id < 0) + return FALSE; + + if (g_list_find(user->group_ids, GINT_TO_POINTER(group_id))) + return TRUE; + + return FALSE; +} + +static gboolean +user_is_there(MsnUser *user, int list_id, int group_id) +{ + int list_op; + + if (user == NULL) + return FALSE; + + list_op = 1 << list_id; + + if (!(user->list_op & list_op)) + return FALSE; + + if (list_id == MSN_LIST_FL) + { + if (group_id >= 0) + return user_is_in_group(user, group_id); + } + + return TRUE; +} + +static const char* +get_store_name(MsnUser *user) +{ + const char *store_name; + + g_return_val_if_fail(user != NULL, NULL); + + store_name = msn_user_get_store_name(user); + + if (store_name != NULL) + store_name = purple_url_encode(store_name); + else + store_name = msn_user_get_passport(user); + + /* this might be a bit of a hack, but it should prevent notification server + * disconnections for people who have buddies with insane friendly names + * who added you to their buddy list from being disconnected. Stu. */ + /* Shx: What? Isn't the store_name obtained from the server, and hence it's + * below the BUDDY_ALIAS_MAXLEN ? */ + /* Stu: yeah, that's why it's a bit of a hack, as you pointed out, we're + * probably decoding the incoming store_name wrong, or something. bleh. */ + + if (strlen(store_name) > BUDDY_ALIAS_MAXLEN) + store_name = msn_user_get_passport(user); + + return store_name; +} + +static void +msn_request_add_group(MsnUserList *userlist, const char *who, + const char *old_group_name, const char *new_group_name) +{ + MsnCmdProc *cmdproc; + MsnTransaction *trans; + MsnMoveBuddy *data; + + cmdproc = userlist->session->notification->cmdproc; + data = g_new0(MsnMoveBuddy, 1); + + data->who = g_strdup(who); + + if (old_group_name) + data->old_group_name = g_strdup(old_group_name); + + trans = msn_transaction_new(cmdproc, "ADG", "%s %d", + purple_url_encode(new_group_name), + 0); + + msn_transaction_set_data(trans, data); + + msn_cmdproc_send_trans(cmdproc, trans); +} + +/************************************************************************** + * Server functions + **************************************************************************/ + +MsnListId +msn_get_list_id(const char *list) +{ + if (list[0] == 'F') + return MSN_LIST_FL; + else if (list[0] == 'A') + return MSN_LIST_AL; + else if (list[0] == 'B') + return MSN_LIST_BL; + else if (list[0] == 'R') + return MSN_LIST_RL; + + return -1; +} + +void +msn_got_add_user(MsnSession *session, MsnUser *user, + MsnListId list_id, int group_id) +{ + PurpleAccount *account; + const char *passport; + const char *friendly; + + account = session->account; + + passport = msn_user_get_passport(user); + friendly = msn_user_get_friendly_name(user); + + if (list_id == MSN_LIST_FL) + { + PurpleConnection *gc; + + gc = purple_account_get_connection(account); + + serv_got_alias(gc, passport, friendly); + + if (group_id >= 0) + { + msn_user_add_group_id(user, group_id); + } + else + { + /* session->sync->fl_users_count++; */ + } + } + else if (list_id == MSN_LIST_AL) + { + purple_privacy_permit_add(account, passport, TRUE); + } + else if (list_id == MSN_LIST_BL) + { + purple_privacy_deny_add(account, passport, TRUE); + } + else if (list_id == MSN_LIST_RL) + { + PurpleConnection *gc; + PurpleConversation *convo; + + gc = purple_account_get_connection(account); + + purple_debug_info("msn", + "%s has added you to his or her buddy list.\n", + passport); + + convo = purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM, passport, account); + if (convo) { + PurpleBuddy *buddy; + char *msg; + + buddy = purple_find_buddy(account, passport); + msg = g_strdup_printf( + _("%s has added you to his or her buddy list."), + buddy ? purple_buddy_get_contact_alias(buddy) : passport); + purple_conv_im_write(PURPLE_CONV_IM(convo), passport, msg, + PURPLE_MESSAGE_SYSTEM, time(NULL)); + g_free(msg); + } + + if (!(user->list_op & (MSN_LIST_AL_OP | MSN_LIST_BL_OP))) + { + /* + * TODO: The friendly name was NULL for me when I + * looked at this. Maybe we should use the store + * name instead? --KingAnt + */ + got_new_entry(gc, passport, friendly); + } + } + + user->list_op |= (1 << list_id); + /* purple_user_add_list_id (user, list_id); */ +} + +void +msn_got_rem_user(MsnSession *session, MsnUser *user, + MsnListId list_id, int group_id) +{ + PurpleAccount *account; + const char *passport; + + account = session->account; + + passport = msn_user_get_passport(user); + + if (list_id == MSN_LIST_FL) + { + /* TODO: When is the user totally removed? */ + if (group_id >= 0) + { + msn_user_remove_group_id(user, group_id); + return; + } + else + { + /* session->sync->fl_users_count--; */ + } + } + else if (list_id == MSN_LIST_AL) + { + purple_privacy_permit_remove(account, passport, TRUE); + } + else if (list_id == MSN_LIST_BL) + { + purple_privacy_deny_remove(account, passport, TRUE); + } + else if (list_id == MSN_LIST_RL) + { + PurpleConversation *convo; + + purple_debug_info("msn", + "%s has removed you from his or her buddy list.\n", + passport); + + convo = purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM, passport, account); + if (convo) { + PurpleBuddy *buddy; + char *msg; + + buddy = purple_find_buddy(account, passport); + msg = g_strdup_printf( + _("%s has removed you from his or her buddy list."), + buddy ? purple_buddy_get_contact_alias(buddy) : passport); + purple_conv_im_write(PURPLE_CONV_IM(convo), passport, msg, + PURPLE_MESSAGE_SYSTEM, time(NULL)); + g_free(msg); + } + } + + user->list_op &= ~(1 << list_id); + /* purple_user_remove_list_id (user, list_id); */ + + if (user->list_op == 0) + { + purple_debug_info("msn", "Buddy '%s' shall be deleted?.\n", + passport); + + } +} + +void +msn_got_lst_user(MsnSession *session, MsnUser *user, + int list_op, GSList *group_ids) +{ + PurpleConnection *gc; + PurpleAccount *account; + const char *passport; + const char *store; + + account = session->account; + gc = purple_account_get_connection(account); + + passport = msn_user_get_passport(user); + store = msn_user_get_store_name(user); + + if (list_op & MSN_LIST_FL_OP) + { + GSList *c; + for (c = group_ids; c != NULL; c = g_slist_next(c)) + { + int group_id; + group_id = GPOINTER_TO_INT(c->data); + msn_user_add_group_id(user, group_id); + } + + /* FIXME: It might be a real alias */ + /* Umm, what? This might fix bug #1385130 */ + serv_got_alias(gc, passport, store); + } + + if (list_op & MSN_LIST_AL_OP) + { + /* These are users who are allowed to see our status. */ + purple_privacy_deny_remove(account, passport, TRUE); + purple_privacy_permit_add(account, passport, TRUE); + } + + if (list_op & MSN_LIST_BL_OP) + { + /* These are users who are not allowed to see our status. */ + purple_privacy_permit_remove(account, passport, TRUE); + purple_privacy_deny_add(account, passport, TRUE); + } + + if (list_op & MSN_LIST_RL_OP) + { + /* These are users who have us on their buddy list. */ + /* + * TODO: What is store name set to when this happens? + * For one of my accounts "something@hotmail.com" + * the store name was "something." Maybe we + * should use the friendly name, instead? --KingAnt + */ + + if (!(list_op & (MSN_LIST_AL_OP | MSN_LIST_BL_OP))) + { + got_new_entry(gc, passport, store); + } + } + + user->list_op = list_op; +} + +/************************************************************************** + * UserList functions + **************************************************************************/ + +MsnUserList* +msn_userlist_new(MsnSession *session) +{ + MsnUserList *userlist; + + userlist = g_new0(MsnUserList, 1); + + userlist->session = session; + userlist->buddy_icon_requests = g_queue_new(); + + /* buddy_icon_window is the number of allowed simultaneous buddy icon requests. + * XXX With smarter rate limiting code, we could allow more at once... 5 was the limit set when + * we weren't retrieiving any more than 5 per MSN session. */ + userlist->buddy_icon_window = 1; + + return userlist; +} + +void +msn_userlist_destroy(MsnUserList *userlist) +{ + GList *l; + + for (l = userlist->users; l != NULL; l = l->next) + { + msn_user_destroy(l->data); + } + + g_list_free(userlist->users); + + for (l = userlist->groups; l != NULL; l = l->next) + { + msn_group_destroy(l->data); + } + + g_list_free(userlist->groups); + + g_queue_free(userlist->buddy_icon_requests); + + if (userlist->buddy_icon_request_timer) + purple_timeout_remove(userlist->buddy_icon_request_timer); + + g_free(userlist); +} + +void +msn_userlist_add_user(MsnUserList *userlist, MsnUser *user) +{ + userlist->users = g_list_prepend(userlist->users, user); +} + +void +msn_userlist_remove_user(MsnUserList *userlist, MsnUser *user) +{ + userlist->users = g_list_remove(userlist->users, user); +} + +MsnUser * +msn_userlist_find_user(MsnUserList *userlist, const char *passport) +{ + GList *l; + + g_return_val_if_fail(passport != NULL, NULL); + + for (l = userlist->users; l != NULL; l = l->next) + { + MsnUser *user = (MsnUser *)l->data; + + g_return_val_if_fail(user->passport != NULL, NULL); + + if (!strcmp(passport, user->passport)) + return user; + } + + return NULL; +} + +void +msn_userlist_add_group(MsnUserList *userlist, MsnGroup *group) +{ + userlist->groups = g_list_append(userlist->groups, group); +} + +void +msn_userlist_remove_group(MsnUserList *userlist, MsnGroup *group) +{ + userlist->groups = g_list_remove(userlist->groups, group); +} + +MsnGroup * +msn_userlist_find_group_with_id(MsnUserList *userlist, int id) +{ + GList *l; + + g_return_val_if_fail(userlist != NULL, NULL); + g_return_val_if_fail(id >= 0, NULL); + + for (l = userlist->groups; l != NULL; l = l->next) + { + MsnGroup *group = l->data; + + if (group->id == id) + return group; + } + + return NULL; +} + +MsnGroup * +msn_userlist_find_group_with_name(MsnUserList *userlist, const char *name) +{ + GList *l; + + g_return_val_if_fail(userlist != NULL, NULL); + g_return_val_if_fail(name != NULL, NULL); + + for (l = userlist->groups; l != NULL; l = l->next) + { + MsnGroup *group = l->data; + + if ((group->name != NULL) && !g_ascii_strcasecmp(name, group->name)) + return group; + } + + return NULL; +} + +int +msn_userlist_find_group_id(MsnUserList *userlist, const char *group_name) +{ + MsnGroup *group; + + group = msn_userlist_find_group_with_name(userlist, group_name); + + if (group != NULL) + return msn_group_get_id(group); + else + return -1; +} + +const char * +msn_userlist_find_group_name(MsnUserList *userlist, int group_id) +{ + MsnGroup *group; + + group = msn_userlist_find_group_with_id(userlist, group_id); + + if (group != NULL) + return msn_group_get_name(group); + else + return NULL; +} + +void +msn_userlist_rename_group_id(MsnUserList *userlist, int group_id, + const char *new_name) +{ + MsnGroup *group; + + group = msn_userlist_find_group_with_id(userlist, group_id); + + if (group != NULL) + msn_group_set_name(group, new_name); +} + +void +msn_userlist_remove_group_id(MsnUserList *userlist, int group_id) +{ + MsnGroup *group; + + group = msn_userlist_find_group_with_id(userlist, group_id); + + if (group != NULL) + { + msn_userlist_remove_group(userlist, group); + msn_group_destroy(group); + } +} + +void +msn_userlist_rem_buddy(MsnUserList *userlist, + const char *who, int list_id, const char *group_name) +{ + MsnUser *user; + int group_id; + const char *list; + + user = msn_userlist_find_user(userlist, who); + group_id = -1; + + if (group_name != NULL) + { + group_id = msn_userlist_find_group_id(userlist, group_name); + + if (group_id < 0) + { + /* Whoa, there is no such group. */ + purple_debug_error("msn", "Group doesn't exist: %s\n", group_name); + return; + } + } + + /* First we're going to check if not there. */ + if (!(user_is_there(user, list_id, group_id))) + { + list = lists[list_id]; + purple_debug_error("msn", "User '%s' is not there: %s\n", + who, list); + return; + } + + /* Then request the rem to the server. */ + list = lists[list_id]; + + msn_notification_rem_buddy(userlist->session->notification, list, who, group_id); +} + +void +msn_userlist_add_buddy(MsnUserList *userlist, + const char *who, int list_id, + const char *group_name) +{ + MsnUser *user; + int group_id; + const char *list; + const char *store_name; + + group_id = -1; + + if (!purple_email_is_valid(who)) + { + /* only notify the user about problems adding to the friends list + * maybe we should do something else for other lists, but it probably + * won't cause too many problems if we just ignore it */ + if (list_id == MSN_LIST_FL) + { + char *str = g_strdup_printf(_("Unable to add \"%s\"."), who); + purple_notify_error(NULL, NULL, str, + _("The screen name specified is invalid.")); + g_free(str); + } + + return; + } + + if (group_name != NULL) + { + group_id = msn_userlist_find_group_id(userlist, group_name); + + if (group_id < 0) + { + /* Whoa, we must add that group first. */ + msn_request_add_group(userlist, who, NULL, group_name); + return; + } + } + + user = msn_userlist_find_user(userlist, who); + + /* First we're going to check if it's already there. */ + if (user_is_there(user, list_id, group_id)) + { + list = lists[list_id]; + purple_debug_error("msn", "User '%s' is already there: %s\n", who, list); + return; + } + + store_name = (user != NULL) ? get_store_name(user) : who; + + /* Then request the add to the server. */ + list = lists[list_id]; + + msn_notification_add_buddy(userlist->session->notification, list, who, + store_name, group_id); +} + +void +msn_userlist_move_buddy(MsnUserList *userlist, const char *who, + const char *old_group_name, const char *new_group_name) +{ + int new_group_id; + + new_group_id = msn_userlist_find_group_id(userlist, new_group_name); + + if (new_group_id < 0) + { + msn_request_add_group(userlist, who, old_group_name, new_group_name); + return; + } + + msn_userlist_add_buddy(userlist, who, MSN_LIST_FL, new_group_name); + msn_userlist_rem_buddy(userlist, who, MSN_LIST_FL, old_group_name); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libpurple/protocols/msnp9/userlist.h Mon Nov 12 16:53:54 2007 +0000 @@ -0,0 +1,103 @@ +/** + * @file userlist.h MSN user list support + * + * purple + * + * Purple is the legal property of its developers, whose names are too numerous + * to list here. Please refer to the COPYRIGHT file distributed with this + * source distribution. + * + * 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 02111-1301 USA + */ +#ifndef _MSN_USERLIST_H_ +#define _MSN_USERLIST_H_ + +typedef struct _MsnUserList MsnUserList; + +#include "cmdproc.h" +#include "user.h" +#include "group.h" + +typedef enum +{ + MSN_LIST_FL, + MSN_LIST_AL, + MSN_LIST_BL, + MSN_LIST_RL + +} MsnListId; + +typedef struct +{ + char *who; + char *old_group_name; + +} MsnMoveBuddy; + +struct _MsnUserList +{ + MsnSession *session; + + /* MsnUsers *users; */ + /* MsnGroups *groups; */ + + GList *users; + GList *groups; + + GQueue *buddy_icon_requests; + int buddy_icon_window; + guint buddy_icon_request_timer; + + int fl_users_count; + +}; + +MsnListId msn_get_list_id(const char *list); + +void msn_got_add_user(MsnSession *session, MsnUser *user, + MsnListId list_id, int group_id); +void msn_got_rem_user(MsnSession *session, MsnUser *user, + MsnListId list_id, int group_id); +void msn_got_lst_user(MsnSession *session, MsnUser *user, + int list_op, GSList *group_ids); + +MsnUserList *msn_userlist_new(MsnSession *session); +void msn_userlist_destroy(MsnUserList *userlist); +void msn_userlist_add_user(MsnUserList *userlist, MsnUser *user); +void msn_userlist_remove_user(MsnUserList *userlist, MsnUser *user); +MsnUser *msn_userlist_find_user(MsnUserList *userlist, + const char *passport); +void msn_userlist_add_group(MsnUserList *userlist, MsnGroup *group); +void msn_userlist_remove_group(MsnUserList *userlist, MsnGroup *group); +MsnGroup *msn_userlist_find_group_with_id(MsnUserList *userlist, int id); +MsnGroup *msn_userlist_find_group_with_name(MsnUserList *userlist, + const char *name); +int msn_userlist_find_group_id(MsnUserList *userlist, + const char *group_name); +const char *msn_userlist_find_group_name(MsnUserList *userlist, + int group_id); +void msn_userlist_rename_group_id(MsnUserList *userlist, int group_id, + const char *new_name); +void msn_userlist_remove_group_id(MsnUserList *userlist, int group_id); + +void msn_userlist_rem_buddy(MsnUserList *userlist, const char *who, + int list_id, const char *group_name); +void msn_userlist_add_buddy(MsnUserList *userlist, const char *who, + int list_id, const char *group_name); +void msn_userlist_move_buddy(MsnUserList *userlist, const char *who, + const char *old_group_name, + const char *new_group_name); + +#endif /* _MSN_USERLIST_H_ */
--- a/libpurple/protocols/myspace/myspace.c Mon Nov 12 16:15:53 2007 +0000 +++ b/libpurple/protocols/myspace/myspace.c Mon Nov 12 16:53:54 2007 +0000 @@ -291,8 +291,8 @@ /* Notify an error message also, because this is important! */ purple_notify_error(acct, _("MySpaceIM Error"), str, NULL); - gc->wants_to_die = TRUE; - purple_connection_error(gc, str); + purple_connection_error_reason (gc, + PURPLE_CONNECTION_ERROR_AUTHENTICATION_FAILED, str); g_free(str); return; } @@ -315,7 +315,9 @@ if (!purple_proxy_connect(gc, acct, host, port, msim_connect_cb, gc)) { /* TODO: try other ports if in auto mode, then save * working port and try that first next time. */ - purple_connection_error(gc, _("Couldn't create socket")); + purple_connection_error_reason (gc, + PURPLE_CONNECTION_ERROR_NETWORK_ERROR, + _("Couldn't create socket")); return; } } @@ -353,7 +355,9 @@ if (nc_len != MSIM_AUTH_CHALLENGE_LENGTH) { purple_debug_info("msim", "bad nc length: %x != 0x%x\n", nc_len, MSIM_AUTH_CHALLENGE_LENGTH); - purple_connection_error(session->gc, _("Unexpected challenge length from server")); + purple_connection_error_reason (session->gc, + PURPLE_CONNECTION_ERROR_NETWORK_ERROR, + _("Unexpected challenge length from server")); return FALSE; } @@ -826,7 +830,6 @@ serv_got_typing_stopped(session->gc, username); g_free(username); - g_free(text); return TRUE; } @@ -1294,7 +1297,8 @@ purple_debug_info("msim", "msim_check_alive: %s > interval of %d, presumed dead\n", errmsg, MSIM_KEEPALIVE_INTERVAL); - purple_connection_error(session->gc, errmsg); + purple_connection_error_reason (session->gc, + PURPLE_CONNECTION_ERROR_NETWORK_ERROR, errmsg); purple_notify_error(session->gc, NULL, errmsg, NULL); @@ -1560,7 +1564,8 @@ purple_notify_error(session->account, _("No username set"), _("Please go to http://editprofile.myspace.com/index.cfm?fuseaction=profile.username and choose a username and try to login again."), NULL); - purple_connection_error(session->gc, _("No username set")); + purple_connection_error_reason (session->gc, + PURPLE_CONNECTION_ERROR_AUTHENTICATION_FAILED, _("No username set")); return FALSE; } @@ -1796,16 +1801,21 @@ /* Destroy session if fatal. */ if (msim_msg_get(msg, "fatal")) { + PurpleConnectionError reason = PURPLE_CONNECTION_ERROR_NETWORK_ERROR; purple_debug_info("msim", "fatal error, closing\n"); switch (err) { case 260: /* Incorrect password */ + reason = PURPLE_CONNECTION_ERROR_AUTHENTICATION_FAILED; + if (!purple_account_get_remember_password(session->account)) + purple_account_set_password(session->account, NULL); + break; case 6: /* Logged in elsewhere */ - session->gc->wants_to_die = TRUE; + reason = PURPLE_CONNECTION_ERROR_NAME_IN_USE; if (!purple_account_get_remember_password(session->account)) purple_account_set_password(session->account, NULL); break; } - purple_connection_error(session->gc, full_errmsg); + purple_connection_error_reason (session->gc, reason, full_errmsg); } else { purple_notify_error(session->account, _("MySpaceIM Error"), full_errmsg, NULL); } @@ -1875,7 +1885,6 @@ purple_blist_add_buddy(buddy, NULL, NULL, NULL); user = msim_get_user_from_buddy(buddy); - /* TODO: free user. memory leak? */ /* All buddies on list should have 'uid' integer associated with them. */ purple_blist_node_set_int(&buddy->node, "UserID", msim_msg_get_integer(msg, "f")); @@ -2317,7 +2326,9 @@ /* libpurple/eventloop.h only defines these two */ if (cond != PURPLE_INPUT_READ && cond != PURPLE_INPUT_WRITE) { purple_debug_info("msim_input_cb", "unknown condition=%d\n", cond); - purple_connection_error(gc, _("Invalid input condition")); + purple_connection_error_reason (gc, + PURPLE_CONNECTION_ERROR_NETWORK_ERROR, + _("Invalid input condition")); return; } @@ -2335,7 +2346,9 @@ purple_debug_error("msim", "msim_input_cb: %d-byte read buffer full! rxoff=%d\n", MSIM_READ_BUF_SIZE, session->rxoff); - purple_connection_error(gc, _("Read buffer full")); + purple_connection_error_reason (gc, + PURPLE_CONNECTION_ERROR_NETWORK_ERROR, + _("Read buffer full")); return; } @@ -2354,11 +2367,15 @@ purple_debug_error("msim", "msim_input_cb: read error, ret=%d, " "error=%s, source=%d, fd=%d (%X))\n", n, g_strerror(errno), source, session->fd, session->fd); - purple_connection_error(gc, _("Read error")); + purple_connection_error_reason (gc, + PURPLE_CONNECTION_ERROR_NETWORK_ERROR, + _("Read error")); return; } else if (n == 0) { purple_debug_info("msim", "msim_input_cb: server disconnected\n"); - purple_connection_error(gc, _("Server has disconnected")); + purple_connection_error_reason (gc, + PURPLE_CONNECTION_ERROR_NETWORK_ERROR, + _("Server has disconnected")); return; } @@ -2366,7 +2383,9 @@ purple_debug_info("msim_input_cb", "received %d bytes, pushing rxoff to %d, over buffer size of %d\n", n, n + session->rxoff, MSIM_READ_BUF_SIZE); /* TODO: g_realloc like msn, yahoo, irc, jabber? */ - purple_connection_error(gc, _("Read buffer full")); + purple_connection_error_reason (gc, + PURPLE_CONNECTION_ERROR_NETWORK_ERROR, + _("Read buffer full")); } /* Null terminate */ @@ -2381,7 +2400,9 @@ purple_debug_info("msim", "msim_input_cb: strlen=%d, but read %d bytes" "--null byte encountered?\n", strlen(session->rxbuf + session->rxoff), n); - //purple_connection_error(gc, "Invalid message - null byte on input"); + /*purple_connection_error_reason (gc, + PURPLE_CONNECTION_ERROR_NETWORK_ERROR, + "Invalid message - null byte on input"); */ return; } #endif @@ -2404,7 +2425,9 @@ msg = msim_parse(g_strdup(session->rxbuf)); if (!msg) { purple_debug_info("msim", "msim_input_cb: couldn't parse rxbuf\n"); - purple_connection_error(gc, _("Unparseable message")); + purple_connection_error_reason (gc, + PURPLE_CONNECTION_ERROR_NETWORK_ERROR, + _("Unparseable message")); } else { /* Process message and then free it (processing function should * clone message if it wants to keep it afterwards.) */ @@ -2471,9 +2494,9 @@ session = (MsimSession *)gc->proto_data; if (source < 0) { - purple_connection_error(gc, _("Couldn't connect to host")); - purple_connection_error(gc, g_strdup_printf( - _("Couldn't connect to host: %s (%d)"), + purple_connection_error_reason (gc, + PURPLE_CONNECTION_ERROR_NETWORK_ERROR, + g_strdup_printf(_("Couldn't connect to host: %s (%d)"), error_message ? error_message : "no message given", source)); return; @@ -2674,7 +2697,6 @@ /* TODO: other fields, store in 'user' */ msim_msg_free(contact_info); - g_free(username); } /** Add first ContactID in contact_info to buddy's list. Used to add
--- a/libpurple/protocols/novell/novell.c Mon Nov 12 16:15:53 2007 +0000 +++ b/libpurple/protocols/novell/novell.c Mon Nov 12 16:53:54 2007 +0000 @@ -120,21 +120,27 @@ _check_for_disconnect(user, rc); } else { - + PurpleConnectionError reason; char *err = g_strdup_printf(_("Login failed (%s)."), nm_error_to_string (ret_code)); - /* Don't attempt to auto-reconnect if our password - * was invalid. - */ - if (ret_code == NMERR_AUTHENTICATION_FAILED || - ret_code == NMERR_CREDENTIALS_MISSING || - ret_code == NMERR_PASSWORD_INVALID) { - if (!purple_account_get_remember_password(gc->account)) - purple_account_set_password(gc->account, NULL); - gc->wants_to_die = TRUE; + switch (ret_code) { + case NMERR_AUTHENTICATION_FAILED: + case NMERR_CREDENTIALS_MISSING: + case NMERR_PASSWORD_INVALID: + /* Don't attempt to auto-reconnect if our + * password was invalid. + */ + if (!purple_account_get_remember_password(gc->account)) + purple_account_set_password(gc->account, NULL); + reason = PURPLE_CONNECTION_ERROR_AUTHENTICATION_FAILED; + break; + default: + /* FIXME: There are other reasons login could fail */ + reason = PURPLE_CONNECTION_ERROR_NETWORK_ERROR; } - purple_connection_error(gc, err); + + purple_connection_error_reason (gc, reason, err); g_free(err); } } @@ -1120,8 +1126,9 @@ if (_is_disconnect_error(err)) { - purple_connection_error(gc, _("Error communicating with server." - " Closing connection.")); + purple_connection_error_reason (gc, + PURPLE_CONNECTION_ERROR_NETWORK_ERROR, + _("Error communicating with server. Closing connection.")); return TRUE; } @@ -1667,7 +1674,7 @@ user = gc->proto_data; user->conn->ssl_conn->data = NULL; - purple_connection_error(gc, _("Unable to make SSL connection to server.")); + purple_connection_ssl_error (gc, error); } static void @@ -1690,9 +1697,9 @@ if (_is_disconnect_error(rc)) { - purple_connection_error(gc, - _("Error communicating with server." - " Closing connection.")); + purple_connection_error_reason (gc, + PURPLE_CONNECTION_ERROR_NETWORK_ERROR, + _("Error communicating with server. Closing connection.")); } else { purple_debug(PURPLE_DEBUG_INFO, "novell", "Error processing event or response (%d).\n", rc); @@ -1731,7 +1738,9 @@ conn->connected = TRUE; purple_ssl_input_add(gsc, novell_ssl_recv_cb, gc); } else { - purple_connection_error(gc, _("Unable to connect to server.")); + purple_connection_error_reason (gc, + PURPLE_CONNECTION_ERROR_NETWORK_ERROR, + _("Unable to connect to server.")); } purple_connection_update_progress(gc, _("Waiting for response..."), @@ -2011,11 +2020,12 @@ gc = purple_account_get_connection(account); if (gc) { - gc->wants_to_die = TRUE; /* we don't want to reconnect in this case */ if (!purple_account_get_remember_password(account)) purple_account_set_password(account, NULL); - purple_connection_error(gc, _("You have been logged out because you" - " logged in at another workstation.")); + purple_connection_error_reason (gc, + PURPLE_CONNECTION_ERROR_NAME_IN_USE, + _("You have been logged out because you" + " logged in at another workstation.")); } } @@ -2169,9 +2179,10 @@ */ /* ...but for now just error out with a nice message. */ - purple_connection_error(gc, _("Unable to connect to server." - " Please enter the address of the server" - " you wish to connect to.")); + purple_connection_error_reason (gc, + PURPLE_CONNECTION_ERROR_INVALID_SETTINGS, + _("Unable to connect to server. Please enter the " + "address of the server you wish to connect to.")); return; } @@ -2197,8 +2208,9 @@ user->conn->addr, user->conn->port, novell_ssl_connected_cb, novell_ssl_connect_error, gc); if (user->conn->ssl_conn->data == NULL) { - purple_connection_error(gc, _("Error." - " SSL support is not installed.")); + purple_connection_error_reason (gc, + PURPLE_CONNECTION_ERROR_NO_SSL_SUPPORT, + _("Error. SSL support is not installed.")); } } }
--- a/libpurple/protocols/oscar/flap_connection.c Mon Nov 12 16:15:53 2007 +0000 +++ b/libpurple/protocols/oscar/flap_connection.c Mon Nov 12 16:53:54 2007 +0000 @@ -380,11 +380,13 @@ { /* No more FLAP connections! Sign off this PurpleConnection! */ gchar *tmp; + PurpleConnectionError reason = PURPLE_CONNECTION_ERROR_NETWORK_ERROR; + if (conn->disconnect_code == 0x0001) { + reason = PURPLE_CONNECTION_ERROR_NAME_IN_USE; tmp = g_strdup(_("You have signed on from another location.")); if (!purple_account_get_remember_password(account)) purple_account_set_password(account, NULL); - od->gc->wants_to_die = TRUE; } else if (conn->disconnect_reason == OSCAR_DISCONNECT_REMOTE_CLOSED) tmp = g_strdup(_("Server closed the connection.")); else if (conn->disconnect_reason == OSCAR_DISCONNECT_LOST_CONNECTION) @@ -404,7 +406,7 @@ if (tmp != NULL) { - purple_connection_error(od->gc, tmp); + purple_connection_error_reason(od->gc, reason, tmp); g_free(tmp); } }
--- a/libpurple/protocols/oscar/oscar.c Mon Nov 12 16:15:53 2007 +0000 +++ b/libpurple/protocols/oscar/oscar.c Mon Nov 12 16:53:54 2007 +0000 @@ -994,7 +994,7 @@ gchar *msg; msg = g_strdup_printf(_("Could not connect to authentication server:\n%s"), error_message); - purple_connection_error(gc, msg); + purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR, msg); g_free(msg); } else if (conn->type == SNAC_FAMILY_LOCATE) @@ -1002,7 +1002,7 @@ gchar *msg; msg = g_strdup_printf(_("Could not connect to BOS server:\n%s"), error_message); - purple_connection_error(gc, msg); + purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR, msg); g_free(msg); } else @@ -1260,8 +1260,7 @@ if (!aim_snvalid(purple_account_get_username(account))) { gchar *buf; buf = g_strdup_printf(_("Unable to login: Could not sign on as %s because the screen name is invalid. Screen names must be a valid email address, or start with a letter and contain only letters, numbers and spaces, or contain only numbers."), purple_account_get_username(account)); - gc->wants_to_die = TRUE; - purple_connection_error(gc, buf); + purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_INVALID_SETTINGS, buf); g_free(buf); return; } @@ -1283,7 +1282,8 @@ connection_established_cb, newconn); if (newconn->connect_data == NULL) { - purple_connection_error(gc, _("Couldn't connect to host")); + purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR, + _("Couldn't connect to host")); return; } @@ -1344,43 +1344,37 @@ switch (info->errorcode) { case 0x01: /* Unregistered screen name */ - gc->wants_to_die = TRUE; - purple_connection_error(gc, _("Invalid screen name.")); + purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_INVALID_USERNAME, _("Invalid screen name.")); break; case 0x05: /* Incorrect password */ - gc->wants_to_die = TRUE; if (!purple_account_get_remember_password(account)) purple_account_set_password(account, NULL); - purple_connection_error(gc, _("Incorrect password.")); + purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_AUTHENTICATION_FAILED, _("Incorrect password.")); break; case 0x11: /* Suspended account */ - gc->wants_to_die = TRUE; - purple_connection_error(gc, _("Your account is currently suspended.")); + purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_AUTHENTICATION_FAILED, _("Your account is currently suspended.")); break; case 0x14: /* service temporarily unavailable */ - purple_connection_error(gc, _("The AOL Instant Messenger service is temporarily unavailable.")); + purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR, _("The AOL Instant Messenger service is temporarily unavailable.")); break; case 0x18: /* screen name connecting too frequently */ - gc->wants_to_die = TRUE; - purple_connection_error(gc, _("You have been connecting and disconnecting too frequently. Wait ten minutes and try again. If you continue to try, you will need to wait even longer.")); + purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_OTHER_ERROR, _("You have been connecting and disconnecting too frequently. Wait ten minutes and try again. If you continue to try, you will need to wait even longer.")); break; case 0x1c: /* client too old */ - gc->wants_to_die = TRUE; g_snprintf(buf, sizeof(buf), _("The client version you are using is too old. Please upgrade at %s"), PURPLE_WEBSITE); - purple_connection_error(gc, buf); + purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_OTHER_ERROR, buf); break; case 0x1d: /* IP address connecting too frequently */ - gc->wants_to_die = TRUE; - purple_connection_error(gc, _("You have been connecting and disconnecting too frequently. Wait ten minutes and try again. If you continue to try, you will need to wait even longer.")); + purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_OTHER_ERROR, _("You have been connecting and disconnecting too frequently. Wait ten minutes and try again. If you continue to try, you will need to wait even longer.")); break; default: - purple_connection_error(gc, _("Authentication failed")); + purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_AUTHENTICATION_FAILED, _("Authentication failed")); break; } purple_debug_info("oscar", "Login Error Code 0x%04hx\n", info->errorcode); @@ -1410,7 +1404,7 @@ g_free(host); if (newconn->connect_data == NULL) { - purple_connection_error(gc, _("Could Not Connect")); + purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR, _("Could Not Connect")); return 0; } @@ -1435,8 +1429,9 @@ PurpleConnection *gc = user_data; /* Disconnect */ - gc->wants_to_die = TRUE; - purple_connection_error(gc, _("The SecurID key entered is invalid.")); + purple_connection_error_reason(gc, + PURPLE_CONNECTION_ERROR_AUTHENTICATION_FAILED, + _("The SecurID key entered is invalid.")); } static int
--- a/libpurple/protocols/qq/keep_alive.c Mon Nov 12 16:15:53 2007 +0000 +++ b/libpurple/protocols/qq/keep_alive.c Mon Nov 12 16:53:54 2007 +0000 @@ -84,7 +84,8 @@ /* segments[0] and segment[1] are all 0x30 ("0") */ qd->all_online = strtol(segments[2], NULL, 10); if(0 == qd->all_online) - purple_connection_error(gc, _("Keep alive error")); + purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR, + _("Keep alive error")); g_free(qd->my_ip); qd->my_ip = g_strdup(segments[3]); qd->my_port = strtol(segments[4], NULL, 10);
--- a/libpurple/protocols/qq/login_logout.c Mon Nov 12 16:15:53 2007 +0000 +++ b/libpurple/protocols/qq/login_logout.c Mon Nov 12 16:53:54 2007 +0000 @@ -405,7 +405,7 @@ ">>> %d bytes -> [default] decrypt and dump\n%s", buf_len, hex_dump); try_dump_as_gbk(buf, buf_len); - purple_connection_error(gc, _("Error requesting login token")); + purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR, _("Error requesting login token")); } g_free(hex_dump); } @@ -479,13 +479,14 @@ switch (ret) { case QQ_LOGIN_REPLY_PWD_ERROR: - gc->wants_to_die = TRUE; if (!purple_account_get_remember_password(gc->account)) purple_account_set_password(gc->account, NULL); - purple_connection_error(gc, _("Incorrect password.")); + purple_connection_error_reason(gc, + PURPLE_CONNECTION_ERROR_AUTHENTICATION_FAILED, _("Incorrect password.")); break; case QQ_LOGIN_REPLY_MISC_ERROR: - purple_connection_error(gc, _("Unable to login, check debug log")); + purple_connection_error_reason(gc, + PURPLE_CONNECTION_ERROR_NETWORK_ERROR, _("Unable to login, check debug log")); break; case QQ_LOGIN_REPLY_OK: purple_debug(PURPLE_DEBUG_INFO, "QQ", "Login replys OK, everything is fine\n");
--- a/libpurple/protocols/qq/qq.c Mon Nov 12 16:15:53 2007 +0000 +++ b/libpurple/protocols/qq/qq.c Mon Nov 12 16:53:54 2007 +0000 @@ -136,7 +136,8 @@ purple_connection_update_progress(gc, _("Connecting"), 0, QQ_CONNECT_STEPS); if (qq_connect(account, qq_server, strtol(qq_port, NULL, 10), use_tcp, FALSE) < 0) - purple_connection_error(gc, _("Unable to connect.")); + purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR, + _("Unable to connect.")); } /* directly goes for qq_disconnect */
--- a/libpurple/protocols/qq/qq_proxy.c Mon Nov 12 16:15:53 2007 +0000 +++ b/libpurple/protocols/qq/qq_proxy.c Mon Nov 12 16:53:54 2007 +0000 @@ -139,7 +139,7 @@ g_return_if_fail(gc != NULL && gc->proto_data != NULL); if (source < 0) { /* socket returns -1 */ - purple_connection_error(gc, error_message); + purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR, error_message); return; } @@ -497,7 +497,7 @@ ret = send(qd->fd, data, len, 0); } if (ret == -1) - purple_connection_error(qd->gc, g_strerror(errno)); + purple_connection_error_reason(qd->gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR, g_strerror(errno)); return ret; }
--- a/libpurple/protocols/qq/recv_core.c Mon Nov 12 16:15:53 2007 +0000 +++ b/libpurple/protocols/qq/recv_core.c Mon Nov 12 16:53:54 2007 +0000 @@ -306,7 +306,8 @@ gc = (PurpleConnection *) data; if(cond != PURPLE_INPUT_READ) { - purple_connection_error(gc, _("Socket error")); + purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR, + _("Socket error")); return; } @@ -316,7 +317,8 @@ /* here we have UDP proxy suppport */ len = qq_proxy_read(qd, buf, MAX_PACKET_SIZE); if (len <= 0) { - purple_connection_error(gc, _("Unable to read from socket")); + purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR, + _("Unable to read from socket")); return; } else { _qq_packet_process(buf, len, gc);
--- a/libpurple/protocols/qq/sendqueue.c Mon Nov 12 16:15:53 2007 +0000 +++ b/libpurple/protocols/qq/sendqueue.c Mon Nov 12 16:53:54 2007 +0000 @@ -120,7 +120,8 @@ case QQ_CMD_KEEP_ALIVE: if (qd->logged_in) { purple_debug(PURPLE_DEBUG_ERROR, "QQ", "Connection lost!\n"); - purple_connection_error(gc, _("Connection lost")); + purple_connection_error_reason(gc, + PURPLE_CONNECTION_ERROR_NETWORK_ERROR, _("Connection lost")); qd->logged_in = FALSE; } p->resend_times = -1; @@ -128,7 +129,8 @@ case QQ_CMD_LOGIN: case QQ_CMD_REQUEST_LOGIN_TOKEN: if (!qd->logged_in) /* cancel login progress */ - purple_connection_error(gc, _("Login failed, no reply")); + purple_connection_error_reason(gc, + PURPLE_CONNECTION_ERROR_NETWORK_ERROR, _("Login failed, no reply")); p->resend_times = -1; break; default:{
--- a/libpurple/protocols/sametime/sametime.c Mon Nov 12 16:15:53 2007 +0000 +++ b/libpurple/protocols/sametime/sametime.c Mon Nov 12 16:53:54 2007 +0000 @@ -414,7 +414,9 @@ } else if(len > 0) { DEBUG_ERROR("write returned %i, %i bytes left unwritten\n", ret, len); - purple_connection_error(pd->gc, _("Connection closed (writing)")); + purple_connection_error_reason(pd->gc, + PURPLE_CONNECTION_ERROR_NETWORK_ERROR, + _("Connection closed (writing)")); #if 0 close(pd->socket); @@ -1552,7 +1554,38 @@ if(GPOINTER_TO_UINT(info) & ERR_FAILURE) { char *err = mwError(GPOINTER_TO_UINT(info)); - purple_connection_error(gc, err); + PurpleConnectionError reason; + switch (GPOINTER_TO_UINT(info)) { + case VERSION_MISMATCH: + reason = PURPLE_CONNECTION_ERROR_OTHER_ERROR; + break; + + case USER_RESTRICTED: + case INCORRECT_LOGIN: + case USER_UNREGISTERED: + case GUEST_IN_USE: + reason = PURPLE_CONNECTION_ERROR_AUTHENTICATION_FAILED; + break; + + case ENCRYPT_MISMATCH: + case ERR_ENCRYPT_NO_SUPPORT: + case ERR_NO_COMMON_ENCRYPT: + reason = PURPLE_CONNECTION_ERROR_ENCRYPTION_ERROR; + break; + + case VERIFICATION_DOWN: + reason = PURPLE_CONNECTION_ERROR_AUTHENTICATION_IMPOSSIBLE; + break; + + case MULTI_SERVER_LOGIN: + case MULTI_SERVER_LOGIN2: + reason = PURPLE_CONNECTION_ERROR_NAME_IN_USE; + break; + + default: + reason = PURPLE_CONNECTION_ERROR_NETWORK_ERROR; + } + purple_connection_error_reason(gc, reason, err); g_free(err); } break; @@ -1698,16 +1731,22 @@ } if(! ret) { + const char *msg = _("Connection reset"); DEBUG_INFO("connection reset\n"); - purple_connection_error(pd->gc, _("Connection reset")); + purple_connection_error_reason(pd->gc, + PURPLE_CONNECTION_ERROR_NETWORK_ERROR, + msg); } else if(ret < 0) { - char *msg = g_strerror(err); - - DEBUG_INFO("error in read callback: %s\n", msg); - - msg = g_strdup_printf(_("Error reading from socket: %s"), msg); - purple_connection_error(pd->gc, msg); + const gchar *err_str = g_strerror(err); + char *msg = NULL; + + DEBUG_INFO("error in read callback: %s\n", err_str); + + msg = g_strdup_printf(_("Error reading from socket: %s"), err_str); + purple_connection_error_reason(pd->gc, + PURPLE_CONNECTION_ERROR_NETWORK_ERROR, + msg); g_free(msg); } } @@ -1729,7 +1768,10 @@ } else { /* this is a regular connect, error out */ - purple_connection_error(pd->gc, _("Unable to connect to host")); + const char *msg = _("Unable to connect to host"); + purple_connection_error_reason(pd->gc, + PURPLE_CONNECTION_ERROR_NETWORK_ERROR, + msg); } return; @@ -3611,7 +3653,10 @@ static void prompt_host_cancel_cb(PurpleConnection *gc) { - purple_connection_error(gc, _("No Sametime Community Server specified")); + const char *msg = _("No Sametime Community Server specified"); + purple_connection_error_reason(gc, + PURPLE_CONNECTION_ERROR_INVALID_SETTINGS, + msg); } @@ -3723,7 +3768,8 @@ purple_connection_update_progress(gc, _("Connecting"), 1, MW_CONNECT_STEPS); if (purple_proxy_connect(gc, account, host, port, connect_cb, pd) == NULL) { - purple_connection_error(gc, _("Unable to connect to host")); + purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR, + _("Unable to connect to host")); } }
--- a/libpurple/protocols/silc/silc.c Mon Nov 12 16:15:53 2007 +0000 +++ b/libpurple/protocols/silc/silc.c Mon Nov 12 16:53:54 2007 +0000 @@ -314,34 +314,40 @@ /* Close the connection */ if (!sg->detaching) - purple_connection_error(gc, _("Disconnected by server")); + purple_connection_error_reason(gc, + PURPLE_CONNECTION_ERROR_NETWORK_ERROR, + _("Disconnected by server")); else /* TODO: Does this work correctly? Maybe we need to set wants_to_die? */ purple_account_disconnect(purple_connection_get_account(gc)); break; case SILC_CLIENT_CONN_ERROR: - purple_connection_error(gc, _("Error during connecting to SILC Server")); + purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR, + _("Error during connecting to SILC Server")); g_unlink(silcpurple_session_file(purple_account_get_username(sg->account))); break; case SILC_CLIENT_CONN_ERROR_KE: - purple_connection_error(gc, _("Key Exchange failed")); + purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_ENCRYPTION_ERROR, + _("Key Exchange failed")); break; case SILC_CLIENT_CONN_ERROR_AUTH: - purple_connection_error(gc, _("Authentication failed")); + purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_AUTHENTICATION_FAILED, + _("Authentication failed")); break; case SILC_CLIENT_CONN_ERROR_RESUME: - purple_connection_error(gc, - _("Resuming detached session failed. " - "Press Reconnect to create new connection.")); + purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_OTHER_ERROR, + _("Resuming detached session failed. " + "Press Reconnect to create new connection.")); g_unlink(silcpurple_session_file(purple_account_get_username(sg->account))); break; case SILC_CLIENT_CONN_ERROR_TIMEOUT: - purple_connection_error(gc, _("Connection Timeout")); + purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR, + _("Connection Timeout")); break; } @@ -362,7 +368,9 @@ sg = gc->proto_data; if (status != SILC_SOCKET_OK) { - purple_connection_error(gc, _("Connection failed")); + purple_connection_error_reason(gc, + PURPLE_CONNECTION_ERROR_NETWORK_ERROR, + _("Connection failed")); silc_pkcs_public_key_free(sg->public_key); silc_pkcs_private_key_free(sg->private_key); silc_free(sg); @@ -408,7 +416,8 @@ sg = gc->proto_data; if (source < 0) { - purple_connection_error(gc, _("Connection failed")); + purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR, + _("Connection failed")); silc_pkcs_public_key_free(sg->public_key); silc_pkcs_private_key_free(sg->private_key); silc_free(sg); @@ -416,7 +425,7 @@ return; } - silc_hash_alloc("sha1", &sg->sha1hash); + silc_hash_alloc((unsigned char *)"sha1", &sg->sha1hash); /* Wrap socket to TCP stream */ silc_socket_tcp_stream_create(source, TRUE, FALSE, @@ -431,6 +440,7 @@ PurpleAccount *account = purple_connection_get_account(gc); char pkd[256], prd[256]; + /* Progress */ purple_connection_update_progress(gc, _("Connecting to SILC Server"), 1, 5); @@ -441,8 +451,8 @@ (char *)purple_account_get_string(account, "private-key", prd), (gc->password == NULL) ? "" : gc->password, &sg->public_key, &sg->private_key)) { - g_snprintf(pkd, sizeof(pkd), _("Could not load SILC key pair")); - purple_connection_error(gc, pkd); + purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_OTHER_ERROR, + _("Could not load SILC key pair")); gc->proto_data = NULL; silc_free(sg); return; @@ -455,7 +465,8 @@ purple_account_get_int(account, "port", 706), silcpurple_login_connected, gc) == NULL) { - purple_connection_error(gc, _("Unable to create connection")); + purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR, + _("Unable to create connection")); gc->proto_data = NULL; silc_free(sg); return; @@ -484,7 +495,8 @@ /* Allocate SILC client */ client = silc_client_alloc(&ops, ¶ms, gc, NULL); if (!client) { - purple_connection_error(gc, _("Out of memory")); + purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_OTHER_ERROR, + _("Out of memory")); return; } @@ -534,8 +546,8 @@ /* Init SILC client */ if (!silc_client_init(client, username, hostname, realname, silcpurple_running, sg)) { - gc->wants_to_die = TRUE; - purple_connection_error(gc, _("Cannot initialize SILC protocol")); + purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_OTHER_ERROR, + _("Cannot initialize SILC protocol")); gc->proto_data = NULL; silc_free(sg); return; @@ -543,8 +555,8 @@ /* Check the ~/.silc dir and create it, and new key pair if necessary. */ if (!silcpurple_check_silc_dir(gc)) { - gc->wants_to_die = TRUE; - purple_connection_error(gc, _("Error loading SILC key pair")); + purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_OTHER_ERROR, + _("Error loading SILC key pair")); gc->proto_data = NULL; silc_free(sg); return;
--- a/libpurple/protocols/silc/util.c Mon Nov 12 16:15:53 2007 +0000 +++ b/libpurple/protocols/silc/util.c Mon Nov 12 16:53:54 2007 +0000 @@ -212,7 +212,8 @@ (gc->password == NULL) ? "" : gc->password, NULL, NULL, FALSE)) { - purple_connection_error(gc, _("Cannot create SILC key pair\n")); + purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_OTHER_ERROR, + _("Cannot create SILC key pair\n")); return FALSE; } @@ -254,7 +255,8 @@ (gc->password == NULL) ? "" : gc->password, NULL, NULL, FALSE)) { - purple_connection_error(gc, _("Cannot create SILC key pair\n")); + purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_OTHER_ERROR, + _("Cannot create SILC key pair\n")); return FALSE; }
--- a/libpurple/protocols/silc10/buddy.c Mon Nov 12 16:15:53 2007 +0000 +++ b/libpurple/protocols/silc10/buddy.c Mon Nov 12 16:53:54 2007 +0000 @@ -311,7 +311,7 @@ purple_request_action_with_hint(client->application, _("Key Agreement Request"), tmp, hostname ? tmp2 : NULL, 1, gc->account, client_entry->nickname, - NULL, a, PURPLE_REQUEST_UI_HINT_BLIST, 2, _("Yes"), G_CALLBACK(silcpurple_buddy_keyagr_request_cb), + NULL, PURPLE_REQUEST_UI_HINT_BLIST, a, 2, _("Yes"), G_CALLBACK(silcpurple_buddy_keyagr_request_cb), _("No"), G_CALLBACK(silcpurple_buddy_keyagr_request_cb)); }
--- a/libpurple/protocols/silc10/pk.c Mon Nov 12 16:15:53 2007 +0000 +++ b/libpurple/protocols/silc10/pk.c Mon Nov 12 16:53:54 2007 +0000 @@ -115,7 +115,7 @@ purple_request_action_with_hint(gc, _("Verify Public Key"), tmp, tmp2, PURPLE_DEFAULT_ACTION_NONE, - purple_connection_get_account(gc), entity, NULL, verify, PURPLE_REQUEST_UI_HINT_BLIST, 3, + purple_connection_get_account(gc), entity, NULL, PURPLE_REQUEST_UI_HINT_BLIST, verify, 3, _("Yes"), G_CALLBACK(silcpurple_verify_cb), _("No"), G_CALLBACK(silcpurple_verify_cb), _("_View..."), G_CALLBACK(silcpurple_verify_details));
--- a/libpurple/protocols/silc10/util.c Mon Nov 12 16:15:53 2007 +0000 +++ b/libpurple/protocols/silc10/util.c Mon Nov 12 16:53:54 2007 +0000 @@ -667,7 +667,7 @@ text = purple_unescape_html(tmp); g_free(tmp); /* Add text */ - silc_mime_add_data(p, text, strlen(text)); + silc_mime_add_data(p, (unsigned char *)text, strlen(text)); g_free(text); if (!parts) @@ -720,7 +720,7 @@ "text/plain; charset=utf-8"); /* Add text */ - silc_mime_add_data(p, tmp, strlen(tmp)); + silc_mime_add_data(p, (unsigned char *)tmp, strlen(tmp)); g_free(tmp); if (!parts)
--- a/libpurple/protocols/simple/simple.c Mon Nov 12 16:15:53 2007 +0000 +++ b/libpurple/protocols/simple/simple.c Mon Nov 12 16:53:54 2007 +0000 @@ -414,7 +414,9 @@ written = 0; else if(written <= 0) { /*TODO: do we really want to disconnect on a failure to write?*/ - purple_connection_error(gc, _("Could not write")); + purple_connection_error_reason(gc, + PURPLE_CONNECTION_ERROR_NETWORK_ERROR, + _("Could not write")); return; } @@ -436,7 +438,9 @@ } if(source < 0) { - purple_connection_error(gc, _("Could not connect")); + purple_connection_error_reason(gc, + PURPLE_CONNECTION_ERROR_NETWORK_ERROR, + _("Could not connect")); return; } @@ -462,7 +466,7 @@ if(!sip->connecting) { purple_debug_info("simple", "connecting to %s port %d\n", sip->realhostname ? sip->realhostname : "{NULL}", sip->realport); if (purple_proxy_connect(gc, sip->account, sip->realhostname, sip->realport, send_later_cb, gc) == NULL) { - purple_connection_error(gc, _("Couldn't create socket")); + purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR, _("Couldn't create socket")); } sip->connecting = TRUE; } @@ -1101,11 +1105,11 @@ if(sip->registerstatus != SIMPLE_REGISTER_RETRY) { purple_debug_info("simple", "REGISTER retries %d\n", sip->registrar.retries); if(sip->registrar.retries > SIMPLE_REGISTER_RETRY_MAX) { - purple_debug_info("simple", "Setting wants_to_die to true.\n"); - sip->gc->wants_to_die = TRUE; if (!purple_account_get_remember_password(sip->gc->account)) purple_account_set_password(sip->gc->account, NULL); - purple_connection_error(sip->gc, _("Incorrect password.")); + purple_connection_error_reason(sip->gc, + PURPLE_CONNECTION_ERROR_AUTHENTICATION_FAILED, + _("Incorrect password.")); return TRUE; } tmp = sipmsg_find_header(msg, "WWW-Authenticate"); @@ -1118,8 +1122,9 @@ if (sip->registerstatus != SIMPLE_REGISTER_RETRY) { purple_debug_info("simple", "Unrecognized return code for REGISTER.\n"); if (sip->registrar.retries > SIMPLE_REGISTER_RETRY_MAX) { - sip->gc->wants_to_die = TRUE; - purple_connection_error(sip->gc, _("Unknown server response.")); + purple_connection_error_reason(sip->gc, + PURPLE_CONNECTION_ERROR_OTHER_ERROR, + _("Unknown server response.")); return TRUE; } sip->registerstatus = SIMPLE_REGISTER_RETRY; @@ -1681,7 +1686,9 @@ } if(source < 0) { - purple_connection_error(gc, _("Could not connect")); + purple_connection_error_reason(gc, + PURPLE_CONNECTION_ERROR_NETWORK_ERROR, + _("Could not connect")); return; } @@ -1715,7 +1722,9 @@ sip->listen_data = NULL; if(listenfd == -1) { - purple_connection_error(sip->gc, _("Could not create listen socket")); + purple_connection_error_reason(sip->gc, + PURPLE_CONNECTION_ERROR_NETWORK_ERROR, + _("Could not create listen socket")); return; } @@ -1738,7 +1747,9 @@ sip->query_data = NULL; if (!hosts || !hosts->data) { - purple_connection_error(sip->gc, _("Couldn't resolve host")); + purple_connection_error_reason(sip->gc, + PURPLE_CONNECTION_ERROR_NETWORK_ERROR, + _("Couldn't resolve host")); return; } @@ -1757,7 +1768,9 @@ sip->listen_data = purple_network_listen_range(5060, 5160, SOCK_DGRAM, simple_udp_host_resolved_listen_cb, sip); if (sip->listen_data == NULL) { - purple_connection_error(sip->gc, _("Could not create listen socket")); + purple_connection_error_reason(sip->gc, + PURPLE_CONNECTION_ERROR_NETWORK_ERROR, + _("Could not create listen socket")); return; } } @@ -1770,7 +1783,9 @@ sip->listenfd = listenfd; if(sip->listenfd == -1) { - purple_connection_error(sip->gc, _("Could not create listen socket")); + purple_connection_error_reason(sip->gc, + PURPLE_CONNECTION_ERROR_NETWORK_ERROR, + _("Could not create listen socket")); return; } @@ -1783,7 +1798,9 @@ /* open tcp connection to the server */ if (purple_proxy_connect(sip->gc, sip->account, sip->realhostname, sip->realport, login_cb, sip->gc) == NULL) { - purple_connection_error(sip->gc, _("Couldn't create socket")); + purple_connection_error_reason(sip->gc, + PURPLE_CONNECTION_ERROR_NETWORK_ERROR, + _("Couldn't create socket")); } } @@ -1821,7 +1838,9 @@ sip->listen_data = purple_network_listen_range(5060, 5160, SOCK_STREAM, simple_tcp_connect_listen_cb, sip); if (sip->listen_data == NULL) { - purple_connection_error(sip->gc, _("Could not create listen socket")); + purple_connection_error_reason(sip->gc, + PURPLE_CONNECTION_ERROR_NETWORK_ERROR, + _("Could not create listen socket")); return; } } else { /* UDP */ @@ -1829,7 +1848,9 @@ sip->query_data = purple_dnsquery_a(hostname, port, simple_udp_host_resolved, sip); if (sip->query_data == NULL) { - purple_connection_error(sip->gc, _("Could not resolve hostname")); + purple_connection_error_reason(sip->gc, + PURPLE_CONNECTION_ERROR_NETWORK_ERROR, + _("Could not resolve hostname")); } } } @@ -1845,8 +1866,9 @@ gc = purple_account_get_connection(account); if (strpbrk(username, " \t\v\r\n") != NULL) { - gc->wants_to_die = TRUE; - purple_connection_error(gc, _("SIP screen names may not contain whitespaces or @ symbols")); + purple_connection_error_reason(gc, + PURPLE_CONNECTION_ERROR_INVALID_SETTINGS, + _("SIP screen names may not contain whitespaces or @ symbols")); return; }
--- a/libpurple/protocols/yahoo/yahoo.c Mon Nov 12 16:15:53 2007 +0000 +++ b/libpurple/protocols/yahoo/yahoo.c Mon Nov 12 16:53:54 2007 +0000 @@ -201,10 +201,10 @@ char *message = NULL; if (pkt->service == YAHOO_SERVICE_LOGOFF && pkt->status == -1) { - gc->wants_to_die = TRUE; if (!purple_account_get_remember_password(account)) purple_account_set_password(account, NULL); - purple_connection_error(gc, _("You have signed on from another location.")); + purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NAME_IN_USE, + _("You have signed on from another location.")); return; } @@ -2090,6 +2090,7 @@ char *url = NULL; char *fullmsg; PurpleAccount *account = gc->account; + PurpleConnectionError reason = PURPLE_CONNECTION_ERROR_AUTHENTICATION_FAILED; while (l) { struct yahoo_pair *pair = l->data; @@ -2105,6 +2106,7 @@ switch (err) { case 3: msg = g_strdup(_("Invalid screen name.")); + reason = PURPLE_CONNECTION_ERROR_INVALID_USERNAME; break; case 13: #ifdef TRY_WEBMESSENGER_LOGIN @@ -2139,8 +2141,7 @@ else fullmsg = g_strdup(msg); - gc->wants_to_die = TRUE; - purple_connection_error(gc, fullmsg); + purple_connection_error_reason(gc, reason, fullmsg); g_free(msg); g_free(fullmsg); } @@ -2464,11 +2465,12 @@ tmp = g_strdup_printf(_("Lost connection with server:\n%s"), g_strerror(errno)); - purple_connection_error(gc, tmp); + purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR, tmp); g_free(tmp); return; } else if (len == 0) { - purple_connection_error(gc, _("Server closed the connection.")); + purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR, + _("Server closed the connection.")); return; } @@ -2559,7 +2561,7 @@ gchar *tmp; tmp = g_strdup_printf(_("Could not establish a connection with the server:\n%s"), error_message); - purple_connection_error(gc, tmp); + purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR, tmp); g_free(tmp); return; } @@ -2591,7 +2593,7 @@ gchar *tmp; tmp = g_strdup_printf(_("Could not establish a connection with the server:\n%s"), error_message); - purple_connection_error(gc, tmp); + purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR, tmp); g_free(tmp); return; } @@ -2631,11 +2633,12 @@ tmp = g_strdup_printf(_("Lost connection with server:\n%s"), g_strerror(errno)); - purple_connection_error(gc, tmp); + purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR, tmp); g_free(tmp); return; } else if (len == 0) { - purple_connection_error(gc, _("Server closed the connection.")); + purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR, + _("Server closed the connection.")); return; } @@ -2650,7 +2653,8 @@ if ((strncmp(buf, "HTTP/1.0 302", strlen("HTTP/1.0 302")) && strncmp(buf, "HTTP/1.1 302", strlen("HTTP/1.1 302")))) { - purple_connection_error(gc, _("Received unexpected HTTP response from server.")); + purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR, + _("Received unexpected HTTP response from server.")); return; } @@ -2672,9 +2676,10 @@ yd->rxlen = 0; /* Now we have our cookies to login with. I'll go get the milk. */ if (purple_proxy_connect(gc, account, "wcs2.msg.dcn.yahoo.com", - purple_account_get_int(account, "port", YAHOO_PAGER_PORT), - yahoo_got_web_connected, gc) == NULL) { - purple_connection_error(gc, _("Connection problem")); + purple_account_get_int(account, "port", YAHOO_PAGER_PORT), + yahoo_got_web_connected, gc) == NULL) { + purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR, + _("Connection problem")); return; } } @@ -2702,7 +2707,7 @@ gc->inpa = 0; tmp = g_strdup_printf(_("Lost connection with %s:\n%s"), "login.yahoo.com:80", g_strerror(errno)); - purple_connection_error(gc, tmp); + purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR, tmp); g_free(tmp); return; } @@ -2727,7 +2732,7 @@ gchar *tmp; tmp = g_strdup_printf(_("Could not establish a connection with %s:\n%s"), "login.yahoo.com:80", error_message); - purple_connection_error(gc, tmp); + purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR, tmp); g_free(tmp); return; } @@ -2811,7 +2816,8 @@ if (error_message != NULL) { - purple_connection_error(gc, error_message); + purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR, + error_message); return; } @@ -2860,7 +2866,8 @@ g_hash_table_destroy(hash); yd->auth = g_string_free(url, FALSE); if (purple_proxy_connect(gc, account, "login.yahoo.com", 80, yahoo_got_cookies, gc) == NULL) { - purple_connection_error(gc, _("Connection problem")); + purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR, + _("Connection problem")); return; } @@ -2963,7 +2970,8 @@ purple_account_get_int(account, "port", YAHOO_PAGER_PORT), yahoo_got_connected, gc) == NULL) { - purple_connection_error(gc, _("Connection problem")); + purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR, + _("Connection problem")); return; } } else { @@ -2973,7 +2981,8 @@ purple_account_get_int(account, "port", YAHOO_PAGER_PORT), yahoo_got_connected, gc) == NULL) { - purple_connection_error(gc, _("Connection problem")); + purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR, + _("Connection problem")); return; } }
--- a/libpurple/protocols/yahoo/yahoo_packet.c Mon Nov 12 16:15:53 2007 +0000 +++ b/libpurple/protocols/yahoo/yahoo_packet.c Mon Nov 12 16:53:54 2007 +0000 @@ -303,7 +303,8 @@ return; else if (ret < 0) { /* TODO: what to do here - do we really have to disconnect? */ - purple_connection_error(yd->gc, _("Write Error")); + purple_connection_error_reason(yd->gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR, + _("Write Error")); return; }
--- a/libpurple/protocols/yahoo/ycht.c Mon Nov 12 16:15:53 2007 +0000 +++ b/libpurple/protocols/yahoo/ycht.c Mon Nov 12 16:53:54 2007 +0000 @@ -285,7 +285,8 @@ else if (ret <= 0) { /* TODO: error handling */ /* - purple_connection_error(purple_account_get_connection(irc->account), + purple_connection_error_reason(purple_account_get_connection(irc->account), + PURPLE_CONNECTION_ERROR_NETWORK_ERROR, _("Server has disconnected")); */ return;
--- a/libpurple/purple-uninstalled.pc.in Mon Nov 12 16:15:53 2007 +0000 +++ b/libpurple/purple-uninstalled.pc.in Mon Nov 12 16:53:54 2007 +0000 @@ -3,6 +3,7 @@ libdir=@libdir@ includedir=@includedir@ datadir=@datadir@ +datarootdir=@datarootdir@ sysconfdir=@sysconfdir@ Name: libpurple
--- a/libpurple/purple.pc.in Mon Nov 12 16:15:53 2007 +0000 +++ b/libpurple/purple.pc.in Mon Nov 12 16:53:54 2007 +0000 @@ -3,8 +3,9 @@ libdir=@libdir@ includedir=@includedir@ datadir=@datadir@ +datarootdir=@datarootdir@ sysconfdir=@sysconfdir@ - + Name: libpurple Description: libpurple is a GLib-based instant messenger library. Version: @VERSION@
--- a/libpurple/signals.c Mon Nov 12 16:15:53 2007 +0000 +++ b/libpurple/signals.c Mon Nov 12 16:53:54 2007 +0000 @@ -649,6 +649,16 @@ ((void (*)(void *, gint, gint, void *))cb)(arg1, arg2, arg3, data); } +void purple_marshal_VOID__POINTER_INT_POINTER(PurpleCallback cb, va_list args, + void *data, void **return_val) +{ + void *arg1 = va_arg(args, void *); + gint arg2 = va_arg(args, gint); + void *arg3 = va_arg(args, void *); + + ((void (*)(void *, gint, void *, void *))cb)(arg1, arg2, arg3, data); +} + void purple_marshal_VOID__POINTER_POINTER(PurpleCallback cb, va_list args, void *data, void **return_val)
--- a/libpurple/signals.h Mon Nov 12 16:15:53 2007 +0000 +++ b/libpurple/signals.h Mon Nov 12 16:53:54 2007 +0000 @@ -284,6 +284,8 @@ PurpleCallback cb, va_list args, void *data, void **return_val); void purple_marshal_VOID__POINTER_INT_INT( PurpleCallback cb, va_list args, void *data, void **return_val); +void purple_marshal_VOID__POINTER_INT_POINTER( + PurpleCallback cb, va_list args, void *data, void **return_val); void purple_marshal_VOID__POINTER_POINTER( PurpleCallback cb, va_list args, void *data, void **return_val); void purple_marshal_VOID__POINTER_POINTER_UINT(
--- a/libpurple/sslconn.h Mon Nov 12 16:15:53 2007 +0000 +++ b/libpurple/sslconn.h Mon Nov 12 16:53:54 2007 +0000 @@ -26,11 +26,6 @@ #ifndef _PURPLE_SSLCONN_H_ #define _PURPLE_SSLCONN_H_ -#include "certificate.h" -#include "proxy.h" - -#define PURPLE_SSL_DEFAULT_PORT 443 - /** Possible SSL errors. */ typedef enum { @@ -39,6 +34,11 @@ PURPLE_SSL_CERTIFICATE_INVALID = 3 } PurpleSslErrorType; +#include "certificate.h" +#include "proxy.h" + +#define PURPLE_SSL_DEFAULT_PORT 443 + typedef struct _PurpleSslConnection PurpleSslConnection; typedef void (*PurpleSslInputFunction)(gpointer, PurpleSslConnection *, @@ -126,9 +126,9 @@ /** Obtains the certificate chain provided by the peer * * @param gsc Connection context - * @return A newly allocated list of #PurpleCertificate containing the - * certificates the peer provided. - * @see purple_ssl_get_peer_certificates + * @return A newly allocated list containing the certificates + * the peer provided. + * @see PurpleCertificate * @todo Decide whether the ordering of certificates in this * list can be guaranteed. */
--- a/libpurple/win32/global.mak Mon Nov 12 16:15:53 2007 +0000 +++ b/libpurple/win32/global.mak Mon Nov 12 16:53:54 2007 +0000 @@ -20,7 +20,7 @@ NSPR_TOP ?= $(WIN32_DEV_TOP)/nspr-4.6.4 NSS_TOP ?= $(WIN32_DEV_TOP)/nss-3.11.4 PERL_LIB_TOP ?= $(WIN32_DEV_TOP)/perl58 -SILC_TOOLKIT ?= $(WIN32_DEV_TOP)/silc-toolkit-1.1.2 +SILC_TOOLKIT ?= $(WIN32_DEV_TOP)/silc-toolkit-1.1.5 TCL_LIB_TOP ?= $(WIN32_DEV_TOP)/tcl-8.4.5 GSTREAMER_TOP ?= $(WIN32_DEV_TOP)/gstreamer-0.10.13
--- a/libpurple/xmlnode.c Mon Nov 12 16:15:53 2007 +0000 +++ b/libpurple/xmlnode.c Mon Nov 12 16:53:54 2007 +0000 @@ -590,7 +590,7 @@ } for(i=0; i < nb_attributes * 5; i+=5) { - const char *prefix = attributes[i + 1]; + const char *prefix = (const char *)attributes[i + 1]; char *txt; int attrib_len = attributes[i+4] - attributes[i+3]; char *attrib = g_malloc(attrib_len + 1);
--- a/pidgin/Makefile.am Mon Nov 12 16:15:53 2007 +0000 +++ b/pidgin/Makefile.am Mon Nov 12 16:53:54 2007 +0000 @@ -118,7 +118,8 @@ gtkstatusbox.c \ gtkthemes.c \ gtkutils.c \ - gtkwhiteboard.c + gtkwhiteboard.c \ + minidialog.c pidgin_headers = \ eggtrayicon.h \ @@ -170,6 +171,7 @@ gtkthemes.h \ gtkutils.h \ gtkwhiteboard.h \ + minidialog.h \ pidgin.h pidginincludedir=$(includedir)/pidgin
--- a/pidgin/Makefile.mingw Mon Nov 12 16:15:53 2007 +0000 +++ b/pidgin/Makefile.mingw Mon Nov 12 16:53:54 2007 +0000 @@ -93,6 +93,7 @@ gtkthemes.c \ gtkutils.c \ gtkwhiteboard.c \ + minidialog.c \ pidginstock.c \ win32/MinimizeToTray.c \ win32/gtkdocklet-win32.c \
--- a/pidgin/gtkblist.c Mon Nov 12 16:15:53 2007 +0000 +++ b/pidgin/gtkblist.c Mon Nov 12 16:53:54 2007 +0000 @@ -58,6 +58,7 @@ #include "gtkstatusbox.h" #include "gtkscrollbook.h" #include "gtkutils.h" +#include "pidgin/minidialog.h" #include <gdk/gdkkeysyms.h> #include <gtk/gtk.h> @@ -107,6 +108,21 @@ GList *entries; } PidginJoinChatData; +typedef struct +{ + /** PidginScrollBook used to hold error minidialogs. Gets packed + * inside PidginBuddyList.error_buttons + */ + GtkWidget *error_scrollbook; + + /** Pointer to the mini-dialog about having signed on elsewhere, if one + * is showing; @c NULL otherwise. + */ + PidginMiniDialog *signed_on_elsewhere; +} PidginBuddyListPrivate; + +#define PIDGIN_BUDDY_LIST_GET_PRIVATE(list) \ + ((PidginBuddyListPrivate *)((list)->priv)) static GtkWidget *accountmenu = NULL; @@ -4125,10 +4141,13 @@ static void pidgin_blist_new_list(PurpleBuddyList *blist) { PidginBuddyList *gtkblist; + PidginBuddyListPrivate *priv; gtkblist = g_new0(PidginBuddyList, 1); gtkblist->connection_errors = g_hash_table_new_full(g_direct_hash, g_direct_equal, NULL, g_free); + gtkblist->priv = priv = g_new0(PidginBuddyListPrivate, 1); + blist->ui_data = gtkblist; } @@ -4284,6 +4303,13 @@ widget->allocation.width - 2 - HEADLINE_CLOSE_SIZE, 2, HEADLINE_CLOSE_SIZE, HEADLINE_CLOSE_SIZE, GDK_RGB_DITHER_NONE, 0, 0); +#if 0 + /* The presence of one opening paren in each branch of + * GTK_CHECK_VERSION confuses vim's bracket matching for the + * rest of the file. + */ + ) +#endif gtk_paint_focus(widget->style, widget->window, GTK_STATE_PRELIGHT, NULL, widget, NULL, widget->allocation.width - HEADLINE_CLOSE_SIZE - 3, 1, @@ -4354,124 +4380,363 @@ /* Connection error handling stuff */ /***********************************/ +#define OBJECT_DATA_KEY_ACCOUNT "account" + +static gboolean +find_account_widget(GObject *widget, + PurpleAccount *account) +{ + if (g_object_get_data(widget, OBJECT_DATA_KEY_ACCOUNT) == account) + return 0; /* found */ + else + return 1; +} + static void -ce_modify_account_cb(PurpleAccount *account) +pack_prpl_icon_start(GtkWidget *box, + PurpleAccount *account) +{ + GdkPixbuf *pixbuf; + GtkWidget *image; + + pixbuf = pidgin_create_prpl_icon(account, PIDGIN_PRPL_ICON_SMALL); + if (pixbuf != NULL) { + image = gtk_image_new_from_pixbuf(pixbuf); + g_object_unref(pixbuf); + + gtk_box_pack_start(GTK_BOX(box), image, FALSE, FALSE, 0); + } +} + +static void +add_error_dialog(PidginBuddyList *gtkblist, + GtkWidget *dialog) +{ + PidginBuddyListPrivate *priv = PIDGIN_BUDDY_LIST_GET_PRIVATE(gtkblist); + gtk_container_add(GTK_CONTAINER(priv->error_scrollbook), dialog); + + if (!GTK_WIDGET_HAS_FOCUS(gtkblist->window)) + pidgin_set_urgent(GTK_WINDOW(gtkblist->window), TRUE); +} + +static GtkWidget * +find_child_widget_by_account(GtkContainer *container, + PurpleAccount *account) +{ + GList *l = NULL; + GList *children = gtk_container_get_children(container); + GtkWidget *ret = NULL; + l = g_list_find_custom(children, account, (GCompareFunc) find_account_widget); + if (l) + ret = GTK_WIDGET(l->data); + g_list_free(children); + return ret; +} + +static void +remove_child_widget_by_account(GtkContainer *container, + PurpleAccount *account) +{ + GtkWidget *widget = find_child_widget_by_account(container, account); + if(widget) + gtk_widget_destroy(widget); +} + +/* Generic error buttons */ + +static void +generic_error_modify_cb(PurpleAccount *account) { pidgin_account_dialog_show(PIDGIN_MODIFY_ACCOUNT_DIALOG, account); } static void -ce_enable_account_cb(PurpleAccount *account) +generic_error_enable_cb(PurpleAccount *account) +{ + purple_account_set_enabled(account, purple_core_get_ui(), TRUE); +} + +static void +generic_error_ignore_cb(PurpleAccount *account) +{ + purple_account_clear_current_error(account); +} + +static void +generic_error_destroy_cb(GtkObject *dialog, + PurpleAccount *account) +{ + g_hash_table_remove(gtkblist->connection_errors, account); +} + +static void +add_generic_error_dialog(PurpleAccount *account, + const PurpleConnectionErrorInfo *err) +{ + GtkWidget *mini_dialog; + const char *username = purple_account_get_username(account); + gboolean enabled = + purple_account_get_enabled(account, purple_core_get_ui()); + char *primary; + + if (enabled) + primary = g_strdup_printf(_("%s disconnected"), username); + else + primary = g_strdup_printf(_("%s disabled"), username); + + mini_dialog = pidgin_make_mini_dialog(NULL, PIDGIN_STOCK_DIALOG_ERROR, + primary, err->description, account, + (enabled ? _("Reconnect") : _("Re-enable")), + (enabled ? PURPLE_CALLBACK(purple_account_connect) + : PURPLE_CALLBACK(generic_error_enable_cb)), + _("Modify Account"), PURPLE_CALLBACK(generic_error_modify_cb), + _("Ignore"), PURPLE_CALLBACK(generic_error_ignore_cb), + NULL); + + g_free(primary); + + g_object_set_data(G_OBJECT(mini_dialog), OBJECT_DATA_KEY_ACCOUNT, + account); + + g_signal_connect_after(mini_dialog, "destroy", + (GCallback)generic_error_destroy_cb, + account); + + add_error_dialog(gtkblist, mini_dialog); +} + +static void +remove_generic_error_dialog(PurpleAccount *account) +{ + PidginBuddyListPrivate *priv = PIDGIN_BUDDY_LIST_GET_PRIVATE(gtkblist); + remove_child_widget_by_account(GTK_CONTAINER(priv->error_scrollbook), + account); +} + + +/* Notifications about accounts which were disconnected with + * PURPLE_CONNECTION_ERROR_NAME_IN_USE + */ + +typedef void (*AccountFunction)(PurpleAccount *); + +static void +elsewhere_foreach_account(PidginMiniDialog *mini_dialog, + AccountFunction f) +{ + PurpleAccount *account; + GList *labels = gtk_container_get_children( + GTK_CONTAINER(mini_dialog->contents)); + GList *l; + + for (l = labels; l; l = l->next) { + account = g_object_get_data(G_OBJECT(l->data), OBJECT_DATA_KEY_ACCOUNT); + if (account) + f(account); + else + purple_debug_warning("gtkblist", "mini_dialog's child " + "didn't have an account stored in it!"); + } + g_list_free(labels); +} + +static void +enable_account(PurpleAccount *account) { purple_account_set_enabled(account, purple_core_get_ui(), TRUE); } static void -connection_error_button_clicked_cb(GtkButton *widget, gpointer user_data) -{ - PurpleAccount *account; - char *primary; - const char *text; - gboolean enabled; - GList *list; - - account = user_data; - primary = g_strdup_printf(_("%s disconnected"), - purple_account_get_username(account)); - text = g_hash_table_lookup(gtkblist->connection_errors, account); - - enabled = purple_account_get_enabled(account, purple_core_get_ui()); - purple_request_action_with_hint(account, _("Connection Error"), primary, text, 2, - account, NULL, NULL, - PURPLE_REQUEST_UI_HINT_ACCOUNT, account, 3, - _("OK"), NULL, - _("Modify Account"), PURPLE_CALLBACK(ce_modify_account_cb), - enabled ? _("Connect") : _("Re-enable Account"), - enabled ? PURPLE_CALLBACK(purple_account_connect) : - PURPLE_CALLBACK(ce_enable_account_cb)); - g_free(primary); - gtk_widget_destroy(GTK_WIDGET(widget)); - g_hash_table_remove(gtkblist->connection_errors, account); - if ((list = gtk_container_get_children(GTK_CONTAINER(gtkblist->error_buttons))) == NULL) { - gtk_widget_hide(gtkblist->error_buttons); - } else { - g_list_free(list); - } -} - -/* Add some buttons that show connection errors */ +reconnect_elsewhere_accounts(PidginMiniDialog *mini_dialog, + GtkButton *button, + gpointer unused) +{ + elsewhere_foreach_account(mini_dialog, enable_account); +} + +static void +ignore_elsewhere_accounts(PidginMiniDialog *mini_dialog, + GtkButton *button, + gpointer unused) +{ + elsewhere_foreach_account(mini_dialog, purple_account_clear_current_error); +} + static void -create_connection_error_buttons(gpointer key, gpointer value, - gpointer user_data) -{ - PurpleAccount *account; - gchar *escaped, *text; - GtkWidget *button, *label, *image, *hbox; - GdkPixbuf *pixbuf; - - account = key; - escaped = g_markup_escape_text((const gchar *)value, -1); - text = g_strdup_printf(_("<span color=\"red\">%s disconnected: %s</span>"), - purple_account_get_username(account), - escaped); - g_free(escaped); +ensure_signed_on_elsewhere_minidialog(PidginBuddyList *gtkblist) +{ + PidginBuddyListPrivate *priv = PIDGIN_BUDDY_LIST_GET_PRIVATE(gtkblist); + PidginMiniDialog *mini_dialog; + + if(priv->signed_on_elsewhere) + return; + + mini_dialog = priv->signed_on_elsewhere = + pidgin_mini_dialog_new(NULL, NULL, PIDGIN_STOCK_DISCONNECT); + + pidgin_mini_dialog_add_button(mini_dialog, _("Re-enable"), + reconnect_elsewhere_accounts, NULL); + + pidgin_mini_dialog_add_button(mini_dialog, _("Ignore"), + ignore_elsewhere_accounts, NULL); + + add_error_dialog(gtkblist, GTK_WIDGET(mini_dialog)); + + /* Set priv->signed_on_elsewhere to NULL when the dialog is destroyed */ + g_signal_connect(G_OBJECT(mini_dialog), "destroy", + (GCallback) gtk_widget_destroyed, &(priv->signed_on_elsewhere)); +} + +static void +update_signed_on_elsewhere_minidialog_title(void) +{ + PidginBuddyListPrivate *priv = PIDGIN_BUDDY_LIST_GET_PRIVATE(gtkblist); + PidginMiniDialog *mini_dialog = priv->signed_on_elsewhere; + guint accounts; + char *title; + + if (mini_dialog == NULL) + return; + + accounts = pidgin_mini_dialog_get_num_children(mini_dialog); + + title = g_strdup_printf( + ngettext("%d account was disabled because you signed on from another location.", + "%d accounts were disabled because you signed on from another location.", + accounts), + accounts); + pidgin_mini_dialog_set_title(mini_dialog, title); + g_free(title); +} + +static GtkWidget * +create_account_label(PurpleAccount *account) +{ + GtkWidget *hbox, *label; + const char *username = purple_account_get_username(account); + char *markup; hbox = gtk_hbox_new(FALSE, 6); - - /* Create the icon */ - if (purple_account_get_status_type_with_primitive(account, - PURPLE_STATUS_OFFLINE) != NULL) { - pixbuf = pidgin_create_prpl_icon(account, PIDGIN_PRPL_ICON_SMALL); - if (pixbuf != NULL) { - image = gtk_image_new_from_pixbuf(pixbuf); - g_object_unref(pixbuf); - - gtk_box_pack_start(GTK_BOX(hbox), image, FALSE, FALSE, 0); - } - } - - /* Create the text */ - label = gtk_label_new(""); - gtk_label_set_markup(GTK_LABEL(label), text); - g_free(text); + g_object_set_data(G_OBJECT(hbox), OBJECT_DATA_KEY_ACCOUNT, account); + + pack_prpl_icon_start(hbox, account); + + label = gtk_label_new(NULL); + markup = g_strdup_printf("<span size=\"smaller\">%s</span>", username); + gtk_label_set_markup(GTK_LABEL(label), markup); + g_free(markup); + gtk_misc_set_alignment(GTK_MISC(label), 0, 0); #if GTK_CHECK_VERSION(2,6,0) - g_object_set(label, "ellipsize", PANGO_ELLIPSIZE_END, NULL); + g_object_set(G_OBJECT(label), "ellipsize", PANGO_ELLIPSIZE_END, NULL); +#endif +#if GTK_CHECK_VERSION(2,12,0) + { /* avoid unused variable warnings on pre-2.12 Gtk */ + char *description = + purple_account_get_current_error(account)->description; + if (description != NULL && *description != '\0') + gtk_widget_set_tooltip_text(label, description); + } #endif gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, TRUE, 0); - /* Create the actual button and put the icon and text on it */ - button = gtk_button_new(); - gtk_container_add(GTK_CONTAINER(button), hbox); - g_signal_connect(G_OBJECT(button), "clicked", - G_CALLBACK(connection_error_button_clicked_cb), - account); - gtk_widget_show_all(button); - gtk_box_pack_end(GTK_BOX(gtkblist->error_buttons), button, - FALSE, FALSE, 0); - gtk_widget_show_all(gtkblist->error_buttons); + return hbox; +} + +static void +add_to_signed_on_elsewhere(PurpleAccount *account) +{ + PidginBuddyListPrivate *priv = PIDGIN_BUDDY_LIST_GET_PRIVATE(gtkblist); + PidginMiniDialog *mini_dialog; + GtkWidget *account_label; + + ensure_signed_on_elsewhere_minidialog(gtkblist); + mini_dialog = priv->signed_on_elsewhere; + + if(find_child_widget_by_account(GTK_CONTAINER(mini_dialog->contents), account)) + return; + + account_label = create_account_label(account); + gtk_box_pack_start(mini_dialog->contents, account_label, FALSE, FALSE, 0); + gtk_widget_show_all(account_label); + + update_signed_on_elsewhere_minidialog_title(); + + if (!GTK_WIDGET_HAS_FOCUS(gtkblist->window)) + pidgin_set_urgent(GTK_WINDOW(gtkblist->window), TRUE); +} + +static void +remove_from_signed_on_elsewhere(PurpleAccount *account) +{ + PidginBuddyListPrivate *priv = PIDGIN_BUDDY_LIST_GET_PRIVATE(gtkblist); + PidginMiniDialog *mini_dialog = priv->signed_on_elsewhere; + if(mini_dialog == NULL) + return; + + remove_child_widget_by_account(GTK_CONTAINER(mini_dialog->contents), account); + + update_signed_on_elsewhere_minidialog_title(); +} + + +/* Call appropriate error notification code based on error types */ +static void +update_account_error_state(PurpleAccount *account, + const PurpleConnectionErrorInfo *old, + const PurpleConnectionErrorInfo *new, + PidginBuddyList *gtkblist) +{ + /* For backwards compatibility: */ + if (new) + pidgin_blist_update_account_error_state(account, new->description); + else + pidgin_blist_update_account_error_state(account, NULL); + + if (old) { + if(old->type == PURPLE_CONNECTION_ERROR_NAME_IN_USE) + remove_from_signed_on_elsewhere(account); + else + remove_generic_error_dialog(account); + } + + if (new) { + if(new->type == PURPLE_CONNECTION_ERROR_NAME_IN_USE) + add_to_signed_on_elsewhere(account); + else + add_generic_error_dialog(account, new); + } +} + +/* In case accounts are loaded before the blist (which they currently are), + * let's call update_account_error_state ourselves on every account's current + * state when the blist starts. + */ +static void +show_initial_account_errors(PidginBuddyList *gtkblist) +{ + GList *l = purple_accounts_get_all(); + PurpleAccount *account; + const PurpleConnectionErrorInfo *err; + + for (; l; l = l->next) + { + account = l->data; + err = purple_account_get_current_error(account); + + update_account_error_state(account, NULL, err, gtkblist); + } } void pidgin_blist_update_account_error_state(PurpleAccount *account, const char *text) { - GList *l; - + /* connection_errors isn't actually used anywhere; it's just kept in + * sync with reality in case a plugin uses it. + */ if (text == NULL) g_hash_table_remove(gtkblist->connection_errors, account); else g_hash_table_insert(gtkblist->connection_errors, account, g_strdup(text)); - - /* Remove the old error buttons */ - for (l = gtk_container_get_children(GTK_CONTAINER(gtkblist->error_buttons)); - l != NULL; - l = g_list_delete_link(l, l)) - { - gtk_widget_destroy(GTK_WIDGET(l->data)); - } - - /* Add new error buttons */ - g_hash_table_foreach(gtkblist->connection_errors, - create_connection_error_buttons, NULL); } static gboolean @@ -4598,6 +4863,7 @@ static void pidgin_blist_show(PurpleBuddyList *list) { + PidginBuddyListPrivate *priv; void *handle; GtkCellRenderer *rend; GtkTreeViewColumn *column; @@ -4624,6 +4890,7 @@ } gtkblist = PIDGIN_BLIST(list); + priv = PIDGIN_BUDDY_LIST_GET_PRIVATE(gtkblist); gtkblist->empty_avatar = gdk_pixbuf_new(GDK_COLORSPACE_RGB, TRUE, 8, 32, 32); gdk_pixbuf_fill(gtkblist->empty_avatar, 0x00000000); @@ -4926,11 +5193,19 @@ gtkblist->scrollbook = pidgin_scroll_book_new(); gtk_box_pack_start(GTK_BOX(gtkblist->vbox), gtkblist->scrollbook, FALSE, FALSE, 0); - /* Create an empty vbox used for showing connection errors */ + /* Create an vbox which holds the scrollbook which is actually used to + * display connection errors. The vbox needs to still exist for + * backwards compatibility. + */ gtkblist->error_buttons = gtk_vbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(gtkblist->vbox), gtkblist->error_buttons, FALSE, FALSE, 0); - gtk_container_set_border_width(GTK_CONTAINER(gtkblist->error_buttons), 3); - + gtk_container_set_border_width(GTK_CONTAINER(gtkblist->error_buttons), 0); + + priv->error_scrollbook = pidgin_scroll_book_new(); + gtk_box_pack_start(GTK_BOX(gtkblist->error_buttons), + priv->error_scrollbook, FALSE, FALSE, 0); + + /* Add the statusbox */ gtkblist->statusbox = pidgin_status_box_new(); gtk_box_pack_start(GTK_BOX(gtkblist->vbox), gtkblist->statusbox, FALSE, TRUE, 0); @@ -5001,43 +5276,56 @@ purple_prefs_connect_callback(handle, PIDGIN_PREFS_ROOT "/sound/method", pidgin_blist_sound_method_pref_cb, NULL); + /* Setup some purple signal handlers. */ - purple_signal_connect(purple_accounts_get_handle(), "account-enabled", - gtkblist, PURPLE_CALLBACK(account_modified), gtkblist); - purple_signal_connect(purple_accounts_get_handle(), "account-disabled", - gtkblist, PURPLE_CALLBACK(account_modified), gtkblist); - purple_signal_connect(purple_accounts_get_handle(), "account-removed", - gtkblist, PURPLE_CALLBACK(account_modified), gtkblist); - purple_signal_connect(purple_accounts_get_handle(), "account-status-changed", - gtkblist, PURPLE_CALLBACK(account_status_changed), gtkblist); - - purple_signal_connect(pidgin_account_get_handle(), "account-modified", - gtkblist, PURPLE_CALLBACK(account_modified), gtkblist); - - purple_signal_connect(purple_connections_get_handle(), "signed-on", - gtkblist, PURPLE_CALLBACK(sign_on_off_cb), list); - purple_signal_connect(purple_connections_get_handle(), "signed-off", - gtkblist, PURPLE_CALLBACK(sign_on_off_cb), list); - - purple_signal_connect(purple_plugins_get_handle(), "plugin-load", - gtkblist, PURPLE_CALLBACK(plugin_changed_cb), NULL); - purple_signal_connect(purple_plugins_get_handle(), "plugin-unload", - gtkblist, PURPLE_CALLBACK(plugin_changed_cb), NULL); - - purple_signal_connect(purple_conversations_get_handle(), "conversation-updated", - gtkblist, PURPLE_CALLBACK(conversation_updated_cb), - gtkblist); - purple_signal_connect(purple_conversations_get_handle(), "deleting-conversation", - gtkblist, PURPLE_CALLBACK(conversation_deleting_cb), - gtkblist); - purple_signal_connect(purple_conversations_get_handle(), "conversation-created", - gtkblist, PURPLE_CALLBACK(conversation_created_cb), - gtkblist); + + handle = purple_accounts_get_handle(); + purple_signal_connect(handle, "account-enabled", gtkblist, + PURPLE_CALLBACK(account_modified), gtkblist); + purple_signal_connect(handle, "account-disabled", gtkblist, + PURPLE_CALLBACK(account_modified), gtkblist); + purple_signal_connect(handle, "account-removed", gtkblist, + PURPLE_CALLBACK(account_modified), gtkblist); + purple_signal_connect(handle, "account-status-changed", gtkblist, + PURPLE_CALLBACK(account_status_changed), + gtkblist); + purple_signal_connect(handle, "account-error-changed", gtkblist, + PURPLE_CALLBACK(update_account_error_state), + gtkblist); + + handle = pidgin_account_get_handle(); + purple_signal_connect(handle, "account-modified", gtkblist, + PURPLE_CALLBACK(account_modified), gtkblist); + + handle = purple_connections_get_handle(); + purple_signal_connect(handle, "signed-on", gtkblist, + PURPLE_CALLBACK(sign_on_off_cb), list); + purple_signal_connect(handle, "signed-off", gtkblist, + PURPLE_CALLBACK(sign_on_off_cb), list); + + handle = purple_plugins_get_handle(); + purple_signal_connect(handle, "plugin-load", gtkblist, + PURPLE_CALLBACK(plugin_changed_cb), NULL); + purple_signal_connect(handle, "plugin-unload", gtkblist, + PURPLE_CALLBACK(plugin_changed_cb), NULL); + + handle = purple_conversations_get_handle(); + purple_signal_connect(handle, "conversation-updated", gtkblist, + PURPLE_CALLBACK(conversation_updated_cb), + gtkblist); + purple_signal_connect(handle, "deleting-conversation", gtkblist, + PURPLE_CALLBACK(conversation_deleting_cb), + gtkblist); + purple_signal_connect(handle, "conversation-created", gtkblist, + PURPLE_CALLBACK(conversation_created_cb), + gtkblist); gtk_widget_hide(gtkblist->headline_hbox); - gtk_widget_hide(gtkblist->error_buttons); + + show_initial_account_errors(gtkblist); /* emit our created signal */ + handle = pidgin_blist_get_handle(); purple_signal_emit(handle, "gtkblist-created", list); } @@ -5660,6 +5948,8 @@ static void pidgin_blist_destroy(PurpleBuddyList *list) { + PidginBuddyListPrivate *priv; + if (!gtkblist) return; @@ -5693,6 +5983,9 @@ gtkblist->hand_cursor = NULL; gtkblist->arrow_cursor = NULL; + priv = PIDGIN_BUDDY_LIST_GET_PRIVATE(gtkblist); + g_free(priv); + g_free(gtkblist); accountmenu = NULL; gtkblist = NULL;
--- a/pidgin/gtkblist.h Mon Nov 12 16:15:53 2007 +0000 +++ b/pidgin/gtkblist.h Mon Nov 12 16:53:54 2007 +0000 @@ -84,7 +84,14 @@ GtkWidget *menutray; /**< The menu tray widget. */ GtkWidget *menutrayicon; /**< The menu tray icon. */ - GHashTable *connection_errors; /**< Caches connection error messages and accounts. */ + /** Caches connection error messages; keys are #PurpleAccount and + * values are non-@c NULL <tt>const char *</tt>s containing localised + * error messages. (If an account does not have an error, it will not + * appear in the table.) + * @deprecated in favour of purple_account_get_current_error(), which also + * gives you the #PurpleConnectionError value. + */ + GHashTable *connection_errors; guint refresh_timer; /**< The timer for refreshing every 30 seconds */ @@ -119,6 +126,8 @@ GtkWidget *error_buttons; /**< Box containing the connection error buttons */ GtkWidget *statusbox; /**< The status selector dropdown */ GdkPixbuf *empty_avatar; /**< A 32x32 transparent pixbuf */ + + gpointer priv; /**< Pointer to opaque private data */ }; #define PIDGIN_BLIST(list) ((PidginBuddyList *)(list)->ui_data) @@ -339,13 +348,16 @@ void pidgin_append_blist_node_extended_menu(GtkWidget *menu, PurpleBlistNode *node); /** - * Used by the connection API to tell the blist if an account - * has a connection error or no longer has a connection error. + * Was used by the connection API to tell the blist if an account has a + * connection error or no longer has a connection error, but the blist now does + * this itself with the @ref account-error-changed signal. * * @param account The account that either has a connection error * or no longer has a connection error. * @param message The connection error message, or NULL if this * account is no longer in an error state. + * @deprecated There was no good reason for code other than gtkconn to call + * this. */ void pidgin_blist_update_account_error_state(PurpleAccount *account, const char *message);
--- a/pidgin/gtkconn.c Mon Nov 12 16:15:53 2007 +0000 +++ b/pidgin/gtkconn.c Mon Nov 12 16:53:54 2007 +0000 @@ -42,6 +42,7 @@ #define INITIAL_RECON_DELAY_MAX 60000 #define MAX_RECON_DELAY 600000 +#define MAX_RACCOON_DELAY "shorter in urban areas" typedef struct { int delay; @@ -81,8 +82,6 @@ (purple_connections_get_connecting() != NULL)); g_hash_table_remove(auto_reconns, account); - - pidgin_blist_update_account_error_state(account, NULL); } static void @@ -137,7 +136,9 @@ } static void -pidgin_connection_report_disconnect(PurpleConnection *gc, const char *text) +pidgin_connection_report_disconnect_reason (PurpleConnection *gc, + PurpleConnectionError reason, + const char *text) { PurpleAccount *account = NULL; PidginAutoRecon *info; @@ -146,8 +147,7 @@ account = purple_connection_get_account(gc); info = g_hash_table_lookup(auto_reconns, account); - pidgin_blist_update_account_error_state(account, text); - if (!gc->wants_to_die) { + if (!purple_connection_error_is_fatal (reason)) { if (info == NULL) { info = g_new0(PidginAutoRecon, 1); g_hash_table_insert(auto_reconns, account, info); @@ -159,33 +159,9 @@ } info->timeout = g_timeout_add(info->delay, do_signon, account); } else { - char *p, *s, *n=NULL ; if (info != NULL) g_hash_table_remove(auto_reconns, account); - if (purple_account_get_alias(account)) - { - n = g_strdup_printf("%s (%s) (%s)", - purple_account_get_username(account), - purple_account_get_alias(account), - purple_account_get_protocol_name(account)); - } - else - { - n = g_strdup_printf("%s (%s)", - purple_account_get_username(account), - purple_account_get_protocol_name(account)); - } - - p = g_strdup_printf(_("%s disconnected"), n); - s = g_strdup_printf(_("%s\n\n" - "%s will not attempt to reconnect the account until you " - "correct the error and re-enable the account."), text, PIDGIN_NAME); - purple_notify_error(NULL, NULL, p, s); - g_free(p); - g_free(s); - g_free(n); - /* * TODO: Do we really want to disable the account when it's * disconnected by wants_to_die? This happens when you sign @@ -259,10 +235,10 @@ pidgin_connection_connected, pidgin_connection_disconnected, pidgin_connection_notice, - pidgin_connection_report_disconnect, + NULL, /* report_disconnect */ pidgin_connection_network_connected, pidgin_connection_network_disconnected, - NULL, + pidgin_connection_report_disconnect_reason, NULL, NULL, NULL @@ -278,8 +254,6 @@ account_removed_cb(PurpleAccount *account, gpointer user_data) { g_hash_table_remove(auto_reconns, account); - - pidgin_blist_update_account_error_state(account, NULL); }
--- a/pidgin/gtkconv.c Mon Nov 12 16:15:53 2007 +0000 +++ b/pidgin/gtkconv.c Mon Nov 12 16:53:54 2007 +0000 @@ -3074,6 +3074,9 @@ chat, (GDestroyNotify)purple_blist_remove_chat); } } else { + if (!purple_account_is_connected(conv->account)) + return FALSE; + buddy = purple_find_buddy(conv->account, conv->name); /* gotta remain bug-compatible :( libpurple < 2.0.2 didn't handle
--- a/pidgin/gtkmain.c Mon Nov 12 16:15:53 2007 +0000 +++ b/pidgin/gtkmain.c Mon Nov 12 16:53:54 2007 +0000 @@ -195,6 +195,18 @@ char *segfault_message; +/* + * This signal handler shouldn't be touching this much stuff. + * It should just set a flag and return, and something else in + * Pidgin should monitor the flag to see if something needs to + * be done. Because the signal handler interrupts the program, + * it could be called in the middle of adding a new connection + * to the list of connections, and then if we try to disconnect + * all connections it could lead to a crash because the linked + * list of connections could be in a weird state. But, well, + * this signal handler probably isn't called very often, so it's + * not a big deal. + */ static void sighandler(int sig) {
--- a/pidgin/gtkroomlist.c Mon Nov 12 16:15:53 2007 +0000 +++ b/pidgin/gtkroomlist.c Mon Nov 12 16:53:54 2007 +0000 @@ -61,6 +61,15 @@ GtkWidget *tree; GHashTable *cats; /**< Meow. */ gint num_rooms, total_rooms; + GtkWidget *tipwindow; + GdkRectangle tip_rect; + guint timeout; + PangoLayout *tip_layout; + PangoLayout *tip_name_layout; + int tip_height; + int tip_width; + int tip_name_height; + int tip_name_width; } PidginRoomlist; enum { @@ -331,6 +340,310 @@ } } +static void pidgin_roomlist_tooltip_destroy(PidginRoomlist *grl) +{ + if ((grl == NULL) || (grl->tipwindow == NULL)) + return; + + gtk_widget_destroy(grl->tipwindow); + grl->tipwindow = NULL; +} + +static void pidgin_roomlist_tooltip_destroy_cb(GObject *object, PidginRoomlist *grl) +{ + if ((grl == NULL) || (grl->tipwindow == NULL)) + return; + + if (grl->timeout) + g_source_remove(grl->timeout); + grl->timeout = 0; + + pidgin_roomlist_tooltip_destroy(grl); +} + +#define SMALL_SPACE 6 +#define TOOLTIP_BORDER 12 + +static void pidgin_roomlist_paint_tip(GtkWidget *widget, GdkEventExpose *event, gpointer user_data) +{ + PidginRoomlist *grl = (PidginRoomlist *)user_data; + GtkStyle *style; + int current_height, max_width; + int max_text_width; + GtkTextDirection dir = gtk_widget_get_direction(GTK_WIDGET(grl->tree)); + + style = grl->tipwindow->style; + gtk_paint_flat_box(style, grl->tipwindow->window, GTK_STATE_NORMAL, GTK_SHADOW_OUT, + NULL, grl->tipwindow, "tooltip", 0, 0, -1, -1); + + max_text_width = 0; + + max_text_width = MAX(grl->tip_width, grl->tip_name_width); + max_width = TOOLTIP_BORDER + SMALL_SPACE + max_text_width + TOOLTIP_BORDER; + + current_height = 12; + + if (dir == GTK_TEXT_DIR_RTL) { + gtk_paint_layout(style, grl->tipwindow->window, GTK_STATE_NORMAL, FALSE, + NULL, grl->tipwindow, "tooltip", + max_width - (TOOLTIP_BORDER + SMALL_SPACE) - PANGO_PIXELS(600000), + current_height, grl->tip_name_layout); + } else { + gtk_paint_layout (style, grl->tipwindow->window, GTK_STATE_NORMAL, FALSE, + NULL, grl->tipwindow, "tooltip", + TOOLTIP_BORDER + SMALL_SPACE, current_height, grl->tip_name_layout); + } + if (dir != GTK_TEXT_DIR_RTL) { + gtk_paint_layout (style, grl->tipwindow->window, GTK_STATE_NORMAL, FALSE, + NULL, grl->tipwindow, "tooltip", + TOOLTIP_BORDER + SMALL_SPACE, current_height + grl->tip_name_height, grl->tip_layout); + } else { + gtk_paint_layout(style, grl->tipwindow->window, GTK_STATE_NORMAL, FALSE, + NULL, grl->tipwindow, "tooltip", + max_width - (TOOLTIP_BORDER + SMALL_SPACE) - PANGO_PIXELS(600000), + current_height + grl->tip_name_height, + grl->tip_layout); + } + +} + +static gboolean pidgin_roomlist_create_tip(PurpleRoomlist *list) +{ + PidginRoomlist *grl = list->ui_data; + GtkWidget *tv = grl->tree; + PurpleRoomlistRoom *room; + GtkTreePath *path; + GtkTreeIter iter; + GValue val; + gchar *name, *tmp, *node_name; + GString *tooltip_text = NULL; + GList *l, *k; + gint j; + gboolean first = TRUE; + + if (!gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(tv), grl->tip_rect.x, grl->tip_rect.y + (grl->tip_rect.height/2), + &path, NULL, NULL, NULL)) + return FALSE; + + gtk_tree_model_get_iter(GTK_TREE_MODEL(grl->model), &iter, path); + + val.g_type = 0; + gtk_tree_model_get_value(GTK_TREE_MODEL(grl->model), &iter, ROOM_COLUMN, &val); + room = g_value_get_pointer(&val); + + if (!room || !(room->type & PURPLE_ROOMLIST_ROOMTYPE_ROOM)) + return FALSE; + + tooltip_text = g_string_new(""); + gtk_tree_model_get(GTK_TREE_MODEL(grl->model), &iter, NAME_COLUMN, &name, -1); + + for (j = NUM_OF_COLUMNS, l = room->fields, k = list->fields; l && k; j++, l = l->next, k = k->next) { + PurpleRoomlistField *f = k->data; + gchar *label; + if (f->hidden) + continue; + label = g_markup_escape_text(f->label, -1); + switch (f->type) { + case PURPLE_ROOMLIST_FIELD_BOOL: + g_string_append_printf(tooltip_text, "%s<b>%s:</b> %s", first ? "" : "\n", label, l->data ? "True" : "False"); + break; + case PURPLE_ROOMLIST_FIELD_INT: + g_string_append_printf(tooltip_text, "%s<b>%s:</b> %d", first ? "" : "\n", label, GPOINTER_TO_INT(l->data)); + break; + case PURPLE_ROOMLIST_FIELD_STRING: + tmp = g_markup_escape_text((char *)l->data, -1); + g_string_append_printf(tooltip_text, "%s<b>%s:</b> %s", first ? "" : "\n", label, tmp); + g_free(tmp); + break; + } + first = FALSE; + g_free(label); + } + + gtk_tree_path_free(path); + + grl->tip_layout = gtk_widget_create_pango_layout(grl->tipwindow, NULL); + grl->tip_name_layout = gtk_widget_create_pango_layout(grl->tipwindow, NULL); + + tmp = g_markup_escape_text(name, -1); + g_free(name); + node_name = g_strdup_printf("<span size='x-large' weight='bold'>%s</span>", tmp); + g_free(tmp); + + pango_layout_set_markup(grl->tip_layout, tooltip_text->str, -1); + pango_layout_set_wrap(grl->tip_layout, PANGO_WRAP_WORD); + pango_layout_set_width(grl->tip_layout, 600000); + + pango_layout_get_size (grl->tip_layout, &grl->tip_width, &grl->tip_height); + grl->tip_width = PANGO_PIXELS(grl->tip_width); + grl->tip_height = PANGO_PIXELS(grl->tip_height); + + pango_layout_set_markup(grl->tip_name_layout, node_name, -1); + pango_layout_set_wrap(grl->tip_name_layout, PANGO_WRAP_WORD); + pango_layout_set_width(grl->tip_name_layout, 600000); + + pango_layout_get_size (grl->tip_name_layout, &grl->tip_name_width, &grl->tip_name_height); + grl->tip_name_width = PANGO_PIXELS(grl->tip_name_width) + SMALL_SPACE; + grl->tip_name_height = MAX(PANGO_PIXELS(grl->tip_name_height), SMALL_SPACE); + + g_free(node_name); + g_string_free(tooltip_text, TRUE); + + return TRUE; +} + +static void pidgin_roomlist_draw_tooltip(PurpleRoomlist *list, GtkWidget *widget) +{ + PidginRoomlist *grl = list->ui_data; + int scr_w, scr_h, w, h, x, y; +#if GTK_CHECK_VERSION(2,2,0) + int mon_num; + GdkScreen *screen = NULL; +#endif + GdkRectangle mon_size; + int sig; + const char *name; + + pidgin_roomlist_tooltip_destroy(grl); + grl->tipwindow = gtk_window_new(GTK_WINDOW_POPUP); + gtk_widget_ensure_style (grl->tipwindow); + + if (!pidgin_roomlist_create_tip(list)) { + pidgin_roomlist_tooltip_destroy(grl); + return; + } + + name = gtk_window_get_title(GTK_WINDOW(gtk_widget_get_toplevel(widget))); + gtk_widget_set_app_paintable(grl->tipwindow, TRUE); + gtk_window_set_title(GTK_WINDOW(grl->tipwindow), name ? name : _("Room List")); + gtk_window_set_resizable(GTK_WINDOW(grl->tipwindow), FALSE); + gtk_widget_set_name(grl->tipwindow, "gtk-tooltips"); + g_signal_connect(G_OBJECT(grl->tipwindow), "expose_event", + G_CALLBACK(pidgin_roomlist_paint_tip), grl); + + w = TOOLTIP_BORDER + SMALL_SPACE + + MAX(grl->tip_width, grl->tip_name_width) + TOOLTIP_BORDER; + h = TOOLTIP_BORDER + grl->tip_height + grl->tip_name_height + + TOOLTIP_BORDER; + +#if GTK_CHECK_VERSION(2,2,0) + gdk_display_get_pointer(gdk_display_get_default(), &screen, &x, &y, NULL); + mon_num = gdk_screen_get_monitor_at_point(screen, x, y); + gdk_screen_get_monitor_geometry(screen, mon_num, &mon_size); + + scr_w = mon_size.width + mon_size.x; + scr_h = mon_size.height + mon_size.y; +#else + scr_w = gdk_screen_width(); + scr_h = gdk_screen_height(); + gdk_window_get_pointer(NULL, &x, &y, NULL); + mon_size.x = 0; + mon_size.y = 0; +#endif + +#if GTK_CHECK_VERSION(2,2,0) + if (w > mon_size.width) + w = mon_size.width - 10; + + if (h > mon_size.height) + h = mon_size.height - 10; +#endif + x -= ((w >> 1) + 4); + + if ((y + h + 4) > scr_h) + y = y - h - 5; + else + y = y + 6; + + if (y < mon_size.y) + y = mon_size.y; + + if (y != mon_size.y) { + if ((x + w) > scr_w) + x -= (x + w + 5) - scr_w; + else if (x < mon_size.x) + x = mon_size.x; + } else { + x -= (w / 2 + 10); + if (x < mon_size.x) + x = mon_size.x; + } + + gtk_widget_set_size_request(grl->tipwindow, w, h); + gtk_window_move(GTK_WINDOW(grl->tipwindow), x, y); + gtk_widget_show(grl->tipwindow); + + /* Hide the tooltip when the widget is destroyed */ + sig = g_signal_connect(G_OBJECT(widget), "destroy", G_CALLBACK(pidgin_roomlist_tooltip_destroy_cb), grl); + g_signal_connect_swapped(G_OBJECT(grl->tipwindow), "destroy", G_CALLBACK(g_source_remove), GINT_TO_POINTER(sig)); +} + +static gboolean pidgin_roomlist_tooltip_timeout(PurpleRoomlist *list) +{ + PidginRoomlist *grl = list->ui_data; + GtkWidget *tv = grl->tree; + GtkTreePath *path; + + pidgin_roomlist_tooltip_destroy(grl); + + if (!gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(tv), grl->tip_rect.x, grl->tip_rect.y + (grl->tip_rect.height/2), + &path, NULL, NULL, NULL)) + return FALSE; + + pidgin_roomlist_draw_tooltip(list, GTK_WIDGET(grl->tree)); + + return FALSE; +} + +static gboolean row_motion_cb(GtkWidget *tv, GdkEventMotion *event, gpointer user_data) +{ + PurpleRoomlist *list = user_data; + PidginRoomlist *grl = list->ui_data; + GtkTreePath *path; + int delay; + + /* XXX: should this be using the blist delay pref? */ + delay = purple_prefs_get_int(PIDGIN_PREFS_ROOT "/blist/tooltip_delay"); + + if (delay == 0) + return FALSE; + + if (grl->timeout) { + if ((event->y > grl->tip_rect.y) && ((event->y - grl->tip_rect.height) < grl->tip_rect.y)) + return FALSE; + /* We've left the cell. Remove the timeout and create a new one below */ + pidgin_roomlist_tooltip_destroy(grl); + } + + gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(tv), event->x, event->y, &path, NULL, NULL, NULL); + + if (path == NULL) { + pidgin_roomlist_tooltip_destroy(grl); + return FALSE; + } + + gtk_tree_view_get_cell_area(GTK_TREE_VIEW(tv), path, NULL, &grl->tip_rect); + + if (path) + gtk_tree_path_free(path); + grl->timeout = g_timeout_add(delay, (GSourceFunc)pidgin_roomlist_tooltip_timeout, list); + + return FALSE; +} + +static void row_leave_cb(GtkWidget *tv, GdkEventCrossing *e, gpointer user_data) +{ + PurpleRoomlist *list = user_data; + PidginRoomlist *grl = list->ui_data; + + if (grl->timeout) { + g_source_remove(grl->timeout); + grl->timeout = 0; + } + + pidgin_roomlist_tooltip_destroy(grl); +} + static gboolean account_filter_func(PurpleAccount *account) { PurpleConnection *gc = purple_account_get_connection(account); @@ -650,6 +963,8 @@ g_signal_connect(G_OBJECT(tree), "button-press-event", G_CALLBACK(room_click_cb), list); g_signal_connect(G_OBJECT(tree), "row-expanded", G_CALLBACK(row_expanded_cb), list); g_signal_connect(G_OBJECT(tree), "row-activated", G_CALLBACK(row_activated_cb), list); + g_signal_connect(G_OBJECT(tree), "motion-notify-event", G_CALLBACK(row_motion_cb), list); + g_signal_connect(G_OBJECT(tree), "leave-notify-event", G_CALLBACK(row_leave_cb), list); /* Enable CTRL+F searching */ gtk_tree_view_set_search_column(GTK_TREE_VIEW(tree), NAME_COLUMN);
--- a/pidgin/gtkutils.c Mon Nov 12 16:15:53 2007 +0000 +++ b/pidgin/gtkutils.c Mon Nov 12 16:53:54 2007 +0000 @@ -61,6 +61,7 @@ #include "pidginstock.h" #include "gtkthemes.h" #include "gtkutils.h" +#include "pidgin/minidialog.h" typedef struct { GtkWidget *menu; @@ -2910,91 +2911,76 @@ minidialogs = g_slist_remove(minidialogs, widget); } -void *pidgin_make_mini_dialog(PurpleConnection *gc, const char *icon_name, - const char *primary, const char *secondary, - void *user_data, ...) +struct _old_button_clicked_cb_data +{ + PidginUtilMiniDialogCallback cb; + gpointer data; +}; + +static void +old_mini_dialog_button_clicked_cb(PidginMiniDialog *mini_dialog, + GtkButton *button, + gpointer user_data) +{ + struct _old_button_clicked_cb_data *data = user_data; + data->cb(data->data, button); +} + +static void +old_mini_dialog_destroy_cb(GtkWidget *dialog, + GList *cb_datas) { - GtkWidget *vbox; - GtkWidget *hbox; - GtkWidget *hbox2; - GtkWidget *label; - GtkWidget *button; - GtkWidget *img = NULL; - GtkSizeGroup *sg = gtk_size_group_new(GTK_SIZE_GROUP_BOTH); - char label_text[2048]; + while (cb_datas != NULL) + { + g_free(cb_datas->data); + cb_datas = g_list_delete_link(cb_datas, cb_datas); + } +} + +GtkWidget * +pidgin_make_mini_dialog(PurpleConnection *gc, + const char *icon_name, + const char *primary, + const char *secondary, + void *user_data, + ...) +{ + PidginMiniDialog *mini_dialog; const char *button_text; - GCallback callback; - char *primary_esc, *secondary_esc = NULL; + GList *cb_datas = NULL; va_list args; static gboolean first_call = TRUE; - img = gtk_image_new_from_stock(icon_name, gtk_icon_size_from_name(PIDGIN_ICON_SIZE_TANGO_EXTRA_SMALL)); - gtk_misc_set_alignment(GTK_MISC(img), 0, 0); - - vbox = gtk_vbox_new(FALSE,0); - gtk_container_set_border_width(GTK_CONTAINER(vbox), PIDGIN_HIG_BOX_SPACE); - - g_object_set_data(G_OBJECT(vbox), "gc" ,gc); - minidialogs = g_slist_prepend(minidialogs, vbox); - g_signal_connect(G_OBJECT(vbox), "destroy", G_CALLBACK(alert_killed_cb), NULL); - if (first_call) { first_call = FALSE; purple_signal_connect(purple_connections_get_handle(), "signed-off", - pidgin_utils_get_handle(), - PURPLE_CALLBACK(connection_signed_off_cb), NULL); + pidgin_utils_get_handle(), + PURPLE_CALLBACK(connection_signed_off_cb), NULL); } - hbox = gtk_hbox_new(FALSE, 0); - gtk_container_add(GTK_CONTAINER(vbox), hbox); - - if (img != NULL) - gtk_box_pack_start(GTK_BOX(hbox), img, FALSE, FALSE, 0); - - primary_esc = g_markup_escape_text(primary, -1); - - if (secondary) - secondary_esc = g_markup_escape_text(secondary, -1); - g_snprintf(label_text, sizeof(label_text), - "<span weight=\"bold\" size=\"smaller\">%s</span>%s<span size=\"smaller\">%s</span>", - primary_esc, secondary ? "\n" : "", secondary_esc ? secondary_esc : ""); - g_free(primary_esc); - g_free(secondary_esc); - label = gtk_label_new(NULL); - gtk_widget_set_size_request(label, purple_prefs_get_int(PIDGIN_PREFS_ROOT "/blist/width")-25,-1); - gtk_label_set_markup(GTK_LABEL(label), label_text); - gtk_label_set_line_wrap(GTK_LABEL(label), TRUE); - gtk_misc_set_alignment(GTK_MISC(label), 0, 0); - gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, TRUE, 0); - - hbox2 = gtk_hbox_new(FALSE, PIDGIN_HIG_BOX_SPACE); - gtk_box_pack_start(GTK_BOX(vbox), hbox2, FALSE, FALSE, 0); + mini_dialog = pidgin_mini_dialog_new(primary, secondary, icon_name); + g_object_set_data(G_OBJECT(mini_dialog), "gc" ,gc); + g_signal_connect(G_OBJECT(mini_dialog), "destroy", + G_CALLBACK(alert_killed_cb), NULL); va_start(args, user_data); while ((button_text = va_arg(args, char*))) { - callback = va_arg(args, GCallback); - button = gtk_button_new(); - - if (callback) - g_signal_connect_swapped(G_OBJECT(button), "clicked", callback, user_data); - g_signal_connect_swapped(G_OBJECT(button), "clicked", G_CALLBACK(gtk_widget_destroy), vbox); - hbox = gtk_hbox_new(FALSE, 0); - gtk_container_add(GTK_CONTAINER(button), hbox); - gtk_container_set_border_width(GTK_CONTAINER(hbox), 3); - g_snprintf(label_text, sizeof(label_text), - "<span size=\"smaller\">%s</span>", button_text); - label = gtk_label_new(NULL); - gtk_label_set_markup_with_mnemonic(GTK_LABEL(label), label_text); - gtk_misc_set_alignment(GTK_MISC(label), 0.5, 0.5); - gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, TRUE, 0); - gtk_box_pack_end(GTK_BOX(hbox2), button, FALSE, FALSE, 0); - gtk_size_group_add_widget(sg, button); + PidginUtilMiniDialogCallback callback = + va_arg(args, PidginUtilMiniDialogCallback); + struct _old_button_clicked_cb_data *data = + g_new0(struct _old_button_clicked_cb_data, 1); + data->cb = callback; + data->data = user_data; + pidgin_mini_dialog_add_button(mini_dialog, button_text, + old_mini_dialog_button_clicked_cb, data); + cb_datas = g_list_append(cb_datas, data); } va_end(args); - g_object_unref(sg); - - return vbox; + g_signal_connect(G_OBJECT(mini_dialog), "destroy", + G_CALLBACK(old_mini_dialog_destroy_cb), cb_datas); + + return GTK_WIDGET(mini_dialog); } /*
--- a/pidgin/gtkutils.h Mon Nov 12 16:15:53 2007 +0000 +++ b/pidgin/gtkutils.h Mon Nov 12 16:53:54 2007 +0000 @@ -599,18 +599,38 @@ char *pidgin_make_pretty_arrows(const char *str); /** - * Creates a "mini-dialog" suitable for embedding in the buddy list scrollbook + * The type of callbacks passed to pidgin_make_mini_dialog(). + */ +typedef void (*PidginUtilMiniDialogCallback)(gpointer user_data, GtkButton *); + +/** + * Creates a #PidginMiniDialog, tied to a #PurpleConnection, suitable for + * embedding in the buddy list scrollbook with pidgin_blist_add_alert(). * - * @param handle A handle - * @param stock_id The ID of a stock image to use in the mini dialog + * @param handle The #PurpleConnection to which this mini-dialog + * refers, or @c NULL if it does not refer to a + * connection. If @a handle is supplied, the mini-dialog + * will be automatically removed and destroyed when the + * connection signs off. + * @param stock_id The ID of a stock image to use in the mini dialog. * @param primary The primary text - * @param secondary The secondary text + * @param secondary The secondary text, or @c NULL for no description. * @param user_data Data to pass to the callbacks - * @param ... a NULL-terminated list of button labels and callbacks + * @param ... a <tt>NULL</tt>-terminated list of button labels + * (<tt>char *</tt>) and callbacks + * (#PidginUtilMiniDialogCallback). @a user_data will be + * passed as the first argument. (Callbacks may lack a + * second argument, or be @c NULL to take no action when + * the corresponding button is pressed.) When a button is + * pressed, the callback (if any) will be called; when + * the callback returns the dialog will be destroyed. + * @return A #PidginMiniDialog, suitable for passing to + * pidgin_blist_add_alert(). + * @see pidginstock.h */ -void *pidgin_make_mini_dialog(PurpleConnection *handle, const char* stock_id, - const char *primary, const char *secondary, - void *user_data, ...); +GtkWidget *pidgin_make_mini_dialog(PurpleConnection *handle, + const char* stock_id, const char *primary, const char *secondary, + void *user_data, ...); /** * This is a callback function to be used for Ctrl+F searching in treeviews.
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pidgin/minidialog.c Mon Nov 12 16:53:54 2007 +0000 @@ -0,0 +1,388 @@ +/** + * @file minidialog.c Implementation of the #PidginMiniDialog Gtk widget. + * @ingroup pidgin + */ + +/* pidgin + * + * Pidgin is the legal property of its developers, whose names are too numerous + * to list here. Please refer to the COPYRIGHT file distributed with this + * source distribution. + * + * 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 02111-1301 USA + */ + +#include "internal.h" + +#include <gtk/gtkhbox.h> +#include <gtk/gtkbutton.h> + +#include "libpurple/prefs.h" + +#include "pidgin/minidialog.h" +#include "pidgin/pidgin.h" +#include "pidgin/pidginstock.h" + +G_DEFINE_TYPE (PidginMiniDialog, pidgin_mini_dialog, GTK_TYPE_VBOX) + +enum +{ + PROP_TITLE = 1, + PROP_DESCRIPTION, + PROP_ICON_NAME, + + LAST_PROPERTY +} HazeConnectionProperties; + +typedef struct _PidginMiniDialogPrivate +{ + GtkImage *icon; + GtkBox *title_box; + GtkLabel *title; + GtkLabel *desc; + GtkBox *buttons; +} PidginMiniDialogPrivate; + +#define PIDGIN_MINI_DIALOG_GET_PRIVATE(dialog) \ + ((PidginMiniDialogPrivate *) ((dialog)->priv)) + +PidginMiniDialog * +pidgin_mini_dialog_new(const gchar *title, + const gchar *description, + const gchar *icon_name) +{ + PidginMiniDialog *mini_dialog = g_object_new(PIDGIN_TYPE_MINI_DIALOG, + "title", title, + "description", description, + "icon-name", icon_name, + NULL); + + return mini_dialog; +} + +void +pidgin_mini_dialog_set_title(PidginMiniDialog *mini_dialog, + const char *title) +{ + g_object_set(G_OBJECT(mini_dialog), "title", title, NULL); +} + +void +pidgin_mini_dialog_set_description(PidginMiniDialog *mini_dialog, + const char *description) +{ + g_object_set(G_OBJECT(mini_dialog), "description", description, NULL); +} + +void +pidgin_mini_dialog_set_icon_name(PidginMiniDialog *mini_dialog, + const char *icon_name) +{ + g_object_set(G_OBJECT(mini_dialog), "icon_name", icon_name, NULL); +} + +struct _mini_dialog_button_clicked_cb_data +{ + PidginMiniDialog *mini_dialog; + PidginMiniDialogCallback callback; + gpointer user_data; +}; + +guint +pidgin_mini_dialog_get_num_children(PidginMiniDialog *mini_dialog) +{ + return g_list_length(mini_dialog->contents->children); +} + +static gboolean +idle_destroy_cb(GtkWidget *mini_dialog) +{ + gtk_widget_destroy(mini_dialog); + return FALSE; +} + +static void +mini_dialog_button_clicked_cb(GtkButton *button, + gpointer user_data) +{ + struct _mini_dialog_button_clicked_cb_data *data = user_data; + + data->callback(data->mini_dialog, button, data->user_data); + + g_idle_add((GSourceFunc) idle_destroy_cb, data->mini_dialog); +} + +static void +mini_dialog_button_destroy_cb(GtkButton *button, + gpointer user_data) +{ + struct _mini_dialog_button_clicked_cb_data *data = user_data; + g_free(data); +} + +void +pidgin_mini_dialog_add_button(PidginMiniDialog *self, + const char *text, + PidginMiniDialogCallback clicked_cb, + gpointer user_data) +{ + PidginMiniDialogPrivate *priv = PIDGIN_MINI_DIALOG_GET_PRIVATE(self); + struct _mini_dialog_button_clicked_cb_data *callback_data + = g_new0(struct _mini_dialog_button_clicked_cb_data, 1); + GtkWidget *button = gtk_button_new(); + GtkWidget *label = gtk_label_new(NULL); + char *button_text = + g_strdup_printf("<span size=\"smaller\">%s</span>", text); + + gtk_label_set_markup_with_mnemonic(GTK_LABEL(label), button_text); + g_free(button_text); + + callback_data->mini_dialog = self; + callback_data->callback = clicked_cb; + callback_data->user_data = user_data; + g_signal_connect(G_OBJECT(button), "clicked", + (GCallback) mini_dialog_button_clicked_cb, callback_data); + g_signal_connect(G_OBJECT(button), "destroy", + (GCallback) mini_dialog_button_destroy_cb, callback_data); + + gtk_misc_set_alignment(GTK_MISC(label), 0.5, 0.5); + gtk_container_add(GTK_CONTAINER(button), label); + + gtk_box_pack_end(GTK_BOX(priv->buttons), button, FALSE, FALSE, + 0); + gtk_widget_show_all(GTK_WIDGET(button)); +} + +static void +pidgin_mini_dialog_get_property(GObject *object, + guint property_id, + GValue *value, + GParamSpec *pspec) +{ + PidginMiniDialog *self = PIDGIN_MINI_DIALOG(object); + PidginMiniDialogPrivate *priv = PIDGIN_MINI_DIALOG_GET_PRIVATE(self); + + switch (property_id) { + case PROP_TITLE: + g_value_set_string(value, gtk_label_get_text(priv->title)); + break; + case PROP_DESCRIPTION: + g_value_set_string(value, gtk_label_get_text(priv->desc)); + break; + case PROP_ICON_NAME: + { + gchar *icon_name = NULL; + GtkIconSize size; + gtk_image_get_stock(priv->icon, &icon_name, &size); + g_value_set_string(value, icon_name); + break; + } + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + } +} + +static void +mini_dialog_set_title(PidginMiniDialog *self, + const char *title) +{ + PidginMiniDialogPrivate *priv = PIDGIN_MINI_DIALOG_GET_PRIVATE(self); + + char *title_esc = g_markup_escape_text(title, -1); + char *title_markup = g_strdup_printf( + "<span weight=\"bold\" size=\"smaller\">%s</span>", + title_esc ? title_esc : ""); + + gtk_label_set_markup(priv->title, title_markup); + + g_free(title_esc); + g_free(title_markup); +} + +static void +mini_dialog_set_description(PidginMiniDialog *self, + const char *description) +{ + PidginMiniDialogPrivate *priv = PIDGIN_MINI_DIALOG_GET_PRIVATE(self); + if(description) + { + char *desc_esc = g_markup_escape_text(description, -1); + char *desc_markup = g_strdup_printf( + "<span size=\"smaller\">%s</span>", desc_esc); + + gtk_label_set_markup(priv->desc, desc_markup); + + g_free(desc_esc); + g_free(desc_markup); + + gtk_widget_show(GTK_WIDGET(priv->desc)); + g_object_set(G_OBJECT(priv->desc), "no-show-all", FALSE, NULL); + } + else + { + gtk_label_set_text(priv->desc, NULL); + gtk_widget_hide(GTK_WIDGET(priv->desc)); + /* make calling show_all() on the minidialog not affect desc + * even though it's packed inside it. + */ + g_object_set(G_OBJECT(priv->desc), "no-show-all", TRUE, NULL); + } +} + +static void +pidgin_mini_dialog_set_property(GObject *object, + guint property_id, + const GValue *value, + GParamSpec *pspec) +{ + PidginMiniDialog *self = PIDGIN_MINI_DIALOG(object); + PidginMiniDialogPrivate *priv = PIDGIN_MINI_DIALOG_GET_PRIVATE(self); + + switch (property_id) { + case PROP_TITLE: + mini_dialog_set_title(self, g_value_get_string(value)); + break; + case PROP_DESCRIPTION: + mini_dialog_set_description(self, g_value_get_string(value)); + break; + case PROP_ICON_NAME: + gtk_image_set_from_stock(priv->icon, g_value_get_string(value), + gtk_icon_size_from_name(PIDGIN_ICON_SIZE_TANGO_EXTRA_SMALL)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + } +} + +static void +pidgin_mini_dialog_finalize(GObject *object) +{ + PidginMiniDialog *self = PIDGIN_MINI_DIALOG(object); + PidginMiniDialogPrivate *priv = PIDGIN_MINI_DIALOG_GET_PRIVATE(self); + + g_free(priv); + self->priv = NULL; + + purple_prefs_disconnect_by_handle(self); + + G_OBJECT_CLASS (pidgin_mini_dialog_parent_class)->finalize (object); +} + +static void +pidgin_mini_dialog_class_init(PidginMiniDialogClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS(klass); + GParamSpec *param_spec; + + object_class->get_property = pidgin_mini_dialog_get_property; + object_class->set_property = pidgin_mini_dialog_set_property; + object_class->finalize = pidgin_mini_dialog_finalize; + + param_spec = g_param_spec_string("title", "title", + "String specifying the mini-dialog's title", NULL, +#if GTK_CHECK_VERSION(2,8,0) + G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB | +#endif + G_PARAM_READWRITE); + g_object_class_install_property (object_class, PROP_TITLE, param_spec); + + param_spec = g_param_spec_string("description", "description", + "Description text for the mini-dialog, if desired", NULL, +#if GTK_CHECK_VERSION(2,8,0) + G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB | +#endif + G_PARAM_READWRITE); + g_object_class_install_property (object_class, PROP_DESCRIPTION, param_spec); + + param_spec = g_param_spec_string("icon-name", "icon-name", + "String specifying the Gtk stock name of the dialog's icon", + NULL, +#if GTK_CHECK_VERSION(2,8,0) + G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB | +#endif + G_PARAM_READWRITE); + g_object_class_install_property (object_class, PROP_ICON_NAME, param_spec); +} + +/* 16 is the width of the icon, due to PIDGIN_ICON_SIZE_TANGO_EXTRA_SMALL */ +#define BLIST_WIDTH_OTHER_THAN_LABEL \ + ((PIDGIN_HIG_BOX_SPACE * 3) + 16) + +#define BLIST_WIDTH_PREF \ + (PIDGIN_PREFS_ROOT "/blist/width") + +static void +blist_width_changed_cb(const char *name, + PurplePrefType type, + gconstpointer val, + gpointer data) +{ + PidginMiniDialog *self = PIDGIN_MINI_DIALOG(data); + PidginMiniDialogPrivate *priv = PIDGIN_MINI_DIALOG_GET_PRIVATE(self); + guint blist_width = GPOINTER_TO_INT(val); + guint label_width = blist_width - BLIST_WIDTH_OTHER_THAN_LABEL; + + gtk_widget_set_size_request(GTK_WIDGET(priv->title), label_width, -1); + gtk_widget_set_size_request(GTK_WIDGET(priv->desc), label_width, -1); +} + +static void +pidgin_mini_dialog_init(PidginMiniDialog *self) +{ + GtkBox *self_box = GTK_BOX(self); + guint blist_width = purple_prefs_get_int(BLIST_WIDTH_PREF); + guint label_width = blist_width - BLIST_WIDTH_OTHER_THAN_LABEL; + + PidginMiniDialogPrivate *priv = g_new0(PidginMiniDialogPrivate, 1); + self->priv = priv; + + gtk_container_set_border_width(GTK_CONTAINER(self), PIDGIN_HIG_BOX_SPACE); + + priv->title_box = GTK_BOX(gtk_hbox_new(FALSE, PIDGIN_HIG_BOX_SPACE)); + + priv->icon = GTK_IMAGE(gtk_image_new()); + gtk_misc_set_alignment(GTK_MISC(priv->icon), 0, 0); + + priv->title = GTK_LABEL(gtk_label_new(NULL)); + gtk_widget_set_size_request(GTK_WIDGET(priv->title), label_width, -1); + gtk_label_set_line_wrap(priv->title, TRUE); + gtk_misc_set_alignment(GTK_MISC(priv->title), 0, 0); + + gtk_box_pack_start(priv->title_box, GTK_WIDGET(priv->icon), FALSE, FALSE, 0); + gtk_box_pack_start(priv->title_box, GTK_WIDGET(priv->title), TRUE, TRUE, 0); + + priv->desc = GTK_LABEL(gtk_label_new(NULL)); + gtk_widget_set_size_request(GTK_WIDGET(priv->desc), label_width, -1); + gtk_label_set_line_wrap(priv->desc, TRUE); + gtk_misc_set_alignment(GTK_MISC(priv->desc), 0, 0); + /* make calling show_all() on the minidialog not affect desc even though + * it's packed inside it. + */ + g_object_set(G_OBJECT(priv->desc), "no-show-all", TRUE, NULL); + + purple_prefs_connect_callback(self, BLIST_WIDTH_PREF, + blist_width_changed_cb, self); + + self->contents = GTK_BOX(gtk_vbox_new(FALSE, 0)); + + priv->buttons = GTK_BOX(gtk_hbox_new(FALSE, 0)); + + gtk_box_pack_start(self_box, GTK_WIDGET(priv->title_box), FALSE, FALSE, 0); + gtk_box_pack_start(self_box, GTK_WIDGET(priv->desc), FALSE, FALSE, 0); + gtk_box_pack_start(self_box, GTK_WIDGET(self->contents), TRUE, TRUE, 0); + gtk_box_pack_start(self_box, GTK_WIDGET(priv->buttons), FALSE, FALSE, 0); + + gtk_widget_show_all(GTK_WIDGET(self)); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pidgin/minidialog.h Mon Nov 12 16:53:54 2007 +0000 @@ -0,0 +1,162 @@ +/** + * @file minidialog.h API for the #PidginMiniDialog Gtk widget. + * @ingroup pidgin + */ + +/* pidgin + * + * Pidgin is the legal property of its developers, whose names are too numerous + * to list here. Please refer to the COPYRIGHT file distributed with this + * source distribution. + * + * 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 02111-1301 USA + */ + +#ifndef __PIDGIN_MINI_DIALOG_H__ +#define __PIDGIN_MINI_DIALOG_H__ + +#include <glib-object.h> +#include <gtk/gtkvbox.h> +#include <gtk/gtklabel.h> + +G_BEGIN_DECLS + +#define PIDGIN_TYPE_MINI_DIALOG pidgin_mini_dialog_get_type() + +#define PIDGIN_MINI_DIALOG(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST ((obj), \ + PIDGIN_TYPE_MINI_DIALOG, PidginMiniDialog)) + +#define PIDGIN_MINI_DIALOG_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST ((klass), \ + PIDGIN_TYPE_MINI_DIALOG, PidginMiniDialogClass)) + +#define PIDGIN_IS_MINI_DIALOG(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE ((obj), \ + PIDGIN_TYPE_MINI_DIALOG)) + +#define PIDGIN_IS_MINI_DIALOG_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE ((klass), \ + PIDGIN_TYPE_MINI_DIALOG)) + +#define PIDGIN_MINI_DIALOG_GET_CLASS(obj) \ + (G_TYPE_INSTANCE_GET_CLASS ((obj), \ + PIDGIN_TYPE_MINI_DIALOG, PidginMiniDialogClass)) + +/** + * A widget resembling a diminutive dialog box, designed to be embedded in the + * #PidginBuddyList. Mini-dialogs have titles, optional descriptions, and a row + * of buttons at the bottom; above the buttons is a <tt>GtkHBox</tt> into which + * you can pack any random widgets you want to add to the dialog. When any of + * the dialog's buttons is clicked, the dialog will be destroyed. + * + * Dialogs have the following GObject properties: + * <dl> + * <dt><tt>"title"</tt> (<tt>char *</tt>)</dt> + * <dd>A string to be displayed as the dialog's title.</dd> + * <dt><tt>"description"</tt> (<tt>char *</tt>)</dt> + * <dd>A string to be displayed as the dialog's description. If this is @c + * NULL, the description widget will be hidden. + * </dd> + * <dt><tt>"icon-name"</tt> (<tt>char *</tt>)</dt> + * <dd>The Gtk stock id of an icon for the dialog, or @c NULL for no icon. + * @see pidginstock.h + * </dd> + * </dl> + */ +typedef struct { + GtkVBox parent; + + /** A GtkVBox into which extra widgets for the dialog should be packed. + */ + GtkBox *contents; + + gpointer priv; +} PidginMiniDialog; + +/** The class of #PidginMiniDialog objects. */ +typedef struct { + GtkBoxClass parent_class; + + void (*_purple_reserved1) (void); + void (*_purple_reserved2) (void); + void (*_purple_reserved3) (void); + void (*_purple_reserved4) (void); +} PidginMiniDialogClass; + +/** The type of a callback triggered by a button in a mini-dialog being pressed. + * @param mini_dialog a dialog, one of whose buttons has been pressed. + * @param button the button which was pressed. + * @param user_data arbitrary data, supplied to + * pidgin_mini_dialog_add_button() when the button was + * created. + */ +typedef void (*PidginMiniDialogCallback)(PidginMiniDialog *mini_dialog, + GtkButton *button, gpointer user_data); + +/** Get the GType of #PidginMiniDialog. */ +GType pidgin_mini_dialog_get_type (void); + +/** Creates a new #PidginMiniDialog. This is a shortcut for creating the dialog + * with @c g_object_new() then setting each property yourself. + * @return a new #PidginMiniDialog. + */ +PidginMiniDialog *pidgin_mini_dialog_new(const gchar *title, + const gchar *description, const gchar *icon_name); + +/** Shortcut for setting a mini-dialog's title via GObject properties. + * @param mini_dialog a mini-dialog + * @param title the new title for @a mini_dialog + */ +void pidgin_mini_dialog_set_title(PidginMiniDialog *mini_dialogtitle , + const char *title); + +/** Shortcut for setting a mini-dialog's description via GObject properties. + * @param mini_dialog a mini-dialog + * @param description the new description for @a mini_dialog, or @c NULL to + * hide the description widget. + */ +void pidgin_mini_dialog_set_description(PidginMiniDialog *mini_dialog, + const char *description); + +/** Shortcut for setting a mini-dialog's icon via GObject properties. + * @param mini_dialog a mini-dialog + * @param title the Gtk stock ID of an icon, or @c NULL for no icon. + */ +void pidgin_mini_dialog_set_icon_name(PidginMiniDialog *mini_dialog, + const char *icon_name); + +/** Adds a new button to a mini-dialog, and attaches the supplied callback to + * its <tt>clicked</tt> signal. After a button is clicked, the dialog is + * destroyed. + * @param mini_dialog a mini-dialog + * @param text the text to display on the new button + * @param clicked_cb the function to call when the button is clicked + * @param user_data arbitrary data to pass to @a clicked_cb when it is + * called. + */ +void pidgin_mini_dialog_add_button(PidginMiniDialog *mini_dialog, + const char *text, PidginMiniDialogCallback clicked_cb, + gpointer user_data); + +/** Gets the number of widgets packed into PidginMiniDialog.contents. + * @param mini_dialog a mini-dialog + * @return the number of widgets in @a mini_dialog->contents. + */ +guint pidgin_mini_dialog_get_num_children(PidginMiniDialog *mini_dialog); + +G_END_DECLS + +#endif /* __PIDGIN_MINI_DIALOG_H__ */
--- a/pidgin/pidgin-uninstalled.pc.in Mon Nov 12 16:15:53 2007 +0000 +++ b/pidgin/pidgin-uninstalled.pc.in Mon Nov 12 16:53:54 2007 +0000 @@ -3,6 +3,7 @@ libdir=@libdir@ includedir=@includedir@ datadir=@datadir@ +datarootdir=@datarootdir@ sysconfdir=@sysconfdir@ Name: Pidgin
--- a/pidgin/pidgin.pc.in Mon Nov 12 16:15:53 2007 +0000 +++ b/pidgin/pidgin.pc.in Mon Nov 12 16:53:54 2007 +0000 @@ -3,6 +3,7 @@ libdir=@libdir@ includedir=@includedir@ datadir=@datadir@ +datarootdir=@datarootdir@ sysconfdir=@sysconfdir@ Name: Pidgin
--- a/pidgin/pixmaps/Makefile.am Mon Nov 12 16:15:53 2007 +0000 +++ b/pidgin/pixmaps/Makefile.am Mon Nov 12 16:53:54 2007 +0000 @@ -1,38 +1,12 @@ pidginpixmapdir = $(datadir)/pixmaps/pidgin +pidginiconsdir = $(datadir) -SUBDIRS = buddy_icons/qq dialogs/16 dialogs/64 emblems/16 \ - emotes/default/24 emotes/none \ - icons/16 icons/22 icons/24 icons/32 icons/48 \ - protocols/16 protocols/22 protocols/48 \ - status/11 status/16 status/22 status/32 status/48 \ - toolbar/16 toolbar/22 tray/16 tray/22 tray/32 tray/48 +SUBDIRS = buddy_icons/qq emotes/default/24 emotes/none MAKEFILE_MINGW = \ buddy_icons/qq/Makefile.mingw \ - dialogs/16/Makefile.mingw \ - dialogs/64/Makefile.mingw \ - emotes/default/Makefile.mingw \ emotes/default/24/Makefile.mingw \ - emotes/none/Makefile.mingw \ - emblems/16/Makefile.mingw \ - protocols/22/Makefile.mingw \ - protocols/48/Makefile.mingw \ - status/11/Makefile.mingw \ - status/11/rtl/Makefile.mingw \ - status/16/Makefile.mingw \ - status/16/rtl/Makefile.mingw \ - status/22/Makefile.mingw \ - status/22/rtl/Makefile.mingw \ - status/32/Makefile.mingw \ - status/32/rtl/Makefile.mingw \ - status/48/Makefile.mingw \ - status/48/rtl/Makefile.mingw \ - toolbar/16/Makefile.mingw \ - toolbar/22/Makefile.mingw \ - tray/16/Makefile.mingw \ - tray/22/Makefile.mingw \ - tray/32/Makefile.mingw \ - tray/48/Makefile.mingw + emotes/none/Makefile.mingw ANIMATIONS_16 = \ animations/16/connect0.png \ @@ -56,6 +30,13 @@ dialogs/16/scalable/info.svg \ dialogs/16/scalable/mail.svg +DIALOGS_16 = \ + dialogs/16/auth.png \ + dialogs/16/error.png \ + dialogs/16/info.png \ + dialogs/16/mail.png \ + dialogs/16/question.png + DIALOGS_64_SCALABLE = \ dialogs/64/scalable/auth.svg \ dialogs/64/scalable/cool.svg \ @@ -65,6 +46,16 @@ dialogs/64/scalable/question.svg \ dialogs/64/scalable/warning.svg +DIALOGS_64 = \ + dialogs/64/auth.png \ + dialogs/64/cool.png \ + dialogs/64/dialog.png \ + dialogs/64/error.png \ + dialogs/64/info.png \ + dialogs/64/mail.png \ + dialogs/64/question.png \ + dialogs/64/warning.png + EMBLEMS_16_SCALABLE = \ emblems/16/scalable/aol-client.svg \ emblems/16/scalable/blocked.svg \ @@ -83,6 +74,29 @@ emblems/16/scalable/video.svg \ emblems/16/scalable/voice.svg +EMBLEMS_16 = \ + emblems/16/aol-client.png \ + emblems/16/birthday.png \ + emblems/16/blocked.png \ + emblems/16/bot.png \ + emblems/16/external.png \ + emblems/16/female.png \ + emblems/16/founder.png \ + emblems/16/free-for-chat.png \ + emblems/16/game.png \ + emblems/16/half-operator.png \ + emblems/16/hiptop.png \ + emblems/16/male.png \ + emblems/16/mobile.png \ + emblems/16/music.png \ + emblems/16/not-authorized.png \ + emblems/16/operator.png \ + emblems/16/qq-member.png \ + emblems/16/secure.png \ + emblems/16/unavailable.png \ + emblems/16/video.png \ + emblems/16/voice.png + EMOTES_DEFAULT_24_SCALABLE = \ emotes/default/24/scalable/act-up.svg \ emotes/default/24/scalable/airplane.svg \ @@ -290,20 +304,48 @@ protocols/16/scalable/yahoo.svg \ protocols/16/scalable/zephyr.svg +PROTOCOLS_16 = \ + protocols/16/aim.png \ + protocols/16/bonjour.png \ + protocols/16/gadu-gadu.png \ + protocols/16/google-talk.png \ + protocols/16/novell.png \ + protocols/16/icq.png \ + protocols/16/irc.png \ + protocols/16/jabber.png \ + protocols/16/meanwhile.png \ + protocols/16/msn.png \ + protocols/16/myspace.png \ + protocols/16/qq.png \ + protocols/16/silc.png \ + protocols/16/simple.png \ + protocols/16/yahoo.png \ + protocols/16/zephyr.png + ICONS_16_SCALABLE = \ - icons/16/scalable/pidgin.svg + icons/hicolor/16x16/apps/scalable/pidgin.svg + +ICONS_16 = icons/hicolor/16x16/apps/pidgin.png ICONS_22_SCALABLE = \ - icons/22/scalable/pidgin.svg + icons/hicolor/22x22/apps/scalable/pidgin.svg + +ICONS_22 = icons/hicolor/22x22/apps/pidgin.png ICONS_24_SCALABLE = \ - icons/24/scalable/pidgin.svg + icons/hicolor/24x24/apps/scalable/pidgin.svg + +ICONS_24 = icons/hicolor/24x24/apps/pidgin.png ICONS_32_SCALABLE = \ - icons/32/scalable/pidgin.svg + icons/hicolor/32x32/apps/scalable/pidgin.svg + +ICONS_32 = icons/hicolor/32x32/apps/pidgin.png ICONS_48_SCALABLE = \ - icons/48/scalable/pidgin.svg + icons/hicolor/48x48/apps/scalable/pidgin.svg + +ICONS_48 = icons/hicolor/48x48/apps/pidgin.png PROTOCOLS_22_SCALABLE = \ protocols/22/scalable/aim.svg \ @@ -321,6 +363,24 @@ protocols/22/scalable/yahoo.svg \ protocols/22/scalable/zephyr.svg +PROTOCOLS_22 = \ + protocols/22/aim.png \ + protocols/22/bonjour.png \ + protocols/22/gadu-gadu.png \ + protocols/22/google-talk.png \ + protocols/22/novell.png \ + protocols/22/icq.png \ + protocols/22/irc.png \ + protocols/22/jabber.png \ + protocols/22/meanwhile.png \ + protocols/22/msn.png \ + protocols/22/myspace.png \ + protocols/22/qq.png \ + protocols/22/silc.png \ + protocols/22/simple.png \ + protocols/22/yahoo.png \ + protocols/22/zephyr.png + PROTOCOLS_48_SCALABLE = \ protocols/48/scalable/aim.svg \ protocols/48/scalable/bonjour.svg \ @@ -338,6 +398,23 @@ protocols/48/scalable/yahoo.svg \ protocols/48/scalable/zephyr.svg +PROTOCOLS_48 = \ + protocols/48/aim.png \ + protocols/48/bonjour.png \ + protocols/48/gadu-gadu.png \ + protocols/48/novell.png \ + protocols/48/icq.png \ + protocols/48/irc.png \ + protocols/48/jabber.png \ + protocols/48/meanwhile.png \ + protocols/48/msn.png \ + protocols/48/myspace.png \ + protocols/48/qq.png \ + protocols/48/silc.png \ + protocols/48/simple.png \ + protocols/48/yahoo.png \ + protocols/48/zephyr.png + STATUS_11_SCALABLE = \ status/11/scalable/available.svg \ status/11/scalable/away.svg \ @@ -348,6 +425,21 @@ status/11/scalable/offline.svg \ status/11/scalable/person.svg +STATUS_11 = \ + status/11/available.png \ + status/11/away.png \ + status/11/busy.png \ + status/11/chat.png \ + status/11/extended-away.png \ + status/11/invisible.png \ + status/11/log-in.png \ + status/11/log-out.png \ + status/11/offline.png \ + status/11/person.png + +STATUS_11_RTL = \ + status/11/rtl/extended-away.png + STATUS_16_SCALABLE = \ status/16/scalable/available.svg \ status/16/scalable/away.svg \ @@ -360,6 +452,23 @@ status/16/scalable/offline.svg \ status/16/scalable/person.svg +STATUS_16 = \ + status/16/available.png \ + status/16/away.png \ + status/16/busy.png \ + status/16/chat.png \ + status/16/extended-away.png \ + status/16/invisible.png \ + status/16/log-in.png \ + status/16/log-out.png \ + status/16/offline.png \ + status/16/person.png + +STATUS_16_RTL = \ + status/16/rtl/extended-away.png \ + status/16/rtl/log-in.png \ + status/16/rtl/log-out.png + STATUS_22_SCALABLE = \ status/22/scalable/available.svg \ status/22/scalable/away.svg \ @@ -371,6 +480,23 @@ status/22/scalable/offline.svg \ status/22/scalable/person.svg +STATUS_22 = \ + status/22/available.png \ + status/22/away.png \ + status/22/busy.png \ + status/22/chat.png \ + status/22/extended-away.png \ + status/22/invisible.png \ + status/22/log-in.png \ + status/22/log-out.png \ + status/22/offline.png \ + status/22/person.png + +STATUS_22_RTL = \ + status/22/rtl/extended-away.png \ + status/22/rtl/log-in.png \ + status/22/rtl/log-out.png + STATUS_32_SCALABLE = \ status/32/scalable/available.svg \ status/32/scalable/away.svg \ @@ -382,6 +508,37 @@ status/32/scalable/offline.svg \ status/32/scalable/person.svg +STATUS_32 = \ + status/32/available.png \ + status/32/away.png \ + status/32/busy.png \ + status/32/chat.png \ + status/32/extended-away.png \ + status/32/invisible.png \ + status/32/log-in.png \ + status/32/log-out.png \ + status/32/offline.png \ + status/32/person.png + +STATUS_32_RTL = \ + status/32/rtl/extended-away.png \ + status/32/rtl/log-in.png \ + status/32/rtl/log-out.png + +STATUS_48 = \ + status/48/available.png \ + status/48/away.png \ + status/48/busy.png \ + status/48/chat.png \ + status/48/extended-away.png \ + status/48/log-in.png \ + status/48/log-out.png \ + status/48/offline.png \ + status/48/person.png + +STATUS_48_RTL = \ + status/48/rtl/extended-away.png + TOOLBAR_11 = \ toolbar/11/message-new.png @@ -392,9 +549,27 @@ toolbar/16/scalable/font-size-down.svg \ toolbar/16/scalable/font-size-up.svg +TOOLBAR_16 = \ + toolbar/16/change-bgcolor.png \ + toolbar/16/change-fgcolor.png \ + toolbar/16/emote-select.png \ + toolbar/16/font-face.png \ + toolbar/16/font-size-down.png \ + toolbar/16/font-size-up.png \ + toolbar/16/insert.png \ + toolbar/16/insert-image.png \ + toolbar/16/insert-link.png \ + toolbar/16/message-new.png \ + toolbar/16/plugins.png \ + toolbar/16/send-file.png \ + toolbar/16/unblock.png + TOOLBAR_22_SCALABLE = \ toolbar/22/scalable/select-avatar.svg +TOOLBAR_22 = \ + toolbar/22/select-avatar.png + TRAY_16_SCALABLE = \ tray/16/scalable/tray-away.svg \ tray/16/scalable/tray-busy.svg \ @@ -405,9 +580,61 @@ tray/16/scalable/tray-offline.svg \ tray/16/scalable/tray-online.svg +TRAY_16_ICO = \ + tray/16/available_4bit.ico \ + tray/16/away_4bit.ico \ + tray/16/busy_4bit.ico \ + tray/16/connecting_4bit.ico \ + tray/16/extended-away_4bit.ico \ + tray/16/invisible_4bit.ico \ + tray/16/message_4bit.ico \ + tray/16/offline_4bit.ico + +TRAY_16 = \ + tray/16/tray-away.png \ + tray/16/tray-busy.png \ + tray/16/tray-invisible.png \ + tray/16/tray-connecting.png \ + tray/16/tray-extended-away.png \ + tray/16/tray-message.png \ + tray/16/tray-new-im.png \ + tray/16/tray-offline.png \ + tray/16/tray-online.png + TRAY_22_SCALABLE = \ tray/22/scalable/tray-invisible.svg +TRAY_22 = \ + tray/22/tray-away.png \ + tray/22/tray-busy.png \ + tray/22/tray-connecting.png \ + tray/22/tray-extended-away.png \ + tray/22/tray-invisible.png \ + tray/22/tray-message.png \ + tray/22/tray-new-im.png \ + tray/22/tray-offline.png \ + tray/22/tray-online.png + +TRAY_32 = \ + tray/32/tray-away.png \ + tray/32/tray-busy.png \ + tray/32/tray-connecting.png \ + tray/32/tray-extended-away.png \ + tray/32/tray-invisible.png \ + tray/32/tray-new-im.png \ + tray/32/tray-offline.png \ + tray/32/tray-online.png + +TRAY_48 = \ + tray/48/tray-away.png \ + tray/48/tray-busy.png \ + tray/48/tray-connecting.png \ + tray/48/tray-extended-away.png \ + tray/48/tray-invisible.png \ + tray/48/tray-new-im.png \ + tray/48/tray-offline.png \ + tray/48/tray-online.png + EXTRA_DIST = \ edit.png \ info.png \ @@ -439,6 +666,7 @@ $(TOOLBAR_11) \ $(TOOLBAR_16_SCALABLE) \ $(TOOLBAR_22_SCALABLE) \ + $(TRAY_16_ICO) \ $(TRAY_16_SCALABLE) \ $(TRAY_22_SCALABLE) @@ -448,4 +676,34 @@ pidgindistpixdir = $(datadir)/pixmaps/pidgin pidgindistpix_DATA = logo.png arrow-down.xpm arrow-left.xpm arrow-right.xpm arrow-up.xpm -nobase_dist_pidginpixmap_DATA = $(ANIMATIONS_16) +nobase_dist_pidginpixmap_DATA = \ + $(ANIMATIONS_16) \ + $(DIALOGS_16) \ + $(DIALOGS_64) \ + $(EMBLEMS_16) \ + $(PROTOCOLS_16) \ + $(PROTOCOLS_22) \ + $(PROTOCOLS_48) \ + $(STATUS_11) \ + $(STATUS_11_RTL) \ + $(STATUS_16) \ + $(STATUS_16_RTL) \ + $(STATUS_22) \ + $(STATUS_22_RTL) \ + $(STATUS_32) \ + $(STATUS_32_RTL) \ + $(STATUS_48) \ + $(STATUS_48_RTL) \ + $(TOOLBAR_16) \ + $(TOOLBAR_22) \ + $(TRAY_16) \ + $(TRAY_22) \ + $(TRAY_32) \ + $(TRAY_48) + +nobase_dist_pidginicons_DATA = \ + $(ICONS_16) \ + $(ICONS_22) \ + $(ICONS_24) \ + $(ICONS_32) \ + $(ICONS_48)
--- a/pidgin/pixmaps/Makefile.mingw Mon Nov 12 16:15:53 2007 +0000 +++ b/pidgin/pixmaps/Makefile.mingw Mon Nov 12 16:53:54 2007 +0000 @@ -15,9 +15,7 @@ install: if test '$(SUBDIRS)'; then \ list='$(SUBDIRS)'; for subdir in $$list; do \ - if [[ "$$subdir" != icons/* ]]; then \ $(MAKE) -C $$subdir -f $(MINGW_MAKEFILE) install || exit 1 ;\ - fi \ done; \ fi; if test '$(nobase_dist_pidginpixmap_DATA)'; then \
--- a/pidgin/pixmaps/dialogs/16/Makefile.am Mon Nov 12 16:15:53 2007 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,10 +0,0 @@ -EXTRA_DIST = auth.png \ - error.png \ - info.png \ - mail.png \ - question.png - -pidgindialogpixdir = $(datadir)/pixmaps/pidgin/dialogs/16 - -pidgindialogpix_DATA = $(EXTRA_DIST) -
--- a/pidgin/pixmaps/dialogs/16/Makefile.mingw Mon Nov 12 16:15:53 2007 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,20 +0,0 @@ -# -# Makefile.mingw -# -# Description: Makefile for win32 (mingw) version of Pidgin pixmaps -# - -PIDGIN_TREE_TOP := ../../../.. -include $(PIDGIN_TREE_TOP)/libpurple/win32/global.mak - -datadir = $(PIDGIN_INSTALL_DIR) -include ./Makefile.am - -.PHONY: install - -install: - if test '$(pidgindialogpix_DATA)'; then \ - mkdir -p $(pidgindialogpixdir); \ - cp $(pidgindialogpix_DATA) $(pidgindialogpixdir); \ - fi; -
--- a/pidgin/pixmaps/dialogs/64/Makefile.am Mon Nov 12 16:15:53 2007 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,12 +0,0 @@ -EXTRA_DIST = auth.png \ - cool.png \ - dialog.png \ - error.png \ - info.png \ - mail.png \ - question.png \ - warning.png - -pidgindialogpixdir = $(datadir)/pixmaps/pidgin/dialogs/64 - -pidgindialogpix_DATA = $(EXTRA_DIST)
--- a/pidgin/pixmaps/dialogs/64/Makefile.mingw Mon Nov 12 16:15:53 2007 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,20 +0,0 @@ -# -# Makefile.mingw -# -# Description: Makefile for win32 (mingw) version of Pidgin pixmaps -# - -PIDGIN_TREE_TOP := ../../../.. -include $(PIDGIN_TREE_TOP)/libpurple/win32/global.mak - -datadir = $(PIDGIN_INSTALL_DIR) -include ./Makefile.am - -.PHONY: install - -install: - if test '$(pidgindialogpix_DATA)'; then \ - mkdir -p $(pidgindialogpixdir); \ - cp $(pidgindialogpix_DATA) $(pidgindialogpixdir); \ - fi; -
--- a/pidgin/pixmaps/emblems/16/Makefile.am Mon Nov 12 16:15:53 2007 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,24 +0,0 @@ -EXTRA_DIST = aol-client.png \ - birthday.png \ - blocked.png \ - bot.png \ - external.png \ - female.png \ - founder.png \ - free-for-chat.png \ - game.png \ - half-operator.png \ - hiptop.png \ - male.png \ - mobile.png \ - music.png \ - not-authorized.png \ - operator.png \ - qq-member.png \ - secure.png \ - unavailable.png \ - video.png \ - voice.png - -pidginemblempixdir = $(datadir)/pixmaps/pidgin/emblems/16 -pidginemblempix_DATA = $(EXTRA_DIST)
--- a/pidgin/pixmaps/emblems/16/Makefile.mingw Mon Nov 12 16:15:53 2007 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,20 +0,0 @@ -# -# Makefile.mingw -# -# Description: Makefile for win32 (mingw) version of Pidgin pixmaps -# - -PIDGIN_TREE_TOP := ../../../.. -include $(PIDGIN_TREE_TOP)/libpurple/win32/global.mak - -datadir = $(PIDGIN_INSTALL_DIR) -include ./Makefile.am - -.PHONY: install - -install: - if test '$(pidginemblempix_DATA)'; then \ - mkdir -p $(pidginemblempixdir); \ - cp $(pidginemblempix_DATA) $(pidginemblempixdir); \ - fi; -
--- a/pidgin/pixmaps/emotes/default/Makefile.mingw Mon Nov 12 16:15:53 2007 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,24 +0,0 @@ -# -# Makefile.mingw -# -# Description: Makefile for win32 (mingw) version of Pidgin pixmaps -# - -include ./Makefile.am - -.PHONY: install clean - -install: - if test '$(SUBDIRS)'; then \ - list='$(SUBDIRS)'; for subdir in $$list; do \ - $(MAKE) -C $$subdir -f Makefile.mingw install || exit 1; \ - done; \ - fi; - -clean: - if test '$(SUBDIRS)'; then \ - list='$(SUBDIRS)'; for subdir in $$list; do \ - $(MAKE) -C $$subdir -f Makefile.mingw clean || exit 1; \ - done; \ - fi; -
--- a/pidgin/pixmaps/icons/16/Makefile.am Mon Nov 12 16:15:53 2007 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,6 +0,0 @@ -EXTRA_DIST = pidgin.png - -pidginiconspixdir = $(datadir)/icons/hicolor/16x16/apps - -pidginiconspix_DATA = $(EXTRA_DIST) -
--- a/pidgin/pixmaps/icons/16/scalable/pidgin.svg Mon Nov 12 16:15:53 2007 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,784 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<!-- Created with Inkscape (http://www.inkscape.org/) --> -<svg - xmlns:dc="http://purl.org/dc/elements/1.1/" - xmlns:cc="http://web.resource.org/cc/" - xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:svg="http://www.w3.org/2000/svg" - xmlns="http://www.w3.org/2000/svg" - xmlns:xlink="http://www.w3.org/1999/xlink" - xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" - xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - width="16" - height="16" - id="svg4345" - sodipodi:version="0.32" - inkscape:version="0.44.1" - sodipodi:docbase="/home/hbons/Desktop/2.0.2/pidgin/pixmaps/icons/16/scalable" - sodipodi:docname="pidgin.svg" - inkscape:export-filename="/home/hbons/Desktop/pidgin16.png" - inkscape:export-xdpi="90" - inkscape:export-ydpi="90" - version="1.0"> - <defs - id="defs4347"> - <linearGradient - inkscape:collect="always" - id="linearGradient3157"> - <stop - style="stop-color:#eeeeec;stop-opacity:1;" - offset="0" - id="stop3159" /> - <stop - style="stop-color:#eeeeec;stop-opacity:0;" - offset="1" - id="stop3161" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient3149"> - <stop - style="stop-color:#3b1941;stop-opacity:1;" - offset="0" - id="stop3151" /> - <stop - style="stop-color:#3b1941;stop-opacity:0;" - offset="1" - id="stop3153" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient3141"> - <stop - style="stop-color:#82508e;stop-opacity:1;" - offset="0" - id="stop3143" /> - <stop - style="stop-color:#82508e;stop-opacity:0;" - offset="1" - id="stop3145" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient3128"> - <stop - style="stop-color:#eeeeec;stop-opacity:1;" - offset="0" - id="stop3130" /> - <stop - style="stop-color:#eeeeec;stop-opacity:0;" - offset="1" - id="stop3132" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient5438"> - <stop - style="stop-color:white;stop-opacity:1;" - offset="0" - id="stop5440" /> - <stop - style="stop-color:white;stop-opacity:0;" - offset="1" - id="stop5442" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient6817"> - <stop - style="stop-color:white;stop-opacity:1;" - offset="0" - id="stop6819" /> - <stop - style="stop-color:white;stop-opacity:0;" - offset="1" - id="stop6821" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient6537"> - <stop - style="stop-color:white;stop-opacity:1;" - offset="0" - id="stop6539" /> - <stop - style="stop-color:white;stop-opacity:0;" - offset="1" - id="stop6541" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient6506"> - <stop - style="stop-color:#eeeeec;stop-opacity:1;" - offset="0" - id="stop6508" /> - <stop - style="stop-color:#eeeeec;stop-opacity:0;" - offset="1" - id="stop6510" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient5280"> - <stop - style="stop-color:#82508e;stop-opacity:1;" - offset="0" - id="stop5282" /> - <stop - style="stop-color:#82508e;stop-opacity:0;" - offset="1" - id="stop5284" /> - </linearGradient> - <linearGradient - id="linearGradient2804"> - <stop - style="stop-color:black;stop-opacity:0;" - offset="0" - id="stop2806" /> - <stop - id="stop2812" - offset="0.5" - style="stop-color:black;stop-opacity:1;" /> - <stop - style="stop-color:black;stop-opacity:0;" - offset="1" - id="stop2808" /> - </linearGradient> - <radialGradient - inkscape:collect="always" - xlink:href="#linearGradient25546" - id="radialGradient25572" - gradientUnits="userSpaceOnUse" - gradientTransform="matrix(1,0,0,0.994693,0,4.16407e-2)" - cx="7.8836637" - cy="1.5104795" - fx="7.8836637" - fy="1.5104795" - r="8.4883642" /> - <radialGradient - inkscape:collect="always" - xlink:href="#linearGradient25546" - id="radialGradient25568" - gradientUnits="userSpaceOnUse" - gradientTransform="matrix(1,0,0,0.994693,0,4.16407e-2)" - cx="7.8836741" - cy="0.14505707" - fx="7.8836741" - fy="0.14505707" - r="8.4883642" /> - <linearGradient - inkscape:collect="always" - id="linearGradient25546"> - <stop - style="stop-color:white;stop-opacity:1;" - offset="0" - id="stop25548" /> - <stop - style="stop-color:white;stop-opacity:0;" - offset="1" - id="stop25550" /> - </linearGradient> - <radialGradient - inkscape:collect="always" - xlink:href="#linearGradient25546" - id="radialGradient25554" - cx="7.8836637" - cy="2.6242435" - fx="7.8836637" - fy="2.6242435" - r="8.4883642" - gradientTransform="matrix(1.131317,0,0,1.125313,-1.035262,-0.301139)" - gradientUnits="userSpaceOnUse" /> - <linearGradient - id="linearGradient3800"> - <stop - style="stop-color:#f4d9b1;stop-opacity:1.0000000;" - offset="0.0000000" - id="stop3802" /> - <stop - style="stop-color:#df9725;stop-opacity:1.0000000;" - offset="1.0000000" - id="stop3804" /> - </linearGradient> - <radialGradient - inkscape:collect="always" - xlink:href="#linearGradient5280" - id="radialGradient5286" - cx="15.004828" - cy="39.80859" - fx="15.004828" - fy="39.80859" - r="9.7225161" - gradientTransform="matrix(1,0,0,0.732283,0,10.65742)" - gradientUnits="userSpaceOnUse" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient6537" - id="linearGradient6543" - x1="30.5" - y1="0.033532728" - x2="30.5" - y2="23.559282" - gradientUnits="userSpaceOnUse" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient6817" - id="linearGradient6823" - x1="0.23931108" - y1="38.950283" - x2="5.7089725" - y2="42.982571" - gradientUnits="userSpaceOnUse" - gradientTransform="matrix(0.63556,0,0,0.371995,11.16667,-5.489292)" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient5438" - id="linearGradient5444" - x1="30.152058" - y1="-0.86487341" - x2="30.152058" - y2="23.011967" - gradientUnits="userSpaceOnUse" /> - <linearGradient - inkscape:collect="always" - id="linearGradient3976"> - <stop - style="stop-color:#3b1941;stop-opacity:1;" - offset="0" - id="stop3978" /> - <stop - style="stop-color:#3b1941;stop-opacity:0;" - offset="1" - id="stop3980" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient3968"> - <stop - style="stop-color:#82508e;stop-opacity:1;" - offset="0" - id="stop3970" /> - <stop - style="stop-color:#82508e;stop-opacity:0;" - offset="1" - id="stop3972" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient3958"> - <stop - style="stop-color:#eeeeec;stop-opacity:1;" - offset="0" - id="stop3960" /> - <stop - style="stop-color:#eeeeec;stop-opacity:0;" - offset="1" - id="stop3962" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient2850"> - <stop - style="stop-color:#ce5c00;stop-opacity:1;" - offset="0" - id="stop2852" /> - <stop - style="stop-color:#ce5c00;stop-opacity:0;" - offset="1" - id="stop2854" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient6563"> - <stop - style="stop-color:white;stop-opacity:1;" - offset="0" - id="stop6565" /> - <stop - style="stop-color:white;stop-opacity:0;" - offset="1" - id="stop6567" /> - </linearGradient> - <linearGradient - id="linearGradient2110"> - <stop - style="stop-color:black;stop-opacity:0;" - offset="0" - id="stop2112" /> - <stop - id="stop2114" - offset="0.5" - style="stop-color:black;stop-opacity:1;" /> - <stop - style="stop-color:black;stop-opacity:0;" - offset="1" - id="stop2067" /> - </linearGradient> - <radialGradient - inkscape:collect="always" - xlink:href="#linearGradient25546" - id="radialGradient2069" - gradientUnits="userSpaceOnUse" - gradientTransform="matrix(1,0,0,0.994693,0,4.16407e-2)" - cx="7.8836637" - cy="1.5104795" - fx="7.8836637" - fy="1.5104795" - r="8.4883642" /> - <radialGradient - inkscape:collect="always" - xlink:href="#linearGradient25546" - id="radialGradient2071" - gradientUnits="userSpaceOnUse" - gradientTransform="matrix(1,0,0,0.994693,0,4.16407e-2)" - cx="7.8836741" - cy="0.14505707" - fx="7.8836741" - fy="0.14505707" - r="8.4883642" /> - <radialGradient - inkscape:collect="always" - xlink:href="#linearGradient25546" - id="radialGradient2079" - cx="7.8836637" - cy="2.6242435" - fx="7.8836637" - fy="2.6242435" - r="8.4883642" - gradientTransform="matrix(1.131317,0,0,1.125313,-1.035262,-0.301139)" - gradientUnits="userSpaceOnUse" /> - <linearGradient - id="linearGradient2081"> - <stop - style="stop-color:#f4d9b1;stop-opacity:1.0000000;" - offset="0.0000000" - id="stop2104" /> - <stop - style="stop-color:#df9725;stop-opacity:1.0000000;" - offset="1.0000000" - id="stop2085" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient6506" - id="linearGradient2101" - x1="15.645709" - y1="39.743458" - x2="14.943421" - y2="50.079575" - gradientUnits="userSpaceOnUse" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient6537" - id="linearGradient2089" - x1="30.5" - y1="0.033532728" - x2="30.5" - y2="23.559282" - gradientUnits="userSpaceOnUse" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient6563" - id="linearGradient6569" - x1="-1.6841649" - y1="39.902092" - x2="5.5366187" - y2="44.272076" - gradientUnits="userSpaceOnUse" /> - <linearGradient - gradientUnits="userSpaceOnUse" - y2="23.011967" - x2="30.152058" - y1="-0.86487341" - x1="30.152058" - id="linearGradient2097" - xlink:href="#linearGradient5438" - inkscape:collect="always" /> - <linearGradient - gradientUnits="userSpaceOnUse" - y2="42.982571" - x2="5.7089725" - y1="38.950283" - x1="0.23931108" - id="linearGradient2095" - xlink:href="#linearGradient6817" - inkscape:collect="always" /> - <linearGradient - gradientUnits="userSpaceOnUse" - y2="50.726673" - x2="15.645709" - y1="40.434063" - x1="15.645709" - id="linearGradient2093" - xlink:href="#linearGradient6506" - inkscape:collect="always" /> - <linearGradient - id="linearGradient2087"> - <stop - id="stop2089" - offset="0.0000000" - style="stop-color:#f4d9b1;stop-opacity:1.0000000;" /> - <stop - id="stop2091" - offset="1.0000000" - style="stop-color:#df9725;stop-opacity:1.0000000;" /> - </linearGradient> - <radialGradient - gradientUnits="userSpaceOnUse" - gradientTransform="matrix(1.131317,0,0,1.125313,-1.035262,-0.301139)" - r="8.4883642" - fy="2.6242435" - fx="7.8836637" - cy="2.6242435" - cx="7.8836637" - id="radialGradient2085" - xlink:href="#linearGradient25546" - inkscape:collect="always" /> - <radialGradient - r="8.4883642" - fy="0.14505707" - fx="7.8836741" - cy="0.14505707" - cx="7.8836741" - gradientTransform="matrix(1,0,0,0.994693,0,4.16407e-2)" - gradientUnits="userSpaceOnUse" - id="radialGradient2077" - xlink:href="#linearGradient25546" - inkscape:collect="always" /> - <radialGradient - r="8.4883642" - fy="1.5104795" - fx="7.8836637" - cy="1.5104795" - cx="7.8836637" - gradientTransform="matrix(1,0,0,0.994693,0,4.16407e-2)" - gradientUnits="userSpaceOnUse" - id="radialGradient2075" - xlink:href="#linearGradient25546" - inkscape:collect="always" /> - <linearGradient - id="linearGradient2067"> - <stop - id="stop2069" - offset="0" - style="stop-color:black;stop-opacity:0;" /> - <stop - style="stop-color:black;stop-opacity:1;" - offset="0.5" - id="stop2071" /> - <stop - id="stop2073" - offset="1" - style="stop-color:black;stop-opacity:0;" /> - </linearGradient> - <linearGradient - id="linearGradient3108" - inkscape:collect="always"> - <stop - id="stop3110" - offset="0" - style="stop-color:#eeeeec;stop-opacity:1;" /> - <stop - id="stop3112" - offset="1" - style="stop-color:#eeeeec;stop-opacity:0;" /> - </linearGradient> - <linearGradient - id="linearGradient3116" - inkscape:collect="always"> - <stop - id="stop3118" - offset="0" - style="stop-color:#82508e;stop-opacity:1;" /> - <stop - id="stop3120" - offset="1" - style="stop-color:#82508e;stop-opacity:0;" /> - </linearGradient> - <linearGradient - id="linearGradient3124" - inkscape:collect="always"> - <stop - id="stop3126" - offset="0" - style="stop-color:#3b1941;stop-opacity:1;" /> - <stop - id="stop3128" - offset="1" - style="stop-color:#3b1941;stop-opacity:0;" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient2850" - id="linearGradient2187" - gradientUnits="userSpaceOnUse" - gradientTransform="matrix(0.769231,0,0,0.714287,47.76924,-9.285729)" - x1="21.785719" - y1="28.142857" - x2="17.785713" - y2="30.07143" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient2850" - id="linearGradient2195" - gradientUnits="userSpaceOnUse" - gradientTransform="matrix(0.769231,0,0,0.714287,13.76923,-8.28573)" - x1="21.785719" - y1="28.142857" - x2="17.785713" - y2="30.07143" /> - <radialGradient - inkscape:collect="always" - xlink:href="#linearGradient3958" - id="radialGradient2209" - gradientUnits="userSpaceOnUse" - gradientTransform="matrix(1.116159,0,0,1.076653,14.60502,-22.28695)" - cx="9.0640488" - cy="21.511742" - fx="9.0640488" - fy="21.511742" - r="16.663956" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient6506" - id="linearGradient2211" - gradientUnits="userSpaceOnUse" - gradientTransform="matrix(0.660903,0,0,0.627207,18.73149,-12.3201)" - x1="15.645709" - y1="39.743458" - x2="15.645709" - y2="53.502155" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient3968" - id="linearGradient2214" - gradientUnits="userSpaceOnUse" - gradientTransform="matrix(0.67692,0,0,0.646801,18.46433,-12.90841)" - x1="16.13257" - y1="40.781811" - x2="16.13257" - y2="48.068741" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient3976" - id="linearGradient2216" - gradientUnits="userSpaceOnUse" - gradientTransform="matrix(0.67692,0,0,0.646801,18.46433,-12.90841)" - x1="12.095973" - y1="40.907658" - x2="12.095973" - y2="46.463146" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient6537" - id="linearGradient2219" - gradientUnits="userSpaceOnUse" - gradientTransform="matrix(0.668893,0,0,0.668627,18.08624,-12.19246)" - x1="30.5" - y1="0.033532728" - x2="30.5" - y2="23.559282" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient3108" - id="linearGradient2229" - gradientUnits="userSpaceOnUse" - x1="10.18327" - y1="16.618088" - x2="27.598003" - y2="36.64465" - gradientTransform="matrix(0.660903,0,0,0.627207,49.74106,-7.361383)" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient6506" - id="linearGradient2231" - gradientUnits="userSpaceOnUse" - x1="15.645709" - y1="39.743458" - x2="15.645709" - y2="53.502155" - gradientTransform="matrix(0.660903,0,0,0.627207,49.74106,-7.361383)" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient3116" - id="linearGradient2234" - gradientUnits="userSpaceOnUse" - x1="15.722902" - y1="39.585075" - x2="15.722902" - y2="45.76453" - gradientTransform="matrix(0.67692,0,0,0.646801,49.4739,-7.949693)" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient3124" - id="linearGradient2236" - gradientUnits="userSpaceOnUse" - x1="13.150809" - y1="39.39394" - x2="13.150809" - y2="45.551888" - gradientTransform="matrix(0.67692,0,0,0.646801,49.4739,-7.949693)" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient3128" - id="linearGradient3134" - x1="8.0725698" - y1="17.765934" - x2="24.284664" - y2="37.578945" - gradientUnits="userSpaceOnUse" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient3141" - id="linearGradient3147" - x1="12.353984" - y1="38.611191" - x2="12.353984" - y2="45.595356" - gradientUnits="userSpaceOnUse" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient3149" - id="linearGradient3155" - x1="10.166225" - y1="38.766953" - x2="10.166225" - y2="45.595673" - gradientUnits="userSpaceOnUse" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient3157" - id="linearGradient3163" - x1="11.982447" - y1="39.088425" - x2="11.982447" - y2="45.778931" - gradientUnits="userSpaceOnUse" /> - </defs> - <sodipodi:namedview - id="base" - pagecolor="#ffffff" - bordercolor="#666666" - borderopacity="1.0" - inkscape:pageopacity="0.0" - inkscape:pageshadow="2" - inkscape:zoom="30.009658" - inkscape:cx="15.476031" - inkscape:cy="9.174961" - inkscape:current-layer="layer1" - showgrid="true" - inkscape:grid-bbox="true" - inkscape:document-units="px" - inkscape:window-width="1434" - inkscape:window-height="840" - inkscape:window-x="0" - inkscape:window-y="0" - showguides="true" - inkscape:guide-bbox="true" - inkscape:grid-points="false" - width="16px" - height="16px" - inkscape:object-bbox="true" /> - <metadata - id="metadata4350"> - <rdf:RDF> - <cc:Work - rdf:about=""> - <dc:format>image/svg+xml</dc:format> - <dc:type - rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> - </cc:Work> - </rdf:RDF> - </metadata> - <g - id="layer1" - inkscape:label="Layer 1" - inkscape:groupmode="layer"> - <path - style="opacity:1;fill:#75507b;fill-opacity:1" - d="M 36.0625,8 C 33.978257,8 33.334928,10.523086 34.78125,12.9375 C 35.250389,13.720651 36.674297,15.15311 36.86722,15.15311 L 36.878267,14.508325 C 36.288194,13.580567 35.517363,12.502064 35.686987,12.281543 C 37.835781,12.281543 38,11.491782 38,10.027674 C 38,8.7542399 37.228501,8 36.0625,8 z " - id="path6521" - transform="matrix(1.148904,0,0,0.920169,-34.28919,-3.241212)" - sodipodi:nodetypes="csccccc" /> - <path - style="opacity:1;fill:url(#linearGradient3147);fill-opacity:1.0;stroke:url(#linearGradient3155);stroke-width:2.30209565;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - d="M 15,13 C 8.3759979,13 3,18.600001 3,25.5 C 3,31.153143 2.9750563,38.402618 2.9750563,45.572826 C 4.1625449,45.572826 27.946366,45.600605 30.637365,45.600605 C 32.751492,45.600605 32.586331,43.541005 32.586331,43.541005 C 32.586331,40.875594 27.597902,38.639057 25.813453,36.682531 C 23.985035,34.68151 26,30.884078 26,30.884078 C 26.641306,29.354278 28.01889,26.891006 28.01889,25.115922 C 28.01889,18.215923 21.624002,13 15,13 z " - id="path5176" - sodipodi:nodetypes="ccccszcsc" - transform="matrix(0.43939,0,0,0.42944,-0.819445,-4.082726)" /> - <rect - style="opacity:1;fill:white;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="rect6331" - width="2.6154532" - height="1.1545694" - x="5.513658" - y="6.4806929" - rx="0.48532724" - ry="0.32910046" - transform="matrix(1.147027,0,0,0.866113,-0.324314,2.386999)" /> - <path - transform="matrix(0.399589,0,0,0.393554,-5.973603e-2,-3.038964)" - style="opacity:0.5;fill:url(#linearGradient3134);fill-opacity:1.0;stroke:url(#linearGradient3163);stroke-width:2.5216887;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - d="M 15,14.0625 C 8.9877035,14.0625 4.0789961,19.13808 4.0625,25.46875 C 4.0624722,25.479427 4.0617033,25.489349 4.0625,25.5 C 4.0625,32.787473 3.9033639,38.26012 3.9033639,44.499878 C 5.8399452,44.499878 24.86993,44.470084 30.695903,44.470084 C 29.746978,42.549359 26.273076,40.711023 23.972608,38.78763 C 23.362603,37.973536 23.023697,35.459892 22.969233,34.418473 C 23.611113,31.359155 25.129532,28.401757 26.527172,25.440129 C 26.527172,19.094533 21.022436,14.0625 15,14.0625 z " - id="path5241" - sodipodi:nodetypes="csccccccc" /> - <path - style="opacity:1;fill:#a46bb0;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1" - d="M 6,7.2175674 C 6,8.8735678 4.5070272,10 3.4999996,10 C 2.1199999,10 1,8.6559998 1,6.9999995 C 1,5.5609093 1.7677476,4 3.1477475,4 C 4.5277481,4 6,5.9092686 6,7.2175674 z " - id="path3137" - sodipodi:nodetypes="csssc" /> - <path - transform="matrix(0.626764,0,0,0.689441,-3.309086,-9.833164)" - style="opacity:1;fill:white;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1" - d="M 13.257119,24.626053 C 13.257119,26.227351 11.8279,27.316574 10.863875,27.316574 C 9.5428049,27.316574 8.4706318,26.01697 8.4706318,24.415672 C 8.4706318,23.024119 9.2055946,21.514771 10.526665,21.514771 C 11.847736,21.514771 13.257119,23.360971 13.257119,24.626053 z " - id="path5157" - sodipodi:nodetypes="csssc" /> - <path - sodipodi:type="arc" - style="opacity:1;fill:#5c3566;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="path5162" - sodipodi:cx="10.169642" - sodipodi:cy="24.3125" - sodipodi:rx="1.2410715" - sodipodi:ry="1.2946428" - d="M 11.410714 24.3125 A 1.2410715 1.2946428 0 1 1 8.928571,24.3125 A 1.2410715 1.2946428 0 1 1 11.410714 24.3125 z" - transform="matrix(0.805757,0,0,1.158623,-4.194263,-20.66902)" /> - <path - style="opacity:1;fill:#a46bb0;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1" - d="M 11.387086,4.6790601 C 10.509745,3.6558267 9.0824486,3.9284339 8.5222543,4.5817815 C 7.7545814,5.4771092 7.8435868,7.0342022 8.7209273,8.0574357 C 9.4833498,8.9466415 10.737398,9.413013 11.505071,8.5176851 C 12.272744,7.6223568 12.080215,5.4874505 11.387086,4.6790601 z " - id="path3139" - sodipodi:nodetypes="csssc" /> - <path - transform="matrix(0.29055,-0.412361,-0.273947,-0.388798,13.58792,20.45445)" - style="opacity:1;fill:white;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1" - d="M 13.257119,24.626053 C 13.257119,26.227351 11.8279,27.316574 10.863875,27.316574 C 9.5428049,27.316574 8.4706318,26.01697 8.4706318,24.415672 C 8.4706318,23.024119 9.2055946,21.514771 10.526665,21.514771 C 11.847736,21.514771 13.257119,23.360971 13.257119,24.626053 z " - id="path5169" - sodipodi:nodetypes="csssc" /> - <path - sodipodi:type="arc" - style="opacity:1;fill:#5c3566;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="path5171" - sodipodi:cx="10.169642" - sodipodi:cy="24.3125" - sodipodi:rx="1.2410715" - sodipodi:ry="1.2946428" - d="M 11.410714 24.3125 A 1.2410715 1.2946428 0 1 1 8.928571,24.3125 A 1.2410715 1.2946428 0 1 1 11.410714 24.3125 z" - transform="matrix(0.805754,0,0,1.158626,0.805772,-20.66909)" /> - <path - style="fill:#3b1941;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1" - d="M -3.174544e-16,1.7837407 C 0.49897694,0.43045085 3.4176637,1.3941391 4.4321866,1.7478251 L 2.7448964,2 L -3.174544e-16,1.7837407 z " - id="path5192" - sodipodi:nodetypes="cccc" /> - <path - style="fill:#fcaf3e;fill-opacity:1;stroke:none;stroke-width:1.0283047;stroke-miterlimit:4;stroke-opacity:1" - d="M 4,8.9694498 C 6.5363255,9.6796143 7.1434322,8 7.6676187,8 C 8.1845929,8 8.1150542,9.7216455 10.752536,9.1373864 C 10.257681,9.8617678 8.7366795,11 8.0954601,11 C 7.4470215,11 4.8041406,10.039472 4,8.9694498 z " - id="path3987" - sodipodi:nodetypes="czczc" /> - <path - style="fill:#3b1941;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1" - d="M 2.5678134,0.78213791 C 3.0667903,-0.57115198 7,-0.11652293 7,1.7459005 L 5.3127098,0.99839721 L 2.5678134,0.78213791 z " - id="path1991" - sodipodi:nodetypes="cccc" /> - </g> -</svg>
--- a/pidgin/pixmaps/icons/22/Makefile.am Mon Nov 12 16:15:53 2007 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,6 +0,0 @@ -EXTRA_DIST = pidgin.png - -pidginiconspixdir = $(datadir)/icons/hicolor/22x22/apps - -pidginiconspix_DATA = $(EXTRA_DIST) -
--- a/pidgin/pixmaps/icons/22/scalable/pidgin.svg Mon Nov 12 16:15:53 2007 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,591 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<!-- Created with Inkscape (http://www.inkscape.org/) --> -<svg - xmlns:dc="http://purl.org/dc/elements/1.1/" - xmlns:cc="http://web.resource.org/cc/" - xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:svg="http://www.w3.org/2000/svg" - xmlns="http://www.w3.org/2000/svg" - xmlns:xlink="http://www.w3.org/1999/xlink" - xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" - xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - width="22" - height="22" - id="svg4345" - sodipodi:version="0.32" - inkscape:version="0.44.1" - sodipodi:docbase="/home/hbons/Desktop/Pidgin/2.1.0/icons/24/scalable" - sodipodi:docname="pidgin.svg" - inkscape:export-filename="/home/hbons/Desktop/pidgin24.png" - inkscape:export-xdpi="90" - inkscape:export-ydpi="90" - version="1.0"> - <defs - id="defs4347"> - <linearGradient - inkscape:collect="always" - id="linearGradient3124"> - <stop - style="stop-color:#3b1941;stop-opacity:1;" - offset="0" - id="stop3126" /> - <stop - style="stop-color:#3b1941;stop-opacity:0;" - offset="1" - id="stop3128" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient3116"> - <stop - style="stop-color:#82508e;stop-opacity:1;" - offset="0" - id="stop3118" /> - <stop - style="stop-color:#82508e;stop-opacity:0;" - offset="1" - id="stop3120" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient3108"> - <stop - style="stop-color:#eeeeec;stop-opacity:1;" - offset="0" - id="stop3110" /> - <stop - style="stop-color:#eeeeec;stop-opacity:0;" - offset="1" - id="stop3112" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient5438"> - <stop - style="stop-color:white;stop-opacity:1;" - offset="0" - id="stop5440" /> - <stop - style="stop-color:white;stop-opacity:0;" - offset="1" - id="stop5442" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient6817"> - <stop - style="stop-color:white;stop-opacity:1;" - offset="0" - id="stop6819" /> - <stop - style="stop-color:white;stop-opacity:0;" - offset="1" - id="stop6821" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient6537"> - <stop - style="stop-color:white;stop-opacity:1;" - offset="0" - id="stop6539" /> - <stop - style="stop-color:white;stop-opacity:0;" - offset="1" - id="stop6541" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient6506"> - <stop - style="stop-color:#eeeeec;stop-opacity:1;" - offset="0" - id="stop6508" /> - <stop - style="stop-color:#eeeeec;stop-opacity:0;" - offset="1" - id="stop6510" /> - </linearGradient> - <linearGradient - id="linearGradient2804"> - <stop - style="stop-color:black;stop-opacity:0;" - offset="0" - id="stop2806" /> - <stop - id="stop2812" - offset="0.5" - style="stop-color:black;stop-opacity:1;" /> - <stop - style="stop-color:black;stop-opacity:0;" - offset="1" - id="stop2808" /> - </linearGradient> - <radialGradient - inkscape:collect="always" - xlink:href="#linearGradient25546" - id="radialGradient25572" - gradientUnits="userSpaceOnUse" - gradientTransform="matrix(1,0,0,0.994693,0,4.16407e-2)" - cx="7.8836637" - cy="1.5104795" - fx="7.8836637" - fy="1.5104795" - r="8.4883642" /> - <radialGradient - inkscape:collect="always" - xlink:href="#linearGradient25546" - id="radialGradient25568" - gradientUnits="userSpaceOnUse" - gradientTransform="matrix(1,0,0,0.994693,0,4.16407e-2)" - cx="7.8836741" - cy="0.14505707" - fx="7.8836741" - fy="0.14505707" - r="8.4883642" /> - <linearGradient - inkscape:collect="always" - id="linearGradient25546"> - <stop - style="stop-color:white;stop-opacity:1;" - offset="0" - id="stop25548" /> - <stop - style="stop-color:white;stop-opacity:0;" - offset="1" - id="stop25550" /> - </linearGradient> - <radialGradient - inkscape:collect="always" - xlink:href="#linearGradient25546" - id="radialGradient25554" - cx="7.8836637" - cy="2.6242435" - fx="7.8836637" - fy="2.6242435" - r="8.4883642" - gradientTransform="matrix(1.131317,0,0,1.125313,-1.035262,-0.301139)" - gradientUnits="userSpaceOnUse" /> - <linearGradient - id="linearGradient3800"> - <stop - style="stop-color:#f4d9b1;stop-opacity:1.0000000;" - offset="0.0000000" - id="stop3802" /> - <stop - style="stop-color:#df9725;stop-opacity:1.0000000;" - offset="1.0000000" - id="stop3804" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient6506" - id="linearGradient6512" - x1="15.645709" - y1="39.029884" - x2="15.645709" - y2="43.206608" - gradientUnits="userSpaceOnUse" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient6817" - id="linearGradient6823" - x1="0.23931108" - y1="38.950283" - x2="5.7089725" - y2="42.982571" - gradientUnits="userSpaceOnUse" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient5438" - id="linearGradient5444" - x1="30.152058" - y1="-0.86487341" - x2="30.152058" - y2="23.011967" - gradientUnits="userSpaceOnUse" /> - <linearGradient - gradientUnits="userSpaceOnUse" - y2="44.272076" - x2="5.5366187" - y1="39.902092" - x1="-1.6841649" - id="linearGradient6569" - xlink:href="#linearGradient6563" - inkscape:collect="always" /> - <linearGradient - gradientUnits="userSpaceOnUse" - y2="23.559282" - x2="30.5" - y1="0.033532728" - x1="30.5" - id="linearGradient2089" - xlink:href="#linearGradient6537" - inkscape:collect="always" /> - <linearGradient - gradientUnits="userSpaceOnUse" - y2="50.079575" - x2="14.943421" - y1="39.743458" - x1="15.645709" - id="linearGradient2087" - xlink:href="#linearGradient6506" - inkscape:collect="always" /> - <linearGradient - id="linearGradient2081"> - <stop - id="stop2083" - offset="0.0000000" - style="stop-color:#f4d9b1;stop-opacity:1.0000000;" /> - <stop - id="stop2085" - offset="1.0000000" - style="stop-color:#df9725;stop-opacity:1.0000000;" /> - </linearGradient> - <radialGradient - gradientUnits="userSpaceOnUse" - gradientTransform="matrix(1.131317,0,0,1.125313,-1.035262,-0.301139)" - r="8.4883642" - fy="2.6242435" - fx="7.8836637" - cy="2.6242435" - cx="7.8836637" - id="radialGradient2079" - xlink:href="#linearGradient25546" - inkscape:collect="always" /> - <radialGradient - r="8.4883642" - fy="0.14505707" - fx="7.8836741" - cy="0.14505707" - cx="7.8836741" - gradientTransform="matrix(1,0,0,0.994693,0,4.16407e-2)" - gradientUnits="userSpaceOnUse" - id="radialGradient2071" - xlink:href="#linearGradient25546" - inkscape:collect="always" /> - <radialGradient - r="8.4883642" - fy="1.5104795" - fx="7.8836637" - cy="1.5104795" - cx="7.8836637" - gradientTransform="matrix(1,0,0,0.994693,0,4.16407e-2)" - gradientUnits="userSpaceOnUse" - id="radialGradient2069" - xlink:href="#linearGradient25546" - inkscape:collect="always" /> - <linearGradient - id="linearGradient2061"> - <stop - id="stop2063" - offset="0" - style="stop-color:black;stop-opacity:0;" /> - <stop - style="stop-color:black;stop-opacity:1;" - offset="0.5" - id="stop2065" /> - <stop - id="stop2067" - offset="1" - style="stop-color:black;stop-opacity:0;" /> - </linearGradient> - <linearGradient - id="linearGradient6563" - inkscape:collect="always"> - <stop - id="stop6565" - offset="0" - style="stop-color:white;stop-opacity:1;" /> - <stop - id="stop6567" - offset="1" - style="stop-color:white;stop-opacity:0;" /> - </linearGradient> - <linearGradient - id="linearGradient2850" - inkscape:collect="always"> - <stop - id="stop2852" - offset="0" - style="stop-color:#ce5c00;stop-opacity:1;" /> - <stop - id="stop2854" - offset="1" - style="stop-color:#ce5c00;stop-opacity:0;" /> - </linearGradient> - <linearGradient - id="linearGradient3958" - inkscape:collect="always"> - <stop - id="stop3960" - offset="0" - style="stop-color:#eeeeec;stop-opacity:1;" /> - <stop - id="stop3962" - offset="1" - style="stop-color:#eeeeec;stop-opacity:0;" /> - </linearGradient> - <linearGradient - id="linearGradient3968" - inkscape:collect="always"> - <stop - id="stop3970" - offset="0" - style="stop-color:#82508e;stop-opacity:1;" /> - <stop - id="stop3972" - offset="1" - style="stop-color:#82508e;stop-opacity:0;" /> - </linearGradient> - <linearGradient - id="linearGradient3976" - inkscape:collect="always"> - <stop - id="stop3978" - offset="0" - style="stop-color:#3b1941;stop-opacity:1;" /> - <stop - id="stop3980" - offset="1" - style="stop-color:#3b1941;stop-opacity:0;" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient2850" - id="linearGradient2149" - gradientUnits="userSpaceOnUse" - gradientTransform="matrix(0.769231,0,0,0.714287,-34.23081,-12.28573)" - x1="21.785719" - y1="28.142857" - x2="17.785713" - y2="30.07143" /> - <radialGradient - inkscape:collect="always" - xlink:href="#linearGradient3958" - id="radialGradient2191" - gradientUnits="userSpaceOnUse" - gradientTransform="matrix(1.116159,0,0,1.076653,-36.39499,-20.28695)" - cx="9.0640488" - cy="21.511742" - fx="9.0640488" - fy="21.511742" - r="16.663956" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient6506" - id="linearGradient2193" - gradientUnits="userSpaceOnUse" - x1="15.645709" - y1="39.743458" - x2="15.645709" - y2="53.502155" - gradientTransform="matrix(0.660903,0,0,0.627207,-32.26852,-10.3201)" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient3968" - id="linearGradient2196" - gradientUnits="userSpaceOnUse" - x1="16.13257" - y1="40.781811" - x2="16.13257" - y2="48.068741" - gradientTransform="matrix(0.67692,0,0,0.646801,-32.53568,-10.90841)" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient3976" - id="linearGradient2198" - gradientUnits="userSpaceOnUse" - x1="12.095973" - y1="40.907658" - x2="12.095973" - y2="46.463146" - gradientTransform="matrix(0.67692,0,0,0.646801,-32.53568,-10.90841)" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient6537" - id="linearGradient2201" - gradientUnits="userSpaceOnUse" - x1="30.5" - y1="0.033532728" - x2="30.5" - y2="23.559282" - gradientTransform="matrix(0.668893,0,0,0.668627,-32.91377,-10.19246)" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient3108" - id="linearGradient3114" - x1="10.18327" - y1="16.618088" - x2="27.598003" - y2="36.64465" - gradientUnits="userSpaceOnUse" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient3116" - id="linearGradient3122" - x1="15.722902" - y1="38.768803" - x2="15.722902" - y2="43.249905" - gradientUnits="userSpaceOnUse" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient3124" - id="linearGradient3130" - x1="13.150809" - y1="38.849556" - x2="13.150809" - y2="43.105652" - gradientUnits="userSpaceOnUse" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient2850" - id="linearGradient3146" - gradientUnits="userSpaceOnUse" - gradientTransform="matrix(0.769231,0,0,0.714287,-3.230767,-7.285729)" - x1="21.785719" - y1="28.142857" - x2="17.785713" - y2="30.07143" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient5438" - id="linearGradient2848" - gradientUnits="userSpaceOnUse" - x1="30.152058" - y1="-0.86487341" - x2="30.152058" - y2="23.011967" /> - </defs> - <sodipodi:namedview - id="base" - pagecolor="#ffffff" - bordercolor="#666666" - borderopacity="1.0" - inkscape:pageopacity="0.0" - inkscape:pageshadow="2" - inkscape:zoom="22.743067" - inkscape:cx="23.715241" - inkscape:cy="10.08258" - inkscape:current-layer="layer1" - showgrid="true" - inkscape:grid-bbox="true" - inkscape:document-units="px" - inkscape:window-width="1434" - inkscape:window-height="840" - inkscape:window-x="0" - inkscape:window-y="0" - showguides="true" - inkscape:guide-bbox="true" - inkscape:grid-points="false" - width="22px" - height="22px" - inkscape:object-bbox="true" /> - <metadata - id="metadata4350"> - <rdf:RDF> - <cc:Work - rdf:about=""> - <dc:format>image/svg+xml</dc:format> - <dc:type - rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> - </cc:Work> - </rdf:RDF> - </metadata> - <g - id="layer1" - inkscape:label="Layer 1" - inkscape:groupmode="layer"> - <path - style="opacity:1;fill:#75507b;fill-opacity:1" - d="M 36.0625,8 C 33.978257,8 33.334928,10.523086 34.78125,12.9375 C 35.250389,13.720651 36.674297,15.15311 36.86722,15.15311 L 36.878267,14.508325 C 36.288194,13.580567 35.517363,12.502064 35.686987,12.281543 C 37.835781,12.281543 38,11.491782 38,10.027674 C 38,8.7542399 37.228501,8 36.0625,8 z " - id="path6521" - transform="matrix(1.747787,0,0,1.397993,-52.41719,-5.183942)" - sodipodi:nodetypes="csccccc" /> - <path - style="opacity:1;fill:url(#linearGradient3122);fill-opacity:1;stroke:url(#linearGradient3130);stroke-width:1.51128328;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - d="M 15,13 C 8.3759979,13 3,18.600001 3,25.5 C 3,31.153143 2.9750563,38.402618 2.9750563,45.572826 C 4.1625449,45.572826 27.946366,45.600605 30.637365,45.600605 C 32.751492,45.600605 32.586331,43.541005 32.586331,43.541005 C 32.586331,40.875594 27.597902,38.639057 25.813453,36.682531 C 23.985035,34.68151 26,30.5 26,30.5 C 26.641306,28.9702 27,27.275084 27,25.5 C 27,18.600001 21.624002,13 15,13 z " - id="path5176" - sodipodi:nodetypes="ccccszcsc" - transform="matrix(0.67692,0,0,0.646801,-1.52611,-5.949693)" /> - <path - transform="matrix(0.660903,0,0,0.627207,-1.258953,-5.361383)" - style="opacity:0.5;fill:url(#linearGradient3114);fill-opacity:1;stroke:url(#linearGradient6512);stroke-width:1.55319393;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - d="M 15,14.0625 C 8.9877035,14.0625 4.0789961,19.13808 4.0625,25.46875 C 4.0624722,25.479427 4.0617033,25.489349 4.0625,25.5 C 4.0625,32.787473 3.9033639,38.26012 3.9033639,44.499878 C 5.8399452,44.499878 22.452275,44.470084 28.278248,44.470084 C 29.445455,44.470084 31.431654,44.974157 31.431654,43.509594 C 31.431654,43.287851 31.231903,42.870917 30.681654,42.353344 C 30.131405,41.835771 29.308414,41.280003 28.400404,40.728344 C 26.665321,39.858723 25.411769,39.090553 24.621247,37.290844 C 24.011242,36.47675 23.731303,35.519763 23.676839,34.478344 C 23.622375,33.436925 24.107721,32.319635 24.224561,31.259594 C 24.458241,29.139511 24.96875,30.28125 24.96875,30.28125 C 24.98374,30.216952 25.004663,30.154183 25.03125,30.09375 C 25.618731,28.692346 25.9375,27.131297 25.9375,25.5 C 25.9375,19.154404 21.022436,14.0625 15,14.0625 z " - id="path5241" - sodipodi:nodetypes="cscccssccsscssc" /> - <path - style="fill:#a46bb0;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1" - d="M 3.072604,7.0864988 C 4.607952,5.4493238 7.105721,5.8854918 8.086061,6.9308478 C 9.4294869,8.3633698 9.273726,10.85472 7.738379,12.491894 C 6.404137,13.914624 4.209552,14.660821 2.866124,13.228299 C 1.522696,11.795776 1.859625,8.3799248 3.072604,7.0864988 z " - id="path3138" - sodipodi:nodetypes="csssc" /> - <path - transform="matrix(1.010846,0,0,1.029732,-5.552971,-15.17001)" - style="opacity:1;fill:white;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1" - d="M 13.257119,24.626053 C 13.257119,26.227351 11.8279,27.316574 10.863875,27.316574 C 9.5428049,27.316574 8.4706318,26.01697 8.4706318,24.415672 C 8.4706318,23.024119 9.2055946,21.514771 10.526665,21.514771 C 11.847736,21.514771 13.257119,23.360971 13.257119,24.626053 z " - id="path5157" - sodipodi:nodetypes="csssc" /> - <path - sodipodi:type="arc" - style="opacity:1;fill:#5c3566;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="path5162" - sodipodi:cx="10.169642" - sodipodi:cy="24.3125" - sodipodi:rx="1.2410715" - sodipodi:ry="1.2946428" - d="M 11.410714 24.3125 A 1.2410715 1.2946428 0 1 1 8.928571,24.3125 A 1.2410715 1.2946428 0 1 1 11.410714 24.3125 z" - transform="matrix(1.208633,0,0,1.158621,-6.791366,-17.66897)" /> - <path - transform="matrix(0.670792,0,0,0.486348,-3.805943,-3.90166)" - style="fill:#3b1941;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1" - d="M 11.651119,11.193815 C 13.577759,8.2509126 16.249277,11.481501 17.614226,12.804399 L 14.761306,13.747613 L 11.651119,11.193815 z " - id="path5192" - sodipodi:nodetypes="cccc" /> - <path - transform="matrix(0.851014,0,0,0.554879,-3.938174,-5.194599)" - style="fill:#3b1941;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1" - d="M 11.689238,9.8218679 C 13.591296,8.0161941 17.174576,11.994261 17.519594,13.650486 L 14.543472,12.891665 L 11.689238,9.8218679 z " - id="rect5189" - sodipodi:nodetypes="cccc" /> - <path - style="fill:#975fa3;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1" - d="M 16.371022,7.8148748 C 15.47069,6.586993 14.005993,6.9141191 13.43112,7.6981356 C 12.643332,8.7725276 12.734671,10.64104 13.635002,11.868921 C 14.417404,12.93597 15.704314,13.495617 16.492103,12.421225 C 17.279892,11.346833 17.082315,8.7849447 16.371022,7.8148748 z " - id="path3132" - sodipodi:nodetypes="csssc" /> - <path - style="fill:white;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1" - d="M 16.502957,8.5432477 C 15.827476,7.7246593 14.728576,7.9427464 14.297274,8.4654263 C 13.706229,9.1816906 13.774757,10.427368 14.450238,11.245957 C 15.037241,11.957323 16.002754,12.33042 16.593798,11.614156 C 17.184843,10.897891 17.03661,9.1899614 16.502957,8.5432477 z " - id="path3134" - sodipodi:nodetypes="csssc" /> - <path - sodipodi:type="arc" - style="fill:#5c3566;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="path3136" - sodipodi:cx="10.169642" - sodipodi:cy="24.3125" - sodipodi:rx="1.2410715" - sodipodi:ry="1.2946428" - d="M 11.410714 24.3125 A 1.2410715 1.2946428 0 1 1 8.928571,24.3125 A 1.2410715 1.2946428 0 1 1 11.410714 24.3125 z" - transform="matrix(1.153827,0,0,1.158621,3.593156,-17.66895)" /> - <rect - style="fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="rect3140" - width="4.4400907" - height="1" - x="8.5358553" - y="13" - rx="0.69182354" - ry="0.5" /> - <path - style="fill:#fcaf3e;fill-opacity:1;stroke:none;stroke-width:1.0283047;stroke-miterlimit:4;stroke-opacity:1" - d="M 6,13.893438 C 11.088512,17.243015 10.655188,12 11.431469,12 C 12.197069,12 11.699301,17.201991 16,13.895644 C 15.267157,15.102946 13.014668,17 12.06507,17 C 11.104781,17 7.190872,15.676807 6,13.893438 z " - id="path3142" - sodipodi:nodetypes="czczc" /> - <path - style="fill:url(#linearGradient3146);fill-opacity:1;stroke:none;stroke-width:1.0283047;stroke-miterlimit:4;stroke-opacity:1" - d="M 6,13.893439 C 10.740404,18.171305 10.655188,12 11.431469,12 C 12.197069,12 11.641283,17.027939 16,13.895646 C 15.267157,15.102947 13.014668,17 12.06507,17 C 11.104781,17 7.190873,15.676809 6,13.893439 z " - id="path3144" - sodipodi:nodetypes="czczc" /> - </g> -</svg>
--- a/pidgin/pixmaps/icons/24/Makefile.am Mon Nov 12 16:15:53 2007 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,6 +0,0 @@ -EXTRA_DIST = pidgin.png - -pidginiconspixdir = $(datadir)/icons/hicolor/24x24/apps - -pidginiconspix_DATA = $(EXTRA_DIST) -
--- a/pidgin/pixmaps/icons/24/scalable/pidgin.svg Mon Nov 12 16:15:53 2007 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,589 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<!-- Created with Inkscape (http://www.inkscape.org/) --> -<svg - xmlns:dc="http://purl.org/dc/elements/1.1/" - xmlns:cc="http://web.resource.org/cc/" - xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:svg="http://www.w3.org/2000/svg" - xmlns="http://www.w3.org/2000/svg" - xmlns:xlink="http://www.w3.org/1999/xlink" - xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" - xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - width="24" - height="24" - id="svg4345" - sodipodi:version="0.32" - inkscape:version="0.44.1" - sodipodi:docbase="/home/hbons/Desktop/Pidgin/2.1.0/icons/24/scalable" - sodipodi:docname="pidgin.svg" - inkscape:export-filename="/home/hbons/Desktop/pidgin24.png" - inkscape:export-xdpi="90" - inkscape:export-ydpi="90" - version="1.0"> - <defs - id="defs4347"> - <linearGradient - inkscape:collect="always" - id="linearGradient3124"> - <stop - style="stop-color:#3b1941;stop-opacity:1;" - offset="0" - id="stop3126" /> - <stop - style="stop-color:#3b1941;stop-opacity:0;" - offset="1" - id="stop3128" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient3116"> - <stop - style="stop-color:#82508e;stop-opacity:1;" - offset="0" - id="stop3118" /> - <stop - style="stop-color:#82508e;stop-opacity:0;" - offset="1" - id="stop3120" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient3108"> - <stop - style="stop-color:#eeeeec;stop-opacity:1;" - offset="0" - id="stop3110" /> - <stop - style="stop-color:#eeeeec;stop-opacity:0;" - offset="1" - id="stop3112" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient5438"> - <stop - style="stop-color:white;stop-opacity:1;" - offset="0" - id="stop5440" /> - <stop - style="stop-color:white;stop-opacity:0;" - offset="1" - id="stop5442" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient6817"> - <stop - style="stop-color:white;stop-opacity:1;" - offset="0" - id="stop6819" /> - <stop - style="stop-color:white;stop-opacity:0;" - offset="1" - id="stop6821" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient6537"> - <stop - style="stop-color:white;stop-opacity:1;" - offset="0" - id="stop6539" /> - <stop - style="stop-color:white;stop-opacity:0;" - offset="1" - id="stop6541" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient6506"> - <stop - style="stop-color:#eeeeec;stop-opacity:1;" - offset="0" - id="stop6508" /> - <stop - style="stop-color:#eeeeec;stop-opacity:0;" - offset="1" - id="stop6510" /> - </linearGradient> - <linearGradient - id="linearGradient2804"> - <stop - style="stop-color:black;stop-opacity:0;" - offset="0" - id="stop2806" /> - <stop - id="stop2812" - offset="0.5" - style="stop-color:black;stop-opacity:1;" /> - <stop - style="stop-color:black;stop-opacity:0;" - offset="1" - id="stop2808" /> - </linearGradient> - <radialGradient - inkscape:collect="always" - xlink:href="#linearGradient25546" - id="radialGradient25572" - gradientUnits="userSpaceOnUse" - gradientTransform="matrix(1,0,0,0.994693,0,4.16407e-2)" - cx="7.8836637" - cy="1.5104795" - fx="7.8836637" - fy="1.5104795" - r="8.4883642" /> - <radialGradient - inkscape:collect="always" - xlink:href="#linearGradient25546" - id="radialGradient25568" - gradientUnits="userSpaceOnUse" - gradientTransform="matrix(1,0,0,0.994693,0,4.16407e-2)" - cx="7.8836741" - cy="0.14505707" - fx="7.8836741" - fy="0.14505707" - r="8.4883642" /> - <linearGradient - inkscape:collect="always" - id="linearGradient25546"> - <stop - style="stop-color:white;stop-opacity:1;" - offset="0" - id="stop25548" /> - <stop - style="stop-color:white;stop-opacity:0;" - offset="1" - id="stop25550" /> - </linearGradient> - <radialGradient - inkscape:collect="always" - xlink:href="#linearGradient25546" - id="radialGradient25554" - cx="7.8836637" - cy="2.6242435" - fx="7.8836637" - fy="2.6242435" - r="8.4883642" - gradientTransform="matrix(1.131317,0,0,1.125313,-1.035262,-0.301139)" - gradientUnits="userSpaceOnUse" /> - <linearGradient - id="linearGradient3800"> - <stop - style="stop-color:#f4d9b1;stop-opacity:1.0000000;" - offset="0.0000000" - id="stop3802" /> - <stop - style="stop-color:#df9725;stop-opacity:1.0000000;" - offset="1.0000000" - id="stop3804" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient6506" - id="linearGradient6512" - x1="15.645709" - y1="39.029884" - x2="15.645709" - y2="43.206608" - gradientUnits="userSpaceOnUse" - gradientTransform="matrix(0.660903,0,0,0.627207,-0.293224,-4.361383)" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient6817" - id="linearGradient6823" - x1="0.23931108" - y1="38.950283" - x2="5.7089725" - y2="42.982571" - gradientUnits="userSpaceOnUse" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient5438" - id="linearGradient5444" - x1="30.152058" - y1="-0.86487341" - x2="30.152058" - y2="23.011967" - gradientUnits="userSpaceOnUse" /> - <linearGradient - gradientUnits="userSpaceOnUse" - y2="44.272076" - x2="5.5366187" - y1="39.902092" - x1="-1.6841649" - id="linearGradient6569" - xlink:href="#linearGradient6563" - inkscape:collect="always" /> - <linearGradient - gradientUnits="userSpaceOnUse" - y2="23.559282" - x2="30.5" - y1="0.033532728" - x1="30.5" - id="linearGradient2089" - xlink:href="#linearGradient6537" - inkscape:collect="always" /> - <linearGradient - gradientUnits="userSpaceOnUse" - y2="50.079575" - x2="14.943421" - y1="39.743458" - x1="15.645709" - id="linearGradient2087" - xlink:href="#linearGradient6506" - inkscape:collect="always" /> - <linearGradient - id="linearGradient2081"> - <stop - id="stop2083" - offset="0.0000000" - style="stop-color:#f4d9b1;stop-opacity:1.0000000;" /> - <stop - id="stop2085" - offset="1.0000000" - style="stop-color:#df9725;stop-opacity:1.0000000;" /> - </linearGradient> - <radialGradient - gradientUnits="userSpaceOnUse" - gradientTransform="matrix(1.131317,0,0,1.125313,-1.035262,-0.301139)" - r="8.4883642" - fy="2.6242435" - fx="7.8836637" - cy="2.6242435" - cx="7.8836637" - id="radialGradient2079" - xlink:href="#linearGradient25546" - inkscape:collect="always" /> - <radialGradient - r="8.4883642" - fy="0.14505707" - fx="7.8836741" - cy="0.14505707" - cx="7.8836741" - gradientTransform="matrix(1,0,0,0.994693,0,4.16407e-2)" - gradientUnits="userSpaceOnUse" - id="radialGradient2071" - xlink:href="#linearGradient25546" - inkscape:collect="always" /> - <radialGradient - r="8.4883642" - fy="1.5104795" - fx="7.8836637" - cy="1.5104795" - cx="7.8836637" - gradientTransform="matrix(1,0,0,0.994693,0,4.16407e-2)" - gradientUnits="userSpaceOnUse" - id="radialGradient2069" - xlink:href="#linearGradient25546" - inkscape:collect="always" /> - <linearGradient - id="linearGradient2061"> - <stop - id="stop2063" - offset="0" - style="stop-color:black;stop-opacity:0;" /> - <stop - style="stop-color:black;stop-opacity:1;" - offset="0.5" - id="stop2065" /> - <stop - id="stop2067" - offset="1" - style="stop-color:black;stop-opacity:0;" /> - </linearGradient> - <linearGradient - id="linearGradient6563" - inkscape:collect="always"> - <stop - id="stop6565" - offset="0" - style="stop-color:white;stop-opacity:1;" /> - <stop - id="stop6567" - offset="1" - style="stop-color:white;stop-opacity:0;" /> - </linearGradient> - <linearGradient - id="linearGradient2850" - inkscape:collect="always"> - <stop - id="stop2852" - offset="0" - style="stop-color:#ce5c00;stop-opacity:1;" /> - <stop - id="stop2854" - offset="1" - style="stop-color:#ce5c00;stop-opacity:0;" /> - </linearGradient> - <linearGradient - id="linearGradient3958" - inkscape:collect="always"> - <stop - id="stop3960" - offset="0" - style="stop-color:#eeeeec;stop-opacity:1;" /> - <stop - id="stop3962" - offset="1" - style="stop-color:#eeeeec;stop-opacity:0;" /> - </linearGradient> - <linearGradient - id="linearGradient3968" - inkscape:collect="always"> - <stop - id="stop3970" - offset="0" - style="stop-color:#82508e;stop-opacity:1;" /> - <stop - id="stop3972" - offset="1" - style="stop-color:#82508e;stop-opacity:0;" /> - </linearGradient> - <linearGradient - id="linearGradient3976" - inkscape:collect="always"> - <stop - id="stop3978" - offset="0" - style="stop-color:#3b1941;stop-opacity:1;" /> - <stop - id="stop3980" - offset="1" - style="stop-color:#3b1941;stop-opacity:0;" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient2850" - id="linearGradient2149" - gradientUnits="userSpaceOnUse" - gradientTransform="matrix(0.769231,0,0,0.714287,-34.23081,-12.28573)" - x1="21.785719" - y1="28.142857" - x2="17.785713" - y2="30.07143" /> - <radialGradient - inkscape:collect="always" - xlink:href="#linearGradient3958" - id="radialGradient2191" - gradientUnits="userSpaceOnUse" - gradientTransform="matrix(1.116159,0,0,1.076653,-36.39499,-20.28695)" - cx="9.0640488" - cy="21.511742" - fx="9.0640488" - fy="21.511742" - r="16.663956" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient6506" - id="linearGradient2193" - gradientUnits="userSpaceOnUse" - x1="15.645709" - y1="39.743458" - x2="15.645709" - y2="53.502155" - gradientTransform="matrix(0.660903,0,0,0.627207,-32.26852,-10.3201)" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient3968" - id="linearGradient2196" - gradientUnits="userSpaceOnUse" - x1="16.13257" - y1="40.781811" - x2="16.13257" - y2="48.068741" - gradientTransform="matrix(0.67692,0,0,0.646801,-32.53568,-10.90841)" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient3976" - id="linearGradient2198" - gradientUnits="userSpaceOnUse" - x1="12.095973" - y1="40.907658" - x2="12.095973" - y2="46.463146" - gradientTransform="matrix(0.67692,0,0,0.646801,-32.53568,-10.90841)" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient6537" - id="linearGradient2201" - gradientUnits="userSpaceOnUse" - x1="30.5" - y1="0.033532728" - x2="30.5" - y2="23.559282" - gradientTransform="matrix(0.668893,0,0,0.668627,-32.91377,-10.19246)" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient3108" - id="linearGradient3114" - x1="10.18327" - y1="16.618088" - x2="27.598003" - y2="36.64465" - gradientUnits="userSpaceOnUse" - gradientTransform="matrix(0.660903,0,0,0.627207,-0.293224,-4.361383)" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient3116" - id="linearGradient3122" - x1="15.722902" - y1="38.768803" - x2="15.722902" - y2="43.249905" - gradientUnits="userSpaceOnUse" - gradientTransform="matrix(0.67692,0,0,0.646801,-0.560381,-4.949693)" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient3124" - id="linearGradient3130" - x1="13.150809" - y1="38.849556" - x2="13.150809" - y2="43.105652" - gradientUnits="userSpaceOnUse" - gradientTransform="matrix(0.67692,0,0,0.646801,-0.560381,-4.949693)" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient2850" - id="linearGradient3146" - gradientUnits="userSpaceOnUse" - gradientTransform="matrix(0.769231,0,0,0.714287,-2.265038,-6.285729)" - x1="21.785719" - y1="28.142857" - x2="17.785713" - y2="30.07143" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient5438" - id="linearGradient2848" - gradientUnits="userSpaceOnUse" - x1="30.152058" - y1="-0.86487341" - x2="30.152058" - y2="23.011967" /> - </defs> - <sodipodi:namedview - id="base" - pagecolor="#ffffff" - bordercolor="#666666" - borderopacity="1.0" - inkscape:pageopacity="0.0" - inkscape:pageshadow="2" - inkscape:zoom="32.163554" - inkscape:cx="16.820721" - inkscape:cy="19.317678" - inkscape:current-layer="layer1" - showgrid="true" - inkscape:grid-bbox="true" - inkscape:document-units="px" - inkscape:window-width="1440" - inkscape:window-height="846" - inkscape:window-x="0" - inkscape:window-y="0" - showguides="true" - inkscape:guide-bbox="true" - inkscape:grid-points="false" - width="24px" - height="24px" - inkscape:object-bbox="true" /> - <metadata - id="metadata4350"> - <rdf:RDF> - <cc:Work - rdf:about=""> - <dc:format>image/svg+xml</dc:format> - <dc:type - rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> - </cc:Work> - </rdf:RDF> - </metadata> - <g - id="layer1" - inkscape:label="Layer 1" - inkscape:groupmode="layer"> - <path - style="opacity:1;fill:#75507b;fill-opacity:1" - d="M 11.578108,7.0000021 C 7.9352949,7.0000021 6.8108928,10.527259 9.3387556,13.902593 C 10.158711,14.997432 12.647399,17 12.984587,17 L 13.003895,16.098595 C 11.972573,14.801596 10.625325,13.293856 10.921791,12.985569 C 14.677426,12.985569 14.964445,11.881489 14.964445,9.8346762 C 14.964445,8.0544242 13.616029,7.0000021 11.578108,7.0000021 z " - id="path6521" - sodipodi:nodetypes="csccccc" /> - <path - style="opacity:1;fill:url(#linearGradient3122);fill-opacity:1;stroke:url(#linearGradient3130);stroke-width:0.99999976;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - d="M 9.593419,3.4587201 C 5.1094995,3.4587201 1.470379,7.0808064 1.470379,11.543733 C 1.470379,15.200191 1.4534941,19.889159 1.4534941,24.526857 C 2.2573289,24.526857 18.357073,24.544824 20.178665,24.544824 C 21.609759,24.544824 21.497959,23.212673 21.497959,23.212673 C 21.497959,21.488682 18.121191,20.042088 16.913262,18.776605 C 15.675569,17.482342 17.039539,14.777738 17.039539,14.777738 C 17.473652,13.788261 17.716459,12.691859 17.716459,11.543733 C 17.716459,7.0808064 14.077339,3.4587201 9.593419,3.4587201 z " - id="path5176" - sodipodi:nodetypes="ccccszcsc" /> - <path - style="opacity:0.5;fill:url(#linearGradient3114);fill-opacity:1;stroke:url(#linearGradient6512);stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - d="M 9.620321,4.4587156 C 5.6467762,4.4587156 2.4025968,7.6421549 2.3916944,11.612795 C 2.3916761,11.619492 2.3911679,11.625715 2.3916944,11.632396 C 2.3916944,16.20315 2.2865209,19.635632 2.2865209,23.549252 C 3.5664133,23.549252 14.545552,23.530565 18.395955,23.530565 C 19.167366,23.530565 20.480051,23.846723 20.480051,22.928139 C 20.480051,22.78906 20.348035,22.527556 19.984374,22.202931 C 19.620712,21.878306 19.076795,21.529724 18.476689,21.18372 C 17.329967,20.638287 16.501491,20.156486 15.979032,19.027696 C 15.575878,18.51709 15.390866,17.916861 15.35487,17.263676 C 15.318875,16.610491 15.639642,15.909718 15.716861,15.244853 C 15.871301,13.915122 16.208698,14.631229 16.208698,14.631229 C 16.218605,14.590901 16.232433,14.551532 16.250005,14.513628 C 16.638273,13.634657 16.848948,12.655557 16.848948,11.632396 C 16.848948,7.6523934 13.600567,4.4587156 9.620321,4.4587156 z " - id="path5241" - sodipodi:nodetypes="cscccssccsscssc" /> - <path - style="fill:#a46bb0;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1" - d="M 4.038333,8.0864989 C 5.573681,6.4493239 8.07145,6.8854919 9.05179,7.9308479 C 10.395216,9.3633699 10.239455,11.85472 8.704108,13.491894 C 7.369866,14.914624 5.175281,15.660821 3.831853,14.228299 C 2.488425,12.795776 2.825354,9.3799249 4.038333,8.0864989 z " - id="path3138" - sodipodi:nodetypes="csssc" /> - <path - style="opacity:1;fill:white;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1" - d="M 8.8136637,11.188225 C 8.8136637,12.837133 7.3689434,13.95874 6.3944626,13.95874 C 5.0590642,13.95874 3.9752623,12.620497 3.9752623,10.971589 C 3.9752623,9.5386622 4.7181965,7.9844383 6.0535952,7.9844383 C 7.3889945,7.9844383 8.8136637,9.8855295 8.8136637,11.188225 z " - id="path5157" - sodipodi:nodetypes="csssc" /> - <path - sodipodi:type="arc" - style="opacity:1;fill:#5c3566;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="path5162" - sodipodi:cx="10.169642" - sodipodi:cy="24.3125" - sodipodi:rx="1.2410715" - sodipodi:ry="1.2946428" - d="M 11.410714 24.3125 A 1.2410715 1.2946428 0 1 1 8.928571,24.3125 A 1.2410715 1.2946428 0 1 1 11.410714 24.3125 z" - transform="matrix(1.208633,0,0,1.158621,-5.825637,-16.66897)" /> - <path - style="fill:#3b1941;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1" - d="M 4.9752634,2.5424297 C 6.2676381,1.111155 8.059671,2.6823452 8.9752679,3.325734 L 7.061552,3.7844642 L 4.9752634,2.5424297 z " - id="path5192" - sodipodi:nodetypes="cccc" /> - <path - style="fill:#3b1941;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1" - d="M 6.9752602,1.2553494 C 8.5939382,0.25341885 11.64336,2.4607647 11.936975,3.3797691 L 9.4042533,2.9587153 L 6.9752602,1.2553494 z " - id="rect5189" - sodipodi:nodetypes="cccc" /> - <path - style="fill:#975fa3;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1" - d="M 17.336751,8.8148749 C 16.436419,7.5869931 14.971722,7.9141192 14.396849,8.6981357 C 13.609061,9.7725277 13.7004,11.64104 14.600731,12.868921 C 15.383133,13.93597 16.670043,14.495617 17.457832,13.421225 C 18.245621,12.346833 18.048044,9.7849448 17.336751,8.8148749 z " - id="path3132" - sodipodi:nodetypes="csssc" /> - <path - style="fill:white;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1" - d="M 17.468686,9.5432478 C 16.793205,8.7246594 15.694305,8.9427465 15.263003,9.4654264 C 14.671958,10.181691 14.740486,11.427368 15.415967,12.245957 C 16.00297,12.957323 16.968483,13.33042 17.559527,12.614156 C 18.150572,11.897891 18.002339,10.189962 17.468686,9.5432478 z " - id="path3134" - sodipodi:nodetypes="csssc" /> - <path - sodipodi:type="arc" - style="fill:#5c3566;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="path3136" - sodipodi:cx="10.169642" - sodipodi:cy="24.3125" - sodipodi:rx="1.2410715" - sodipodi:ry="1.2946428" - d="M 11.410714 24.3125 A 1.2410715 1.2946428 0 1 1 8.928571,24.3125 A 1.2410715 1.2946428 0 1 1 11.410714 24.3125 z" - transform="matrix(1.153827,0,0,1.158621,4.558885,-16.66895)" /> - <rect - style="fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="rect3140" - width="4.4400907" - height="1" - x="9.501585" - y="14" - rx="0.69182354" - ry="0.5" /> - <path - style="fill:#fcaf3e;fill-opacity:1;stroke:none;stroke-width:1.0283047;stroke-miterlimit:4;stroke-opacity:1" - d="M 6.965729,14.893438 C 12.054241,18.243015 11.620917,13 12.397198,13 C 13.162798,13 12.66503,18.201991 16.965729,14.895644 C 16.232886,16.102946 13.980397,18 13.030799,18 C 12.07051,18 8.156601,16.676807 6.965729,14.893438 z " - id="path3142" - sodipodi:nodetypes="czczc" /> - <path - style="fill:url(#linearGradient3146);fill-opacity:1;stroke:none;stroke-width:1.0283047;stroke-miterlimit:4;stroke-opacity:1" - d="M 6.965729,14.893439 C 11.706133,19.171305 11.620917,13 12.397198,13 C 13.162798,13 12.607012,18.027939 16.965729,14.895646 C 16.232886,16.102947 13.980397,18 13.030799,18 C 12.07051,18 8.156602,16.676809 6.965729,14.893439 z " - id="path3144" - sodipodi:nodetypes="czczc" /> - </g> -</svg>
--- a/pidgin/pixmaps/icons/32/Makefile.am Mon Nov 12 16:15:53 2007 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,6 +0,0 @@ -EXTRA_DIST = pidgin.png - -pidginiconspixdir = $(datadir)/icons/hicolor/32x32/apps - -pidginiconspix_DATA = $(EXTRA_DIST) -
--- a/pidgin/pixmaps/icons/32/scalable/pidgin.svg Mon Nov 12 16:15:53 2007 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,489 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<!-- Created with Inkscape (http://www.inkscape.org/) --> -<svg - xmlns:dc="http://purl.org/dc/elements/1.1/" - xmlns:cc="http://web.resource.org/cc/" - xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:svg="http://www.w3.org/2000/svg" - xmlns="http://www.w3.org/2000/svg" - xmlns:xlink="http://www.w3.org/1999/xlink" - xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" - xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - width="32" - height="32" - id="svg4345" - sodipodi:version="0.32" - inkscape:version="0.44.1" - sodipodi:docbase="/home/hbons/Desktop/2.0.2/pidgin/pixmaps/icons/32/scalable" - sodipodi:docname="pidgin.svg" - inkscape:export-filename="/home/hbons/Desktop/pidgin32.png" - inkscape:export-xdpi="90" - inkscape:export-ydpi="90" - version="1.0"> - <defs - id="defs4347"> - <linearGradient - inkscape:collect="always" - id="linearGradient3976"> - <stop - style="stop-color:#3b1941;stop-opacity:1;" - offset="0" - id="stop3978" /> - <stop - style="stop-color:#3b1941;stop-opacity:0;" - offset="1" - id="stop3980" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient3968"> - <stop - style="stop-color:#82508e;stop-opacity:1;" - offset="0" - id="stop3970" /> - <stop - style="stop-color:#82508e;stop-opacity:0;" - offset="1" - id="stop3972" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient3958"> - <stop - style="stop-color:#eeeeec;stop-opacity:1;" - offset="0" - id="stop3960" /> - <stop - style="stop-color:#eeeeec;stop-opacity:0;" - offset="1" - id="stop3962" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient2850"> - <stop - style="stop-color:#ce5c00;stop-opacity:1;" - offset="0" - id="stop2852" /> - <stop - style="stop-color:#ce5c00;stop-opacity:0;" - offset="1" - id="stop2854" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient2850" - id="linearGradient2856" - x1="21.785719" - y1="28.142857" - x2="17.785713" - y2="30.07143" - gradientUnits="userSpaceOnUse" - gradientTransform="translate(-47,-15.99998)" /> - <linearGradient - inkscape:collect="always" - id="linearGradient2816"> - <stop - style="stop-color:#eeeeec;stop-opacity:1;" - offset="0" - id="stop2818" /> - <stop - style="stop-color:#eeeeec;stop-opacity:0;" - offset="1" - id="stop2820" /> - </linearGradient> - <radialGradient - inkscape:collect="always" - xlink:href="#linearGradient2816" - id="radialGradient2824" - cx="9.4288578" - cy="19.283415" - fx="9.4288578" - fy="19.283415" - r="16.390338" - gradientTransform="matrix(1.556432,0,0,1.618148,-52.04294,-30.39321)" - gradientUnits="userSpaceOnUse" /> - <linearGradient - inkscape:collect="always" - id="linearGradient2826"> - <stop - style="stop-color:#3b1941;stop-opacity:1;" - offset="0" - id="stop2828" /> - <stop - style="stop-color:#3b1941;stop-opacity:0;" - offset="1" - id="stop2830" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient2826" - id="linearGradient2832" - x1="13.191773" - y1="41.606163" - x2="13.191773" - y2="47.843258" - gradientUnits="userSpaceOnUse" - gradientTransform="matrix(1,0,0,0.988192,-46.55265,-16.48621)" /> - <linearGradient - inkscape:collect="always" - id="linearGradient2834"> - <stop - style="stop-color:#82508e;stop-opacity:1;" - offset="0" - id="stop2836" /> - <stop - style="stop-color:#82508e;stop-opacity:0;" - offset="1" - id="stop2838" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient2834" - id="linearGradient2840" - x1="11.373499" - y1="41.566242" - x2="11.373499" - y2="47.746658" - gradientUnits="userSpaceOnUse" - gradientTransform="matrix(1,0,0,0.988192,-46.55265,-16.48621)" /> - <linearGradient - inkscape:collect="always" - id="linearGradient6563"> - <stop - style="stop-color:white;stop-opacity:1;" - offset="0" - id="stop6565" /> - <stop - style="stop-color:white;stop-opacity:0;" - offset="1" - id="stop6567" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient6537"> - <stop - style="stop-color:white;stop-opacity:1;" - offset="0" - id="stop6539" /> - <stop - style="stop-color:white;stop-opacity:0;" - offset="1" - id="stop6541" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient6506"> - <stop - style="stop-color:#eeeeec;stop-opacity:1;" - offset="0" - id="stop6508" /> - <stop - style="stop-color:#eeeeec;stop-opacity:0;" - offset="1" - id="stop6510" /> - </linearGradient> - <linearGradient - id="linearGradient2804"> - <stop - style="stop-color:black;stop-opacity:0;" - offset="0" - id="stop2806" /> - <stop - id="stop2812" - offset="0.5" - style="stop-color:black;stop-opacity:1;" /> - <stop - style="stop-color:black;stop-opacity:0;" - offset="1" - id="stop2808" /> - </linearGradient> - <radialGradient - inkscape:collect="always" - xlink:href="#linearGradient25546" - id="radialGradient25572" - gradientUnits="userSpaceOnUse" - gradientTransform="matrix(1,0,0,0.994693,0,4.16407e-2)" - cx="7.8836637" - cy="1.5104795" - fx="7.8836637" - fy="1.5104795" - r="8.4883642" /> - <radialGradient - inkscape:collect="always" - xlink:href="#linearGradient25546" - id="radialGradient25568" - gradientUnits="userSpaceOnUse" - gradientTransform="matrix(1,0,0,0.994693,0,4.16407e-2)" - cx="7.8836741" - cy="0.14505707" - fx="7.8836741" - fy="0.14505707" - r="8.4883642" /> - <linearGradient - inkscape:collect="always" - id="linearGradient25546"> - <stop - style="stop-color:white;stop-opacity:1;" - offset="0" - id="stop25548" /> - <stop - style="stop-color:white;stop-opacity:0;" - offset="1" - id="stop25550" /> - </linearGradient> - <radialGradient - inkscape:collect="always" - xlink:href="#linearGradient25546" - id="radialGradient25554" - cx="7.8836637" - cy="2.6242435" - fx="7.8836637" - fy="2.6242435" - r="8.4883642" - gradientTransform="matrix(1.131317,0,0,1.125313,-1.035262,-0.301139)" - gradientUnits="userSpaceOnUse" /> - <linearGradient - id="linearGradient3800"> - <stop - style="stop-color:#f4d9b1;stop-opacity:1.0000000;" - offset="0.0000000" - id="stop3802" /> - <stop - style="stop-color:#df9725;stop-opacity:1.0000000;" - offset="1.0000000" - id="stop3804" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient6506" - id="linearGradient6512" - x1="15.645709" - y1="39.743458" - x2="14.943421" - y2="50.079575" - gradientUnits="userSpaceOnUse" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient6537" - id="linearGradient6543" - x1="30.5" - y1="0.033532728" - x2="30.5" - y2="23.559282" - gradientUnits="userSpaceOnUse" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient6563" - id="linearGradient6569" - x1="-1.6841649" - y1="39.902092" - x2="5.5366187" - y2="44.272076" - gradientUnits="userSpaceOnUse" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient6537" - id="linearGradient3069" - gradientUnits="userSpaceOnUse" - x1="30.5" - y1="0.033532728" - x2="30.5" - y2="23.559282" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient6506" - id="linearGradient3071" - gradientUnits="userSpaceOnUse" - x1="15.645709" - y1="39.743458" - x2="15.645709" - y2="53.502155" - gradientTransform="translate(-47,-15)" /> - <radialGradient - inkscape:collect="always" - xlink:href="#linearGradient3958" - id="radialGradient3966" - cx="9.0640488" - cy="21.511742" - fx="9.0640488" - fy="21.511742" - r="16.663956" - gradientTransform="matrix(1.68884,0,0,1.716583,-6.243689,-15.89085)" - gradientUnits="userSpaceOnUse" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient3968" - id="linearGradient3974" - x1="16.13257" - y1="40.781811" - x2="16.13257" - y2="48.068741" - gradientUnits="userSpaceOnUse" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient3976" - id="linearGradient3982" - x1="12.095973" - y1="40.907658" - x2="12.095973" - y2="46.463146" - gradientUnits="userSpaceOnUse" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient2850" - id="linearGradient3991" - gradientUnits="userSpaceOnUse" - gradientTransform="matrix(0.769231,0,0,0.714287,-1.230773,-2.285726)" - x1="21.785719" - y1="28.142857" - x2="17.785713" - y2="30.07143" /> - </defs> - <sodipodi:namedview - id="base" - pagecolor="#ffffff" - bordercolor="#666666" - borderopacity="1.0" - inkscape:pageopacity="0.0" - inkscape:pageshadow="2" - inkscape:zoom="17.236022" - inkscape:cx="21.944662" - inkscape:cy="16.287609" - inkscape:current-layer="layer1" - showgrid="true" - inkscape:grid-bbox="true" - inkscape:document-units="px" - inkscape:window-width="1434" - inkscape:window-height="840" - inkscape:window-x="0" - inkscape:window-y="0" - showguides="true" - inkscape:guide-bbox="true" - inkscape:grid-points="false" - width="32px" - height="32px" - inkscape:object-bbox="true" /> - <metadata - id="metadata4350"> - <rdf:RDF> - <cc:Work - rdf:about=""> - <dc:format>image/svg+xml</dc:format> - <dc:type - rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> - </cc:Work> - </rdf:RDF> - </metadata> - <g - id="layer1" - inkscape:label="Layer 1" - inkscape:groupmode="layer"> - <path - sodipodi:type="inkscape:offset" - inkscape:radius="-1.0057179" - inkscape:original="M 20.53125 1.5 C 17.192693 1.5 14.5 4.611235 14.5 8.46875 L 14.5 20.53125 C 14.5 24.388765 17.192693 27.5 20.53125 27.5 L 34.53125 27.5 L 34.53125 31.09375 L 39.34375 27.5 L 41.5 27.5 C 45.512737 27.5 46.5 24.38319 46.5 20.53125 L 46.5 8.46875 C 46.5 4.6112353 43.807307 1.5 40.46875 1.5 L 20.53125 1.5 z " - style="fill:none;fill-opacity:1;stroke:white;stroke-width:1.47727883;stroke-miterlimit:4;stroke-opacity:1" - id="path6504" - d="M 20.53125,2.5 C 17.817519,2.5 15.5,5.0792547 15.5,8.46875 L 15.5,20.53125 C 15.5,23.920745 17.817519,26.5 20.53125,26.5 L 34.53125,26.5 C 35.082213,26.503178 35.528072,26.949037 35.53125,27.5 L 35.53125,29.09375 L 38.75,26.6875 C 38.923102,26.563771 39.130983,26.498125 39.34375,26.5 L 41.5,26.5 C 43.245978,26.5 44.034662,25.931926 44.625,24.9375 C 45.215338,23.943074 45.5,22.371297 45.5,20.53125 L 45.5,8.46875 C 45.5,5.079255 43.182481,2.5 40.46875,2.5 L 20.53125,2.5 z " - transform="matrix(0.67692,0,0,0.67692,0.161535,-0.515354)" /> - <path - style="fill:#efefef;fill-opacity:1;stroke:#787878;stroke-width:1.46586692;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - d="M 20.53125,1.5 C 17.192693,1.5 14.5,4.611235 14.5,8.46875 L 14.5,20.53125 C 14.5,24.388765 17.428915,28.139948 20.767472,28.139948 L 33.409288,28.041495 L 33.415412,31.845969 L 38.723454,28.076231 L 42.130099,28.139948 C 46.142836,28.139948 46.5,24.580097 46.5,20.728157 L 46.5,8.46875 C 46.5,4.6112353 43.807307,1.5 40.46875,1.5 L 20.53125,1.5 z " - id="rect5498" - sodipodi:nodetypes="cccccccccccc" - transform="matrix(0.687501,0,0,0.67692,-0.468758,-0.515381)" /> - <path - transform="matrix(0.668893,0,0,0.668627,8.626692e-2,-0.192463)" - style="fill:url(#linearGradient6543);fill-opacity:1;stroke:white;stroke-width:1.49530375;stroke-miterlimit:4;stroke-opacity:1" - d="M 20.53125,2.53125 C 17.841732,2.53125 15.53125,5.0973912 15.53125,8.46875 L 15.53125,20.53125 C 15.53125,23.902609 17.841732,26.46875 20.53125,26.46875 L 33.967629,26.46875 C 34.534122,26.476048 34.991581,26.933507 34.998879,27.5 L 34.998879,29 L 38.71875,26.65625 C 38.901723,26.528628 39.120742,26.462922 39.34375,26.46875 L 42.415884,26.46875 C 45.139435,26.46875 45.46875,24.282574 45.46875,20.53125 L 45.46875,8.46875 C 45.46875,5.0973915 43.158268,2.53125 40.46875,2.53125 L 20.53125,2.53125 z " - id="path6535" - sodipodi:nodetypes="cccccccccccccc" /> - <path - style="opacity:1;fill:url(#linearGradient3974);fill-opacity:1.0;stroke:url(#linearGradient3982);stroke-width:1.51128328;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - d="M 15,13 C 8.3759979,13 3,18.600001 3,25.5 C 4.8460021,40.483064 0.49299658,38.484005 0.052646307,45.33795 C 0.052646307,47.422072 1.0380664,48.413461 3.1446965,48.413461 C 4.3321851,48.413461 29.360035,48.5596 32.051034,48.5596 C 34.165161,48.5596 34,46.5 34,46.5 C 34,43.834589 27.597902,41.598052 25.813453,39.641526 C 23.985035,37.640505 26,30.5 26,30.5 C 26.641306,28.9702 27,27.275084 27,25.5 C 27,18.600001 21.624002,13 15,13 z " - id="path5176" - sodipodi:nodetypes="cccccszcsc" - transform="matrix(0.67692,0,0,0.646801,0.464358,-0.908413)" /> - <path - style="opacity:0.5;fill:url(#radialGradient3966);fill-opacity:1.0;stroke:url(#linearGradient6512);stroke-width:1.55319357;stroke-miterlimit:4;stroke-opacity:1" - d="M 15,14.0625 C 8.9877035,14.0625 4.0789961,19.13808 4.0625,25.46875 C 4.0624722,25.479427 4.0625,25.489316 4.0625,25.5 C 4.9744187,33.020507 4.3062656,37.469969 2.59375,40.59375 C -0.19778709,46.24536 1.5610206,47.490284 3.9033639,47.490284 C 5.8399452,47.490284 23.958121,47.46049 29.784094,47.46049 C 30.951301,47.46049 32.9375,47.964563 32.9375,46.5 C 32.9375,46.278257 32.737749,45.861323 32.1875,45.34375 C 31.637251,44.826177 30.81426,44.270409 29.90625,43.71875 C 28.99824,43.167091 28.02821,42.609033 27.15625,42.0625 C 26.28429,41.515967 25.511654,41.005793 24.96875,40.28125 C 24.358745,39.467156 24.078806,38.510169 24.024342,37.46875 C 23.969878,36.427331 24.107721,35.310041 24.224561,34.25 C 24.458241,32.129917 24.96875,30.28125 24.96875,30.28125 C 24.98374,30.216952 25.004663,30.154183 25.03125,30.09375 C 25.618731,28.692346 25.9375,27.131297 25.9375,25.5 C 25.9375,19.154404 21.022436,14.0625 15,14.0625 z " - id="path5241" - sodipodi:nodetypes="csscccssssssscssc" - transform="matrix(0.660903,0,0,0.627207,0.731515,-0.320103)" /> - <path - style="opacity:1;fill:#a46bb0;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1" - d="M 5.0726004,12.086499 C 6.6079483,10.449324 9.1057173,10.885492 10.086057,11.930848 C 11.429483,13.36337 11.273722,15.85472 9.7383746,17.491894 C 8.4041332,18.914624 6.2095475,19.660821 4.8661202,18.228299 C 3.5226923,16.795776 3.8596213,13.379925 5.0726004,12.086499 z " - id="path5160" - sodipodi:nodetypes="csssc" /> - <path - style="opacity:1;fill:white;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1" - d="M 13.257119,24.626053 C 13.257119,26.227351 11.8279,27.316574 10.863875,27.316574 C 9.5428049,27.316574 8.4706318,26.01697 8.4706318,24.415672 C 8.4706318,23.024119 9.2055946,21.514771 10.526665,21.514771 C 11.847736,21.514771 13.257119,23.360971 13.257119,24.626053 z " - id="path5157" - sodipodi:nodetypes="csssc" - transform="matrix(1.010846,0,0,1.029732,-3.562503,-10.12874)" /> - <path - sodipodi:type="arc" - style="opacity:1;fill:#5c3566;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="path5162" - sodipodi:cx="10.169642" - sodipodi:cy="24.3125" - sodipodi:rx="1.2410715" - sodipodi:ry="1.2946428" - d="M 11.410714 24.3125 A 1.2410715 1.2946428 0 1 1 8.928571,24.3125 A 1.2410715 1.2946428 0 1 1 11.410714 24.3125 z" - transform="matrix(1.208633,0,0,1.158621,-4.791365,-12.66897)" /> - <path - transform="matrix(0.596326,-0.813274,-0.562251,-0.766804,24.4163,42.47989)" - style="opacity:1;fill:#975fa3;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1" - d="M 13.257119,24.626053 C 13.257119,26.227351 11.8279,27.316574 10.863875,27.316574 C 9.5428049,27.316574 8.4706318,26.01697 8.4706318,24.415672 C 8.4706318,23.024119 9.2055946,21.514771 10.526665,21.514771 C 11.847736,21.514771 13.257119,23.360971 13.257119,24.626053 z " - id="path5167" - sodipodi:nodetypes="csssc" /> - <path - style="opacity:1;fill:white;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1" - d="M 13.257119,24.626053 C 13.257119,26.227351 11.8279,27.316574 10.863875,27.316574 C 9.5428049,27.316574 8.4706318,26.01697 8.4706318,24.415672 C 8.4706318,23.024119 9.2055946,21.514771 10.526665,21.514771 C 11.847736,21.514771 13.257119,23.360971 13.257119,24.626053 z " - id="path5169" - sodipodi:nodetypes="csssc" - transform="matrix(0.447398,-0.542185,-0.421833,-0.511203,23.06465,33.31996)" /> - <path - sodipodi:type="arc" - style="opacity:1;fill:#5c3566;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="path5171" - sodipodi:cx="10.169642" - sodipodi:cy="24.3125" - sodipodi:rx="1.2410715" - sodipodi:ry="1.2946428" - d="M 11.410714 24.3125 A 1.2410715 1.2946428 0 1 1 8.928571,24.3125 A 1.2410715 1.2946428 0 1 1 11.410714 24.3125 z" - transform="matrix(1.208633,0,0,1.158621,5.208632,-12.66896)" /> - <rect - style="opacity:1;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="rect5215" - width="4.4400907" - height="1" - x="10.535856" - y="18" - rx="0.69182354" - ry="0.5" /> - <path - transform="matrix(0.670792,0,0,0.486348,-1.815475,1.13962)" - style="fill:#3b1941;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1" - d="M 11.651119,11.193815 C 13.577759,8.2509126 16.249277,11.481501 17.614226,12.804399 L 14.761306,13.747613 L 11.651119,11.193815 z " - id="path5192" - sodipodi:nodetypes="cccc" /> - <path - transform="matrix(0.851014,0,0,0.554879,-1.947706,-0.153319)" - style="fill:#3b1941;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1" - d="M 11.689238,9.8218679 C 13.591296,8.0161941 17.174576,11.994261 17.519594,13.650486 L 14.543472,12.891665 L 11.689238,9.8218679 z " - id="rect5189" - sodipodi:nodetypes="cccc" /> - <path - style="fill:#fcaf3e;fill-opacity:1;stroke:none;stroke-width:1.0283047;stroke-miterlimit:4;stroke-opacity:1" - d="M 8,18.893438 C 13.088512,22.243015 12.655188,17 13.431469,17 C 14.197069,17 13.699301,22.201991 18,18.895644 C 17.267157,20.102946 15.014668,22 14.06507,22 C 13.104781,22 9.1908718,20.676807 8,18.893438 z " - id="path3987" - sodipodi:nodetypes="czczc" /> - <path - style="fill:url(#linearGradient3991);fill-opacity:1;stroke:none;stroke-width:1.0283047;stroke-miterlimit:4;stroke-opacity:1" - d="M 8,18.893439 C 12.740404,23.171305 12.655188,17 13.431469,17 C 14.197069,17 13.641283,22.027939 18,18.895646 C 17.267157,20.102947 15.014668,22 14.06507,22 C 13.104781,22 9.1908731,20.676809 8,18.893439 z " - id="path3989" - sodipodi:nodetypes="czczc" /> - </g> -</svg>
--- a/pidgin/pixmaps/icons/48/Makefile.am Mon Nov 12 16:15:53 2007 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,6 +0,0 @@ -EXTRA_DIST = pidgin.png - -pidginiconspixdir = $(datadir)/icons/hicolor/48x48/apps - -pidginiconspix_DATA = $(EXTRA_DIST) -
--- a/pidgin/pixmaps/icons/48/scalable/pidgin.svg Mon Nov 12 16:15:53 2007 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,460 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<!-- Created with Inkscape (http://www.inkscape.org/) --> -<svg - xmlns:dc="http://purl.org/dc/elements/1.1/" - xmlns:cc="http://web.resource.org/cc/" - xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:svg="http://www.w3.org/2000/svg" - xmlns="http://www.w3.org/2000/svg" - xmlns:xlink="http://www.w3.org/1999/xlink" - xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" - xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - width="48px" - height="48px" - id="svg4345" - sodipodi:version="0.32" - inkscape:version="0.44.1" - sodipodi:docbase="/home/hbons/Desktop/2.0.2/pidgin/pixmaps/icons/48/scalable" - sodipodi:docname="pidgin.svg" - inkscape:export-filename="/home/hbons/Desktop/pidgin48.png" - inkscape:export-xdpi="90" - inkscape:export-ydpi="90"> - <defs - id="defs4347"> - <linearGradient - inkscape:collect="always" - id="linearGradient2850"> - <stop - style="stop-color:#ce5c00;stop-opacity:1;" - offset="0" - id="stop2852" /> - <stop - style="stop-color:#ce5c00;stop-opacity:0;" - offset="1" - id="stop2854" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient2834"> - <stop - style="stop-color:#82508e;stop-opacity:1;" - offset="0" - id="stop2836" /> - <stop - style="stop-color:#82508e;stop-opacity:0;" - offset="1" - id="stop2838" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient2826"> - <stop - style="stop-color:#3b1941;stop-opacity:1;" - offset="0" - id="stop2828" /> - <stop - style="stop-color:#3b1941;stop-opacity:0;" - offset="1" - id="stop2830" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient2816"> - <stop - style="stop-color:#eeeeec;stop-opacity:1;" - offset="0" - id="stop2818" /> - <stop - style="stop-color:#eeeeec;stop-opacity:0;" - offset="1" - id="stop2820" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient6563"> - <stop - style="stop-color:white;stop-opacity:1;" - offset="0" - id="stop6565" /> - <stop - style="stop-color:white;stop-opacity:0;" - offset="1" - id="stop6567" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient6537"> - <stop - style="stop-color:white;stop-opacity:1;" - offset="0" - id="stop6539" /> - <stop - style="stop-color:white;stop-opacity:0;" - offset="1" - id="stop6541" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient6506"> - <stop - style="stop-color:#eeeeec;stop-opacity:1;" - offset="0" - id="stop6508" /> - <stop - style="stop-color:#eeeeec;stop-opacity:0;" - offset="1" - id="stop6510" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient6493"> - <stop - style="stop-color:#eeeeec;stop-opacity:1;" - offset="0" - id="stop6495" /> - <stop - style="stop-color:#eeeeec;stop-opacity:0;" - offset="1" - id="stop6497" /> - </linearGradient> - <linearGradient - inkscape:collect="always" - id="linearGradient5280"> - <stop - style="stop-color:#82508e;stop-opacity:1;" - offset="0" - id="stop5282" /> - <stop - style="stop-color:#82508e;stop-opacity:0;" - offset="1" - id="stop5284" /> - </linearGradient> - <linearGradient - id="linearGradient2804"> - <stop - style="stop-color:black;stop-opacity:0;" - offset="0" - id="stop2806" /> - <stop - id="stop2812" - offset="0.5" - style="stop-color:black;stop-opacity:1;" /> - <stop - style="stop-color:black;stop-opacity:0;" - offset="1" - id="stop2808" /> - </linearGradient> - <radialGradient - inkscape:collect="always" - xlink:href="#linearGradient25546" - id="radialGradient25572" - gradientUnits="userSpaceOnUse" - gradientTransform="matrix(1,0,0,0.994693,0,4.16407e-2)" - cx="7.8836637" - cy="1.5104795" - fx="7.8836637" - fy="1.5104795" - r="8.4883642" /> - <radialGradient - inkscape:collect="always" - xlink:href="#linearGradient25546" - id="radialGradient25568" - gradientUnits="userSpaceOnUse" - gradientTransform="matrix(1,0,0,0.994693,0,4.16407e-2)" - cx="7.8836741" - cy="0.14505707" - fx="7.8836741" - fy="0.14505707" - r="8.4883642" /> - <linearGradient - inkscape:collect="always" - id="linearGradient25546"> - <stop - style="stop-color:white;stop-opacity:1;" - offset="0" - id="stop25548" /> - <stop - style="stop-color:white;stop-opacity:0;" - offset="1" - id="stop25550" /> - </linearGradient> - <radialGradient - inkscape:collect="always" - xlink:href="#linearGradient25546" - id="radialGradient25554" - cx="7.8836637" - cy="2.6242435" - fx="7.8836637" - fy="2.6242435" - r="8.4883642" - gradientTransform="matrix(1.131317,0,0,1.125313,-1.035262,-0.301139)" - gradientUnits="userSpaceOnUse" /> - <linearGradient - id="linearGradient3800"> - <stop - style="stop-color:#f4d9b1;stop-opacity:1.0000000;" - offset="0.0000000" - id="stop3802" /> - <stop - style="stop-color:#df9725;stop-opacity:1.0000000;" - offset="1.0000000" - id="stop3804" /> - </linearGradient> - <radialGradient - inkscape:collect="always" - xlink:href="#linearGradient5280" - id="radialGradient5286" - cx="15.004828" - cy="39.80859" - fx="15.004828" - fy="39.80859" - r="9.7225161" - gradientTransform="matrix(1,0,0,0.732283,0,10.65742)" - gradientUnits="userSpaceOnUse" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient6493" - id="linearGradient6499" - x1="3.3105288" - y1="43.5" - x2="5.6917014" - y2="43.5" - gradientUnits="userSpaceOnUse" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient6506" - id="linearGradient6512" - x1="15.645709" - y1="41.751736" - x2="15.645709" - y2="47.370037" - gradientUnits="userSpaceOnUse" - gradientTransform="matrix(1,0,0,0.988192,0.5625,-1.39645)" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient6537" - id="linearGradient6543" - x1="30.5" - y1="5.7732024" - x2="30.5" - y2="19.518673" - gradientUnits="userSpaceOnUse" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient6563" - id="linearGradient6573" - gradientUnits="userSpaceOnUse" - x1="12.01321" - y1="38.950283" - x2="5.5366187" - y2="44.272076" /> - <radialGradient - inkscape:collect="always" - xlink:href="#linearGradient2816" - id="radialGradient2824" - cx="9.4288578" - cy="19.283415" - fx="9.4288578" - fy="19.283415" - r="16.390338" - gradientTransform="matrix(1.556432,0,0,1.618148,-5.04294,-15.39321)" - gradientUnits="userSpaceOnUse" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient2826" - id="linearGradient2832" - x1="13.191773" - y1="41.606163" - x2="13.191773" - y2="47.843258" - gradientUnits="userSpaceOnUse" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient2834" - id="linearGradient2840" - x1="11.373499" - y1="41.566242" - x2="11.373499" - y2="47.746658" - gradientUnits="userSpaceOnUse" /> - <linearGradient - inkscape:collect="always" - xlink:href="#linearGradient2850" - id="linearGradient2856" - x1="21.785719" - y1="28.142857" - x2="17.785713" - y2="30.07143" - gradientUnits="userSpaceOnUse" - gradientTransform="translate(0,-0.999982)" /> - </defs> - <sodipodi:namedview - id="base" - pagecolor="#ffffff" - bordercolor="#666666" - borderopacity="1.0" - inkscape:pageopacity="0.0" - inkscape:pageshadow="2" - inkscape:zoom="14" - inkscape:cx="34.459692" - inkscape:cy="22.220728" - inkscape:current-layer="layer1" - showgrid="true" - inkscape:grid-bbox="true" - inkscape:document-units="px" - inkscape:window-width="1434" - inkscape:window-height="840" - inkscape:window-x="0" - inkscape:window-y="0" - showguides="true" - inkscape:guide-bbox="true" - inkscape:grid-points="true" /> - <metadata - id="metadata4350"> - <rdf:RDF> - <cc:Work - rdf:about=""> - <dc:format>image/svg+xml</dc:format> - <dc:type - rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> - </cc:Work> - </rdf:RDF> - </metadata> - <g - id="layer1" - inkscape:label="Layer 1" - inkscape:groupmode="layer"> - <rect - style="opacity:0.23144106;fill:#2e3436;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="rect6514" - width="36.000004" - height="2.9999979" - x="-4.4446878" - y="57.424854" - rx="2.0412357" - ry="1.4999989" /> - <path - sodipodi:type="inkscape:offset" - inkscape:radius="-1.0057179" - inkscape:original="M 20.53125 1.5 C 17.192693 1.5 14.5 4.611235 14.5 8.46875 L 14.5 20.53125 C 14.5 24.388765 17.192693 27.5 20.53125 27.5 L 34.53125 27.5 L 34.53125 31.09375 L 39.34375 27.5 L 41.5 27.5 C 45.512737 27.5 46.5 24.38319 46.5 20.53125 L 46.5 8.46875 C 46.5 4.6112353 43.807307 1.5 40.46875 1.5 L 20.53125 1.5 z " - style="fill:none;fill-opacity:1;stroke:white;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1" - id="path6504" - d="M 20.53125,2.5 C 17.817519,2.5 15.5,5.0792547 15.5,8.46875 L 15.5,20.53125 C 15.5,23.920745 17.817519,26.5 20.53125,26.5 L 34.53125,26.5 C 35.082213,26.503178 35.528072,26.949037 35.53125,27.5 L 35.53125,29.09375 L 38.75,26.6875 C 38.923102,26.563771 39.130983,26.498125 39.34375,26.5 L 41.5,26.5 C 43.245978,26.5 44.034662,25.931926 44.625,24.9375 C 45.215338,23.943074 45.5,22.371297 45.5,20.53125 L 45.5,8.46875 C 45.5,5.079255 43.182481,2.5 40.46875,2.5 L 20.53125,2.5 z " /> - <path - style="fill:#efefef;fill-opacity:1;stroke:#787878;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1" - d="M 20.53125,1.5 C 17.192693,1.5 14.5,4.611235 14.5,8.46875 L 14.5,20.53125 C 14.5,24.388765 17.192693,27.5 20.53125,27.5 L 34.530203,27.5 L 34.530203,31.107567 L 39.353553,27.485509 L 41.5,27.5 C 45.512737,27.5 46.5,24.38319 46.5,20.53125 L 46.5,8.46875 C 46.5,4.6112353 43.807307,1.5 40.46875,1.5 L 20.53125,1.5 z " - id="rect5498" - sodipodi:nodetypes="cccccccccccc" /> - <path - sodipodi:type="inkscape:offset" - inkscape:radius="-1.044691" - inkscape:original="M 20.53125 1.5 C 17.192693 1.5 14.5 4.611235 14.5 8.46875 L 14.5 20.53125 C 14.5 24.388765 17.192693 27.5 20.53125 27.5 L 34.53125 27.5 L 34.53125 31.09375 L 39.34375 27.5 L 41.5 27.5 C 45.512737 27.5 46.5 24.38319 46.5 20.53125 L 46.5 8.46875 C 46.5 4.6112353 43.807307 1.5 40.46875 1.5 L 20.53125 1.5 z " - style="fill:url(#linearGradient6543);fill-opacity:1.0;stroke:white;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1" - id="path6535" - d="M 20.53125,2.53125 C 17.841732,2.53125 15.53125,5.0973912 15.53125,8.46875 L 15.53125,20.53125 C 15.53125,23.902609 17.841732,26.46875 20.53125,26.46875 L 34.53125,26.46875 C 35.097743,26.476048 35.555202,26.933507 35.5625,27.5 L 35.5625,29 L 38.71875,26.65625 C 38.901723,26.528628 39.120742,26.462922 39.34375,26.46875 L 41.5,26.46875 C 43.235888,26.46875 44.009537,25.921608 44.59375,24.9375 C 45.177963,23.953392 45.46875,22.367968 45.46875,20.53125 L 45.46875,8.46875 C 45.46875,5.0973915 43.158268,2.53125 40.46875,2.53125 L 20.53125,2.53125 z " /> - <path - style="opacity:1;fill:url(#linearGradient2840);fill-opacity:1.0;stroke:url(#linearGradient2832);stroke-width:1.00595677;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - d="M 15,13 C 8.3759979,13 3,18.600001 3,25.5 C 4.8460021,40.483064 0.49299658,38.484005 0.052646307,45.33795 C 0.052646307,47.422072 1.0380664,48.413461 3.1446965,48.413461 C 4.3321851,48.413461 29.360035,48.5596 32.051034,48.5596 C 34.165161,48.5596 34,46.5 34,46.5 C 34,43.834589 27.597902,41.598052 25.813453,39.641526 C 23.985035,37.640505 26,30.5 26,30.5 C 26.641306,28.9702 27,27.275084 27,25.5 C 27,18.600001 21.624002,13 15,13 z " - id="path5176" - sodipodi:nodetypes="cccccszcsc" - transform="matrix(1,0,0,0.988192,0.447354,-1.486208)" /> - <path - style="opacity:0.5;fill:url(#radialGradient2824);fill-opacity:1;stroke:url(#linearGradient6512);stroke-width:0.99999994;stroke-miterlimit:4;stroke-opacity:1" - d="M 15.5625,12.5 C 9.550204,12.5 4.641496,17.515648 4.625,23.771565 C 4.624972,23.782116 4.625,23.791888 4.625,23.802446 C 5.536919,31.234151 4.868766,35.631074 3.15625,38.717969 C 0.36471303,44.302845 2.123521,45.533069 4.465864,45.533069 C 6.402445,45.533069 24.520621,45.503627 30.346594,45.503627 C 31.513801,45.503627 33.5,46.001748 33.5,44.554478 C 33.5,44.335354 33.300249,43.923343 32.75,43.411881 C 32.199751,42.90042 31.37676,42.351214 30.46875,41.806069 C 29.56074,41.260924 28.59071,40.709456 27.71875,40.169376 C 26.84679,39.629297 26.074154,39.125147 25.53125,38.409159 C 24.921245,37.604678 24.641306,36.658991 24.586842,35.629869 C 24.532378,34.600747 24.670221,33.49665 24.787061,32.449126 C 25.020741,30.354077 25.53125,28.527239 25.53125,28.527239 C 25.54624,28.4637 25.567163,28.401673 25.59375,28.341953 C 26.181231,26.957097 26.5,25.414481 26.5,23.802446 C 26.5,17.531779 21.584936,12.5 15.5625,12.5 z " - id="path5241" - sodipodi:nodetypes="csscccssssssscssc" /> - <path - style="opacity:1;fill:#a46bb0;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1" - d="M 7.269301,19.503118 C 9.2717505,17.238166 12.529418,17.841584 13.808008,19.287784 C 15.560146,21.269611 15.356996,24.71627 13.354547,26.981222 C 11.614386,28.949501 8.7521391,29.981828 7,28 C 5.2478601,26.018172 5.6872953,21.292511 7.269301,19.503118 z " - id="path5160" - sodipodi:nodetypes="csssc" /> - <path - transform="matrix(1.46245,0,0,1.378883,-5.440518,-10.80605)" - style="opacity:1;fill:white;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1" - d="M 13.257119,24.626053 C 13.257119,26.227351 11.8279,27.316574 10.863875,27.316574 C 9.5428049,27.316574 8.4706318,26.01697 8.4706318,24.415672 C 8.4706318,23.024119 9.2055946,21.514771 10.526665,21.514771 C 11.847736,21.514771 13.257119,23.360971 13.257119,24.626053 z " - id="path5157" - sodipodi:nodetypes="csssc" /> - <path - sodipodi:type="arc" - style="opacity:1;fill:#5c3566;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="path5162" - sodipodi:cx="10.169642" - sodipodi:cy="24.3125" - sodipodi:rx="1.2410715" - sodipodi:ry="1.2946428" - d="M 11.410714 24.3125 A 1.2410715 1.2946428 0 1 1 8.928571,24.3125 A 1.2410715 1.2946428 0 1 1 11.410714 24.3125 z" - transform="matrix(1.208632,0,0,1.544828,-1.738701,-14.41893)" /> - <path - sodipodi:type="arc" - style="opacity:1;fill:black;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="path5164" - sodipodi:cx="10.169642" - sodipodi:cy="24.3125" - sodipodi:rx="1.2410715" - sodipodi:ry="1.2946428" - d="M 11.410714 24.3125 A 1.2410715 1.2946428 0 1 1 8.928571,24.3125 A 1.2410715 1.2946428 0 1 1 11.410714 24.3125 z" - transform="matrix(0.402878,0,0,0.514947,6.455534,10.62004)" /> - <path - style="opacity:1;fill:#975fa3;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1" - d="M 27.88281,19.946791 C 26.359012,18.309616 23.880032,18.745786 22.907068,19.791141 C 21.573747,21.223665 21.728337,23.715015 23.252136,25.35219 C 24.576341,26.77492 26.754418,27.521117 28.087739,26.088593 C 29.42106,24.656068 29.086665,21.240217 27.88281,19.946791 z " - id="path5167" - sodipodi:nodetypes="csssc" /> - <path - transform="matrix(0.726374,-0.813272,-0.684868,-0.766801,34.41717,50.34012)" - style="opacity:1;fill:white;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1" - d="M 13.257119,24.626053 C 13.257119,26.227351 11.8279,27.316574 10.863875,27.316574 C 9.5428049,27.316574 8.4706318,26.01697 8.4706318,24.415672 C 8.4706318,23.024119 9.2055946,21.514771 10.526665,21.514771 C 11.847736,21.514771 13.257119,23.360971 13.257119,24.626053 z " - id="path5169" - sodipodi:nodetypes="csssc" /> - <path - sodipodi:type="arc" - style="opacity:1;fill:#5c3566;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="path5171" - sodipodi:cx="10.169642" - sodipodi:cy="24.3125" - sodipodi:rx="1.2410715" - sodipodi:ry="1.2946428" - d="M 11.410714 24.3125 A 1.2410715 1.2946428 0 1 1 8.928571,24.3125 A 1.2410715 1.2946428 0 1 1 11.410714 24.3125 z" - transform="matrix(1.208632,0,0,1.598777,13.20865,-15.80042)" /> - <path - sodipodi:type="arc" - style="opacity:1;fill:black;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="path5173" - sodipodi:cx="10.169642" - sodipodi:cy="24.3125" - sodipodi:rx="1.2410715" - sodipodi:ry="1.2946428" - d="M 11.410714 24.3125 A 1.2410715 1.2946428 0 1 1 8.928571,24.3125 A 1.2410715 1.2946428 0 1 1 11.410714 24.3125 z" - transform="matrix(0.402878,0,0,0.53293,21.40289,10.11299)" /> - <rect - style="opacity:1;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="rect5215" - width="7" - height="1.8602936" - x="15" - y="27.000017" - rx="0.81387848" - ry="0.93014681" /> - <path - style="fill:#fcaf3e;fill-opacity:1;stroke:none;stroke-width:1.0283047;stroke-miterlimit:4;stroke-opacity:1" - d="M 12.000005,28.650812 C 17.33287,31.553263 18.051747,26 19.060912,26 C 20.056192,26 20.46502,31.577054 25,28.653901 C 24.047304,30.344123 21.119071,32.999996 19.884593,32.999996 C 18.636217,32.999996 13.548138,31.147528 12.000005,28.650812 z " - id="rect5187" - sodipodi:nodetypes="czczc" /> - <path - transform="matrix(1.236264,0,0,0.549587,-6.482886,4.775206)" - style="fill:#3b1941;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1" - d="M 11.651119,11.193815 C 12.963532,7.814583 16.999999,10.43431 16.999999,12.891665 L 13.737594,13.834879 L 11.651119,11.193815 z " - id="path5192" - sodipodi:nodetypes="cccc" /> - <path - transform="matrix(1.50247,0,0,1,-7.59464,-1.139701)" - style="fill:#3b1941;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1" - d="M 11.689238,9.8218679 C 13.591296,8.0161941 17.219555,11.23544 17.564573,12.891665 L 14.543472,12.891665 L 11.689238,9.8218679 z " - id="rect5189" - sodipodi:nodetypes="cccc" /> - <path - style="fill:url(#linearGradient2856);fill-opacity:1;stroke:none;stroke-width:1.0283047;stroke-miterlimit:4;stroke-opacity:1" - d="M 12.000005,28.650834 C 17.332871,31.553285 18.051747,26.000022 19.060912,26.000022 C 20.056192,26.000022 20.46502,31.577076 25,28.653923 C 24.047304,30.344145 21.119071,33.000018 19.884593,33.000018 C 18.636217,33.000018 13.548139,31.14755 12.000005,28.650834 z " - id="path6561" - sodipodi:nodetypes="czczc" /> - </g> -</svg>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pidgin/pixmaps/icons/hicolor/16x16/apps/scalable/pidgin.svg Mon Nov 12 16:53:54 2007 +0000 @@ -0,0 +1,784 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://web.resource.org/cc/" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="16" + height="16" + id="svg4345" + sodipodi:version="0.32" + inkscape:version="0.44.1" + sodipodi:docbase="/home/hbons/Desktop/2.0.2/pidgin/pixmaps/icons/16/scalable" + sodipodi:docname="pidgin.svg" + inkscape:export-filename="/home/hbons/Desktop/pidgin16.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90" + version="1.0"> + <defs + id="defs4347"> + <linearGradient + inkscape:collect="always" + id="linearGradient3157"> + <stop + style="stop-color:#eeeeec;stop-opacity:1;" + offset="0" + id="stop3159" /> + <stop + style="stop-color:#eeeeec;stop-opacity:0;" + offset="1" + id="stop3161" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient3149"> + <stop + style="stop-color:#3b1941;stop-opacity:1;" + offset="0" + id="stop3151" /> + <stop + style="stop-color:#3b1941;stop-opacity:0;" + offset="1" + id="stop3153" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient3141"> + <stop + style="stop-color:#82508e;stop-opacity:1;" + offset="0" + id="stop3143" /> + <stop + style="stop-color:#82508e;stop-opacity:0;" + offset="1" + id="stop3145" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient3128"> + <stop + style="stop-color:#eeeeec;stop-opacity:1;" + offset="0" + id="stop3130" /> + <stop + style="stop-color:#eeeeec;stop-opacity:0;" + offset="1" + id="stop3132" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient5438"> + <stop + style="stop-color:white;stop-opacity:1;" + offset="0" + id="stop5440" /> + <stop + style="stop-color:white;stop-opacity:0;" + offset="1" + id="stop5442" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient6817"> + <stop + style="stop-color:white;stop-opacity:1;" + offset="0" + id="stop6819" /> + <stop + style="stop-color:white;stop-opacity:0;" + offset="1" + id="stop6821" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient6537"> + <stop + style="stop-color:white;stop-opacity:1;" + offset="0" + id="stop6539" /> + <stop + style="stop-color:white;stop-opacity:0;" + offset="1" + id="stop6541" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient6506"> + <stop + style="stop-color:#eeeeec;stop-opacity:1;" + offset="0" + id="stop6508" /> + <stop + style="stop-color:#eeeeec;stop-opacity:0;" + offset="1" + id="stop6510" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient5280"> + <stop + style="stop-color:#82508e;stop-opacity:1;" + offset="0" + id="stop5282" /> + <stop + style="stop-color:#82508e;stop-opacity:0;" + offset="1" + id="stop5284" /> + </linearGradient> + <linearGradient + id="linearGradient2804"> + <stop + style="stop-color:black;stop-opacity:0;" + offset="0" + id="stop2806" /> + <stop + id="stop2812" + offset="0.5" + style="stop-color:black;stop-opacity:1;" /> + <stop + style="stop-color:black;stop-opacity:0;" + offset="1" + id="stop2808" /> + </linearGradient> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient25546" + id="radialGradient25572" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,0.994693,0,4.16407e-2)" + cx="7.8836637" + cy="1.5104795" + fx="7.8836637" + fy="1.5104795" + r="8.4883642" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient25546" + id="radialGradient25568" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,0.994693,0,4.16407e-2)" + cx="7.8836741" + cy="0.14505707" + fx="7.8836741" + fy="0.14505707" + r="8.4883642" /> + <linearGradient + inkscape:collect="always" + id="linearGradient25546"> + <stop + style="stop-color:white;stop-opacity:1;" + offset="0" + id="stop25548" /> + <stop + style="stop-color:white;stop-opacity:0;" + offset="1" + id="stop25550" /> + </linearGradient> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient25546" + id="radialGradient25554" + cx="7.8836637" + cy="2.6242435" + fx="7.8836637" + fy="2.6242435" + r="8.4883642" + gradientTransform="matrix(1.131317,0,0,1.125313,-1.035262,-0.301139)" + gradientUnits="userSpaceOnUse" /> + <linearGradient + id="linearGradient3800"> + <stop + style="stop-color:#f4d9b1;stop-opacity:1.0000000;" + offset="0.0000000" + id="stop3802" /> + <stop + style="stop-color:#df9725;stop-opacity:1.0000000;" + offset="1.0000000" + id="stop3804" /> + </linearGradient> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient5280" + id="radialGradient5286" + cx="15.004828" + cy="39.80859" + fx="15.004828" + fy="39.80859" + r="9.7225161" + gradientTransform="matrix(1,0,0,0.732283,0,10.65742)" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient6537" + id="linearGradient6543" + x1="30.5" + y1="0.033532728" + x2="30.5" + y2="23.559282" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient6817" + id="linearGradient6823" + x1="0.23931108" + y1="38.950283" + x2="5.7089725" + y2="42.982571" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.63556,0,0,0.371995,11.16667,-5.489292)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient5438" + id="linearGradient5444" + x1="30.152058" + y1="-0.86487341" + x2="30.152058" + y2="23.011967" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + id="linearGradient3976"> + <stop + style="stop-color:#3b1941;stop-opacity:1;" + offset="0" + id="stop3978" /> + <stop + style="stop-color:#3b1941;stop-opacity:0;" + offset="1" + id="stop3980" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient3968"> + <stop + style="stop-color:#82508e;stop-opacity:1;" + offset="0" + id="stop3970" /> + <stop + style="stop-color:#82508e;stop-opacity:0;" + offset="1" + id="stop3972" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient3958"> + <stop + style="stop-color:#eeeeec;stop-opacity:1;" + offset="0" + id="stop3960" /> + <stop + style="stop-color:#eeeeec;stop-opacity:0;" + offset="1" + id="stop3962" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient2850"> + <stop + style="stop-color:#ce5c00;stop-opacity:1;" + offset="0" + id="stop2852" /> + <stop + style="stop-color:#ce5c00;stop-opacity:0;" + offset="1" + id="stop2854" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient6563"> + <stop + style="stop-color:white;stop-opacity:1;" + offset="0" + id="stop6565" /> + <stop + style="stop-color:white;stop-opacity:0;" + offset="1" + id="stop6567" /> + </linearGradient> + <linearGradient + id="linearGradient2110"> + <stop + style="stop-color:black;stop-opacity:0;" + offset="0" + id="stop2112" /> + <stop + id="stop2114" + offset="0.5" + style="stop-color:black;stop-opacity:1;" /> + <stop + style="stop-color:black;stop-opacity:0;" + offset="1" + id="stop2067" /> + </linearGradient> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient25546" + id="radialGradient2069" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,0.994693,0,4.16407e-2)" + cx="7.8836637" + cy="1.5104795" + fx="7.8836637" + fy="1.5104795" + r="8.4883642" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient25546" + id="radialGradient2071" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,0.994693,0,4.16407e-2)" + cx="7.8836741" + cy="0.14505707" + fx="7.8836741" + fy="0.14505707" + r="8.4883642" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient25546" + id="radialGradient2079" + cx="7.8836637" + cy="2.6242435" + fx="7.8836637" + fy="2.6242435" + r="8.4883642" + gradientTransform="matrix(1.131317,0,0,1.125313,-1.035262,-0.301139)" + gradientUnits="userSpaceOnUse" /> + <linearGradient + id="linearGradient2081"> + <stop + style="stop-color:#f4d9b1;stop-opacity:1.0000000;" + offset="0.0000000" + id="stop2104" /> + <stop + style="stop-color:#df9725;stop-opacity:1.0000000;" + offset="1.0000000" + id="stop2085" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient6506" + id="linearGradient2101" + x1="15.645709" + y1="39.743458" + x2="14.943421" + y2="50.079575" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient6537" + id="linearGradient2089" + x1="30.5" + y1="0.033532728" + x2="30.5" + y2="23.559282" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient6563" + id="linearGradient6569" + x1="-1.6841649" + y1="39.902092" + x2="5.5366187" + y2="44.272076" + gradientUnits="userSpaceOnUse" /> + <linearGradient + gradientUnits="userSpaceOnUse" + y2="23.011967" + x2="30.152058" + y1="-0.86487341" + x1="30.152058" + id="linearGradient2097" + xlink:href="#linearGradient5438" + inkscape:collect="always" /> + <linearGradient + gradientUnits="userSpaceOnUse" + y2="42.982571" + x2="5.7089725" + y1="38.950283" + x1="0.23931108" + id="linearGradient2095" + xlink:href="#linearGradient6817" + inkscape:collect="always" /> + <linearGradient + gradientUnits="userSpaceOnUse" + y2="50.726673" + x2="15.645709" + y1="40.434063" + x1="15.645709" + id="linearGradient2093" + xlink:href="#linearGradient6506" + inkscape:collect="always" /> + <linearGradient + id="linearGradient2087"> + <stop + id="stop2089" + offset="0.0000000" + style="stop-color:#f4d9b1;stop-opacity:1.0000000;" /> + <stop + id="stop2091" + offset="1.0000000" + style="stop-color:#df9725;stop-opacity:1.0000000;" /> + </linearGradient> + <radialGradient + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.131317,0,0,1.125313,-1.035262,-0.301139)" + r="8.4883642" + fy="2.6242435" + fx="7.8836637" + cy="2.6242435" + cx="7.8836637" + id="radialGradient2085" + xlink:href="#linearGradient25546" + inkscape:collect="always" /> + <radialGradient + r="8.4883642" + fy="0.14505707" + fx="7.8836741" + cy="0.14505707" + cx="7.8836741" + gradientTransform="matrix(1,0,0,0.994693,0,4.16407e-2)" + gradientUnits="userSpaceOnUse" + id="radialGradient2077" + xlink:href="#linearGradient25546" + inkscape:collect="always" /> + <radialGradient + r="8.4883642" + fy="1.5104795" + fx="7.8836637" + cy="1.5104795" + cx="7.8836637" + gradientTransform="matrix(1,0,0,0.994693,0,4.16407e-2)" + gradientUnits="userSpaceOnUse" + id="radialGradient2075" + xlink:href="#linearGradient25546" + inkscape:collect="always" /> + <linearGradient + id="linearGradient2067"> + <stop + id="stop2069" + offset="0" + style="stop-color:black;stop-opacity:0;" /> + <stop + style="stop-color:black;stop-opacity:1;" + offset="0.5" + id="stop2071" /> + <stop + id="stop2073" + offset="1" + style="stop-color:black;stop-opacity:0;" /> + </linearGradient> + <linearGradient + id="linearGradient3108" + inkscape:collect="always"> + <stop + id="stop3110" + offset="0" + style="stop-color:#eeeeec;stop-opacity:1;" /> + <stop + id="stop3112" + offset="1" + style="stop-color:#eeeeec;stop-opacity:0;" /> + </linearGradient> + <linearGradient + id="linearGradient3116" + inkscape:collect="always"> + <stop + id="stop3118" + offset="0" + style="stop-color:#82508e;stop-opacity:1;" /> + <stop + id="stop3120" + offset="1" + style="stop-color:#82508e;stop-opacity:0;" /> + </linearGradient> + <linearGradient + id="linearGradient3124" + inkscape:collect="always"> + <stop + id="stop3126" + offset="0" + style="stop-color:#3b1941;stop-opacity:1;" /> + <stop + id="stop3128" + offset="1" + style="stop-color:#3b1941;stop-opacity:0;" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2850" + id="linearGradient2187" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.769231,0,0,0.714287,47.76924,-9.285729)" + x1="21.785719" + y1="28.142857" + x2="17.785713" + y2="30.07143" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2850" + id="linearGradient2195" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.769231,0,0,0.714287,13.76923,-8.28573)" + x1="21.785719" + y1="28.142857" + x2="17.785713" + y2="30.07143" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3958" + id="radialGradient2209" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.116159,0,0,1.076653,14.60502,-22.28695)" + cx="9.0640488" + cy="21.511742" + fx="9.0640488" + fy="21.511742" + r="16.663956" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient6506" + id="linearGradient2211" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.660903,0,0,0.627207,18.73149,-12.3201)" + x1="15.645709" + y1="39.743458" + x2="15.645709" + y2="53.502155" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3968" + id="linearGradient2214" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.67692,0,0,0.646801,18.46433,-12.90841)" + x1="16.13257" + y1="40.781811" + x2="16.13257" + y2="48.068741" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3976" + id="linearGradient2216" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.67692,0,0,0.646801,18.46433,-12.90841)" + x1="12.095973" + y1="40.907658" + x2="12.095973" + y2="46.463146" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient6537" + id="linearGradient2219" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.668893,0,0,0.668627,18.08624,-12.19246)" + x1="30.5" + y1="0.033532728" + x2="30.5" + y2="23.559282" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3108" + id="linearGradient2229" + gradientUnits="userSpaceOnUse" + x1="10.18327" + y1="16.618088" + x2="27.598003" + y2="36.64465" + gradientTransform="matrix(0.660903,0,0,0.627207,49.74106,-7.361383)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient6506" + id="linearGradient2231" + gradientUnits="userSpaceOnUse" + x1="15.645709" + y1="39.743458" + x2="15.645709" + y2="53.502155" + gradientTransform="matrix(0.660903,0,0,0.627207,49.74106,-7.361383)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3116" + id="linearGradient2234" + gradientUnits="userSpaceOnUse" + x1="15.722902" + y1="39.585075" + x2="15.722902" + y2="45.76453" + gradientTransform="matrix(0.67692,0,0,0.646801,49.4739,-7.949693)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3124" + id="linearGradient2236" + gradientUnits="userSpaceOnUse" + x1="13.150809" + y1="39.39394" + x2="13.150809" + y2="45.551888" + gradientTransform="matrix(0.67692,0,0,0.646801,49.4739,-7.949693)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3128" + id="linearGradient3134" + x1="8.0725698" + y1="17.765934" + x2="24.284664" + y2="37.578945" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3141" + id="linearGradient3147" + x1="12.353984" + y1="38.611191" + x2="12.353984" + y2="45.595356" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3149" + id="linearGradient3155" + x1="10.166225" + y1="38.766953" + x2="10.166225" + y2="45.595673" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3157" + id="linearGradient3163" + x1="11.982447" + y1="39.088425" + x2="11.982447" + y2="45.778931" + gradientUnits="userSpaceOnUse" /> + </defs> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="30.009658" + inkscape:cx="15.476031" + inkscape:cy="9.174961" + inkscape:current-layer="layer1" + showgrid="true" + inkscape:grid-bbox="true" + inkscape:document-units="px" + inkscape:window-width="1434" + inkscape:window-height="840" + inkscape:window-x="0" + inkscape:window-y="0" + showguides="true" + inkscape:guide-bbox="true" + inkscape:grid-points="false" + width="16px" + height="16px" + inkscape:object-bbox="true" /> + <metadata + id="metadata4350"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + </cc:Work> + </rdf:RDF> + </metadata> + <g + id="layer1" + inkscape:label="Layer 1" + inkscape:groupmode="layer"> + <path + style="opacity:1;fill:#75507b;fill-opacity:1" + d="M 36.0625,8 C 33.978257,8 33.334928,10.523086 34.78125,12.9375 C 35.250389,13.720651 36.674297,15.15311 36.86722,15.15311 L 36.878267,14.508325 C 36.288194,13.580567 35.517363,12.502064 35.686987,12.281543 C 37.835781,12.281543 38,11.491782 38,10.027674 C 38,8.7542399 37.228501,8 36.0625,8 z " + id="path6521" + transform="matrix(1.148904,0,0,0.920169,-34.28919,-3.241212)" + sodipodi:nodetypes="csccccc" /> + <path + style="opacity:1;fill:url(#linearGradient3147);fill-opacity:1.0;stroke:url(#linearGradient3155);stroke-width:2.30209565;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="M 15,13 C 8.3759979,13 3,18.600001 3,25.5 C 3,31.153143 2.9750563,38.402618 2.9750563,45.572826 C 4.1625449,45.572826 27.946366,45.600605 30.637365,45.600605 C 32.751492,45.600605 32.586331,43.541005 32.586331,43.541005 C 32.586331,40.875594 27.597902,38.639057 25.813453,36.682531 C 23.985035,34.68151 26,30.884078 26,30.884078 C 26.641306,29.354278 28.01889,26.891006 28.01889,25.115922 C 28.01889,18.215923 21.624002,13 15,13 z " + id="path5176" + sodipodi:nodetypes="ccccszcsc" + transform="matrix(0.43939,0,0,0.42944,-0.819445,-4.082726)" /> + <rect + style="opacity:1;fill:white;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="rect6331" + width="2.6154532" + height="1.1545694" + x="5.513658" + y="6.4806929" + rx="0.48532724" + ry="0.32910046" + transform="matrix(1.147027,0,0,0.866113,-0.324314,2.386999)" /> + <path + transform="matrix(0.399589,0,0,0.393554,-5.973603e-2,-3.038964)" + style="opacity:0.5;fill:url(#linearGradient3134);fill-opacity:1.0;stroke:url(#linearGradient3163);stroke-width:2.5216887;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="M 15,14.0625 C 8.9877035,14.0625 4.0789961,19.13808 4.0625,25.46875 C 4.0624722,25.479427 4.0617033,25.489349 4.0625,25.5 C 4.0625,32.787473 3.9033639,38.26012 3.9033639,44.499878 C 5.8399452,44.499878 24.86993,44.470084 30.695903,44.470084 C 29.746978,42.549359 26.273076,40.711023 23.972608,38.78763 C 23.362603,37.973536 23.023697,35.459892 22.969233,34.418473 C 23.611113,31.359155 25.129532,28.401757 26.527172,25.440129 C 26.527172,19.094533 21.022436,14.0625 15,14.0625 z " + id="path5241" + sodipodi:nodetypes="csccccccc" /> + <path + style="opacity:1;fill:#a46bb0;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1" + d="M 6,7.2175674 C 6,8.8735678 4.5070272,10 3.4999996,10 C 2.1199999,10 1,8.6559998 1,6.9999995 C 1,5.5609093 1.7677476,4 3.1477475,4 C 4.5277481,4 6,5.9092686 6,7.2175674 z " + id="path3137" + sodipodi:nodetypes="csssc" /> + <path + transform="matrix(0.626764,0,0,0.689441,-3.309086,-9.833164)" + style="opacity:1;fill:white;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1" + d="M 13.257119,24.626053 C 13.257119,26.227351 11.8279,27.316574 10.863875,27.316574 C 9.5428049,27.316574 8.4706318,26.01697 8.4706318,24.415672 C 8.4706318,23.024119 9.2055946,21.514771 10.526665,21.514771 C 11.847736,21.514771 13.257119,23.360971 13.257119,24.626053 z " + id="path5157" + sodipodi:nodetypes="csssc" /> + <path + sodipodi:type="arc" + style="opacity:1;fill:#5c3566;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="path5162" + sodipodi:cx="10.169642" + sodipodi:cy="24.3125" + sodipodi:rx="1.2410715" + sodipodi:ry="1.2946428" + d="M 11.410714 24.3125 A 1.2410715 1.2946428 0 1 1 8.928571,24.3125 A 1.2410715 1.2946428 0 1 1 11.410714 24.3125 z" + transform="matrix(0.805757,0,0,1.158623,-4.194263,-20.66902)" /> + <path + style="opacity:1;fill:#a46bb0;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1" + d="M 11.387086,4.6790601 C 10.509745,3.6558267 9.0824486,3.9284339 8.5222543,4.5817815 C 7.7545814,5.4771092 7.8435868,7.0342022 8.7209273,8.0574357 C 9.4833498,8.9466415 10.737398,9.413013 11.505071,8.5176851 C 12.272744,7.6223568 12.080215,5.4874505 11.387086,4.6790601 z " + id="path3139" + sodipodi:nodetypes="csssc" /> + <path + transform="matrix(0.29055,-0.412361,-0.273947,-0.388798,13.58792,20.45445)" + style="opacity:1;fill:white;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1" + d="M 13.257119,24.626053 C 13.257119,26.227351 11.8279,27.316574 10.863875,27.316574 C 9.5428049,27.316574 8.4706318,26.01697 8.4706318,24.415672 C 8.4706318,23.024119 9.2055946,21.514771 10.526665,21.514771 C 11.847736,21.514771 13.257119,23.360971 13.257119,24.626053 z " + id="path5169" + sodipodi:nodetypes="csssc" /> + <path + sodipodi:type="arc" + style="opacity:1;fill:#5c3566;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="path5171" + sodipodi:cx="10.169642" + sodipodi:cy="24.3125" + sodipodi:rx="1.2410715" + sodipodi:ry="1.2946428" + d="M 11.410714 24.3125 A 1.2410715 1.2946428 0 1 1 8.928571,24.3125 A 1.2410715 1.2946428 0 1 1 11.410714 24.3125 z" + transform="matrix(0.805754,0,0,1.158626,0.805772,-20.66909)" /> + <path + style="fill:#3b1941;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1" + d="M -3.174544e-16,1.7837407 C 0.49897694,0.43045085 3.4176637,1.3941391 4.4321866,1.7478251 L 2.7448964,2 L -3.174544e-16,1.7837407 z " + id="path5192" + sodipodi:nodetypes="cccc" /> + <path + style="fill:#fcaf3e;fill-opacity:1;stroke:none;stroke-width:1.0283047;stroke-miterlimit:4;stroke-opacity:1" + d="M 4,8.9694498 C 6.5363255,9.6796143 7.1434322,8 7.6676187,8 C 8.1845929,8 8.1150542,9.7216455 10.752536,9.1373864 C 10.257681,9.8617678 8.7366795,11 8.0954601,11 C 7.4470215,11 4.8041406,10.039472 4,8.9694498 z " + id="path3987" + sodipodi:nodetypes="czczc" /> + <path + style="fill:#3b1941;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1" + d="M 2.5678134,0.78213791 C 3.0667903,-0.57115198 7,-0.11652293 7,1.7459005 L 5.3127098,0.99839721 L 2.5678134,0.78213791 z " + id="path1991" + sodipodi:nodetypes="cccc" /> + </g> +</svg>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pidgin/pixmaps/icons/hicolor/22x22/apps/scalable/pidgin.svg Mon Nov 12 16:53:54 2007 +0000 @@ -0,0 +1,591 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://web.resource.org/cc/" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="22" + height="22" + id="svg4345" + sodipodi:version="0.32" + inkscape:version="0.44.1" + sodipodi:docbase="/home/hbons/Desktop/Pidgin/2.1.0/icons/24/scalable" + sodipodi:docname="pidgin.svg" + inkscape:export-filename="/home/hbons/Desktop/pidgin24.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90" + version="1.0"> + <defs + id="defs4347"> + <linearGradient + inkscape:collect="always" + id="linearGradient3124"> + <stop + style="stop-color:#3b1941;stop-opacity:1;" + offset="0" + id="stop3126" /> + <stop + style="stop-color:#3b1941;stop-opacity:0;" + offset="1" + id="stop3128" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient3116"> + <stop + style="stop-color:#82508e;stop-opacity:1;" + offset="0" + id="stop3118" /> + <stop + style="stop-color:#82508e;stop-opacity:0;" + offset="1" + id="stop3120" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient3108"> + <stop + style="stop-color:#eeeeec;stop-opacity:1;" + offset="0" + id="stop3110" /> + <stop + style="stop-color:#eeeeec;stop-opacity:0;" + offset="1" + id="stop3112" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient5438"> + <stop + style="stop-color:white;stop-opacity:1;" + offset="0" + id="stop5440" /> + <stop + style="stop-color:white;stop-opacity:0;" + offset="1" + id="stop5442" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient6817"> + <stop + style="stop-color:white;stop-opacity:1;" + offset="0" + id="stop6819" /> + <stop + style="stop-color:white;stop-opacity:0;" + offset="1" + id="stop6821" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient6537"> + <stop + style="stop-color:white;stop-opacity:1;" + offset="0" + id="stop6539" /> + <stop + style="stop-color:white;stop-opacity:0;" + offset="1" + id="stop6541" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient6506"> + <stop + style="stop-color:#eeeeec;stop-opacity:1;" + offset="0" + id="stop6508" /> + <stop + style="stop-color:#eeeeec;stop-opacity:0;" + offset="1" + id="stop6510" /> + </linearGradient> + <linearGradient + id="linearGradient2804"> + <stop + style="stop-color:black;stop-opacity:0;" + offset="0" + id="stop2806" /> + <stop + id="stop2812" + offset="0.5" + style="stop-color:black;stop-opacity:1;" /> + <stop + style="stop-color:black;stop-opacity:0;" + offset="1" + id="stop2808" /> + </linearGradient> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient25546" + id="radialGradient25572" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,0.994693,0,4.16407e-2)" + cx="7.8836637" + cy="1.5104795" + fx="7.8836637" + fy="1.5104795" + r="8.4883642" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient25546" + id="radialGradient25568" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,0.994693,0,4.16407e-2)" + cx="7.8836741" + cy="0.14505707" + fx="7.8836741" + fy="0.14505707" + r="8.4883642" /> + <linearGradient + inkscape:collect="always" + id="linearGradient25546"> + <stop + style="stop-color:white;stop-opacity:1;" + offset="0" + id="stop25548" /> + <stop + style="stop-color:white;stop-opacity:0;" + offset="1" + id="stop25550" /> + </linearGradient> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient25546" + id="radialGradient25554" + cx="7.8836637" + cy="2.6242435" + fx="7.8836637" + fy="2.6242435" + r="8.4883642" + gradientTransform="matrix(1.131317,0,0,1.125313,-1.035262,-0.301139)" + gradientUnits="userSpaceOnUse" /> + <linearGradient + id="linearGradient3800"> + <stop + style="stop-color:#f4d9b1;stop-opacity:1.0000000;" + offset="0.0000000" + id="stop3802" /> + <stop + style="stop-color:#df9725;stop-opacity:1.0000000;" + offset="1.0000000" + id="stop3804" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient6506" + id="linearGradient6512" + x1="15.645709" + y1="39.029884" + x2="15.645709" + y2="43.206608" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient6817" + id="linearGradient6823" + x1="0.23931108" + y1="38.950283" + x2="5.7089725" + y2="42.982571" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient5438" + id="linearGradient5444" + x1="30.152058" + y1="-0.86487341" + x2="30.152058" + y2="23.011967" + gradientUnits="userSpaceOnUse" /> + <linearGradient + gradientUnits="userSpaceOnUse" + y2="44.272076" + x2="5.5366187" + y1="39.902092" + x1="-1.6841649" + id="linearGradient6569" + xlink:href="#linearGradient6563" + inkscape:collect="always" /> + <linearGradient + gradientUnits="userSpaceOnUse" + y2="23.559282" + x2="30.5" + y1="0.033532728" + x1="30.5" + id="linearGradient2089" + xlink:href="#linearGradient6537" + inkscape:collect="always" /> + <linearGradient + gradientUnits="userSpaceOnUse" + y2="50.079575" + x2="14.943421" + y1="39.743458" + x1="15.645709" + id="linearGradient2087" + xlink:href="#linearGradient6506" + inkscape:collect="always" /> + <linearGradient + id="linearGradient2081"> + <stop + id="stop2083" + offset="0.0000000" + style="stop-color:#f4d9b1;stop-opacity:1.0000000;" /> + <stop + id="stop2085" + offset="1.0000000" + style="stop-color:#df9725;stop-opacity:1.0000000;" /> + </linearGradient> + <radialGradient + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.131317,0,0,1.125313,-1.035262,-0.301139)" + r="8.4883642" + fy="2.6242435" + fx="7.8836637" + cy="2.6242435" + cx="7.8836637" + id="radialGradient2079" + xlink:href="#linearGradient25546" + inkscape:collect="always" /> + <radialGradient + r="8.4883642" + fy="0.14505707" + fx="7.8836741" + cy="0.14505707" + cx="7.8836741" + gradientTransform="matrix(1,0,0,0.994693,0,4.16407e-2)" + gradientUnits="userSpaceOnUse" + id="radialGradient2071" + xlink:href="#linearGradient25546" + inkscape:collect="always" /> + <radialGradient + r="8.4883642" + fy="1.5104795" + fx="7.8836637" + cy="1.5104795" + cx="7.8836637" + gradientTransform="matrix(1,0,0,0.994693,0,4.16407e-2)" + gradientUnits="userSpaceOnUse" + id="radialGradient2069" + xlink:href="#linearGradient25546" + inkscape:collect="always" /> + <linearGradient + id="linearGradient2061"> + <stop + id="stop2063" + offset="0" + style="stop-color:black;stop-opacity:0;" /> + <stop + style="stop-color:black;stop-opacity:1;" + offset="0.5" + id="stop2065" /> + <stop + id="stop2067" + offset="1" + style="stop-color:black;stop-opacity:0;" /> + </linearGradient> + <linearGradient + id="linearGradient6563" + inkscape:collect="always"> + <stop + id="stop6565" + offset="0" + style="stop-color:white;stop-opacity:1;" /> + <stop + id="stop6567" + offset="1" + style="stop-color:white;stop-opacity:0;" /> + </linearGradient> + <linearGradient + id="linearGradient2850" + inkscape:collect="always"> + <stop + id="stop2852" + offset="0" + style="stop-color:#ce5c00;stop-opacity:1;" /> + <stop + id="stop2854" + offset="1" + style="stop-color:#ce5c00;stop-opacity:0;" /> + </linearGradient> + <linearGradient + id="linearGradient3958" + inkscape:collect="always"> + <stop + id="stop3960" + offset="0" + style="stop-color:#eeeeec;stop-opacity:1;" /> + <stop + id="stop3962" + offset="1" + style="stop-color:#eeeeec;stop-opacity:0;" /> + </linearGradient> + <linearGradient + id="linearGradient3968" + inkscape:collect="always"> + <stop + id="stop3970" + offset="0" + style="stop-color:#82508e;stop-opacity:1;" /> + <stop + id="stop3972" + offset="1" + style="stop-color:#82508e;stop-opacity:0;" /> + </linearGradient> + <linearGradient + id="linearGradient3976" + inkscape:collect="always"> + <stop + id="stop3978" + offset="0" + style="stop-color:#3b1941;stop-opacity:1;" /> + <stop + id="stop3980" + offset="1" + style="stop-color:#3b1941;stop-opacity:0;" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2850" + id="linearGradient2149" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.769231,0,0,0.714287,-34.23081,-12.28573)" + x1="21.785719" + y1="28.142857" + x2="17.785713" + y2="30.07143" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3958" + id="radialGradient2191" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.116159,0,0,1.076653,-36.39499,-20.28695)" + cx="9.0640488" + cy="21.511742" + fx="9.0640488" + fy="21.511742" + r="16.663956" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient6506" + id="linearGradient2193" + gradientUnits="userSpaceOnUse" + x1="15.645709" + y1="39.743458" + x2="15.645709" + y2="53.502155" + gradientTransform="matrix(0.660903,0,0,0.627207,-32.26852,-10.3201)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3968" + id="linearGradient2196" + gradientUnits="userSpaceOnUse" + x1="16.13257" + y1="40.781811" + x2="16.13257" + y2="48.068741" + gradientTransform="matrix(0.67692,0,0,0.646801,-32.53568,-10.90841)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3976" + id="linearGradient2198" + gradientUnits="userSpaceOnUse" + x1="12.095973" + y1="40.907658" + x2="12.095973" + y2="46.463146" + gradientTransform="matrix(0.67692,0,0,0.646801,-32.53568,-10.90841)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient6537" + id="linearGradient2201" + gradientUnits="userSpaceOnUse" + x1="30.5" + y1="0.033532728" + x2="30.5" + y2="23.559282" + gradientTransform="matrix(0.668893,0,0,0.668627,-32.91377,-10.19246)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3108" + id="linearGradient3114" + x1="10.18327" + y1="16.618088" + x2="27.598003" + y2="36.64465" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3116" + id="linearGradient3122" + x1="15.722902" + y1="38.768803" + x2="15.722902" + y2="43.249905" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3124" + id="linearGradient3130" + x1="13.150809" + y1="38.849556" + x2="13.150809" + y2="43.105652" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2850" + id="linearGradient3146" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.769231,0,0,0.714287,-3.230767,-7.285729)" + x1="21.785719" + y1="28.142857" + x2="17.785713" + y2="30.07143" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient5438" + id="linearGradient2848" + gradientUnits="userSpaceOnUse" + x1="30.152058" + y1="-0.86487341" + x2="30.152058" + y2="23.011967" /> + </defs> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="22.743067" + inkscape:cx="23.715241" + inkscape:cy="10.08258" + inkscape:current-layer="layer1" + showgrid="true" + inkscape:grid-bbox="true" + inkscape:document-units="px" + inkscape:window-width="1434" + inkscape:window-height="840" + inkscape:window-x="0" + inkscape:window-y="0" + showguides="true" + inkscape:guide-bbox="true" + inkscape:grid-points="false" + width="22px" + height="22px" + inkscape:object-bbox="true" /> + <metadata + id="metadata4350"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + </cc:Work> + </rdf:RDF> + </metadata> + <g + id="layer1" + inkscape:label="Layer 1" + inkscape:groupmode="layer"> + <path + style="opacity:1;fill:#75507b;fill-opacity:1" + d="M 36.0625,8 C 33.978257,8 33.334928,10.523086 34.78125,12.9375 C 35.250389,13.720651 36.674297,15.15311 36.86722,15.15311 L 36.878267,14.508325 C 36.288194,13.580567 35.517363,12.502064 35.686987,12.281543 C 37.835781,12.281543 38,11.491782 38,10.027674 C 38,8.7542399 37.228501,8 36.0625,8 z " + id="path6521" + transform="matrix(1.747787,0,0,1.397993,-52.41719,-5.183942)" + sodipodi:nodetypes="csccccc" /> + <path + style="opacity:1;fill:url(#linearGradient3122);fill-opacity:1;stroke:url(#linearGradient3130);stroke-width:1.51128328;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="M 15,13 C 8.3759979,13 3,18.600001 3,25.5 C 3,31.153143 2.9750563,38.402618 2.9750563,45.572826 C 4.1625449,45.572826 27.946366,45.600605 30.637365,45.600605 C 32.751492,45.600605 32.586331,43.541005 32.586331,43.541005 C 32.586331,40.875594 27.597902,38.639057 25.813453,36.682531 C 23.985035,34.68151 26,30.5 26,30.5 C 26.641306,28.9702 27,27.275084 27,25.5 C 27,18.600001 21.624002,13 15,13 z " + id="path5176" + sodipodi:nodetypes="ccccszcsc" + transform="matrix(0.67692,0,0,0.646801,-1.52611,-5.949693)" /> + <path + transform="matrix(0.660903,0,0,0.627207,-1.258953,-5.361383)" + style="opacity:0.5;fill:url(#linearGradient3114);fill-opacity:1;stroke:url(#linearGradient6512);stroke-width:1.55319393;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="M 15,14.0625 C 8.9877035,14.0625 4.0789961,19.13808 4.0625,25.46875 C 4.0624722,25.479427 4.0617033,25.489349 4.0625,25.5 C 4.0625,32.787473 3.9033639,38.26012 3.9033639,44.499878 C 5.8399452,44.499878 22.452275,44.470084 28.278248,44.470084 C 29.445455,44.470084 31.431654,44.974157 31.431654,43.509594 C 31.431654,43.287851 31.231903,42.870917 30.681654,42.353344 C 30.131405,41.835771 29.308414,41.280003 28.400404,40.728344 C 26.665321,39.858723 25.411769,39.090553 24.621247,37.290844 C 24.011242,36.47675 23.731303,35.519763 23.676839,34.478344 C 23.622375,33.436925 24.107721,32.319635 24.224561,31.259594 C 24.458241,29.139511 24.96875,30.28125 24.96875,30.28125 C 24.98374,30.216952 25.004663,30.154183 25.03125,30.09375 C 25.618731,28.692346 25.9375,27.131297 25.9375,25.5 C 25.9375,19.154404 21.022436,14.0625 15,14.0625 z " + id="path5241" + sodipodi:nodetypes="cscccssccsscssc" /> + <path + style="fill:#a46bb0;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1" + d="M 3.072604,7.0864988 C 4.607952,5.4493238 7.105721,5.8854918 8.086061,6.9308478 C 9.4294869,8.3633698 9.273726,10.85472 7.738379,12.491894 C 6.404137,13.914624 4.209552,14.660821 2.866124,13.228299 C 1.522696,11.795776 1.859625,8.3799248 3.072604,7.0864988 z " + id="path3138" + sodipodi:nodetypes="csssc" /> + <path + transform="matrix(1.010846,0,0,1.029732,-5.552971,-15.17001)" + style="opacity:1;fill:white;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1" + d="M 13.257119,24.626053 C 13.257119,26.227351 11.8279,27.316574 10.863875,27.316574 C 9.5428049,27.316574 8.4706318,26.01697 8.4706318,24.415672 C 8.4706318,23.024119 9.2055946,21.514771 10.526665,21.514771 C 11.847736,21.514771 13.257119,23.360971 13.257119,24.626053 z " + id="path5157" + sodipodi:nodetypes="csssc" /> + <path + sodipodi:type="arc" + style="opacity:1;fill:#5c3566;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="path5162" + sodipodi:cx="10.169642" + sodipodi:cy="24.3125" + sodipodi:rx="1.2410715" + sodipodi:ry="1.2946428" + d="M 11.410714 24.3125 A 1.2410715 1.2946428 0 1 1 8.928571,24.3125 A 1.2410715 1.2946428 0 1 1 11.410714 24.3125 z" + transform="matrix(1.208633,0,0,1.158621,-6.791366,-17.66897)" /> + <path + transform="matrix(0.670792,0,0,0.486348,-3.805943,-3.90166)" + style="fill:#3b1941;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1" + d="M 11.651119,11.193815 C 13.577759,8.2509126 16.249277,11.481501 17.614226,12.804399 L 14.761306,13.747613 L 11.651119,11.193815 z " + id="path5192" + sodipodi:nodetypes="cccc" /> + <path + transform="matrix(0.851014,0,0,0.554879,-3.938174,-5.194599)" + style="fill:#3b1941;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1" + d="M 11.689238,9.8218679 C 13.591296,8.0161941 17.174576,11.994261 17.519594,13.650486 L 14.543472,12.891665 L 11.689238,9.8218679 z " + id="rect5189" + sodipodi:nodetypes="cccc" /> + <path + style="fill:#975fa3;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1" + d="M 16.371022,7.8148748 C 15.47069,6.586993 14.005993,6.9141191 13.43112,7.6981356 C 12.643332,8.7725276 12.734671,10.64104 13.635002,11.868921 C 14.417404,12.93597 15.704314,13.495617 16.492103,12.421225 C 17.279892,11.346833 17.082315,8.7849447 16.371022,7.8148748 z " + id="path3132" + sodipodi:nodetypes="csssc" /> + <path + style="fill:white;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1" + d="M 16.502957,8.5432477 C 15.827476,7.7246593 14.728576,7.9427464 14.297274,8.4654263 C 13.706229,9.1816906 13.774757,10.427368 14.450238,11.245957 C 15.037241,11.957323 16.002754,12.33042 16.593798,11.614156 C 17.184843,10.897891 17.03661,9.1899614 16.502957,8.5432477 z " + id="path3134" + sodipodi:nodetypes="csssc" /> + <path + sodipodi:type="arc" + style="fill:#5c3566;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="path3136" + sodipodi:cx="10.169642" + sodipodi:cy="24.3125" + sodipodi:rx="1.2410715" + sodipodi:ry="1.2946428" + d="M 11.410714 24.3125 A 1.2410715 1.2946428 0 1 1 8.928571,24.3125 A 1.2410715 1.2946428 0 1 1 11.410714 24.3125 z" + transform="matrix(1.153827,0,0,1.158621,3.593156,-17.66895)" /> + <rect + style="fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="rect3140" + width="4.4400907" + height="1" + x="8.5358553" + y="13" + rx="0.69182354" + ry="0.5" /> + <path + style="fill:#fcaf3e;fill-opacity:1;stroke:none;stroke-width:1.0283047;stroke-miterlimit:4;stroke-opacity:1" + d="M 6,13.893438 C 11.088512,17.243015 10.655188,12 11.431469,12 C 12.197069,12 11.699301,17.201991 16,13.895644 C 15.267157,15.102946 13.014668,17 12.06507,17 C 11.104781,17 7.190872,15.676807 6,13.893438 z " + id="path3142" + sodipodi:nodetypes="czczc" /> + <path + style="fill:url(#linearGradient3146);fill-opacity:1;stroke:none;stroke-width:1.0283047;stroke-miterlimit:4;stroke-opacity:1" + d="M 6,13.893439 C 10.740404,18.171305 10.655188,12 11.431469,12 C 12.197069,12 11.641283,17.027939 16,13.895646 C 15.267157,15.102947 13.014668,17 12.06507,17 C 11.104781,17 7.190873,15.676809 6,13.893439 z " + id="path3144" + sodipodi:nodetypes="czczc" /> + </g> +</svg>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pidgin/pixmaps/icons/hicolor/24x24/apps/scalable/pidgin.svg Mon Nov 12 16:53:54 2007 +0000 @@ -0,0 +1,589 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://web.resource.org/cc/" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="24" + height="24" + id="svg4345" + sodipodi:version="0.32" + inkscape:version="0.44.1" + sodipodi:docbase="/home/hbons/Desktop/Pidgin/2.1.0/icons/24/scalable" + sodipodi:docname="pidgin.svg" + inkscape:export-filename="/home/hbons/Desktop/pidgin24.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90" + version="1.0"> + <defs + id="defs4347"> + <linearGradient + inkscape:collect="always" + id="linearGradient3124"> + <stop + style="stop-color:#3b1941;stop-opacity:1;" + offset="0" + id="stop3126" /> + <stop + style="stop-color:#3b1941;stop-opacity:0;" + offset="1" + id="stop3128" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient3116"> + <stop + style="stop-color:#82508e;stop-opacity:1;" + offset="0" + id="stop3118" /> + <stop + style="stop-color:#82508e;stop-opacity:0;" + offset="1" + id="stop3120" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient3108"> + <stop + style="stop-color:#eeeeec;stop-opacity:1;" + offset="0" + id="stop3110" /> + <stop + style="stop-color:#eeeeec;stop-opacity:0;" + offset="1" + id="stop3112" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient5438"> + <stop + style="stop-color:white;stop-opacity:1;" + offset="0" + id="stop5440" /> + <stop + style="stop-color:white;stop-opacity:0;" + offset="1" + id="stop5442" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient6817"> + <stop + style="stop-color:white;stop-opacity:1;" + offset="0" + id="stop6819" /> + <stop + style="stop-color:white;stop-opacity:0;" + offset="1" + id="stop6821" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient6537"> + <stop + style="stop-color:white;stop-opacity:1;" + offset="0" + id="stop6539" /> + <stop + style="stop-color:white;stop-opacity:0;" + offset="1" + id="stop6541" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient6506"> + <stop + style="stop-color:#eeeeec;stop-opacity:1;" + offset="0" + id="stop6508" /> + <stop + style="stop-color:#eeeeec;stop-opacity:0;" + offset="1" + id="stop6510" /> + </linearGradient> + <linearGradient + id="linearGradient2804"> + <stop + style="stop-color:black;stop-opacity:0;" + offset="0" + id="stop2806" /> + <stop + id="stop2812" + offset="0.5" + style="stop-color:black;stop-opacity:1;" /> + <stop + style="stop-color:black;stop-opacity:0;" + offset="1" + id="stop2808" /> + </linearGradient> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient25546" + id="radialGradient25572" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,0.994693,0,4.16407e-2)" + cx="7.8836637" + cy="1.5104795" + fx="7.8836637" + fy="1.5104795" + r="8.4883642" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient25546" + id="radialGradient25568" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,0.994693,0,4.16407e-2)" + cx="7.8836741" + cy="0.14505707" + fx="7.8836741" + fy="0.14505707" + r="8.4883642" /> + <linearGradient + inkscape:collect="always" + id="linearGradient25546"> + <stop + style="stop-color:white;stop-opacity:1;" + offset="0" + id="stop25548" /> + <stop + style="stop-color:white;stop-opacity:0;" + offset="1" + id="stop25550" /> + </linearGradient> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient25546" + id="radialGradient25554" + cx="7.8836637" + cy="2.6242435" + fx="7.8836637" + fy="2.6242435" + r="8.4883642" + gradientTransform="matrix(1.131317,0,0,1.125313,-1.035262,-0.301139)" + gradientUnits="userSpaceOnUse" /> + <linearGradient + id="linearGradient3800"> + <stop + style="stop-color:#f4d9b1;stop-opacity:1.0000000;" + offset="0.0000000" + id="stop3802" /> + <stop + style="stop-color:#df9725;stop-opacity:1.0000000;" + offset="1.0000000" + id="stop3804" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient6506" + id="linearGradient6512" + x1="15.645709" + y1="39.029884" + x2="15.645709" + y2="43.206608" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.660903,0,0,0.627207,-0.293224,-4.361383)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient6817" + id="linearGradient6823" + x1="0.23931108" + y1="38.950283" + x2="5.7089725" + y2="42.982571" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient5438" + id="linearGradient5444" + x1="30.152058" + y1="-0.86487341" + x2="30.152058" + y2="23.011967" + gradientUnits="userSpaceOnUse" /> + <linearGradient + gradientUnits="userSpaceOnUse" + y2="44.272076" + x2="5.5366187" + y1="39.902092" + x1="-1.6841649" + id="linearGradient6569" + xlink:href="#linearGradient6563" + inkscape:collect="always" /> + <linearGradient + gradientUnits="userSpaceOnUse" + y2="23.559282" + x2="30.5" + y1="0.033532728" + x1="30.5" + id="linearGradient2089" + xlink:href="#linearGradient6537" + inkscape:collect="always" /> + <linearGradient + gradientUnits="userSpaceOnUse" + y2="50.079575" + x2="14.943421" + y1="39.743458" + x1="15.645709" + id="linearGradient2087" + xlink:href="#linearGradient6506" + inkscape:collect="always" /> + <linearGradient + id="linearGradient2081"> + <stop + id="stop2083" + offset="0.0000000" + style="stop-color:#f4d9b1;stop-opacity:1.0000000;" /> + <stop + id="stop2085" + offset="1.0000000" + style="stop-color:#df9725;stop-opacity:1.0000000;" /> + </linearGradient> + <radialGradient + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.131317,0,0,1.125313,-1.035262,-0.301139)" + r="8.4883642" + fy="2.6242435" + fx="7.8836637" + cy="2.6242435" + cx="7.8836637" + id="radialGradient2079" + xlink:href="#linearGradient25546" + inkscape:collect="always" /> + <radialGradient + r="8.4883642" + fy="0.14505707" + fx="7.8836741" + cy="0.14505707" + cx="7.8836741" + gradientTransform="matrix(1,0,0,0.994693,0,4.16407e-2)" + gradientUnits="userSpaceOnUse" + id="radialGradient2071" + xlink:href="#linearGradient25546" + inkscape:collect="always" /> + <radialGradient + r="8.4883642" + fy="1.5104795" + fx="7.8836637" + cy="1.5104795" + cx="7.8836637" + gradientTransform="matrix(1,0,0,0.994693,0,4.16407e-2)" + gradientUnits="userSpaceOnUse" + id="radialGradient2069" + xlink:href="#linearGradient25546" + inkscape:collect="always" /> + <linearGradient + id="linearGradient2061"> + <stop + id="stop2063" + offset="0" + style="stop-color:black;stop-opacity:0;" /> + <stop + style="stop-color:black;stop-opacity:1;" + offset="0.5" + id="stop2065" /> + <stop + id="stop2067" + offset="1" + style="stop-color:black;stop-opacity:0;" /> + </linearGradient> + <linearGradient + id="linearGradient6563" + inkscape:collect="always"> + <stop + id="stop6565" + offset="0" + style="stop-color:white;stop-opacity:1;" /> + <stop + id="stop6567" + offset="1" + style="stop-color:white;stop-opacity:0;" /> + </linearGradient> + <linearGradient + id="linearGradient2850" + inkscape:collect="always"> + <stop + id="stop2852" + offset="0" + style="stop-color:#ce5c00;stop-opacity:1;" /> + <stop + id="stop2854" + offset="1" + style="stop-color:#ce5c00;stop-opacity:0;" /> + </linearGradient> + <linearGradient + id="linearGradient3958" + inkscape:collect="always"> + <stop + id="stop3960" + offset="0" + style="stop-color:#eeeeec;stop-opacity:1;" /> + <stop + id="stop3962" + offset="1" + style="stop-color:#eeeeec;stop-opacity:0;" /> + </linearGradient> + <linearGradient + id="linearGradient3968" + inkscape:collect="always"> + <stop + id="stop3970" + offset="0" + style="stop-color:#82508e;stop-opacity:1;" /> + <stop + id="stop3972" + offset="1" + style="stop-color:#82508e;stop-opacity:0;" /> + </linearGradient> + <linearGradient + id="linearGradient3976" + inkscape:collect="always"> + <stop + id="stop3978" + offset="0" + style="stop-color:#3b1941;stop-opacity:1;" /> + <stop + id="stop3980" + offset="1" + style="stop-color:#3b1941;stop-opacity:0;" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2850" + id="linearGradient2149" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.769231,0,0,0.714287,-34.23081,-12.28573)" + x1="21.785719" + y1="28.142857" + x2="17.785713" + y2="30.07143" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3958" + id="radialGradient2191" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.116159,0,0,1.076653,-36.39499,-20.28695)" + cx="9.0640488" + cy="21.511742" + fx="9.0640488" + fy="21.511742" + r="16.663956" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient6506" + id="linearGradient2193" + gradientUnits="userSpaceOnUse" + x1="15.645709" + y1="39.743458" + x2="15.645709" + y2="53.502155" + gradientTransform="matrix(0.660903,0,0,0.627207,-32.26852,-10.3201)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3968" + id="linearGradient2196" + gradientUnits="userSpaceOnUse" + x1="16.13257" + y1="40.781811" + x2="16.13257" + y2="48.068741" + gradientTransform="matrix(0.67692,0,0,0.646801,-32.53568,-10.90841)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3976" + id="linearGradient2198" + gradientUnits="userSpaceOnUse" + x1="12.095973" + y1="40.907658" + x2="12.095973" + y2="46.463146" + gradientTransform="matrix(0.67692,0,0,0.646801,-32.53568,-10.90841)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient6537" + id="linearGradient2201" + gradientUnits="userSpaceOnUse" + x1="30.5" + y1="0.033532728" + x2="30.5" + y2="23.559282" + gradientTransform="matrix(0.668893,0,0,0.668627,-32.91377,-10.19246)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3108" + id="linearGradient3114" + x1="10.18327" + y1="16.618088" + x2="27.598003" + y2="36.64465" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.660903,0,0,0.627207,-0.293224,-4.361383)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3116" + id="linearGradient3122" + x1="15.722902" + y1="38.768803" + x2="15.722902" + y2="43.249905" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.67692,0,0,0.646801,-0.560381,-4.949693)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3124" + id="linearGradient3130" + x1="13.150809" + y1="38.849556" + x2="13.150809" + y2="43.105652" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.67692,0,0,0.646801,-0.560381,-4.949693)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2850" + id="linearGradient3146" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.769231,0,0,0.714287,-2.265038,-6.285729)" + x1="21.785719" + y1="28.142857" + x2="17.785713" + y2="30.07143" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient5438" + id="linearGradient2848" + gradientUnits="userSpaceOnUse" + x1="30.152058" + y1="-0.86487341" + x2="30.152058" + y2="23.011967" /> + </defs> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="32.163554" + inkscape:cx="16.820721" + inkscape:cy="19.317678" + inkscape:current-layer="layer1" + showgrid="true" + inkscape:grid-bbox="true" + inkscape:document-units="px" + inkscape:window-width="1440" + inkscape:window-height="846" + inkscape:window-x="0" + inkscape:window-y="0" + showguides="true" + inkscape:guide-bbox="true" + inkscape:grid-points="false" + width="24px" + height="24px" + inkscape:object-bbox="true" /> + <metadata + id="metadata4350"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + </cc:Work> + </rdf:RDF> + </metadata> + <g + id="layer1" + inkscape:label="Layer 1" + inkscape:groupmode="layer"> + <path + style="opacity:1;fill:#75507b;fill-opacity:1" + d="M 11.578108,7.0000021 C 7.9352949,7.0000021 6.8108928,10.527259 9.3387556,13.902593 C 10.158711,14.997432 12.647399,17 12.984587,17 L 13.003895,16.098595 C 11.972573,14.801596 10.625325,13.293856 10.921791,12.985569 C 14.677426,12.985569 14.964445,11.881489 14.964445,9.8346762 C 14.964445,8.0544242 13.616029,7.0000021 11.578108,7.0000021 z " + id="path6521" + sodipodi:nodetypes="csccccc" /> + <path + style="opacity:1;fill:url(#linearGradient3122);fill-opacity:1;stroke:url(#linearGradient3130);stroke-width:0.99999976;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="M 9.593419,3.4587201 C 5.1094995,3.4587201 1.470379,7.0808064 1.470379,11.543733 C 1.470379,15.200191 1.4534941,19.889159 1.4534941,24.526857 C 2.2573289,24.526857 18.357073,24.544824 20.178665,24.544824 C 21.609759,24.544824 21.497959,23.212673 21.497959,23.212673 C 21.497959,21.488682 18.121191,20.042088 16.913262,18.776605 C 15.675569,17.482342 17.039539,14.777738 17.039539,14.777738 C 17.473652,13.788261 17.716459,12.691859 17.716459,11.543733 C 17.716459,7.0808064 14.077339,3.4587201 9.593419,3.4587201 z " + id="path5176" + sodipodi:nodetypes="ccccszcsc" /> + <path + style="opacity:0.5;fill:url(#linearGradient3114);fill-opacity:1;stroke:url(#linearGradient6512);stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="M 9.620321,4.4587156 C 5.6467762,4.4587156 2.4025968,7.6421549 2.3916944,11.612795 C 2.3916761,11.619492 2.3911679,11.625715 2.3916944,11.632396 C 2.3916944,16.20315 2.2865209,19.635632 2.2865209,23.549252 C 3.5664133,23.549252 14.545552,23.530565 18.395955,23.530565 C 19.167366,23.530565 20.480051,23.846723 20.480051,22.928139 C 20.480051,22.78906 20.348035,22.527556 19.984374,22.202931 C 19.620712,21.878306 19.076795,21.529724 18.476689,21.18372 C 17.329967,20.638287 16.501491,20.156486 15.979032,19.027696 C 15.575878,18.51709 15.390866,17.916861 15.35487,17.263676 C 15.318875,16.610491 15.639642,15.909718 15.716861,15.244853 C 15.871301,13.915122 16.208698,14.631229 16.208698,14.631229 C 16.218605,14.590901 16.232433,14.551532 16.250005,14.513628 C 16.638273,13.634657 16.848948,12.655557 16.848948,11.632396 C 16.848948,7.6523934 13.600567,4.4587156 9.620321,4.4587156 z " + id="path5241" + sodipodi:nodetypes="cscccssccsscssc" /> + <path + style="fill:#a46bb0;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1" + d="M 4.038333,8.0864989 C 5.573681,6.4493239 8.07145,6.8854919 9.05179,7.9308479 C 10.395216,9.3633699 10.239455,11.85472 8.704108,13.491894 C 7.369866,14.914624 5.175281,15.660821 3.831853,14.228299 C 2.488425,12.795776 2.825354,9.3799249 4.038333,8.0864989 z " + id="path3138" + sodipodi:nodetypes="csssc" /> + <path + style="opacity:1;fill:white;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1" + d="M 8.8136637,11.188225 C 8.8136637,12.837133 7.3689434,13.95874 6.3944626,13.95874 C 5.0590642,13.95874 3.9752623,12.620497 3.9752623,10.971589 C 3.9752623,9.5386622 4.7181965,7.9844383 6.0535952,7.9844383 C 7.3889945,7.9844383 8.8136637,9.8855295 8.8136637,11.188225 z " + id="path5157" + sodipodi:nodetypes="csssc" /> + <path + sodipodi:type="arc" + style="opacity:1;fill:#5c3566;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="path5162" + sodipodi:cx="10.169642" + sodipodi:cy="24.3125" + sodipodi:rx="1.2410715" + sodipodi:ry="1.2946428" + d="M 11.410714 24.3125 A 1.2410715 1.2946428 0 1 1 8.928571,24.3125 A 1.2410715 1.2946428 0 1 1 11.410714 24.3125 z" + transform="matrix(1.208633,0,0,1.158621,-5.825637,-16.66897)" /> + <path + style="fill:#3b1941;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1" + d="M 4.9752634,2.5424297 C 6.2676381,1.111155 8.059671,2.6823452 8.9752679,3.325734 L 7.061552,3.7844642 L 4.9752634,2.5424297 z " + id="path5192" + sodipodi:nodetypes="cccc" /> + <path + style="fill:#3b1941;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1" + d="M 6.9752602,1.2553494 C 8.5939382,0.25341885 11.64336,2.4607647 11.936975,3.3797691 L 9.4042533,2.9587153 L 6.9752602,1.2553494 z " + id="rect5189" + sodipodi:nodetypes="cccc" /> + <path + style="fill:#975fa3;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1" + d="M 17.336751,8.8148749 C 16.436419,7.5869931 14.971722,7.9141192 14.396849,8.6981357 C 13.609061,9.7725277 13.7004,11.64104 14.600731,12.868921 C 15.383133,13.93597 16.670043,14.495617 17.457832,13.421225 C 18.245621,12.346833 18.048044,9.7849448 17.336751,8.8148749 z " + id="path3132" + sodipodi:nodetypes="csssc" /> + <path + style="fill:white;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1" + d="M 17.468686,9.5432478 C 16.793205,8.7246594 15.694305,8.9427465 15.263003,9.4654264 C 14.671958,10.181691 14.740486,11.427368 15.415967,12.245957 C 16.00297,12.957323 16.968483,13.33042 17.559527,12.614156 C 18.150572,11.897891 18.002339,10.189962 17.468686,9.5432478 z " + id="path3134" + sodipodi:nodetypes="csssc" /> + <path + sodipodi:type="arc" + style="fill:#5c3566;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="path3136" + sodipodi:cx="10.169642" + sodipodi:cy="24.3125" + sodipodi:rx="1.2410715" + sodipodi:ry="1.2946428" + d="M 11.410714 24.3125 A 1.2410715 1.2946428 0 1 1 8.928571,24.3125 A 1.2410715 1.2946428 0 1 1 11.410714 24.3125 z" + transform="matrix(1.153827,0,0,1.158621,4.558885,-16.66895)" /> + <rect + style="fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="rect3140" + width="4.4400907" + height="1" + x="9.501585" + y="14" + rx="0.69182354" + ry="0.5" /> + <path + style="fill:#fcaf3e;fill-opacity:1;stroke:none;stroke-width:1.0283047;stroke-miterlimit:4;stroke-opacity:1" + d="M 6.965729,14.893438 C 12.054241,18.243015 11.620917,13 12.397198,13 C 13.162798,13 12.66503,18.201991 16.965729,14.895644 C 16.232886,16.102946 13.980397,18 13.030799,18 C 12.07051,18 8.156601,16.676807 6.965729,14.893438 z " + id="path3142" + sodipodi:nodetypes="czczc" /> + <path + style="fill:url(#linearGradient3146);fill-opacity:1;stroke:none;stroke-width:1.0283047;stroke-miterlimit:4;stroke-opacity:1" + d="M 6.965729,14.893439 C 11.706133,19.171305 11.620917,13 12.397198,13 C 13.162798,13 12.607012,18.027939 16.965729,14.895646 C 16.232886,16.102947 13.980397,18 13.030799,18 C 12.07051,18 8.156602,16.676809 6.965729,14.893439 z " + id="path3144" + sodipodi:nodetypes="czczc" /> + </g> +</svg>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pidgin/pixmaps/icons/hicolor/32x32/apps/scalable/pidgin.svg Mon Nov 12 16:53:54 2007 +0000 @@ -0,0 +1,489 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://web.resource.org/cc/" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="32" + height="32" + id="svg4345" + sodipodi:version="0.32" + inkscape:version="0.44.1" + sodipodi:docbase="/home/hbons/Desktop/2.0.2/pidgin/pixmaps/icons/32/scalable" + sodipodi:docname="pidgin.svg" + inkscape:export-filename="/home/hbons/Desktop/pidgin32.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90" + version="1.0"> + <defs + id="defs4347"> + <linearGradient + inkscape:collect="always" + id="linearGradient3976"> + <stop + style="stop-color:#3b1941;stop-opacity:1;" + offset="0" + id="stop3978" /> + <stop + style="stop-color:#3b1941;stop-opacity:0;" + offset="1" + id="stop3980" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient3968"> + <stop + style="stop-color:#82508e;stop-opacity:1;" + offset="0" + id="stop3970" /> + <stop + style="stop-color:#82508e;stop-opacity:0;" + offset="1" + id="stop3972" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient3958"> + <stop + style="stop-color:#eeeeec;stop-opacity:1;" + offset="0" + id="stop3960" /> + <stop + style="stop-color:#eeeeec;stop-opacity:0;" + offset="1" + id="stop3962" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient2850"> + <stop + style="stop-color:#ce5c00;stop-opacity:1;" + offset="0" + id="stop2852" /> + <stop + style="stop-color:#ce5c00;stop-opacity:0;" + offset="1" + id="stop2854" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2850" + id="linearGradient2856" + x1="21.785719" + y1="28.142857" + x2="17.785713" + y2="30.07143" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(-47,-15.99998)" /> + <linearGradient + inkscape:collect="always" + id="linearGradient2816"> + <stop + style="stop-color:#eeeeec;stop-opacity:1;" + offset="0" + id="stop2818" /> + <stop + style="stop-color:#eeeeec;stop-opacity:0;" + offset="1" + id="stop2820" /> + </linearGradient> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2816" + id="radialGradient2824" + cx="9.4288578" + cy="19.283415" + fx="9.4288578" + fy="19.283415" + r="16.390338" + gradientTransform="matrix(1.556432,0,0,1.618148,-52.04294,-30.39321)" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + id="linearGradient2826"> + <stop + style="stop-color:#3b1941;stop-opacity:1;" + offset="0" + id="stop2828" /> + <stop + style="stop-color:#3b1941;stop-opacity:0;" + offset="1" + id="stop2830" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2826" + id="linearGradient2832" + x1="13.191773" + y1="41.606163" + x2="13.191773" + y2="47.843258" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,0.988192,-46.55265,-16.48621)" /> + <linearGradient + inkscape:collect="always" + id="linearGradient2834"> + <stop + style="stop-color:#82508e;stop-opacity:1;" + offset="0" + id="stop2836" /> + <stop + style="stop-color:#82508e;stop-opacity:0;" + offset="1" + id="stop2838" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2834" + id="linearGradient2840" + x1="11.373499" + y1="41.566242" + x2="11.373499" + y2="47.746658" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,0.988192,-46.55265,-16.48621)" /> + <linearGradient + inkscape:collect="always" + id="linearGradient6563"> + <stop + style="stop-color:white;stop-opacity:1;" + offset="0" + id="stop6565" /> + <stop + style="stop-color:white;stop-opacity:0;" + offset="1" + id="stop6567" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient6537"> + <stop + style="stop-color:white;stop-opacity:1;" + offset="0" + id="stop6539" /> + <stop + style="stop-color:white;stop-opacity:0;" + offset="1" + id="stop6541" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient6506"> + <stop + style="stop-color:#eeeeec;stop-opacity:1;" + offset="0" + id="stop6508" /> + <stop + style="stop-color:#eeeeec;stop-opacity:0;" + offset="1" + id="stop6510" /> + </linearGradient> + <linearGradient + id="linearGradient2804"> + <stop + style="stop-color:black;stop-opacity:0;" + offset="0" + id="stop2806" /> + <stop + id="stop2812" + offset="0.5" + style="stop-color:black;stop-opacity:1;" /> + <stop + style="stop-color:black;stop-opacity:0;" + offset="1" + id="stop2808" /> + </linearGradient> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient25546" + id="radialGradient25572" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,0.994693,0,4.16407e-2)" + cx="7.8836637" + cy="1.5104795" + fx="7.8836637" + fy="1.5104795" + r="8.4883642" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient25546" + id="radialGradient25568" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,0.994693,0,4.16407e-2)" + cx="7.8836741" + cy="0.14505707" + fx="7.8836741" + fy="0.14505707" + r="8.4883642" /> + <linearGradient + inkscape:collect="always" + id="linearGradient25546"> + <stop + style="stop-color:white;stop-opacity:1;" + offset="0" + id="stop25548" /> + <stop + style="stop-color:white;stop-opacity:0;" + offset="1" + id="stop25550" /> + </linearGradient> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient25546" + id="radialGradient25554" + cx="7.8836637" + cy="2.6242435" + fx="7.8836637" + fy="2.6242435" + r="8.4883642" + gradientTransform="matrix(1.131317,0,0,1.125313,-1.035262,-0.301139)" + gradientUnits="userSpaceOnUse" /> + <linearGradient + id="linearGradient3800"> + <stop + style="stop-color:#f4d9b1;stop-opacity:1.0000000;" + offset="0.0000000" + id="stop3802" /> + <stop + style="stop-color:#df9725;stop-opacity:1.0000000;" + offset="1.0000000" + id="stop3804" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient6506" + id="linearGradient6512" + x1="15.645709" + y1="39.743458" + x2="14.943421" + y2="50.079575" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient6537" + id="linearGradient6543" + x1="30.5" + y1="0.033532728" + x2="30.5" + y2="23.559282" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient6563" + id="linearGradient6569" + x1="-1.6841649" + y1="39.902092" + x2="5.5366187" + y2="44.272076" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient6537" + id="linearGradient3069" + gradientUnits="userSpaceOnUse" + x1="30.5" + y1="0.033532728" + x2="30.5" + y2="23.559282" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient6506" + id="linearGradient3071" + gradientUnits="userSpaceOnUse" + x1="15.645709" + y1="39.743458" + x2="15.645709" + y2="53.502155" + gradientTransform="translate(-47,-15)" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3958" + id="radialGradient3966" + cx="9.0640488" + cy="21.511742" + fx="9.0640488" + fy="21.511742" + r="16.663956" + gradientTransform="matrix(1.68884,0,0,1.716583,-6.243689,-15.89085)" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3968" + id="linearGradient3974" + x1="16.13257" + y1="40.781811" + x2="16.13257" + y2="48.068741" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3976" + id="linearGradient3982" + x1="12.095973" + y1="40.907658" + x2="12.095973" + y2="46.463146" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2850" + id="linearGradient3991" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(0.769231,0,0,0.714287,-1.230773,-2.285726)" + x1="21.785719" + y1="28.142857" + x2="17.785713" + y2="30.07143" /> + </defs> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="17.236022" + inkscape:cx="21.944662" + inkscape:cy="16.287609" + inkscape:current-layer="layer1" + showgrid="true" + inkscape:grid-bbox="true" + inkscape:document-units="px" + inkscape:window-width="1434" + inkscape:window-height="840" + inkscape:window-x="0" + inkscape:window-y="0" + showguides="true" + inkscape:guide-bbox="true" + inkscape:grid-points="false" + width="32px" + height="32px" + inkscape:object-bbox="true" /> + <metadata + id="metadata4350"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + </cc:Work> + </rdf:RDF> + </metadata> + <g + id="layer1" + inkscape:label="Layer 1" + inkscape:groupmode="layer"> + <path + sodipodi:type="inkscape:offset" + inkscape:radius="-1.0057179" + inkscape:original="M 20.53125 1.5 C 17.192693 1.5 14.5 4.611235 14.5 8.46875 L 14.5 20.53125 C 14.5 24.388765 17.192693 27.5 20.53125 27.5 L 34.53125 27.5 L 34.53125 31.09375 L 39.34375 27.5 L 41.5 27.5 C 45.512737 27.5 46.5 24.38319 46.5 20.53125 L 46.5 8.46875 C 46.5 4.6112353 43.807307 1.5 40.46875 1.5 L 20.53125 1.5 z " + style="fill:none;fill-opacity:1;stroke:white;stroke-width:1.47727883;stroke-miterlimit:4;stroke-opacity:1" + id="path6504" + d="M 20.53125,2.5 C 17.817519,2.5 15.5,5.0792547 15.5,8.46875 L 15.5,20.53125 C 15.5,23.920745 17.817519,26.5 20.53125,26.5 L 34.53125,26.5 C 35.082213,26.503178 35.528072,26.949037 35.53125,27.5 L 35.53125,29.09375 L 38.75,26.6875 C 38.923102,26.563771 39.130983,26.498125 39.34375,26.5 L 41.5,26.5 C 43.245978,26.5 44.034662,25.931926 44.625,24.9375 C 45.215338,23.943074 45.5,22.371297 45.5,20.53125 L 45.5,8.46875 C 45.5,5.079255 43.182481,2.5 40.46875,2.5 L 20.53125,2.5 z " + transform="matrix(0.67692,0,0,0.67692,0.161535,-0.515354)" /> + <path + style="fill:#efefef;fill-opacity:1;stroke:#787878;stroke-width:1.46586692;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="M 20.53125,1.5 C 17.192693,1.5 14.5,4.611235 14.5,8.46875 L 14.5,20.53125 C 14.5,24.388765 17.428915,28.139948 20.767472,28.139948 L 33.409288,28.041495 L 33.415412,31.845969 L 38.723454,28.076231 L 42.130099,28.139948 C 46.142836,28.139948 46.5,24.580097 46.5,20.728157 L 46.5,8.46875 C 46.5,4.6112353 43.807307,1.5 40.46875,1.5 L 20.53125,1.5 z " + id="rect5498" + sodipodi:nodetypes="cccccccccccc" + transform="matrix(0.687501,0,0,0.67692,-0.468758,-0.515381)" /> + <path + transform="matrix(0.668893,0,0,0.668627,8.626692e-2,-0.192463)" + style="fill:url(#linearGradient6543);fill-opacity:1;stroke:white;stroke-width:1.49530375;stroke-miterlimit:4;stroke-opacity:1" + d="M 20.53125,2.53125 C 17.841732,2.53125 15.53125,5.0973912 15.53125,8.46875 L 15.53125,20.53125 C 15.53125,23.902609 17.841732,26.46875 20.53125,26.46875 L 33.967629,26.46875 C 34.534122,26.476048 34.991581,26.933507 34.998879,27.5 L 34.998879,29 L 38.71875,26.65625 C 38.901723,26.528628 39.120742,26.462922 39.34375,26.46875 L 42.415884,26.46875 C 45.139435,26.46875 45.46875,24.282574 45.46875,20.53125 L 45.46875,8.46875 C 45.46875,5.0973915 43.158268,2.53125 40.46875,2.53125 L 20.53125,2.53125 z " + id="path6535" + sodipodi:nodetypes="cccccccccccccc" /> + <path + style="opacity:1;fill:url(#linearGradient3974);fill-opacity:1.0;stroke:url(#linearGradient3982);stroke-width:1.51128328;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="M 15,13 C 8.3759979,13 3,18.600001 3,25.5 C 4.8460021,40.483064 0.49299658,38.484005 0.052646307,45.33795 C 0.052646307,47.422072 1.0380664,48.413461 3.1446965,48.413461 C 4.3321851,48.413461 29.360035,48.5596 32.051034,48.5596 C 34.165161,48.5596 34,46.5 34,46.5 C 34,43.834589 27.597902,41.598052 25.813453,39.641526 C 23.985035,37.640505 26,30.5 26,30.5 C 26.641306,28.9702 27,27.275084 27,25.5 C 27,18.600001 21.624002,13 15,13 z " + id="path5176" + sodipodi:nodetypes="cccccszcsc" + transform="matrix(0.67692,0,0,0.646801,0.464358,-0.908413)" /> + <path + style="opacity:0.5;fill:url(#radialGradient3966);fill-opacity:1.0;stroke:url(#linearGradient6512);stroke-width:1.55319357;stroke-miterlimit:4;stroke-opacity:1" + d="M 15,14.0625 C 8.9877035,14.0625 4.0789961,19.13808 4.0625,25.46875 C 4.0624722,25.479427 4.0625,25.489316 4.0625,25.5 C 4.9744187,33.020507 4.3062656,37.469969 2.59375,40.59375 C -0.19778709,46.24536 1.5610206,47.490284 3.9033639,47.490284 C 5.8399452,47.490284 23.958121,47.46049 29.784094,47.46049 C 30.951301,47.46049 32.9375,47.964563 32.9375,46.5 C 32.9375,46.278257 32.737749,45.861323 32.1875,45.34375 C 31.637251,44.826177 30.81426,44.270409 29.90625,43.71875 C 28.99824,43.167091 28.02821,42.609033 27.15625,42.0625 C 26.28429,41.515967 25.511654,41.005793 24.96875,40.28125 C 24.358745,39.467156 24.078806,38.510169 24.024342,37.46875 C 23.969878,36.427331 24.107721,35.310041 24.224561,34.25 C 24.458241,32.129917 24.96875,30.28125 24.96875,30.28125 C 24.98374,30.216952 25.004663,30.154183 25.03125,30.09375 C 25.618731,28.692346 25.9375,27.131297 25.9375,25.5 C 25.9375,19.154404 21.022436,14.0625 15,14.0625 z " + id="path5241" + sodipodi:nodetypes="csscccssssssscssc" + transform="matrix(0.660903,0,0,0.627207,0.731515,-0.320103)" /> + <path + style="opacity:1;fill:#a46bb0;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1" + d="M 5.0726004,12.086499 C 6.6079483,10.449324 9.1057173,10.885492 10.086057,11.930848 C 11.429483,13.36337 11.273722,15.85472 9.7383746,17.491894 C 8.4041332,18.914624 6.2095475,19.660821 4.8661202,18.228299 C 3.5226923,16.795776 3.8596213,13.379925 5.0726004,12.086499 z " + id="path5160" + sodipodi:nodetypes="csssc" /> + <path + style="opacity:1;fill:white;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1" + d="M 13.257119,24.626053 C 13.257119,26.227351 11.8279,27.316574 10.863875,27.316574 C 9.5428049,27.316574 8.4706318,26.01697 8.4706318,24.415672 C 8.4706318,23.024119 9.2055946,21.514771 10.526665,21.514771 C 11.847736,21.514771 13.257119,23.360971 13.257119,24.626053 z " + id="path5157" + sodipodi:nodetypes="csssc" + transform="matrix(1.010846,0,0,1.029732,-3.562503,-10.12874)" /> + <path + sodipodi:type="arc" + style="opacity:1;fill:#5c3566;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="path5162" + sodipodi:cx="10.169642" + sodipodi:cy="24.3125" + sodipodi:rx="1.2410715" + sodipodi:ry="1.2946428" + d="M 11.410714 24.3125 A 1.2410715 1.2946428 0 1 1 8.928571,24.3125 A 1.2410715 1.2946428 0 1 1 11.410714 24.3125 z" + transform="matrix(1.208633,0,0,1.158621,-4.791365,-12.66897)" /> + <path + transform="matrix(0.596326,-0.813274,-0.562251,-0.766804,24.4163,42.47989)" + style="opacity:1;fill:#975fa3;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1" + d="M 13.257119,24.626053 C 13.257119,26.227351 11.8279,27.316574 10.863875,27.316574 C 9.5428049,27.316574 8.4706318,26.01697 8.4706318,24.415672 C 8.4706318,23.024119 9.2055946,21.514771 10.526665,21.514771 C 11.847736,21.514771 13.257119,23.360971 13.257119,24.626053 z " + id="path5167" + sodipodi:nodetypes="csssc" /> + <path + style="opacity:1;fill:white;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1" + d="M 13.257119,24.626053 C 13.257119,26.227351 11.8279,27.316574 10.863875,27.316574 C 9.5428049,27.316574 8.4706318,26.01697 8.4706318,24.415672 C 8.4706318,23.024119 9.2055946,21.514771 10.526665,21.514771 C 11.847736,21.514771 13.257119,23.360971 13.257119,24.626053 z " + id="path5169" + sodipodi:nodetypes="csssc" + transform="matrix(0.447398,-0.542185,-0.421833,-0.511203,23.06465,33.31996)" /> + <path + sodipodi:type="arc" + style="opacity:1;fill:#5c3566;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="path5171" + sodipodi:cx="10.169642" + sodipodi:cy="24.3125" + sodipodi:rx="1.2410715" + sodipodi:ry="1.2946428" + d="M 11.410714 24.3125 A 1.2410715 1.2946428 0 1 1 8.928571,24.3125 A 1.2410715 1.2946428 0 1 1 11.410714 24.3125 z" + transform="matrix(1.208633,0,0,1.158621,5.208632,-12.66896)" /> + <rect + style="opacity:1;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="rect5215" + width="4.4400907" + height="1" + x="10.535856" + y="18" + rx="0.69182354" + ry="0.5" /> + <path + transform="matrix(0.670792,0,0,0.486348,-1.815475,1.13962)" + style="fill:#3b1941;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1" + d="M 11.651119,11.193815 C 13.577759,8.2509126 16.249277,11.481501 17.614226,12.804399 L 14.761306,13.747613 L 11.651119,11.193815 z " + id="path5192" + sodipodi:nodetypes="cccc" /> + <path + transform="matrix(0.851014,0,0,0.554879,-1.947706,-0.153319)" + style="fill:#3b1941;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1" + d="M 11.689238,9.8218679 C 13.591296,8.0161941 17.174576,11.994261 17.519594,13.650486 L 14.543472,12.891665 L 11.689238,9.8218679 z " + id="rect5189" + sodipodi:nodetypes="cccc" /> + <path + style="fill:#fcaf3e;fill-opacity:1;stroke:none;stroke-width:1.0283047;stroke-miterlimit:4;stroke-opacity:1" + d="M 8,18.893438 C 13.088512,22.243015 12.655188,17 13.431469,17 C 14.197069,17 13.699301,22.201991 18,18.895644 C 17.267157,20.102946 15.014668,22 14.06507,22 C 13.104781,22 9.1908718,20.676807 8,18.893438 z " + id="path3987" + sodipodi:nodetypes="czczc" /> + <path + style="fill:url(#linearGradient3991);fill-opacity:1;stroke:none;stroke-width:1.0283047;stroke-miterlimit:4;stroke-opacity:1" + d="M 8,18.893439 C 12.740404,23.171305 12.655188,17 13.431469,17 C 14.197069,17 13.641283,22.027939 18,18.895646 C 17.267157,20.102947 15.014668,22 14.06507,22 C 13.104781,22 9.1908731,20.676809 8,18.893439 z " + id="path3989" + sodipodi:nodetypes="czczc" /> + </g> +</svg>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pidgin/pixmaps/icons/hicolor/48x48/apps/scalable/pidgin.svg Mon Nov 12 16:53:54 2007 +0000 @@ -0,0 +1,460 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://web.resource.org/cc/" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="48px" + height="48px" + id="svg4345" + sodipodi:version="0.32" + inkscape:version="0.44.1" + sodipodi:docbase="/home/hbons/Desktop/2.0.2/pidgin/pixmaps/icons/48/scalable" + sodipodi:docname="pidgin.svg" + inkscape:export-filename="/home/hbons/Desktop/pidgin48.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90"> + <defs + id="defs4347"> + <linearGradient + inkscape:collect="always" + id="linearGradient2850"> + <stop + style="stop-color:#ce5c00;stop-opacity:1;" + offset="0" + id="stop2852" /> + <stop + style="stop-color:#ce5c00;stop-opacity:0;" + offset="1" + id="stop2854" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient2834"> + <stop + style="stop-color:#82508e;stop-opacity:1;" + offset="0" + id="stop2836" /> + <stop + style="stop-color:#82508e;stop-opacity:0;" + offset="1" + id="stop2838" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient2826"> + <stop + style="stop-color:#3b1941;stop-opacity:1;" + offset="0" + id="stop2828" /> + <stop + style="stop-color:#3b1941;stop-opacity:0;" + offset="1" + id="stop2830" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient2816"> + <stop + style="stop-color:#eeeeec;stop-opacity:1;" + offset="0" + id="stop2818" /> + <stop + style="stop-color:#eeeeec;stop-opacity:0;" + offset="1" + id="stop2820" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient6563"> + <stop + style="stop-color:white;stop-opacity:1;" + offset="0" + id="stop6565" /> + <stop + style="stop-color:white;stop-opacity:0;" + offset="1" + id="stop6567" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient6537"> + <stop + style="stop-color:white;stop-opacity:1;" + offset="0" + id="stop6539" /> + <stop + style="stop-color:white;stop-opacity:0;" + offset="1" + id="stop6541" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient6506"> + <stop + style="stop-color:#eeeeec;stop-opacity:1;" + offset="0" + id="stop6508" /> + <stop + style="stop-color:#eeeeec;stop-opacity:0;" + offset="1" + id="stop6510" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient6493"> + <stop + style="stop-color:#eeeeec;stop-opacity:1;" + offset="0" + id="stop6495" /> + <stop + style="stop-color:#eeeeec;stop-opacity:0;" + offset="1" + id="stop6497" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient5280"> + <stop + style="stop-color:#82508e;stop-opacity:1;" + offset="0" + id="stop5282" /> + <stop + style="stop-color:#82508e;stop-opacity:0;" + offset="1" + id="stop5284" /> + </linearGradient> + <linearGradient + id="linearGradient2804"> + <stop + style="stop-color:black;stop-opacity:0;" + offset="0" + id="stop2806" /> + <stop + id="stop2812" + offset="0.5" + style="stop-color:black;stop-opacity:1;" /> + <stop + style="stop-color:black;stop-opacity:0;" + offset="1" + id="stop2808" /> + </linearGradient> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient25546" + id="radialGradient25572" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,0.994693,0,4.16407e-2)" + cx="7.8836637" + cy="1.5104795" + fx="7.8836637" + fy="1.5104795" + r="8.4883642" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient25546" + id="radialGradient25568" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,0.994693,0,4.16407e-2)" + cx="7.8836741" + cy="0.14505707" + fx="7.8836741" + fy="0.14505707" + r="8.4883642" /> + <linearGradient + inkscape:collect="always" + id="linearGradient25546"> + <stop + style="stop-color:white;stop-opacity:1;" + offset="0" + id="stop25548" /> + <stop + style="stop-color:white;stop-opacity:0;" + offset="1" + id="stop25550" /> + </linearGradient> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient25546" + id="radialGradient25554" + cx="7.8836637" + cy="2.6242435" + fx="7.8836637" + fy="2.6242435" + r="8.4883642" + gradientTransform="matrix(1.131317,0,0,1.125313,-1.035262,-0.301139)" + gradientUnits="userSpaceOnUse" /> + <linearGradient + id="linearGradient3800"> + <stop + style="stop-color:#f4d9b1;stop-opacity:1.0000000;" + offset="0.0000000" + id="stop3802" /> + <stop + style="stop-color:#df9725;stop-opacity:1.0000000;" + offset="1.0000000" + id="stop3804" /> + </linearGradient> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient5280" + id="radialGradient5286" + cx="15.004828" + cy="39.80859" + fx="15.004828" + fy="39.80859" + r="9.7225161" + gradientTransform="matrix(1,0,0,0.732283,0,10.65742)" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient6493" + id="linearGradient6499" + x1="3.3105288" + y1="43.5" + x2="5.6917014" + y2="43.5" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient6506" + id="linearGradient6512" + x1="15.645709" + y1="41.751736" + x2="15.645709" + y2="47.370037" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1,0,0,0.988192,0.5625,-1.39645)" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient6537" + id="linearGradient6543" + x1="30.5" + y1="5.7732024" + x2="30.5" + y2="19.518673" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient6563" + id="linearGradient6573" + gradientUnits="userSpaceOnUse" + x1="12.01321" + y1="38.950283" + x2="5.5366187" + y2="44.272076" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient2816" + id="radialGradient2824" + cx="9.4288578" + cy="19.283415" + fx="9.4288578" + fy="19.283415" + r="16.390338" + gradientTransform="matrix(1.556432,0,0,1.618148,-5.04294,-15.39321)" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2826" + id="linearGradient2832" + x1="13.191773" + y1="41.606163" + x2="13.191773" + y2="47.843258" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2834" + id="linearGradient2840" + x1="11.373499" + y1="41.566242" + x2="11.373499" + y2="47.746658" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient2850" + id="linearGradient2856" + x1="21.785719" + y1="28.142857" + x2="17.785713" + y2="30.07143" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(0,-0.999982)" /> + </defs> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="14" + inkscape:cx="34.459692" + inkscape:cy="22.220728" + inkscape:current-layer="layer1" + showgrid="true" + inkscape:grid-bbox="true" + inkscape:document-units="px" + inkscape:window-width="1434" + inkscape:window-height="840" + inkscape:window-x="0" + inkscape:window-y="0" + showguides="true" + inkscape:guide-bbox="true" + inkscape:grid-points="true" /> + <metadata + id="metadata4350"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + </cc:Work> + </rdf:RDF> + </metadata> + <g + id="layer1" + inkscape:label="Layer 1" + inkscape:groupmode="layer"> + <rect + style="opacity:0.23144106;fill:#2e3436;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="rect6514" + width="36.000004" + height="2.9999979" + x="-4.4446878" + y="57.424854" + rx="2.0412357" + ry="1.4999989" /> + <path + sodipodi:type="inkscape:offset" + inkscape:radius="-1.0057179" + inkscape:original="M 20.53125 1.5 C 17.192693 1.5 14.5 4.611235 14.5 8.46875 L 14.5 20.53125 C 14.5 24.388765 17.192693 27.5 20.53125 27.5 L 34.53125 27.5 L 34.53125 31.09375 L 39.34375 27.5 L 41.5 27.5 C 45.512737 27.5 46.5 24.38319 46.5 20.53125 L 46.5 8.46875 C 46.5 4.6112353 43.807307 1.5 40.46875 1.5 L 20.53125 1.5 z " + style="fill:none;fill-opacity:1;stroke:white;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1" + id="path6504" + d="M 20.53125,2.5 C 17.817519,2.5 15.5,5.0792547 15.5,8.46875 L 15.5,20.53125 C 15.5,23.920745 17.817519,26.5 20.53125,26.5 L 34.53125,26.5 C 35.082213,26.503178 35.528072,26.949037 35.53125,27.5 L 35.53125,29.09375 L 38.75,26.6875 C 38.923102,26.563771 39.130983,26.498125 39.34375,26.5 L 41.5,26.5 C 43.245978,26.5 44.034662,25.931926 44.625,24.9375 C 45.215338,23.943074 45.5,22.371297 45.5,20.53125 L 45.5,8.46875 C 45.5,5.079255 43.182481,2.5 40.46875,2.5 L 20.53125,2.5 z " /> + <path + style="fill:#efefef;fill-opacity:1;stroke:#787878;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1" + d="M 20.53125,1.5 C 17.192693,1.5 14.5,4.611235 14.5,8.46875 L 14.5,20.53125 C 14.5,24.388765 17.192693,27.5 20.53125,27.5 L 34.530203,27.5 L 34.530203,31.107567 L 39.353553,27.485509 L 41.5,27.5 C 45.512737,27.5 46.5,24.38319 46.5,20.53125 L 46.5,8.46875 C 46.5,4.6112353 43.807307,1.5 40.46875,1.5 L 20.53125,1.5 z " + id="rect5498" + sodipodi:nodetypes="cccccccccccc" /> + <path + sodipodi:type="inkscape:offset" + inkscape:radius="-1.044691" + inkscape:original="M 20.53125 1.5 C 17.192693 1.5 14.5 4.611235 14.5 8.46875 L 14.5 20.53125 C 14.5 24.388765 17.192693 27.5 20.53125 27.5 L 34.53125 27.5 L 34.53125 31.09375 L 39.34375 27.5 L 41.5 27.5 C 45.512737 27.5 46.5 24.38319 46.5 20.53125 L 46.5 8.46875 C 46.5 4.6112353 43.807307 1.5 40.46875 1.5 L 20.53125 1.5 z " + style="fill:url(#linearGradient6543);fill-opacity:1.0;stroke:white;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1" + id="path6535" + d="M 20.53125,2.53125 C 17.841732,2.53125 15.53125,5.0973912 15.53125,8.46875 L 15.53125,20.53125 C 15.53125,23.902609 17.841732,26.46875 20.53125,26.46875 L 34.53125,26.46875 C 35.097743,26.476048 35.555202,26.933507 35.5625,27.5 L 35.5625,29 L 38.71875,26.65625 C 38.901723,26.528628 39.120742,26.462922 39.34375,26.46875 L 41.5,26.46875 C 43.235888,26.46875 44.009537,25.921608 44.59375,24.9375 C 45.177963,23.953392 45.46875,22.367968 45.46875,20.53125 L 45.46875,8.46875 C 45.46875,5.0973915 43.158268,2.53125 40.46875,2.53125 L 20.53125,2.53125 z " /> + <path + style="opacity:1;fill:url(#linearGradient2840);fill-opacity:1.0;stroke:url(#linearGradient2832);stroke-width:1.00595677;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="M 15,13 C 8.3759979,13 3,18.600001 3,25.5 C 4.8460021,40.483064 0.49299658,38.484005 0.052646307,45.33795 C 0.052646307,47.422072 1.0380664,48.413461 3.1446965,48.413461 C 4.3321851,48.413461 29.360035,48.5596 32.051034,48.5596 C 34.165161,48.5596 34,46.5 34,46.5 C 34,43.834589 27.597902,41.598052 25.813453,39.641526 C 23.985035,37.640505 26,30.5 26,30.5 C 26.641306,28.9702 27,27.275084 27,25.5 C 27,18.600001 21.624002,13 15,13 z " + id="path5176" + sodipodi:nodetypes="cccccszcsc" + transform="matrix(1,0,0,0.988192,0.447354,-1.486208)" /> + <path + style="opacity:0.5;fill:url(#radialGradient2824);fill-opacity:1;stroke:url(#linearGradient6512);stroke-width:0.99999994;stroke-miterlimit:4;stroke-opacity:1" + d="M 15.5625,12.5 C 9.550204,12.5 4.641496,17.515648 4.625,23.771565 C 4.624972,23.782116 4.625,23.791888 4.625,23.802446 C 5.536919,31.234151 4.868766,35.631074 3.15625,38.717969 C 0.36471303,44.302845 2.123521,45.533069 4.465864,45.533069 C 6.402445,45.533069 24.520621,45.503627 30.346594,45.503627 C 31.513801,45.503627 33.5,46.001748 33.5,44.554478 C 33.5,44.335354 33.300249,43.923343 32.75,43.411881 C 32.199751,42.90042 31.37676,42.351214 30.46875,41.806069 C 29.56074,41.260924 28.59071,40.709456 27.71875,40.169376 C 26.84679,39.629297 26.074154,39.125147 25.53125,38.409159 C 24.921245,37.604678 24.641306,36.658991 24.586842,35.629869 C 24.532378,34.600747 24.670221,33.49665 24.787061,32.449126 C 25.020741,30.354077 25.53125,28.527239 25.53125,28.527239 C 25.54624,28.4637 25.567163,28.401673 25.59375,28.341953 C 26.181231,26.957097 26.5,25.414481 26.5,23.802446 C 26.5,17.531779 21.584936,12.5 15.5625,12.5 z " + id="path5241" + sodipodi:nodetypes="csscccssssssscssc" /> + <path + style="opacity:1;fill:#a46bb0;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1" + d="M 7.269301,19.503118 C 9.2717505,17.238166 12.529418,17.841584 13.808008,19.287784 C 15.560146,21.269611 15.356996,24.71627 13.354547,26.981222 C 11.614386,28.949501 8.7521391,29.981828 7,28 C 5.2478601,26.018172 5.6872953,21.292511 7.269301,19.503118 z " + id="path5160" + sodipodi:nodetypes="csssc" /> + <path + transform="matrix(1.46245,0,0,1.378883,-5.440518,-10.80605)" + style="opacity:1;fill:white;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1" + d="M 13.257119,24.626053 C 13.257119,26.227351 11.8279,27.316574 10.863875,27.316574 C 9.5428049,27.316574 8.4706318,26.01697 8.4706318,24.415672 C 8.4706318,23.024119 9.2055946,21.514771 10.526665,21.514771 C 11.847736,21.514771 13.257119,23.360971 13.257119,24.626053 z " + id="path5157" + sodipodi:nodetypes="csssc" /> + <path + sodipodi:type="arc" + style="opacity:1;fill:#5c3566;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="path5162" + sodipodi:cx="10.169642" + sodipodi:cy="24.3125" + sodipodi:rx="1.2410715" + sodipodi:ry="1.2946428" + d="M 11.410714 24.3125 A 1.2410715 1.2946428 0 1 1 8.928571,24.3125 A 1.2410715 1.2946428 0 1 1 11.410714 24.3125 z" + transform="matrix(1.208632,0,0,1.544828,-1.738701,-14.41893)" /> + <path + sodipodi:type="arc" + style="opacity:1;fill:black;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="path5164" + sodipodi:cx="10.169642" + sodipodi:cy="24.3125" + sodipodi:rx="1.2410715" + sodipodi:ry="1.2946428" + d="M 11.410714 24.3125 A 1.2410715 1.2946428 0 1 1 8.928571,24.3125 A 1.2410715 1.2946428 0 1 1 11.410714 24.3125 z" + transform="matrix(0.402878,0,0,0.514947,6.455534,10.62004)" /> + <path + style="opacity:1;fill:#975fa3;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1" + d="M 27.88281,19.946791 C 26.359012,18.309616 23.880032,18.745786 22.907068,19.791141 C 21.573747,21.223665 21.728337,23.715015 23.252136,25.35219 C 24.576341,26.77492 26.754418,27.521117 28.087739,26.088593 C 29.42106,24.656068 29.086665,21.240217 27.88281,19.946791 z " + id="path5167" + sodipodi:nodetypes="csssc" /> + <path + transform="matrix(0.726374,-0.813272,-0.684868,-0.766801,34.41717,50.34012)" + style="opacity:1;fill:white;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1" + d="M 13.257119,24.626053 C 13.257119,26.227351 11.8279,27.316574 10.863875,27.316574 C 9.5428049,27.316574 8.4706318,26.01697 8.4706318,24.415672 C 8.4706318,23.024119 9.2055946,21.514771 10.526665,21.514771 C 11.847736,21.514771 13.257119,23.360971 13.257119,24.626053 z " + id="path5169" + sodipodi:nodetypes="csssc" /> + <path + sodipodi:type="arc" + style="opacity:1;fill:#5c3566;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="path5171" + sodipodi:cx="10.169642" + sodipodi:cy="24.3125" + sodipodi:rx="1.2410715" + sodipodi:ry="1.2946428" + d="M 11.410714 24.3125 A 1.2410715 1.2946428 0 1 1 8.928571,24.3125 A 1.2410715 1.2946428 0 1 1 11.410714 24.3125 z" + transform="matrix(1.208632,0,0,1.598777,13.20865,-15.80042)" /> + <path + sodipodi:type="arc" + style="opacity:1;fill:black;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="path5173" + sodipodi:cx="10.169642" + sodipodi:cy="24.3125" + sodipodi:rx="1.2410715" + sodipodi:ry="1.2946428" + d="M 11.410714 24.3125 A 1.2410715 1.2946428 0 1 1 8.928571,24.3125 A 1.2410715 1.2946428 0 1 1 11.410714 24.3125 z" + transform="matrix(0.402878,0,0,0.53293,21.40289,10.11299)" /> + <rect + style="opacity:1;fill:#eeeeec;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="rect5215" + width="7" + height="1.8602936" + x="15" + y="27.000017" + rx="0.81387848" + ry="0.93014681" /> + <path + style="fill:#fcaf3e;fill-opacity:1;stroke:none;stroke-width:1.0283047;stroke-miterlimit:4;stroke-opacity:1" + d="M 12.000005,28.650812 C 17.33287,31.553263 18.051747,26 19.060912,26 C 20.056192,26 20.46502,31.577054 25,28.653901 C 24.047304,30.344123 21.119071,32.999996 19.884593,32.999996 C 18.636217,32.999996 13.548138,31.147528 12.000005,28.650812 z " + id="rect5187" + sodipodi:nodetypes="czczc" /> + <path + transform="matrix(1.236264,0,0,0.549587,-6.482886,4.775206)" + style="fill:#3b1941;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1" + d="M 11.651119,11.193815 C 12.963532,7.814583 16.999999,10.43431 16.999999,12.891665 L 13.737594,13.834879 L 11.651119,11.193815 z " + id="path5192" + sodipodi:nodetypes="cccc" /> + <path + transform="matrix(1.50247,0,0,1,-7.59464,-1.139701)" + style="fill:#3b1941;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1" + d="M 11.689238,9.8218679 C 13.591296,8.0161941 17.219555,11.23544 17.564573,12.891665 L 14.543472,12.891665 L 11.689238,9.8218679 z " + id="rect5189" + sodipodi:nodetypes="cccc" /> + <path + style="fill:url(#linearGradient2856);fill-opacity:1;stroke:none;stroke-width:1.0283047;stroke-miterlimit:4;stroke-opacity:1" + d="M 12.000005,28.650834 C 17.332871,31.553285 18.051747,26.000022 19.060912,26.000022 C 20.056192,26.000022 20.46502,31.577076 25,28.653923 C 24.047304,30.344145 21.119071,33.000018 19.884593,33.000018 C 18.636217,33.000018 13.548139,31.14755 12.000005,28.650834 z " + id="path6561" + sodipodi:nodetypes="czczc" /> + </g> +</svg>
--- a/pidgin/pixmaps/protocols/16/Makefile.am Mon Nov 12 16:15:53 2007 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,19 +0,0 @@ -EXTRA_DIST = aim.png \ - bonjour.png \ - gadu-gadu.png \ - google-talk.png \ - novell.png \ - icq.png \ - irc.png \ - jabber.png \ - meanwhile.png \ - msn.png \ - myspace.png \ - qq.png \ - silc.png \ - simple.png \ - yahoo.png \ - zephyr.png - -pidginprotocolpixdir = $(datadir)/pixmaps/pidgin/protocols/16 -pidginprotocolpix_DATA = $(EXTRA_DIST)
--- a/pidgin/pixmaps/protocols/16/Makefile.mingw Mon Nov 12 16:15:53 2007 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,20 +0,0 @@ -# -# Makefile.mingw -# -# Description: Makefile for win32 (mingw) version of Pidgin pixmaps -# - -PIDGIN_TREE_TOP := ../../../.. -include $(PIDGIN_TREE_TOP)/libpurple/win32/global.mak - -datadir = $(PIDGIN_INSTALL_DIR) -include ./Makefile.am - -.PHONY: install - -install: - if test '$(pidginprotocolpix_DATA)'; then \ - mkdir -p $(pidginprotocolpixdir); \ - cp $(pidginprotocolpix_DATA) $(pidginprotocolpixdir); \ - fi; -
--- a/pidgin/pixmaps/protocols/22/Makefile.am Mon Nov 12 16:15:53 2007 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,20 +0,0 @@ -EXTRA_DIST = aim.png \ - bonjour.png \ - gadu-gadu.png \ - google-talk.png \ - novell.png \ - icq.png \ - irc.png \ - jabber.png \ - meanwhile.png \ - msn.png \ - myspace.png \ - qq.png \ - silc.png \ - simple.png \ - yahoo.png \ - zephyr.png - -pidginprotocolpixdir = $(datadir)/pixmaps/pidgin/protocols/22 - -pidginprotocolpix_DATA = $(EXTRA_DIST)
--- a/pidgin/pixmaps/protocols/22/Makefile.mingw Mon Nov 12 16:15:53 2007 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,20 +0,0 @@ -# -# Makefile.mingw -# -# Description: Makefile for win32 (mingw) version of Pidgin pixmaps -# - -PIDGIN_TREE_TOP := ../../../.. -include $(PIDGIN_TREE_TOP)/libpurple/win32/global.mak - -datadir = $(PIDGIN_INSTALL_DIR) -include ./Makefile.am - -.PHONY: install - -install: - if test '$(pidginprotocolpix_DATA)'; then \ - mkdir -p $(pidginprotocolpixdir); \ - cp $(pidginprotocolpix_DATA) $(pidginprotocolpixdir); \ - fi; -
--- a/pidgin/pixmaps/protocols/48/Makefile.am Mon Nov 12 16:15:53 2007 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,19 +0,0 @@ -EXTRA_DIST = aim.png \ - bonjour.png \ - gadu-gadu.png \ - novell.png \ - icq.png \ - irc.png \ - jabber.png \ - meanwhile.png \ - msn.png \ - myspace.png \ - qq.png \ - silc.png \ - simple.png \ - yahoo.png \ - zephyr.png - -pidginprotocolpixdir = $(datadir)/pixmaps/pidgin/protocols/48 - -pidginprotocolpix_DATA = $(EXTRA_DIST)
--- a/pidgin/pixmaps/protocols/48/Makefile.mingw Mon Nov 12 16:15:53 2007 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,20 +0,0 @@ -# -# Makefile.mingw -# -# Description: Makefile for win32 (mingw) version of Pidgin pixmaps -# - -PIDGIN_TREE_TOP := ../../../.. -include $(PIDGIN_TREE_TOP)/libpurple/win32/global.mak - -datadir = $(PIDGIN_INSTALL_DIR) -include ./Makefile.am - -.PHONY: install - -install: - if test '$(pidginprotocolpix_DATA)'; then \ - mkdir -p $(pidginprotocolpixdir); \ - cp $(pidginprotocolpix_DATA) $(pidginprotocolpixdir); \ - fi; -
--- a/pidgin/pixmaps/status/11/Makefile.am Mon Nov 12 16:15:53 2007 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,17 +0,0 @@ -SUBDIRS = rtl - -EXTRA_DIST = available.png \ - away.png \ - busy.png \ - chat.png \ - extended-away.png \ - invisible.png \ - log-in.png \ - log-out.png \ - offline.png \ - person.png - -pidginstatuspixdir = $(datadir)/pixmaps/pidgin/status/11 - -pidginstatuspix_DATA = $(EXTRA_DIST) -
--- a/pidgin/pixmaps/status/11/Makefile.mingw Mon Nov 12 16:15:53 2007 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,22 +0,0 @@ -# -# Makefile.mingw -# -# Description: Makefile for win32 (mingw) version of Pidgin pixmaps -# - -PIDGIN_TREE_TOP := ../../../.. -include $(PIDGIN_TREE_TOP)/libpurple/win32/global.mak - -datadir = $(PIDGIN_INSTALL_DIR) -include ./Makefile.am - -.PHONY: install - -install: - if test '$(pidginstatuspix_DATA)'; then \ - mkdir -p $(pidginstatuspixdir); \ - cp $(pidginstatuspix_DATA) $(pidginstatuspixdir); \ - fi; - - $(MAKE) -C rtl -f Makefile.mingw install || exit 1; \ -
--- a/pidgin/pixmaps/status/11/rtl/Makefile.am Mon Nov 12 16:15:53 2007 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,6 +0,0 @@ -EXTRA_DIST = extended-away.png - -pidginstatuspixdir = $(datadir)/pixmaps/pidgin/status/11/rtl - -pidginstatuspix_DATA = $(EXTRA_DIST) -
--- a/pidgin/pixmaps/status/11/rtl/Makefile.mingw Mon Nov 12 16:15:53 2007 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,20 +0,0 @@ -# -# Makefile.mingw -# -# Description: Makefile for win32 (mingw) version of Pidgin pixmaps -# - -PIDGIN_TREE_TOP := ../../../../.. -include $(PIDGIN_TREE_TOP)/libpurple/win32/global.mak - -datadir = $(PIDGIN_INSTALL_DIR) -include ./Makefile.am - -.PHONY: install - -install: - if test '$(pidginstatuspix_DATA)'; then \ - mkdir -p $(pidginstatuspixdir); \ - cp $(pidginstatuspix_DATA) $(pidginstatuspixdir); \ - fi; -
--- a/pidgin/pixmaps/status/16/Makefile.am Mon Nov 12 16:15:53 2007 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,17 +0,0 @@ -SUBDIRS = rtl - -EXTRA_DIST = available.png \ - away.png \ - busy.png \ - chat.png \ - extended-away.png \ - invisible.png \ - log-in.png \ - log-out.png \ - offline.png \ - person.png - -pidginstatuspixdir = $(datadir)/pixmaps/pidgin/status/16 - -pidginstatuspix_DATA = $(EXTRA_DIST) -
--- a/pidgin/pixmaps/status/16/Makefile.mingw Mon Nov 12 16:15:53 2007 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,22 +0,0 @@ -# -# Makefile.mingw -# -# Description: Makefile for win32 (mingw) version of Pidgin pixmaps -# - -PIDGIN_TREE_TOP := ../../../.. -include $(PIDGIN_TREE_TOP)/libpurple/win32/global.mak - -datadir = $(PIDGIN_INSTALL_DIR) -include ./Makefile.am - -.PHONY: install - -install: - if test '$(pidginstatuspix_DATA)'; then \ - mkdir -p $(pidginstatuspixdir); \ - cp $(pidginstatuspix_DATA) $(pidginstatuspixdir); \ - fi; - - $(MAKE) -C rtl -f Makefile.mingw install || exit 1; \ -
--- a/pidgin/pixmaps/status/16/rtl/Makefile.am Mon Nov 12 16:15:53 2007 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,6 +0,0 @@ -EXTRA_DIST = extended-away.png log-in.png log-out.png - -pidginstatuspixdir = $(datadir)/pixmaps/pidgin/status/16/rtl - -pidginstatuspix_DATA = $(EXTRA_DIST) -
--- a/pidgin/pixmaps/status/16/rtl/Makefile.mingw Mon Nov 12 16:15:53 2007 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,20 +0,0 @@ -# -# Makefile.mingw -# -# Description: Makefile for win32 (mingw) version of Pidgin pixmaps -# - -PIDGIN_TREE_TOP := ../../../../.. -include $(PIDGIN_TREE_TOP)/libpurple/win32/global.mak - -datadir = $(PIDGIN_INSTALL_DIR) -include ./Makefile.am - -.PHONY: install - -install: - if test '$(pidginstatuspix_DATA)'; then \ - mkdir -p $(pidginstatuspixdir); \ - cp $(pidginstatuspix_DATA) $(pidginstatuspixdir); \ - fi; -
--- a/pidgin/pixmaps/status/22/Makefile.am Mon Nov 12 16:15:53 2007 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,17 +0,0 @@ -SUBDIRS = rtl - -EXTRA_DIST = available.png \ - away.png \ - busy.png \ - chat.png \ - extended-away.png \ - invisible.png \ - log-in.png \ - log-out.png \ - offline.png \ - person.png - -pidginstatuspixdir = $(datadir)/pixmaps/pidgin/status/22 - -pidginstatuspix_DATA = $(EXTRA_DIST) -
--- a/pidgin/pixmaps/status/22/Makefile.mingw Mon Nov 12 16:15:53 2007 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,22 +0,0 @@ -# -# Makefile.mingw -# -# Description: Makefile for win32 (mingw) version of Pidgin pixmaps -# - -PIDGIN_TREE_TOP := ../../../.. -include $(PIDGIN_TREE_TOP)/libpurple/win32/global.mak - -datadir = $(PIDGIN_INSTALL_DIR) -include ./Makefile.am - -.PHONY: install - -install: - if test '$(pidginstatuspix_DATA)'; then \ - mkdir -p $(pidginstatuspixdir); \ - cp $(pidginstatuspix_DATA) $(pidginstatuspixdir); \ - fi; - - $(MAKE) -C rtl -f Makefile.mingw install || exit 1; \ -
--- a/pidgin/pixmaps/status/22/rtl/Makefile.am Mon Nov 12 16:15:53 2007 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,6 +0,0 @@ -EXTRA_DIST = extended-away.png log-in.png log-out.png - -pidginstatuspixdir = $(datadir)/pixmaps/pidgin/status/22/rtl - -pidginstatuspix_DATA = $(EXTRA_DIST) -
--- a/pidgin/pixmaps/status/22/rtl/Makefile.mingw Mon Nov 12 16:15:53 2007 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,20 +0,0 @@ -# -# Makefile.mingw -# -# Description: Makefile for win32 (mingw) version of Pidgin pixmaps -# - -PIDGIN_TREE_TOP := ../../../../.. -include $(PIDGIN_TREE_TOP)/libpurple/win32/global.mak - -datadir = $(PIDGIN_INSTALL_DIR) -include ./Makefile.am - -.PHONY: install - -install: - if test '$(pidginstatuspix_DATA)'; then \ - mkdir -p $(pidginstatuspixdir); \ - cp $(pidginstatuspix_DATA) $(pidginstatuspixdir); \ - fi; -
--- a/pidgin/pixmaps/status/32/Makefile.am Mon Nov 12 16:15:53 2007 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,17 +0,0 @@ -SUBDIRS = rtl - -EXTRA_DIST = available.png \ - away.png \ - busy.png \ - chat.png \ - extended-away.png \ - invisible.png \ - log-in.png \ - log-out.png \ - offline.png \ - person.png - -pidginstatuspixdir = $(datadir)/pixmaps/pidgin/status/32 - -pidginstatuspix_DATA = $(EXTRA_DIST) -
--- a/pidgin/pixmaps/status/32/Makefile.mingw Mon Nov 12 16:15:53 2007 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,22 +0,0 @@ -# -# Makefile.mingw -# -# Description: Makefile for win32 (mingw) version of Pidgin pixmaps -# - -PIDGIN_TREE_TOP := ../../../.. -include $(PIDGIN_TREE_TOP)/libpurple/win32/global.mak - -datadir = $(PIDGIN_INSTALL_DIR) -include ./Makefile.am - -.PHONY: install - -install: - if test '$(pidginstatuspix_DATA)'; then \ - mkdir -p $(pidginstatuspixdir); \ - cp $(pidginstatuspix_DATA) $(pidginstatuspixdir); \ - fi; - - $(MAKE) -C rtl -f Makefile.mingw install || exit 1; \ -
--- a/pidgin/pixmaps/status/32/rtl/Makefile.am Mon Nov 12 16:15:53 2007 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,6 +0,0 @@ -EXTRA_DIST = extended-away.png log-in.png log-out.png - -pidginstatuspixdir = $(datadir)/pixmaps/pidgin/status/32/rtl - -pidginstatuspix_DATA = $(EXTRA_DIST) -
--- a/pidgin/pixmaps/status/32/rtl/Makefile.mingw Mon Nov 12 16:15:53 2007 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,20 +0,0 @@ -# -# Makefile.mingw -# -# Description: Makefile for win32 (mingw) version of Pidgin pixmaps -# - -PIDGIN_TREE_TOP := ../../../../.. -include $(PIDGIN_TREE_TOP)/libpurple/win32/global.mak - -datadir = $(PIDGIN_INSTALL_DIR) -include ./Makefile.am - -.PHONY: install - -install: - if test '$(pidginstatuspix_DATA)'; then \ - mkdir -p $(pidginstatuspixdir); \ - cp $(pidginstatuspix_DATA) $(pidginstatuspixdir); \ - fi; -
--- a/pidgin/pixmaps/status/48/Makefile.am Mon Nov 12 16:15:53 2007 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,16 +0,0 @@ -SUBDIRS = rtl - -EXTRA_DIST = available.png \ - away.png \ - busy.png \ - chat.png \ - extended-away.png \ - log-in.png \ - log-out.png \ - offline.png \ - person.png - -pidginstatuspixdir = $(datadir)/pixmaps/pidgin/status/48 - -pidginstatuspix_DATA = $(EXTRA_DIST) -
--- a/pidgin/pixmaps/status/48/Makefile.mingw Mon Nov 12 16:15:53 2007 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,22 +0,0 @@ -# -# Makefile.mingw -# -# Description: Makefile for win32 (mingw) version of Pidgin pixmaps -# - -PIDGIN_TREE_TOP := ../../../.. -include $(PIDGIN_TREE_TOP)/libpurple/win32/global.mak - -datadir = $(PIDGIN_INSTALL_DIR) -include ./Makefile.am - -.PHONY: install - -install: - if test '$(pidginstatuspix_DATA)'; then \ - mkdir -p $(pidginstatuspixdir); \ - cp $(pidginstatuspix_DATA) $(pidginstatuspixdir); \ - fi; - - $(MAKE) -C rtl -f Makefile.mingw install || exit 1; \ -
--- a/pidgin/pixmaps/status/48/rtl/Makefile.am Mon Nov 12 16:15:53 2007 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,6 +0,0 @@ -EXTRA_DIST = extended-away.png - -pidginstatuspixdir = $(datadir)/pixmaps/pidgin/status/48/rtl - -pidginstatuspix_DATA = $(EXTRA_DIST) -
--- a/pidgin/pixmaps/status/48/rtl/Makefile.mingw Mon Nov 12 16:15:53 2007 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,20 +0,0 @@ -# -# Makefile.mingw -# -# Description: Makefile for win32 (mingw) version of Pidgin pixmaps -# - -PIDGIN_TREE_TOP := ../../../../.. -include $(PIDGIN_TREE_TOP)/libpurple/win32/global.mak - -datadir = $(PIDGIN_INSTALL_DIR) -include ./Makefile.am - -.PHONY: install - -install: - if test '$(pidginstatuspix_DATA)'; then \ - mkdir -p $(pidginstatuspixdir); \ - cp $(pidginstatuspix_DATA) $(pidginstatuspixdir); \ - fi; -
--- a/pidgin/pixmaps/toolbar/16/Makefile.am Mon Nov 12 16:15:53 2007 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,17 +0,0 @@ -EXTRA_DIST = change-bgcolor.png \ - change-fgcolor.png \ - emote-select.png \ - font-face.png \ - font-size-down.png \ - font-size-up.png \ - insert.png \ - insert-image.png \ - insert-link.png \ - message-new.png \ - plugins.png \ - send-file.png \ - unblock.png - -pidgintoolbarpixdir = $(datadir)/pixmaps/pidgin/toolbar/16 -pidgintoolbarpix_DATA = $(EXTRA_DIST) -
--- a/pidgin/pixmaps/toolbar/16/Makefile.mingw Mon Nov 12 16:15:53 2007 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,20 +0,0 @@ -# -# Makefile.mingw -# -# Description: Makefile for win32 (mingw) version of Pidgin pixmaps -# - -PIDGIN_TREE_TOP := ../../../.. -include $(PIDGIN_TREE_TOP)/libpurple/win32/global.mak - -datadir = $(PIDGIN_INSTALL_DIR) -include ./Makefile.am - -.PHONY: install - -install: - if test '$(pidgintoolbarpix_DATA)'; then \ - mkdir -p $(pidgintoolbarpixdir); \ - cp $(pidgintoolbarpix_DATA) $(pidgintoolbarpixdir); \ - fi; -
--- a/pidgin/pixmaps/toolbar/22/Makefile.am Mon Nov 12 16:15:53 2007 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,5 +0,0 @@ -EXTRA_DIST = select-avatar.png - -pidgintoolbarpixdir = $(datadir)/pixmaps/pidgin/toolbar/22 -pidgintoolbarpix_DATA = $(EXTRA_DIST) -
--- a/pidgin/pixmaps/toolbar/22/Makefile.mingw Mon Nov 12 16:15:53 2007 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,20 +0,0 @@ -# -# Makefile.mingw -# -# Description: Makefile for win32 (mingw) version of Pidgin pixmaps -# - -PIDGIN_TREE_TOP := ../../../.. -include $(PIDGIN_TREE_TOP)/libpurple/win32/global.mak - -datadir = $(PIDGIN_INSTALL_DIR) -include ./Makefile.am - -.PHONY: install - -install: - if test '$(pidgintoolbarpix_DATA)'; then \ - mkdir -p $(pidgintoolbarpixdir); \ - cp $(pidgintoolbarpix_DATA) $(pidgintoolbarpixdir); \ - fi; -
--- a/pidgin/pixmaps/tray/16/Makefile.am Mon Nov 12 16:15:53 2007 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,22 +0,0 @@ -TRAY_ICONS = tray-away.png \ - tray-busy.png \ - tray-invisible.png \ - tray-connecting.png \ - tray-extended-away.png \ - tray-message.png \ - tray-new-im.png \ - tray-offline.png \ - tray-online.png - -EXTRA_DIST = $(TRAY_ICONS) \ - available_4bit.ico \ - away_4bit.ico \ - busy_4bit.ico \ - connecting_4bit.ico \ - extended-away_4bit.ico \ - invisible_4bit.ico \ - message_4bit.ico \ - offline_4bit.ico - -pidgintraypixdir = $(datadir)/pixmaps/pidgin/tray/16 -pidgintraypix_DATA = $(TRAY_ICONS)
--- a/pidgin/pixmaps/tray/16/Makefile.mingw Mon Nov 12 16:15:53 2007 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,20 +0,0 @@ -# -# Makefile.mingw -# -# Description: Makefile for win32 (mingw) version of Pidgin pixmaps -# - -PIDGIN_TREE_TOP := ../../../.. -include $(PIDGIN_TREE_TOP)/libpurple/win32/global.mak - -datadir = $(PIDGIN_INSTALL_DIR) -include ./Makefile.am - -.PHONY: install - -install: - if test '$(pidgintraypix_DATA)'; then \ - mkdir -p $(pidgintraypixdir); \ - cp $(pidgintraypix_DATA) $(pidgintraypixdir); \ - fi; -
--- a/pidgin/pixmaps/tray/16/scalable/Makefile.am Mon Nov 12 16:15:53 2007 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,8 +0,0 @@ -EXTRA_DIST = tray-away.svg \ - tray-busy.svg \ - tray-connecting.svg \ - tray-extended-away.svg \ - tray-invisible.svg \ - tray-message.svg \ - tray-offline.svg \ - tray-online.svg
--- a/pidgin/pixmaps/tray/22/Makefile.am Mon Nov 12 16:15:53 2007 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,14 +0,0 @@ -TRAY_ICONS = tray-away.png \ - tray-busy.png \ - tray-connecting.png \ - tray-extended-away.png \ - tray-invisible.png \ - tray-message.png \ - tray-new-im.png \ - tray-offline.png \ - tray-online.png - -EXTRA_DIST = $(TRAY_ICONS) - -pidgintraypixdir = $(datadir)/pixmaps/pidgin/tray/22 -pidgintraypix_DATA = $(TRAY_ICONS)
--- a/pidgin/pixmaps/tray/22/Makefile.mingw Mon Nov 12 16:15:53 2007 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,20 +0,0 @@ -# -# Makefile.mingw -# -# Description: Makefile for win32 (mingw) version of Pidgin pixmaps -# - -PIDGIN_TREE_TOP := ../../../.. -include $(PIDGIN_TREE_TOP)/libpurple/win32/global.mak - -datadir = $(PIDGIN_INSTALL_DIR) -include ./Makefile.am - -.PHONY: install - -install: - if test '$(pidgintraypix_DATA)'; then \ - mkdir -p $(pidgintraypixdir); \ - cp $(pidgintraypix_DATA) $(pidgintraypixdir); \ - fi; -
--- a/pidgin/pixmaps/tray/22/scalable/Makefile.am Mon Nov 12 16:15:53 2007 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1 +0,0 @@ -EXTRA_DIST = tray-invisible.svg
--- a/pidgin/pixmaps/tray/32/Makefile.am Mon Nov 12 16:15:53 2007 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,13 +0,0 @@ -TRAY_ICONS = tray-away.png \ - tray-busy.png \ - tray-connecting.png \ - tray-extended-away.png \ - tray-invisible.png \ - tray-new-im.png \ - tray-offline.png \ - tray-online.png - -EXTRA_DIST = $(TRAY_ICONS) - -pidgintraypixdir = $(datadir)/pixmaps/pidgin/tray/32 -pidgintraypix_DATA = $(TRAY_ICONS)
--- a/pidgin/pixmaps/tray/32/Makefile.mingw Mon Nov 12 16:15:53 2007 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,20 +0,0 @@ -# -# Makefile.mingw -# -# Description: Makefile for win32 (mingw) version of Pidgin pixmaps -# - -PIDGIN_TREE_TOP := ../../../.. -include $(PIDGIN_TREE_TOP)/libpurple/win32/global.mak - -datadir = $(PIDGIN_INSTALL_DIR) -include ./Makefile.am - -.PHONY: install - -install: - if test '$(pidgintraypix_DATA)'; then \ - mkdir -p $(pidgintraypixdir); \ - cp $(pidgintraypix_DATA) $(pidgintraypixdir); \ - fi; -
--- a/pidgin/pixmaps/tray/48/Makefile.am Mon Nov 12 16:15:53 2007 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,13 +0,0 @@ -TRAY_ICONS = tray-away.png \ - tray-busy.png \ - tray-connecting.png \ - tray-extended-away.png \ - tray-invisible.png \ - tray-new-im.png \ - tray-offline.png \ - tray-online.png - -EXTRA_DIST = $(TRAY_ICONS) - -pidgintraypixdir = $(datadir)/pixmaps/pidgin/tray/48 -pidgintraypix_DATA = $(TRAY_ICONS)
--- a/pidgin/pixmaps/tray/48/Makefile.mingw Mon Nov 12 16:15:53 2007 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,20 +0,0 @@ -# -# Makefile.mingw -# -# Description: Makefile for win32 (mingw) version of Pidgin pixmaps -# - -PIDGIN_TREE_TOP := ../../../.. -include $(PIDGIN_TREE_TOP)/libpurple/win32/global.mak - -datadir = $(PIDGIN_INSTALL_DIR) -include ./Makefile.am - -.PHONY: install - -install: - if test '$(pidgintraypix_DATA)'; then \ - mkdir -p $(pidgintraypixdir); \ - cp $(pidgintraypix_DATA) $(pidgintraypixdir); \ - fi; -
--- a/pidgin/plugins/cap/cap.c Mon Nov 12 16:15:53 2007 +0000 +++ b/pidgin/plugins/cap/cap.c Mon Nov 12 16:53:54 2007 +0000 @@ -437,6 +437,7 @@ static void buddy_idle(PurpleBuddy *buddy, gboolean old_idle, gboolean idle) { } +#if 0 static void blist_node_extended_menu(PurpleBlistNode *node, GList **menu) { PurpleBuddy *buddy; PurpleMenuAction *menu_action; @@ -451,6 +452,7 @@ PURPLE_CALLBACK(display_statistics_action_cb), NULL, NULL); *menu = g_list_append(*menu, menu_action); } +#endif /* drawing-tooltip */ static void drawing_tooltip(PurpleBlistNode *node, GString *text, gboolean full) {
--- a/pidgin/plugins/cap/cap.h Mon Nov 12 16:15:53 2007 +0000 +++ b/pidgin/plugins/cap/cap.h Mon Nov 12 16:53:54 2007 +0000 @@ -99,7 +99,6 @@ /* buddy-signed-off */ static void buddy_signed_off(PurpleBuddy *buddy); static void buddy_idle(PurpleBuddy *buddy, gboolean old_idle, gboolean idle); -static void blist_node_extended_menu(PurpleBlistNode *node, GList **menu); /* drawing-tooltip */ static void drawing_tooltip(PurpleBlistNode *node, GString *text, gboolean full); /* signed-on */
--- a/po/ChangeLog Mon Nov 12 16:15:53 2007 +0000 +++ b/po/ChangeLog Mon Nov 12 16:53:54 2007 +0000 @@ -1,5 +1,8 @@ Pidgin and Finch: The Pimpin' Penguin IM Clients That're Good for the Soul +version 2.3.0 + * German translation updated (Bjoern Voigt, Jochen Kemnade) + version 2.2.3 * Belarusian Latin translation updated (Ihar Hrachyshka) * Indonesian translation updated (Rai S. Regawa)
--- a/po/POTFILES.in Mon Nov 12 16:15:53 2007 +0000 +++ b/po/POTFILES.in Mon Nov 12 16:53:54 2007 +0000 @@ -103,6 +103,16 @@ libpurple/protocols/msn/state.c libpurple/protocols/msn/switchboard.c libpurple/protocols/msn/userlist.c +libpurple/protocols/msnp9/dialog.c +libpurple/protocols/msnp9/error.c +libpurple/protocols/msnp9/msn.c +libpurple/protocols/msnp9/nexus.c +libpurple/protocols/msnp9/notification.c +libpurple/protocols/msnp9/servconn.c +libpurple/protocols/msnp9/session.c +libpurple/protocols/msnp9/state.c +libpurple/protocols/msnp9/switchboard.c +libpurple/protocols/msnp9/userlist.c libpurple/protocols/myspace/myspace.c libpurple/protocols/myspace/user.c libpurple/protocols/myspace/zap.c
--- a/po/de.po Mon Nov 12 16:15:53 2007 +0000 +++ b/po/de.po Mon Nov 12 16:53:54 2007 +0000 @@ -12,8 +12,8 @@ msgstr "" "Project-Id-Version: de\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2007-11-09 20:52+0100\n" -"PO-Revision-Date: 2007-11-09 21:57+0100\n" +"POT-Creation-Date: 2007-11-12 09:54+0100\n" +"PO-Revision-Date: 2007-11-12 09:54+0100\n" "Last-Translator: Jochen Kemnade <jochenkemnade@web.de>\n" "Language-Team: Deutsch <de@li.org>\n" "MIME-Version: 1.0\n" @@ -1948,11 +1948,8 @@ msgstr "Konnte Ihr Plugin nicht laden." #, c-format -msgid "The dependent plugin %s failed to unload." -msgstr "Das erforderliche Plugin %s konnte nicht entladen werden." - -msgid "There were errors unloading the plugin." -msgstr "Beim Entladen des Plugins traten Fehler auf." +msgid "%s requires %s, but it failed to unload." +msgstr "%s hängt von %s ab, konnte aber nicht entladen werden." msgid "Autoaccept" msgstr "Auto-Akzeptieren" @@ -2596,7 +2593,6 @@ "Informationen besuchen Sie die FAQ unter: http://developer.pidgin.im/wiki/" "Using%20Pidgin#CanIusePidginforBonjourLink-LocalMessaging." -#. Send a message about the connection error msgid "Unable to listen for incoming IM connections\n" msgstr "Kann nicht auf eingehende IM-Verbindungen hören\n" @@ -2684,12 +2680,13 @@ msgid "Your buddylist is empty, nothing was written to the file." msgstr "Ihre Buddy-Liste ist leer, es wurde nichts in die Datei geschrieben." -msgid "Couldn't open file" -msgstr "Kann Datei nicht öffnen" - msgid "Buddylist saved successfully!" msgstr "Buddy-Liste wurde erfolgreich gespeichert!" +#, c-format +msgid "Couldn't write buddy list for %s to %s" +msgstr "Konnte Buddy-Liste für %s nicht nach %s schreiben" + msgid "Couldn't load buddylist" msgstr "Konnte Buddy-Liste nicht laden" @@ -2967,8 +2964,6 @@ msgid "SSL support unavailable" msgstr "SSL-Unterstützung nicht verfügbar" -#. TODO: try other ports if in auto mode, then save -#. * working port and try that first next time. msgid "Couldn't create socket" msgstr "Kann Socket nicht erstellen" @@ -3405,7 +3400,6 @@ msgid "Server does not use any supported authentication method" msgstr "Der Server benutzt keine der unterstützten Authentifizierungsmethoden" -#. This should never happen! msgid "Invalid response from server." msgstr "Ungültige Serverantwort." @@ -3814,9 +3808,6 @@ msgid "Find Rooms" msgstr "Finde Räume" -msgid "Error initializing session" -msgstr "Fehler bei Initialisieren der Sitzung" - msgid "You require encryption, but it is not available on this server." msgstr "" "Sie fordern Verschlüsselung, aber diese ist auf dem Server nicht verfügbar." @@ -3959,9 +3950,15 @@ msgid "Mood" msgstr "Stimmung" +msgid "Current media" +msgstr "Aktuelles Medium" + msgid "Mood Text" msgstr "Stimmungstext" +msgid "Allow Buzz" +msgstr "Anklopfen erlauben" + msgid "Tune Artist" msgstr "Künstler anpassen" @@ -3989,9 +3986,6 @@ msgid "Tune URL" msgstr "URL anpassen" -msgid "Allow Buzz" -msgstr "Anklopfen erlauben" - msgid "Password Changed" msgstr "Passwort geändert" @@ -4674,9 +4668,6 @@ msgid "Page" msgstr "Nachricht" -msgid "Current media" -msgstr "Aktuelles Medium" - msgid "Be Right Back" msgstr "Bin gleich zurück" @@ -4689,6 +4680,12 @@ msgid "Out to Lunch" msgstr "Zur Mittagspause" +msgid "Artist" +msgstr "Interpret" + +msgid "Album" +msgstr "Album" + msgid "Set Friendly Name..." msgstr "Setze Spitzname..." @@ -5128,6 +5125,22 @@ msgid "The screen name specified is invalid." msgstr "Der angegebene Benutzername ist ungültig." +msgid "Has you" +msgstr "Hat Sie" + +#. *< type +#. *< ui_requirement +#. *< flags +#. *< dependencies +#. *< priority +#. *< id +#. *< name +#. *< version +#. * summary +#. * description +msgid "MSN Protocol Plugin" +msgstr "MSN-Protokoll-Plugin" + msgid "Missing Cipher" msgstr "Verschlüsselung fehlt" @@ -5235,7 +5248,6 @@ msgid "Invalid input condition" msgstr "Ungültige Eingabebedingung" -#. TODO: g_realloc like msn, yahoo, irc, jabber? msgid "Read buffer full" msgstr "Lesepuffer voll" @@ -5661,9 +5673,6 @@ msgid "GroupWise Conference %d" msgstr "GroupWise-Konferenz %d" -msgid "Unable to make SSL connection to server." -msgstr "Kann keine SSL-Verbindung zum Server herstellen." - msgid "Authenticating..." msgstr "Authentifizierung..." @@ -5705,10 +5714,6 @@ "%s scheint offline zu sein und hat die Nachricht, die Sie gerade gesendet " "haben, nicht empfangen." -#. TODO: Would be nice to prompt if not set! -#. * purple_request_fields(gc, _("Server Address"),...); -#. -#. ...but for now just error out with a nice message. msgid "" "Unable to connect to server. Please enter the address of the server you wish " "to connect to." @@ -6043,12 +6048,14 @@ "sein oder mit einem Buchstaben beginnen und nur Buchstaben, Ziffern und " "Leerzeichen enthalten oder nur aus Ziffern bestehen." +#. Unregistered screen name msgid "Invalid screen name." msgstr "Ungültiger Benutzername." msgid "Incorrect password." msgstr "Falsches Passwort." +#. Suspended account msgid "Your account is currently suspended." msgstr "Ihr Benutzerkonto ist momentan gesperrt." @@ -6056,6 +6063,8 @@ msgid "The AOL Instant Messenger service is temporarily unavailable." msgstr "Der AOL-Sofortnachrichtendienst ist zur Zeit nicht erreichbar." +#. screen name connecting too frequently +#. IP address connecting too frequently msgid "" "You have been connecting and disconnecting too frequently. Wait ten minutes " "and try again. If you continue to try, you will need to wait even longer." @@ -6064,6 +6073,7 @@ "versuchen Sie es noch einmal. Wenn Sie es weiterversuchen, müssen Sie sogar " "noch länger warten." +#. client too old #, c-format msgid "The client version you are using is too old. Please upgrade at %s" msgstr "" @@ -6086,6 +6096,13 @@ #. * #. * A wrapper for purple_request_action() that uses @c OK and @c Cancel buttons. +#. * +#. * @since 2.3.0 +#. +#. * +#. * A wrapper for purple_request_action() that uses @c OK and @c Cancel buttons. +#. * +#. * @deprecated Please use purple_request_ok_cancel_with_hint instead. #. msgid "_OK" msgstr "_OK" @@ -7143,7 +7160,6 @@ msgid "Connection lost" msgstr "Verbindung verloren" -#. cancel login progress msgid "Login failed, no reply" msgstr "Anmeldung fehlgeschlagen, keine Antwort" @@ -8639,7 +8655,6 @@ msgid "Could not load SILC key pair: %s" msgstr "Konnte SILC-Schlüsselpaar nicht laden: %s" -#. TODO: do we really want to disconnect on a failure to write? msgid "Could not write" msgstr "Konnte nicht schreiben" @@ -9021,7 +9036,7 @@ msgid "Activate which ID?" msgstr "Welche ID aktivieren?" -msgid "Join whom in chat?" +msgid "Join who in chat?" msgstr "Wen wollen Sie zum Chat einladen?" msgid "Activate ID..." @@ -9100,7 +9115,6 @@ msgid "Unable to establish file descriptor." msgstr "Konnte Dateibeschreibung nicht erstellen." -#. TODO: what to do here - do we really have to disconnect? msgid "Write Error" msgstr "Schreibfehler" @@ -9406,6 +9420,13 @@ #. * #. * A wrapper for purple_request_action() that uses @c Yes and @c No buttons. +#. * +#. * @since 2.3.0 +#. +#. * +#. * A wrapper for purple_request_action() that uses @c Yes and @c No buttons. +#. * +#. * @deprecated Please use purple_request_yes_no_with_hint instead. #. msgid "_Yes" msgstr "_Ja" @@ -9415,6 +9436,13 @@ #. * #. * A wrapper for purple_request_action() that uses Accept and Cancel buttons. +#. * +#. * @since 2.3.0 +#. +#. * +#. * A wrapper for purple_request_action() that uses Accept and Cancel buttons. +#. * +#. * @deprecated Please use purple_request_accept_cancel_with_hint instead. #. msgid "_Accept" msgstr "_Akzeptieren" @@ -9479,6 +9507,9 @@ msgid "Mobile" msgstr "Mobil" +msgid "Listening to music" +msgstr "" + #, c-format msgid "%s changed status from %s to %s" msgstr "%s hat den Status von %s zu %s geändert" @@ -10038,8 +10069,28 @@ msgstr "%s abgemeldet" #, c-format -msgid "<span color=\"red\">%s disconnected: %s</span>" -msgstr "<span color=\"red\">%s abgemeldet: %s</span>" +msgid "%s disabled" +msgstr "%s deaktiviert" + +msgid "Reconnect" +msgstr "Wiederverbinden" + +msgid "Re-enable" +msgstr "Reaktivieren" + +msgid "Ignore" +msgstr "Ignorieren" + +#, c-format +msgid "%d account was disabled because you signed on from another location." +msgid_plural "" +"%d accounts were disabled because you signed on from another location." +msgstr[0] "" +"%d Konto wurde deaktiviert, da Sie sich von einem anderen Ort angemeldet " +"haben." +msgstr[1] "" +"%d Konten wurden deaktiviert, da Sie sich von einem anderen Ort angemeldet " +"haben." msgid "<b>Username:</b>" msgstr "<b>Benutzername:</b>" @@ -10160,18 +10211,6 @@ msgid "SSL Servers" msgstr "SSL-Server" -#, c-format -msgid "" -"%s\n" -"\n" -"%s will not attempt to reconnect the account until you correct the error and " -"re-enable the account." -msgstr "" -"%s\n" -"\n" -"%s wird nicht versuchen, das Konto wieder zu verbinden bis Sie den Fehler " -"behoben und das Konto wieder aktiviert haben." - msgid "Unknown command." msgstr "Unbekanntes Kommando." @@ -10217,9 +10256,6 @@ msgid "Un-Ignore" msgstr "Nicht Ignorieren" -msgid "Ignore" -msgstr "Ignorieren" - msgid "Get Away Message" msgstr "Neue Abwesenheitsnachricht abholen" @@ -10800,6 +10836,9 @@ msgid "_Name" msgstr "_Name" +msgid "Buddy" +msgstr "Buddy" + msgid "_Account" msgstr "_Konto" @@ -11407,6 +11446,16 @@ msgid "Unload Plugins" msgstr "Plugins entladen" +msgid "Could not unload plugin" +msgstr "Konnte das Plugin nicht entladen" + +msgid "" +"The plugin could not be unloaded now, but will be disabled at the next " +"startup." +msgstr "" +"Das Plugin kann im Moment nicht entladen werden, wird aber beim nächsten " +"Start deaktiviert." + #, c-format msgid "" "%s%s<span weight=\"bold\">Written by:</span>\t%s\n" @@ -13086,9 +13135,3 @@ msgid "This plugin is useful for debbuging XMPP servers or clients." msgstr "" "Dieses Plugin ist nützlich zur Fehlersuche in XMPP-Servern oder -Clients." - -#~ msgid "Unable to connect to contact server" -#~ msgstr "Verbindung zum Kontaktserver nicht möglich" - -#~ msgid "Unable to connect to OIM server" -#~ msgstr "Verbindung zum OIM-Server nicht möglich"
--- a/po/hu.po Mon Nov 12 16:15:53 2007 +0000 +++ b/po/hu.po Mon Nov 12 16:53:54 2007 +0000 @@ -1,17 +1,16 @@ -# translation of pid.hu.po to Hungarian -# Hungarian translation of gaim. +# Hungarian translation of pidgin. # Copyright (C) 2003, 2005, 2006, 2007 Free Software Foundation, Inc. -# This file is distributed under the same license as the gaim package. +# This file is distributed under the same license as the Pidgin package. # The Hungarian translation of Gaim was sponsored by Novell Hungary, many thanks for it! # # Zoltan Sutto <suttozoltan@chello.hu>, 2003. # Gabor Kelemen <kelemeng@gnome.hu>, 2005, 2006, 2007. msgid "" msgstr "" -"Project-Id-Version: gaim 2.0-beta\n" +"Project-Id-Version: pidgin 2.2.x\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2007-09-28 15:32-0500\n" -"PO-Revision-Date: 2007-09-10 12:28+0200\n" +"POT-Creation-Date: 2007-11-11 15:31+0100\n" +"PO-Revision-Date: 2007-11-11 18:43+0100\n" "Last-Translator: Gabor Kelemen <kelemeng@gnome.hu>\n" "Language-Team: Hungarian <gnome@gnome.hu>\n" "MIME-Version: 1.0\n" @@ -51,7 +50,7 @@ " -n, --nologin ne jelentkezzen be automatikusan\n" " -v, --version az aktuális verzió megjelenítése és kilépés\n" -#: ../finch/finch.c:328 ../pidgin/gtkmain.c:711 +#: ../finch/finch.c:328 ../pidgin/gtkmain.c:718 #, c-format msgid "" "%s encountered errors migrating your settings from %s to %s. Please " @@ -63,17 +62,17 @@ "developer.pidgin.im oldalon." #: ../finch/gntaccount.c:124 ../finch/gntaccount.c:484 ../finch/gntblist.c:300 -#: ../finch/gntblist.c:433 ../finch/gntblist.c:446 ../finch/gntplugin.c:186 -#: ../finch/gntplugin.c:234 ../finch/gntstatus.c:301 ../finch/gntstatus.c:310 +#: ../finch/gntblist.c:433 ../finch/gntblist.c:446 ../finch/gntplugin.c:189 +#: ../finch/gntplugin.c:237 ../finch/gntstatus.c:301 ../finch/gntstatus.c:310 #: ../finch/plugins/gntclipboard.c:115 ../finch/plugins/gntclipboard.c:121 #: ../finch/plugins/gntclipboard.c:128 -#: ../libpurple/protocols/jabber/buddy.c:2029 +#: ../libpurple/protocols/jabber/buddy.c:2032 #: ../libpurple/protocols/jabber/chat.c:677 #: ../libpurple/protocols/jabber/chat.c:688 -#: ../libpurple/protocols/jabber/jabber.c:1515 +#: ../libpurple/protocols/jabber/jabber.c:1522 #: ../libpurple/protocols/qq/group_join.c:328 #: ../libpurple/protocols/qq/im.c:576 ../libpurple/protocols/silc/ops.c:57 -#: ../libpurple/protocols/silc/ops.c:1456 +#: ../libpurple/protocols/silc/ops.c:1460 #: ../libpurple/protocols/silc10/ops.c:1451 msgid "Error" msgstr "Hiba" @@ -102,8 +101,8 @@ msgid "(You probably forgot to 'make install'.)" msgstr "(valószínűleg elfelejtette kiadni a \"make install\" parancsot)" -#: ../finch/gntaccount.c:496 ../finch/gntconn.c:136 -#: ../pidgin/gtkaccount.c:1473 ../pidgin/gtkblist.c:4040 +#: ../finch/gntaccount.c:496 ../finch/gntconn.c:137 +#: ../pidgin/gtkaccount.c:1478 ../pidgin/gtkblist.c:4388 msgid "Modify Account" msgstr "Fiók módosítása" @@ -133,32 +132,36 @@ #: ../finch/gntaccount.c:575 ../finch/gntaccount.c:638 #: ../finch/gntaccount.c:889 ../finch/gntblist.c:344 ../finch/gntblist.c:421 #: ../finch/gntblist.c:456 ../finch/gntblist.c:803 ../finch/gntblist.c:1005 -#: ../finch/gntblist.c:1101 ../finch/gntblist.c:2222 ../finch/gntcertmgr.c:91 -#: ../finch/gntplugin.c:379 ../finch/gntpounce.c:459 ../finch/gntpounce.c:667 -#: ../finch/gntprefs.c:265 ../finch/gntsound.c:1058 ../finch/gntstatus.c:145 -#: ../finch/gntstatus.c:485 ../finch/gntstatus.c:610 -#: ../libpurple/account.c:1013 ../libpurple/account.c:1263 -#: ../libpurple/account.c:1298 ../libpurple/conversation.c:1215 -#: ../libpurple/plugins/buddynote.c:51 ../libpurple/protocols/gg/gg.c:507 -#: ../libpurple/protocols/gg/gg.c:666 ../libpurple/protocols/gg/gg.c:803 -#: ../libpurple/protocols/gg/gg.c:884 +#: ../finch/gntblist.c:1101 ../finch/gntblist.c:2224 ../finch/gntblist.c:2287 +#: ../finch/gntcertmgr.c:91 ../finch/gntplugin.c:475 ../finch/gntpounce.c:472 +#: ../finch/gntpounce.c:680 ../finch/gntprefs.c:265 ../finch/gntsound.c:1058 +#: ../finch/gntstatus.c:145 ../finch/gntstatus.c:485 ../finch/gntstatus.c:610 +#: ../libpurple/account.c:1016 ../libpurple/account.c:1305 +#: ../libpurple/account.c:1340 ../libpurple/conversation.c:1215 +#: ../libpurple/plugins/buddynote.c:51 ../libpurple/protocols/gg/gg.c:517 +#: ../libpurple/protocols/gg/gg.c:676 ../libpurple/protocols/gg/gg.c:813 +#: ../libpurple/protocols/gg/gg.c:895 #: ../libpurple/protocols/jabber/buddy.c:728 -#: ../libpurple/protocols/jabber/buddy.c:2413 -#: ../libpurple/protocols/jabber/buddy.c:2449 +#: ../libpurple/protocols/jabber/buddy.c:2426 +#: ../libpurple/protocols/jabber/buddy.c:2462 #: ../libpurple/protocols/jabber/chat.c:786 #: ../libpurple/protocols/jabber/jabber.c:1008 #: ../libpurple/protocols/jabber/jabber.c:1017 -#: ../libpurple/protocols/jabber/jabber.c:1737 +#: ../libpurple/protocols/jabber/jabber.c:1715 #: ../libpurple/protocols/jabber/si.c:874 -#: ../libpurple/protocols/jabber/usermood.c:184 +#: ../libpurple/protocols/jabber/usermood.c:202 #: ../libpurple/protocols/jabber/usernick.c:78 #: ../libpurple/protocols/jabber/xdata.c:400 -#: ../libpurple/protocols/msn/msn.c:287 ../libpurple/protocols/msn/msn.c:304 -#: ../libpurple/protocols/msn/msn.c:321 ../libpurple/protocols/msn/msn.c:338 -#: ../libpurple/protocols/msn/msn.c:359 -#: ../libpurple/protocols/oscar/oscar.c:6094 -#: ../libpurple/protocols/oscar/peer.c:1046 -#: ../libpurple/protocols/qq/buddy_info.c:484 +#: ../libpurple/protocols/msn/msn.c:291 ../libpurple/protocols/msn/msn.c:308 +#: ../libpurple/protocols/msn/msn.c:325 ../libpurple/protocols/msn/msn.c:342 +#: ../libpurple/protocols/msn/msn.c:363 ../libpurple/protocols/msnp9/msn.c:287 +#: ../libpurple/protocols/msnp9/msn.c:304 +#: ../libpurple/protocols/msnp9/msn.c:321 +#: ../libpurple/protocols/msnp9/msn.c:338 +#: ../libpurple/protocols/msnp9/msn.c:359 +#: ../libpurple/protocols/oscar/oscar.c:6149 +#: ../libpurple/protocols/oscar/peer.c:1048 +#: ../libpurple/protocols/qq/buddy_info.c:525 #: ../libpurple/protocols/qq/buddy_opt.c:214 #: ../libpurple/protocols/qq/buddy_opt.c:411 #: ../libpurple/protocols/qq/group.c:124 @@ -169,60 +172,60 @@ #: ../libpurple/protocols/qq/sys_msg.c:113 #: ../libpurple/protocols/qq/sys_msg.c:172 #: ../libpurple/protocols/qq/sys_msg.c:266 -#: ../libpurple/protocols/sametime/sametime.c:3388 -#: ../libpurple/protocols/sametime/sametime.c:3474 -#: ../libpurple/protocols/sametime/sametime.c:3645 -#: ../libpurple/protocols/sametime/sametime.c:5397 -#: ../libpurple/protocols/sametime/sametime.c:5487 -#: ../libpurple/protocols/sametime/sametime.c:5612 +#: ../libpurple/protocols/sametime/sametime.c:3389 +#: ../libpurple/protocols/sametime/sametime.c:3475 +#: ../libpurple/protocols/sametime/sametime.c:3646 +#: ../libpurple/protocols/sametime/sametime.c:5398 +#: ../libpurple/protocols/sametime/sametime.c:5488 +#: ../libpurple/protocols/sametime/sametime.c:5613 #: ../libpurple/protocols/silc/buddy.c:455 -#: ../libpurple/protocols/silc/buddy.c:1076 -#: ../libpurple/protocols/silc/buddy.c:1191 -#: ../libpurple/protocols/silc/chat.c:616 -#: ../libpurple/protocols/silc/chat.c:746 -#: ../libpurple/protocols/silc/ops.c:1816 -#: ../libpurple/protocols/silc/silc.c:823 -#: ../libpurple/protocols/silc/silc.c:1031 +#: ../libpurple/protocols/silc/buddy.c:1079 +#: ../libpurple/protocols/silc/buddy.c:1194 +#: ../libpurple/protocols/silc/chat.c:620 +#: ../libpurple/protocols/silc/chat.c:750 +#: ../libpurple/protocols/silc/ops.c:1820 +#: ../libpurple/protocols/silc/silc.c:954 +#: ../libpurple/protocols/silc/silc.c:1162 #: ../libpurple/protocols/silc10/buddy.c:468 -#: ../libpurple/protocols/silc10/buddy.c:1084 -#: ../libpurple/protocols/silc10/buddy.c:1189 +#: ../libpurple/protocols/silc10/buddy.c:1087 +#: ../libpurple/protocols/silc10/buddy.c:1192 #: ../libpurple/protocols/silc10/chat.c:600 #: ../libpurple/protocols/silc10/chat.c:730 #: ../libpurple/protocols/silc10/ops.c:1904 #: ../libpurple/protocols/silc10/silc.c:736 -#: ../libpurple/protocols/silc10/silc.c:942 -#: ../libpurple/protocols/yahoo/yahoo.c:1032 -#: ../libpurple/protocols/yahoo/yahoo.c:3498 -#: ../libpurple/protocols/yahoo/yahoo.c:3509 ../pidgin/gtkaccount.c:1908 -#: ../pidgin/gtkaccount.c:2495 ../pidgin/gtkblist.c:5967 -#: ../pidgin/gtkcertmgr.c:197 ../pidgin/gtkdialogs.c:773 -#: ../pidgin/gtkdialogs.c:912 ../pidgin/gtkdialogs.c:1004 -#: ../pidgin/gtkdialogs.c:1024 ../pidgin/gtkdialogs.c:1048 -#: ../pidgin/gtkdialogs.c:1070 ../pidgin/gtkdialogs.c:1118 -#: ../pidgin/gtkdialogs.c:1159 ../pidgin/gtkdialogs.c:1215 -#: ../pidgin/gtkdialogs.c:1254 ../pidgin/gtkdialogs.c:1281 -#: ../pidgin/gtkimhtmltoolbar.c:435 ../pidgin/gtklog.c:328 -#: ../pidgin/gtkplugin.c:289 ../pidgin/gtkpounce.c:1101 -#: ../pidgin/gtkprivacy.c:563 ../pidgin/gtkprivacy.c:579 -#: ../pidgin/gtkprivacy.c:604 ../pidgin/gtkprivacy.c:618 -#: ../pidgin/gtkrequest.c:271 ../pidgin/gtksavedstatuses.c:345 -#: ../pidgin/gtkstatusbox.c:1574 +#: ../libpurple/protocols/silc10/silc.c:943 +#: ../libpurple/protocols/yahoo/yahoo.c:1034 +#: ../libpurple/protocols/yahoo/yahoo.c:3500 +#: ../libpurple/protocols/yahoo/yahoo.c:3511 ../pidgin/gtkaccount.c:1913 +#: ../pidgin/gtkaccount.c:2501 ../pidgin/gtkblist.c:6346 +#: ../pidgin/gtkcertmgr.c:197 ../pidgin/gtkdialogs.c:787 +#: ../pidgin/gtkdialogs.c:926 ../pidgin/gtkdialogs.c:1018 +#: ../pidgin/gtkdialogs.c:1038 ../pidgin/gtkdialogs.c:1062 +#: ../pidgin/gtkdialogs.c:1084 ../pidgin/gtkdialogs.c:1132 +#: ../pidgin/gtkdialogs.c:1173 ../pidgin/gtkdialogs.c:1229 +#: ../pidgin/gtkdialogs.c:1268 ../pidgin/gtkdialogs.c:1295 +#: ../pidgin/gtkimhtmltoolbar.c:437 ../pidgin/gtklog.c:328 +#: ../pidgin/gtkplugin.c:289 ../pidgin/gtkpounce.c:1121 +#: ../pidgin/gtkprivacy.c:565 ../pidgin/gtkprivacy.c:581 +#: ../pidgin/gtkprivacy.c:606 ../pidgin/gtkprivacy.c:620 +#: ../pidgin/gtkrequest.c:321 ../pidgin/gtksavedstatuses.c:345 +#: ../pidgin/gtkstatusbox.c:1593 msgid "Cancel" msgstr "Mégsem" #. Save button #. Save -#: ../finch/gntaccount.c:579 ../finch/gntcertmgr.c:311 -#: ../finch/gntplugin.c:379 ../finch/gntpounce.c:465 ../finch/gntprefs.c:265 +#: ../finch/gntaccount.c:579 ../finch/gntcertmgr.c:311 ../finch/gntdebug.c:297 +#: ../finch/gntplugin.c:475 ../finch/gntpounce.c:478 ../finch/gntprefs.c:265 #: ../finch/gntsound.c:1055 ../finch/gntstatus.c:488 ../finch/gntstatus.c:598 -#: ../libpurple/account.c:1297 ../libpurple/plugins/buddynote.c:50 -#: ../libpurple/protocols/jabber/buddy.c:727 ../pidgin/gtkdebug.c:749 -#: ../pidgin/gtkrequest.c:277 +#: ../libpurple/account.c:1339 ../libpurple/plugins/buddynote.c:50 +#: ../libpurple/protocols/jabber/buddy.c:727 ../pidgin/gtkdebug.c:754 +#: ../pidgin/gtkrequest.c:327 msgid "Save" msgstr "Mentés" -#: ../finch/gntaccount.c:632 ../pidgin/gtkaccount.c:1900 -#: ../pidgin/gtksavedstatuses.c:333 ../pidgin/gtkstatusbox.c:1568 +#: ../finch/gntaccount.c:632 ../pidgin/gtkaccount.c:1905 +#: ../pidgin/gtksavedstatuses.c:333 ../pidgin/gtkstatusbox.c:1587 #, c-format msgid "Are you sure you want to delete %s?" msgstr "Biztos, hogy törölni akarja %s fiókot?" @@ -233,16 +236,16 @@ #. Delete button #: ../finch/gntaccount.c:637 ../finch/gntaccount.c:707 -#: ../finch/gntcertmgr.c:319 ../finch/gntpounce.c:666 ../finch/gntpounce.c:729 +#: ../finch/gntcertmgr.c:319 ../finch/gntpounce.c:679 ../finch/gntpounce.c:742 #: ../finch/gntstatus.c:144 ../finch/gntstatus.c:210 -#: ../pidgin/gtkaccount.c:1907 ../pidgin/gtklog.c:327 -#: ../pidgin/gtkpounce.c:1100 ../pidgin/gtkrequest.c:274 -#: ../pidgin/gtksavedstatuses.c:344 ../pidgin/gtkstatusbox.c:1573 +#: ../pidgin/gtkaccount.c:1912 ../pidgin/gtklog.c:327 +#: ../pidgin/gtkpounce.c:1120 ../pidgin/gtkrequest.c:324 +#: ../pidgin/gtksavedstatuses.c:344 ../pidgin/gtkstatusbox.c:1592 msgid "Delete" msgstr "Törlés" -#: ../finch/gntaccount.c:669 ../finch/gntblist.c:2119 ../finch/gntui.c:82 -#: ../pidgin/gtkaccount.c:2325 ../pidgin/gtkdocklet.c:522 +#: ../finch/gntaccount.c:669 ../finch/gntblist.c:2121 ../finch/gntui.c:82 +#: ../pidgin/gtkaccount.c:2331 ../pidgin/gtkdocklet.c:715 msgid "Accounts" msgstr "Fiókok" @@ -252,52 +255,52 @@ #. Add button #: ../finch/gntaccount.c:698 ../finch/gntaccount.c:888 ../finch/gntblist.c:343 -#: ../finch/gntblist.c:421 ../finch/gntblist.c:456 ../finch/gntcertmgr.c:306 -#: ../finch/gntnotify.c:380 ../finch/gntpounce.c:713 ../finch/gntstatus.c:199 -#: ../libpurple/protocols/gg/gg.c:883 ../libpurple/protocols/qq/sys_msg.c:114 +#: ../finch/gntblist.c:421 ../finch/gntblist.c:456 ../finch/gntblist.c:2379 +#: ../finch/gntcertmgr.c:306 ../finch/gntnotify.c:385 ../finch/gntpounce.c:726 +#: ../finch/gntstatus.c:199 ../libpurple/protocols/gg/gg.c:894 +#: ../libpurple/protocols/qq/sys_msg.c:114 #: ../libpurple/protocols/qq/sys_msg.c:173 #: ../libpurple/protocols/qq/sys_msg.c:267 -#: ../libpurple/protocols/sametime/sametime.c:5486 -#: ../libpurple/protocols/silc/chat.c:615 -#: ../libpurple/protocols/silc10/chat.c:599 ../pidgin/gtkaccount.c:2494 -#: ../pidgin/gtkblist.c:5966 ../pidgin/gtkconv.c:1659 -#: ../pidgin/gtkrequest.c:275 +#: ../libpurple/protocols/sametime/sametime.c:5487 +#: ../libpurple/protocols/silc/chat.c:619 +#: ../libpurple/protocols/silc10/chat.c:599 ../pidgin/gtkaccount.c:2500 +#: ../pidgin/gtkblist.c:6345 ../pidgin/gtkconv.c:1713 +#: ../pidgin/gtkrequest.c:325 msgid "Add" msgstr "Hozzáadás" #. Modify button -#: ../finch/gntaccount.c:703 ../finch/gntpounce.c:721 +#: ../finch/gntaccount.c:703 ../finch/gntpounce.c:734 msgid "Modify" msgstr "Módosítás" -#: ../finch/gntaccount.c:811 ../pidgin/gtkaccount.c:2441 +#: ../finch/gntaccount.c:811 ../pidgin/gtkaccount.c:2447 #, c-format msgid "%s%s%s%s has made %s his or her buddy%s%s" msgstr "%s%s%s%s felvette %s partnert %s%s" -#: ../finch/gntaccount.c:884 ../pidgin/gtkaccount.c:2493 +#: ../finch/gntaccount.c:884 ../pidgin/gtkaccount.c:2499 msgid "Add buddy to your list?" msgstr "Felveszi a partnert a partnerlistájára?" -#: ../finch/gntaccount.c:944 ../pidgin/gtkaccount.c:2551 +#: ../finch/gntaccount.c:944 ../pidgin/gtkaccount.c:2557 #, c-format msgid "%s%s%s%s wants to add %s to his or her buddy list%s%s" -msgstr "" -"%s%s%s%s felhasználó szeretné %s partnert felvenni a partnerlistájára%s%s" +msgstr "%s%s%s%s felhasználó szeretné %s partnert felvenni a partnerlistájára%s%s" #: ../finch/gntaccount.c:969 ../finch/gntaccount.c:972 -#: ../finch/gntaccount.c:999 ../pidgin/gtkaccount.c:2574 -#: ../pidgin/gtkaccount.c:2580 +#: ../finch/gntaccount.c:999 ../pidgin/gtkaccount.c:2580 +#: ../pidgin/gtkaccount.c:2586 msgid "Authorize buddy?" msgstr "Engedélyezi a partnert?" #: ../finch/gntaccount.c:976 ../finch/gntaccount.c:1003 -#: ../pidgin/gtkaccount.c:2575 ../pidgin/gtkaccount.c:2581 +#: ../pidgin/gtkaccount.c:2581 ../pidgin/gtkaccount.c:2587 msgid "Authorize" msgstr "Engedélyezés" #: ../finch/gntaccount.c:977 ../finch/gntaccount.c:1004 -#: ../pidgin/gtkaccount.c:2576 ../pidgin/gtkaccount.c:2582 +#: ../pidgin/gtkaccount.c:2582 ../pidgin/gtkaccount.c:2588 msgid "Deny" msgstr "Elutasítás" @@ -321,20 +324,21 @@ msgid "Error adding buddy" msgstr "Hiba a partner hozzáadásakor" -#: ../finch/gntblist.c:325 ../libpurple/protocols/oscar/oscar.c:2888 -#: ../pidgin/gtkaccount.c:1981 ../pidgin/gtksavedstatuses.c:980 +#: ../finch/gntblist.c:325 ../libpurple/protocols/oscar/oscar.c:2903 +#: ../pidgin/gtkaccount.c:1986 ../pidgin/gtksavedstatuses.c:986 msgid "Screen Name" msgstr "Felhasználónév" #: ../finch/gntblist.c:328 ../finch/gntblist.c:410 ../finch/gntblist.c:1250 -#: ../libpurple/protocols/msn/msn.c:1395 -#: ../libpurple/protocols/silc/chat.c:606 +#: ../libpurple/protocols/msn/msn.c:1549 +#: ../libpurple/protocols/msnp9/msn.c:1399 +#: ../libpurple/protocols/silc/chat.c:610 #: ../libpurple/protocols/silc10/chat.c:590 #: ../libpurple/protocols/yahoo/yahoo_profile.c:704 #: ../libpurple/protocols/zephyr/zephyr.c:788 -#: ../libpurple/protocols/zephyr/zephyr.c:1207 ../pidgin/gtkdialogs.c:1023 -#: ../pidgin/gtkdialogs.c:1047 ../pidgin/gtkdialogs.c:1069 -#: ../pidgin/gtkrequest.c:278 +#: ../libpurple/protocols/zephyr/zephyr.c:1207 ../pidgin/gtkdialogs.c:1037 +#: ../pidgin/gtkdialogs.c:1061 ../pidgin/gtkdialogs.c:1083 +#: ../pidgin/gtkrequest.c:328 msgid "Alias" msgstr "Álnév" @@ -343,23 +347,24 @@ msgstr "Csoport" #: ../finch/gntblist.c:335 ../finch/gntblist.c:401 ../finch/gntblist.c:1305 -#: ../finch/gntnotify.c:174 ../finch/gntstatus.c:576 -#: ../libpurple/plugins/idle.c:153 ../libpurple/plugins/idle.c:190 -#: ../pidgin/gtkblist.c:3008 ../pidgin/gtknotify.c:506 -#: ../pidgin/gtkpounce.c:1268 ../pidgin/plugins/gevolution/gevolution.c:445 +#: ../finch/gntblist.c:2210 ../finch/gntblist.c:2274 ../finch/gntnotify.c:174 +#: ../finch/gntstatus.c:576 ../libpurple/plugins/idle.c:153 +#: ../libpurple/plugins/idle.c:190 ../pidgin/gtkblist.c:3226 +#: ../pidgin/gtknotify.c:512 ../pidgin/gtkpounce.c:1288 +#: ../pidgin/plugins/gevolution/gevolution.c:445 msgid "Account" msgstr "Fiók" #: ../finch/gntblist.c:341 ../finch/gntblist.c:852 #: ../libpurple/protocols/silc/buddy.c:725 -#: ../libpurple/protocols/silc/buddy.c:1027 -#: ../libpurple/protocols/silc/buddy.c:1072 -#: ../libpurple/protocols/silc/buddy.c:1182 +#: ../libpurple/protocols/silc/buddy.c:1030 +#: ../libpurple/protocols/silc/buddy.c:1075 +#: ../libpurple/protocols/silc/buddy.c:1185 #: ../libpurple/protocols/silc10/buddy.c:737 -#: ../libpurple/protocols/silc10/buddy.c:1033 -#: ../libpurple/protocols/silc10/buddy.c:1080 -#: ../libpurple/protocols/silc10/buddy.c:1180 -#: ../libpurple/protocols/yahoo/yahoo.c:3343 ../pidgin/gtkblist.c:5483 +#: ../libpurple/protocols/silc10/buddy.c:1036 +#: ../libpurple/protocols/silc10/buddy.c:1083 +#: ../libpurple/protocols/silc10/buddy.c:1183 +#: ../libpurple/protocols/yahoo/yahoo.c:3345 ../pidgin/gtkblist.c:5847 #: ../pidgin/plugins/gevolution/add_buddy_dialog.c:445 msgid "Add Buddy" msgstr "Partner felvétele" @@ -368,16 +373,20 @@ msgid "Please enter buddy information." msgstr "Adja meg a partnerinformációkat." -#: ../finch/gntblist.c:370 ../libpurple/blist.c:1209 +#: ../finch/gntblist.c:370 ../libpurple/blist.c:1210 msgid "Chats" msgstr "Csevegések" #. Extract their Name and put it in -#: ../finch/gntblist.c:407 ../libpurple/protocols/jabber/jabber.c:924 +#: ../finch/gntblist.c:407 ../finch/gntblist.c:2205 +#: ../libpurple/protocols/jabber/jabber.c:924 #: ../libpurple/protocols/jabber/jabber.c:927 -#: ../libpurple/protocols/msn/msn.c:1584 ../libpurple/protocols/msn/msn.c:1649 -#: ../libpurple/protocols/msn/msn.c:1676 -#: ../libpurple/protocols/qq/buddy_info.c:44 ../pidgin/gtkplugin.c:582 +#: ../libpurple/protocols/msn/msn.c:1730 ../libpurple/protocols/msn/msn.c:1795 +#: ../libpurple/protocols/msn/msn.c:1822 +#: ../libpurple/protocols/msnp9/msn.c:1582 +#: ../libpurple/protocols/msnp9/msn.c:1647 +#: ../libpurple/protocols/msnp9/msn.c:1674 +#: ../libpurple/protocols/qq/buddy_info.c:44 ../pidgin/gtkplugin.c:608 #: ../pidgin/gtkroomlist.c:618 #: ../pidgin/plugins/gevolution/add_buddy_dialog.c:132 #: ../pidgin/plugins/gevolution/assoc-buddy.c:123 @@ -388,7 +397,7 @@ msgid "Auto-join" msgstr "Automatikus csatlakozás" -#: ../finch/gntblist.c:419 ../finch/gntblist.c:854 ../pidgin/gtkblist.c:5859 +#: ../finch/gntblist.c:419 ../finch/gntblist.c:854 ../pidgin/gtkblist.c:6231 msgid "Add Chat" msgstr "Csevegés hozzáadása" @@ -409,8 +418,8 @@ msgstr "Ilyen nevű csoport már létezik." #: ../finch/gntblist.c:454 ../finch/gntblist.c:856 -#: ../libpurple/protocols/sametime/sametime.c:5396 -#: ../libpurple/protocols/sametime/sametime.c:5484 ../pidgin/gtkblist.c:5963 +#: ../libpurple/protocols/sametime/sametime.c:5397 +#: ../libpurple/protocols/sametime/sametime.c:5485 ../pidgin/gtkblist.c:6342 msgid "Add Group" msgstr "Csoport felvétele" @@ -434,16 +443,16 @@ msgid "Edit Settings" msgstr "Beállítások szerkesztése" -#: ../finch/gntblist.c:864 ../pidgin/gtkutils.c:931 +#: ../finch/gntblist.c:864 ../pidgin/gtkutils.c:930 msgid "Information" msgstr "Információk" -#: ../finch/gntblist.c:864 ../pidgin/gtkutils.c:931 +#: ../finch/gntblist.c:864 ../pidgin/gtkutils.c:930 msgid "Retrieving..." msgstr "Lekérés..." -#: ../finch/gntblist.c:904 ../finch/gntconv.c:507 -#: ../libpurple/protocols/silc/chat.c:899 +#: ../finch/gntblist.c:904 ../finch/gntconv.c:528 +#: ../libpurple/protocols/silc/chat.c:903 #: ../libpurple/protocols/silc10/chat.c:883 msgid "Get Info" msgstr "Információ lekérése" @@ -453,10 +462,10 @@ msgstr "Partnerfigyelmeztetés felvétele" #. if (q_bud && is_online(q_bud->status)) { -#: ../finch/gntblist.c:915 ../finch/gntconv.c:519 +#: ../finch/gntblist.c:915 ../finch/gntconv.c:540 #: ../libpurple/protocols/jabber/si.c:874 #: ../libpurple/protocols/oscar/oscar.c:654 ../libpurple/protocols/qq/qq.c:587 -#: ../pidgin/gtkconv.c:1607 +#: ../pidgin/gtkconv.c:1661 msgid "Send File" msgstr "Fájl küldése" @@ -467,7 +476,7 @@ #: ../finch/gntblist.c:1000 #, c-format msgid "Please enter the new name for %s" -msgstr "Kérem adja meg új %snevét" +msgstr "Adja meg %s új nevét" #: ../finch/gntblist.c:1002 ../finch/gntblist.c:1250 msgid "Rename" @@ -487,8 +496,7 @@ #: ../finch/gntblist.c:1087 msgid "Removing this group will also remove all the buddies in the group" -msgstr "" -"A csoport eltávolítása a csoportban található partnereket is eltávolítja" +msgstr "A csoport eltávolítása a csoportban található partnereket is eltávolítja" #: ../finch/gntblist.c:1092 #, c-format @@ -501,14 +509,14 @@ msgstr "Eltávolítás jóváhagyása" #: ../finch/gntblist.c:1100 ../finch/gntblist.c:1252 ../finch/gntft.c:227 -#: ../pidgin/gtkconv.c:1656 ../pidgin/gtkrequest.c:276 +#: ../pidgin/gtkconv.c:1710 ../pidgin/gtkrequest.c:326 #: ../pidgin/gtkstatusbox.c:264 msgid "Remove" msgstr "Eltávolítás" #. Buddy List -#: ../finch/gntblist.c:1226 ../finch/gntblist.c:2307 ../finch/gntprefs.c:258 -#: ../finch/gntui.c:83 ../pidgin/gtkblist.c:2688 ../pidgin/gtkblist.c:4284 +#: ../finch/gntblist.c:1226 ../finch/gntblist.c:2432 ../finch/gntprefs.c:258 +#: ../finch/gntui.c:83 ../pidgin/gtkblist.c:2892 ../pidgin/gtkblist.c:4631 #: ../pidgin/plugins/win32/winprefs/winprefs.c:326 msgid "Buddy List" msgstr "Partnerlista" @@ -522,44 +530,49 @@ msgstr "Címke átváltása" #. General -#: ../finch/gntblist.c:1298 ../libpurple/protocols/gg/gg.c:637 -#: ../libpurple/protocols/gg/gg.c:1050 ../libpurple/protocols/gg/gg.c:1123 -#: ../libpurple/protocols/gg/gg.c:2207 +#: ../finch/gntblist.c:1298 ../libpurple/protocols/gg/gg.c:647 +#: ../libpurple/protocols/gg/gg.c:1061 ../libpurple/protocols/gg/gg.c:1134 +#: ../libpurple/protocols/gg/gg.c:2227 #: ../libpurple/protocols/jabber/buddy.c:286 #: ../libpurple/protocols/jabber/buddy.c:1247 -#: ../libpurple/protocols/jabber/buddy.c:2214 -#: ../libpurple/protocols/jabber/buddy.c:2396 +#: ../libpurple/protocols/jabber/buddy.c:2217 +#: ../libpurple/protocols/jabber/buddy.c:2409 #: ../libpurple/protocols/jabber/jabber.c:937 -#: ../libpurple/protocols/jabber/jabber.c:1544 -#: ../libpurple/protocols/jabber/jabber.c:1567 -#: ../libpurple/protocols/jabber/jabber.c:1590 -#: ../libpurple/protocols/jabber/jabber.c:1613 -#: ../libpurple/protocols/jabber/jabber.c:1636 -#: ../libpurple/protocols/msn/msn.c:1403 ../libpurple/protocols/msn/msn.c:1587 +#: ../libpurple/protocols/jabber/jabber.c:1542 +#: ../libpurple/protocols/jabber/jabber.c:1556 +#: ../libpurple/protocols/jabber/jabber.c:1570 +#: ../libpurple/protocols/jabber/jabber.c:1584 +#: ../libpurple/protocols/jabber/jabber.c:1598 +#: ../libpurple/protocols/msn/msn.c:1557 ../libpurple/protocols/msn/msn.c:1733 +#: ../libpurple/protocols/msnp9/msn.c:1407 +#: ../libpurple/protocols/msnp9/msn.c:1585 #: ../libpurple/protocols/qq/buddy_info.c:43 -#: ../libpurple/protocols/silc/buddy.c:1535 +#: ../libpurple/protocols/silc/buddy.c:1538 #: ../libpurple/protocols/silc/ops.c:1002 #: ../libpurple/protocols/silc/ops.c:1186 -#: ../libpurple/protocols/silc/ops.c:1322 -#: ../libpurple/protocols/silc10/buddy.c:1535 +#: ../libpurple/protocols/silc/ops.c:1324 +#: ../libpurple/protocols/silc10/buddy.c:1538 #: ../libpurple/protocols/silc10/ops.c:1036 #: ../libpurple/protocols/silc10/ops.c:1179 #: ../libpurple/protocols/silc10/ops.c:1328 -#: ../libpurple/protocols/yahoo/yahoo_profile.c:1066 ../pidgin/gtkblist.c:3032 +#: ../libpurple/protocols/yahoo/yahoo_profile.c:1066 ../pidgin/gtkblist.c:3250 msgid "Nickname" msgstr "Becenév" #. Idle stuff #: ../finch/gntblist.c:1320 ../finch/gntprefs.c:261 -#: ../libpurple/protocols/bonjour/bonjour.c:340 +#: ../libpurple/protocols/bonjour/bonjour.c:354 #: ../libpurple/protocols/jabber/buddy.c:787 #: ../libpurple/protocols/jabber/buddy.c:951 -#: ../libpurple/protocols/msn/msn.c:544 ../libpurple/protocols/msn/state.c:32 -#: ../libpurple/protocols/novell/novell.c:2825 -#: ../libpurple/protocols/oscar/oscar.c:2912 -#: ../libpurple/protocols/yahoo/yahoo.c:3097 -#: ../libpurple/protocols/yahoo/yahoo_profile.c:710 ../pidgin/gtkblist.c:3060 -#: ../pidgin/gtkblist.c:3460 ../pidgin/gtkprefs.c:1925 +#: ../libpurple/protocols/msn/msn.c:611 ../libpurple/protocols/msn/msn.c:629 +#: ../libpurple/protocols/msn/msn.c:637 ../libpurple/protocols/msn/state.c:32 +#: ../libpurple/protocols/msnp9/msn.c:544 +#: ../libpurple/protocols/msnp9/state.c:32 +#: ../libpurple/protocols/novell/novell.c:2830 +#: ../libpurple/protocols/oscar/oscar.c:2927 +#: ../libpurple/protocols/yahoo/yahoo.c:3099 +#: ../libpurple/protocols/yahoo/yahoo_profile.c:710 ../pidgin/gtkblist.c:3278 +#: ../pidgin/gtkblist.c:3684 ../pidgin/gtkprefs.c:2026 msgid "Idle" msgstr "Inaktív" @@ -590,121 +603,136 @@ "\n" "Utoljára látszott: %s" -#: ../finch/gntblist.c:1702 ../pidgin/gtkdocklet.c:470 -#: ../pidgin/gtkstatusbox.c:1072 +#: ../finch/gntblist.c:1704 ../pidgin/gtkdocklet.c:582 msgid "New..." msgstr "Új..." -#: ../finch/gntblist.c:1709 ../pidgin/gtkdocklet.c:471 -#: ../pidgin/gtkstatusbox.c:1073 +#: ../finch/gntblist.c:1711 ../pidgin/gtkdocklet.c:583 msgid "Saved..." msgstr "Mentett..." -#: ../finch/gntblist.c:2087 ../finch/gntplugin.c:255 ../finch/gntui.c:88 -#: ../pidgin/gtkdocklet.c:523 ../pidgin/gtkplugin.c:531 +#: ../finch/gntblist.c:2089 ../finch/gntplugin.c:345 ../finch/gntui.c:88 +#: ../pidgin/gtkdocklet.c:716 ../pidgin/gtkplugin.c:555 msgid "Plugins" msgstr "Bővítmények" -#: ../finch/gntblist.c:2203 ../pidgin/gtkdialogs.c:754 -#: ../pidgin/gtkdialogs.c:893 ../pidgin/gtkdialogs.c:974 -msgid "_Name" -msgstr "_Név" - -#: ../finch/gntblist.c:2208 ../pidgin/gtkdialogs.c:759 -#: ../pidgin/gtkdialogs.c:898 ../pidgin/gtkdialogs.c:979 -msgid "_Account" -msgstr "_Fiók" - -#: ../finch/gntblist.c:2216 ../pidgin/gtkdialogs.c:767 +#: ../finch/gntblist.c:2218 ../pidgin/gtkdialogs.c:781 msgid "New Instant Message" msgstr "Új azonnali üzenet" -#: ../finch/gntblist.c:2218 ../pidgin/gtkdialogs.c:769 -msgid "" -"Please enter the screen name or alias of the person you would like to IM." -msgstr "" -"Adja meg azon partner felhasználónevét vagy álnevét, akinek üzenni szeretne." +#: ../finch/gntblist.c:2220 ../pidgin/gtkdialogs.c:783 +msgid "Please enter the screen name or alias of the person you would like to IM." +msgstr "Adja meg azon partner felhasználónevét vagy álnevét, akinek üzenni szeretne." #. Not multiline #. Not masked? #. No hints? -#: ../finch/gntblist.c:2221 ../finch/gntcertmgr.c:90 ../finch/gntconn.c:135 -#: ../finch/gntnotify.c:80 ../libpurple/account.c:1012 -#: ../libpurple/account.c:1262 ../libpurple/protocols/gg/gg.c:506 -#: ../libpurple/protocols/gg/gg.c:665 ../libpurple/protocols/gg/gg.c:802 -#: ../libpurple/protocols/jabber/jabber.c:1736 +#: ../finch/gntblist.c:2223 ../finch/gntcertmgr.c:90 ../finch/gntconn.c:136 +#: ../finch/gntnotify.c:80 ../libpurple/account.c:1015 +#: ../libpurple/account.c:1304 ../libpurple/protocols/gg/gg.c:516 +#: ../libpurple/protocols/gg/gg.c:675 ../libpurple/protocols/gg/gg.c:812 +#: ../libpurple/protocols/jabber/jabber.c:1714 #: ../libpurple/protocols/jabber/xdata.c:399 -#: ../libpurple/protocols/msn/msn.c:286 ../libpurple/protocols/msn/msn.c:303 -#: ../libpurple/protocols/msn/msn.c:320 ../libpurple/protocols/msn/msn.c:337 -#: ../libpurple/protocols/oscar/oscar.c:6093 +#: ../libpurple/protocols/msn/msn.c:290 ../libpurple/protocols/msn/msn.c:307 +#: ../libpurple/protocols/msn/msn.c:324 ../libpurple/protocols/msn/msn.c:341 +#: ../libpurple/protocols/msnp9/msn.c:286 +#: ../libpurple/protocols/msnp9/msn.c:303 +#: ../libpurple/protocols/msnp9/msn.c:320 +#: ../libpurple/protocols/msnp9/msn.c:337 +#: ../libpurple/protocols/oscar/oscar.c:6148 #: ../libpurple/protocols/silc/buddy.c:454 -#: ../libpurple/protocols/silc/buddy.c:1190 -#: ../libpurple/protocols/silc/chat.c:447 -#: ../libpurple/protocols/silc/chat.c:482 -#: ../libpurple/protocols/silc/chat.c:745 -#: ../libpurple/protocols/silc/ops.c:1291 -#: ../libpurple/protocols/silc/ops.c:1815 -#: ../libpurple/protocols/silc/silc.c:822 +#: ../libpurple/protocols/silc/buddy.c:1193 +#: ../libpurple/protocols/silc/chat.c:449 +#: ../libpurple/protocols/silc/chat.c:486 +#: ../libpurple/protocols/silc/chat.c:749 +#: ../libpurple/protocols/silc/ops.c:1293 +#: ../libpurple/protocols/silc/ops.c:1819 +#: ../libpurple/protocols/silc/silc.c:953 #: ../libpurple/protocols/silc10/buddy.c:467 -#: ../libpurple/protocols/silc10/buddy.c:1188 +#: ../libpurple/protocols/silc10/buddy.c:1191 #: ../libpurple/protocols/silc10/chat.c:425 #: ../libpurple/protocols/silc10/chat.c:464 #: ../libpurple/protocols/silc10/chat.c:729 #: ../libpurple/protocols/silc10/ops.c:1297 #: ../libpurple/protocols/silc10/ops.c:1903 #: ../libpurple/protocols/silc10/silc.c:735 -#: ../libpurple/protocols/yahoo/yahoo.c:1031 -#: ../libpurple/protocols/yahoo/yahoo.c:3497 -#: ../libpurple/protocols/yahoo/yahoo.c:3508 ../pidgin/gtkblist.c:4039 -#: ../pidgin/gtkcertmgr.c:195 ../pidgin/gtkdialogs.c:772 -#: ../pidgin/gtkdialogs.c:911 ../pidgin/gtkdialogs.c:1003 -#: ../pidgin/gtkrequest.c:270 +#: ../libpurple/protocols/yahoo/yahoo.c:1033 +#: ../libpurple/protocols/yahoo/yahoo.c:3499 +#: ../libpurple/protocols/yahoo/yahoo.c:3510 ../pidgin/gtkblist.c:4387 +#: ../pidgin/gtkcertmgr.c:195 ../pidgin/gtkdialogs.c:786 +#: ../pidgin/gtkdialogs.c:925 ../pidgin/gtkdialogs.c:1017 +#: ../pidgin/gtkrequest.c:320 msgid "OK" msgstr "Rendben" +#: ../finch/gntblist.c:2270 +msgid "Channel" +msgstr "Csatorna" + +#: ../finch/gntblist.c:2282 ../pidgin/gtkblist.c:924 +msgid "Join a Chat" +msgstr "Csatlakozás egy csevegéshez" + +#: ../finch/gntblist.c:2284 +msgid "Please enter the name of the chat you want to join." +msgstr "Adja meg a csevegés nevét, amelyhez csatlakozni kíván." + +#: ../finch/gntblist.c:2286 ../finch/gntnotify.c:394 +msgid "Join" +msgstr "Csatlakozás" + #. Create the "Options" frame. -#: ../finch/gntblist.c:2241 ../finch/gntpounce.c:447 ../pidgin/gtkpounce.c:790 +#: ../finch/gntblist.c:2324 ../finch/gntpounce.c:460 ../pidgin/gtkpounce.c:810 msgid "Options" msgstr "Beállítások" -#: ../finch/gntblist.c:2247 +#: ../finch/gntblist.c:2330 msgid "Send IM..." msgstr "Üzenet küldése..." -#: ../finch/gntblist.c:2251 -#, fuzzy -msgid "Show empty groups" -msgstr "Üres csoportok megjelenítése" - -#: ../finch/gntblist.c:2257 -#, fuzzy -msgid "Show offline buddies" -msgstr "Kilépett partnerek megjelenítése" - -#: ../finch/gntblist.c:2263 -msgid "Sort by status" +#: ../finch/gntblist.c:2335 +msgid "Join Chat..." +msgstr "Csatlakozás csevegéshez..." + +#: ../finch/gntblist.c:2340 +msgid "Show" +msgstr "Megjelenítés" + +#: ../finch/gntblist.c:2345 +msgid "Empty groups" +msgstr "Üres csoportok" + +#: ../finch/gntblist.c:2352 +msgid "Offline buddies" +msgstr "Offline partnerek" + +#: ../finch/gntblist.c:2359 +msgid "Sort" +msgstr "Rendezés" + +#: ../finch/gntblist.c:2364 +msgid "By Status" msgstr "Állapot szerint" -#: ../finch/gntblist.c:2267 -msgid "Sort alphabetically" +#: ../finch/gntblist.c:2369 ../pidgin/gtkblist.c:4172 +msgid "Alphabetically" msgstr "ABC sorrend" -#: ../finch/gntblist.c:2271 -msgid "Sort by log size" +#: ../finch/gntblist.c:2374 +msgid "By Log Size" msgstr "Naplóméret szerint" #: ../finch/gntcertmgr.c:86 ../pidgin/gtkcertmgr.c:188 -#, fuzzy msgid "Certificate Import" -msgstr "Tanúsítványok" +msgstr "Tanúsítványimportálás" #: ../finch/gntcertmgr.c:87 ../pidgin/gtkcertmgr.c:189 msgid "Specify a hostname" -msgstr "" +msgstr "Adjon meg egy gépnevet" #: ../finch/gntcertmgr.c:88 ../pidgin/gtkcertmgr.c:190 msgid "Type the host name this certificate is for." -msgstr "" +msgstr "Írja be a tanúsítványt birtokló gép nevét." #: ../finch/gntcertmgr.c:97 ../pidgin/gtkcertmgr.c:210 #, c-format @@ -712,21 +740,20 @@ "File %s could not be imported.\n" "Make sure that the file is readable and in PEM format.\n" msgstr "" +"A(z) %s fájl nem importálható.\n" +"Győződjön meg róla, hogy a fájl olvasható és PEM formátumban van.\n" #: ../finch/gntcertmgr.c:99 ../pidgin/gtkcertmgr.c:212 -#, fuzzy msgid "Certificate Import Error" -msgstr "Tanúsítványok" +msgstr "Tanúsítványimportálási hiba" #: ../finch/gntcertmgr.c:100 ../pidgin/gtkcertmgr.c:213 -#, fuzzy msgid "X.509 certificate import failed" -msgstr "X.509 tanúsítványok" +msgstr "Az X.509 tanúsítvány importálása meghiúsult" #: ../finch/gntcertmgr.c:110 ../pidgin/gtkcertmgr.c:224 -#, fuzzy msgid "Select a PEM certificate" -msgstr "Fájl kiválasztása" +msgstr "Válasszon ki egy PEM tanúsítványt" #: ../finch/gntcertmgr.c:127 ../pidgin/gtkcertmgr.c:245 #, c-format @@ -734,26 +761,25 @@ "Export to file %s failed.\n" "Check that you have write permission to the target path\n" msgstr "" +"Az importálás meghiúsult a(z) %s fájlba.\n" +"Ellenőrizze, hogy van-e írási jogosultsága a célútvonalra\n" #: ../finch/gntcertmgr.c:129 ../pidgin/gtkcertmgr.c:247 -#, fuzzy msgid "Certificate Export Error" -msgstr "Tanúsítványok" +msgstr "Tanúsítványexportálási hiba" #: ../finch/gntcertmgr.c:130 ../pidgin/gtkcertmgr.c:248 -#, fuzzy msgid "X.509 certificate export failed" -msgstr "X.509 tanúsítványok" +msgstr "Az X.509 tanúsítvány exportálása meghiúsult" #: ../finch/gntcertmgr.c:159 ../pidgin/gtkcertmgr.c:299 -#, fuzzy msgid "PEM X.509 Certificate Export" -msgstr "X.509 tanúsítványok" +msgstr "PEM X.509 tanúsítvány exportálása" #: ../finch/gntcertmgr.c:188 -#, fuzzy, c-format +#, c-format msgid "Certificate for %s" -msgstr "Tanúsítványok" +msgstr "%s tanúsítványa" #: ../finch/gntcertmgr.c:195 #, c-format @@ -763,59 +789,62 @@ "SHA1 fingerprint:\n" "%s" msgstr "" +"Közönséges név: %s\n" +"\n" +"SHA1 ujjlenyomat:\n" +"%s" #: ../finch/gntcertmgr.c:198 -#, fuzzy msgid "SSL Host Certificate" -msgstr "Tanúsítványok" +msgstr "SSL kiszolgálótanúsítvány" #: ../finch/gntcertmgr.c:233 ../pidgin/gtkcertmgr.c:372 #, c-format msgid "Really delete certificate for %s?" -msgstr "" +msgstr "Valóban törli a következő tanúsítványát: %s?" #: ../finch/gntcertmgr.c:236 ../pidgin/gtkcertmgr.c:374 msgid "Confirm certificate delete" -msgstr "" - -#: ../finch/gntcertmgr.c:293 ../pidgin/gtkcertmgr.c:602 -#, fuzzy +msgstr "Tanúsítványtörlés megerősítése" + +#: ../finch/gntcertmgr.c:293 ../pidgin/gtkcertmgr.c:603 msgid "Certificate Manager" -msgstr "Tanúsítványok" +msgstr "Tanúsítványkezelő" #. Creating the user splits -#: ../finch/gntcertmgr.c:298 ../libpurple/protocols/bonjour/bonjour.c:652 -#: ../libpurple/protocols/silc/silc.c:1007 +#: ../finch/gntcertmgr.c:298 ../libpurple/protocols/bonjour/bonjour.c:666 +#: ../libpurple/protocols/silc/silc.c:1138 #: ../libpurple/protocols/silc10/silc.c:918 msgid "Hostname" msgstr "Gépnév" -#: ../finch/gntcertmgr.c:315 ../finch/gntnotify.c:383 ../pidgin/gtkconv.c:1635 -#: ../pidgin/gtkdebug.c:835 +#: ../finch/gntcertmgr.c:315 ../finch/gntnotify.c:388 ../pidgin/gtkconv.c:1689 +#: ../pidgin/gtkdebug.c:840 msgid "Info" msgstr "Információ" #. Close button #: ../finch/gntcertmgr.c:324 ../finch/gntft.c:237 ../finch/gntnotify.c:182 -#: ../finch/gntplugin.c:210 ../finch/gntplugin.c:310 ../finch/gntpounce.c:738 -#: ../finch/gntstatus.c:216 ../libpurple/protocols/msn/msn.c:403 -#: ../libpurple/protocols/silc/util.c:382 -#: ../libpurple/protocols/silc10/util.c:377 ../pidgin/gtkaccount.c:2468 -#: ../pidgin/gtkrequest.c:273 +#: ../finch/gntplugin.c:213 ../finch/gntplugin.c:406 ../finch/gntpounce.c:751 +#: ../finch/gntstatus.c:216 ../libpurple/protocols/msn/msn.c:407 +#: ../libpurple/protocols/msnp9/msn.c:403 +#: ../libpurple/protocols/silc/util.c:386 +#: ../libpurple/protocols/silc10/util.c:377 ../pidgin/gtkaccount.c:2474 +#: ../pidgin/gtkrequest.c:323 msgid "Close" msgstr "Bezárás" -#: ../finch/gntconn.c:124 +#: ../finch/gntconn.c:125 #, c-format msgid "%s (%s)" msgstr "%s (%s)" -#: ../finch/gntconn.c:127 +#: ../finch/gntconn.c:128 #, c-format msgid "%s disconnected." msgstr "%s kapcsolata megszakadt." -#: ../finch/gntconn.c:128 +#: ../finch/gntconn.c:129 #, c-format msgid "" "%s\n" @@ -828,51 +857,51 @@ "A Finch nem próbálja meg újra csatlakoztatni a fiókot, amíg nem javítja a " "hibát és nem engedélyezi újra a fiókot." -#: ../finch/gntconn.c:137 ../pidgin/gtkblist.c:4041 +#: ../finch/gntconn.c:138 ../pidgin/gtkblist.c:4389 msgid "Re-enable Account" msgstr "Fiók újraengedélyezése" -#: ../finch/gntconv.c:139 +#: ../finch/gntconv.c:137 msgid "No such command." msgstr "Nincs ilyen parancs." -#: ../finch/gntconv.c:143 ../pidgin/gtkconv.c:489 +#: ../finch/gntconv.c:141 ../pidgin/gtkconv.c:531 msgid "Syntax Error: You typed the wrong number of arguments to that command." msgstr "" "Szintaktikai hiba: Nem megfelelő számú paramétert adott meg ennek a " "parancsnak." -#: ../finch/gntconv.c:148 ../pidgin/gtkconv.c:495 +#: ../finch/gntconv.c:146 ../pidgin/gtkconv.c:537 msgid "Your command failed for an unknown reason." msgstr "A parancs végrehajtása ismeretlen ok miatt sikertelen." -#: ../finch/gntconv.c:153 ../pidgin/gtkconv.c:502 +#: ../finch/gntconv.c:151 ../pidgin/gtkconv.c:544 msgid "That command only works in chats, not IMs." msgstr "Ez a parancs csak csevegéskor működik, azonnali üzeneteknél nem." -#: ../finch/gntconv.c:156 ../pidgin/gtkconv.c:505 +#: ../finch/gntconv.c:154 ../pidgin/gtkconv.c:547 msgid "That command only works in IMs, not chats." msgstr "Ez a parancs csak azonnali üzeneteknél működik, csevegéskor nem." -#: ../finch/gntconv.c:160 ../pidgin/gtkconv.c:510 +#: ../finch/gntconv.c:158 ../pidgin/gtkconv.c:552 msgid "That command doesn't work on this protocol." msgstr "Ez a parancs nem működik ezzel a protokollal." -#: ../finch/gntconv.c:168 +#: ../finch/gntconv.c:166 msgid "Message was not sent, because you are not signed on." msgstr "Az üzenet nem küldhető el, mivel nincs bejelentkezve." -#: ../finch/gntconv.c:251 +#: ../finch/gntconv.c:245 #, c-format msgid "%s (%s -- %s)" msgstr "%s (%s -- %s)" -#: ../finch/gntconv.c:274 +#: ../finch/gntconv.c:268 #, c-format msgid "%s [%s]" msgstr "%s [%s]" -#: ../finch/gntconv.c:279 ../finch/gntconv.c:773 +#: ../finch/gntconv.c:273 ../finch/gntconv.c:795 #, c-format msgid "" "\n" @@ -881,67 +910,64 @@ "\n" "%s gépel..." -#: ../finch/gntconv.c:298 +#: ../finch/gntconv.c:292 msgid "You have left this chat." msgstr "Elhagyta ezt a csevegést." -#: ../finch/gntconv.c:387 ../pidgin/gtkconv.c:1362 +#: ../finch/gntconv.c:408 ../pidgin/gtkconv.c:1416 msgid "Logging started. Future messages in this conversation will be logged." -msgstr "" -"A naplózás elkezdődött. A társalgás jövőbeli üzenetei naplózva lesznek." - -#: ../finch/gntconv.c:393 ../pidgin/gtkconv.c:1370 -msgid "" -"Logging stopped. Future messages in this conversation will not be logged." -msgstr "" -"A naplózás befejeződött. A társalgás jövőbeli üzenetei nem lesznek naplózva." - -#: ../finch/gntconv.c:442 +msgstr "A naplózás elkezdődött. A társalgás jövőbeli üzenetei naplózva lesznek." + +#: ../finch/gntconv.c:414 ../pidgin/gtkconv.c:1424 +msgid "Logging stopped. Future messages in this conversation will not be logged." +msgstr "A naplózás befejeződött. A társalgás jövőbeli üzenetei nem lesznek naplózva." + +#: ../finch/gntconv.c:463 msgid "Send To" msgstr "Küldés ennek" -#: ../finch/gntconv.c:486 +#: ../finch/gntconv.c:507 msgid "Conversation" msgstr "Társalgás" -#: ../finch/gntconv.c:492 +#: ../finch/gntconv.c:513 msgid "Clear Scrollback" msgstr "Előzmények törlése" -#: ../finch/gntconv.c:496 ../finch/gntprefs.c:191 +#: ../finch/gntconv.c:517 ../finch/gntprefs.c:191 msgid "Show Timestamps" msgstr "Időbélyegek" -#: ../finch/gntconv.c:512 +#: ../finch/gntconv.c:533 msgid "Add Buddy Pounce..." msgstr "Partnerfigyelmeztetés felvétele..." -#: ../finch/gntconv.c:527 +#: ../finch/gntconv.c:548 msgid "Enable Logging" msgstr "Naplózás engedélyezése" -#: ../finch/gntconv.c:533 +#: ../finch/gntconv.c:554 msgid "Enable Sounds" msgstr "Hangok engedélyezése" -#: ../finch/gntconv.c:739 +#: ../finch/gntconv.c:760 msgid "<AUTO-REPLY> " msgstr "<AUTOMATIKUS VÁLASZ> " #. Print the list of users in the room -#: ../finch/gntconv.c:861 +#: ../finch/gntconv.c:883 msgid "List of users:\n" msgstr "Felhasználólista:\n" -#: ../finch/gntconv.c:1023 ../pidgin/gtkconv.c:331 +#: ../finch/gntconv.c:1045 ../pidgin/gtkconv.c:371 msgid "Supported debug options are: version" msgstr "A támogatott hibakeresési parancsok: version" -#: ../finch/gntconv.c:1059 ../pidgin/gtkconv.c:381 +#: ../finch/gntconv.c:1081 ../pidgin/gtkconv.c:423 msgid "No such command (in this context)." msgstr "Nincs ilyen parancs (ebben a kontextusban)." -#: ../finch/gntconv.c:1062 ../pidgin/gtkconv.c:384 +#: ../finch/gntconv.c:1084 ../pidgin/gtkconv.c:426 msgid "" "Use \"/help <command>\" for help on a specific command.\n" "The following commands are available in this context:\n" @@ -950,19 +976,19 @@ "megtekintéséhez.\n" "Ebben a kontextusban a következő parancsok állnak rendelkezésre:\n" -#: ../finch/gntconv.c:1120 ../pidgin/gtkconv.c:7560 +#: ../finch/gntconv.c:1142 ../pidgin/gtkconv.c:7755 msgid "" "say <message>: Send a message normally as if you weren't using a " "command." msgstr "say <üzenet>: Üzenet küldése, mintha nem használná a parancsot." -#: ../finch/gntconv.c:1123 ../pidgin/gtkconv.c:7563 +#: ../finch/gntconv.c:1145 ../pidgin/gtkconv.c:7758 msgid "me <action>: Send an IRC style action to a buddy or chat." msgstr "" "me <művelet>: IRC stílusú művelet küldése egy partnernak vagy " "csevegésnek." -#: ../finch/gntconv.c:1126 ../pidgin/gtkconv.c:7566 +#: ../finch/gntconv.c:1148 ../pidgin/gtkconv.c:7761 msgid "" "debug <option>: Send various debug information to the current " "conversation." @@ -970,43 +996,48 @@ "debug <parancs>: Különböző hibakeresési információk küldése a " "jelenlegi társalgásba." -#: ../finch/gntconv.c:1129 ../pidgin/gtkconv.c:7569 +#: ../finch/gntconv.c:1151 ../pidgin/gtkconv.c:7764 msgid "clear: Clears the conversation scrollback." msgstr "clear: Törli a társalgás előzményeit." -#: ../finch/gntconv.c:1132 ../pidgin/gtkconv.c:7575 +#: ../finch/gntconv.c:1154 ../pidgin/gtkconv.c:7770 msgid "help <command>: Help on a specific command." msgstr "help <parancs>: Egy adott parancs súgója." -#: ../finch/gntconv.c:1135 +#: ../finch/gntconv.c:1157 msgid "users: Show the list of users in the chat." msgstr "users: A csevegés felhasználólistájának megjelenítése." -#: ../finch/gntconv.c:1140 +#: ../finch/gntconv.c:1162 msgid "plugins: Show the plugins window." msgstr "plugins: A bővítmények ablak megjelenítése." -#: ../finch/gntconv.c:1143 +#: ../finch/gntconv.c:1165 msgid "buddylist: Show the buddylist." msgstr "buddylist: A partnerlista megjelenítése." -#: ../finch/gntconv.c:1146 +#: ../finch/gntconv.c:1168 msgid "accounts: Show the accounts window." msgstr "accounts: A fiókok ablak megjelenítése." -#: ../finch/gntconv.c:1149 +#: ../finch/gntconv.c:1171 msgid "debugwin: Show the debug window." msgstr "debugwin: A hibakereső ablak megjelenítése." -#: ../finch/gntconv.c:1152 +#: ../finch/gntconv.c:1174 msgid "prefs: Show the preference window." msgstr "prefs: A beállítások ablak megjelenítése." -#: ../finch/gntconv.c:1155 +#: ../finch/gntconv.c:1177 msgid "statuses: Show the savedstatuses window." msgstr "statuses: A mentett állapotok ablak megjelenítése." -#: ../finch/gntdebug.c:235 ../finch/gntui.c:86 ../pidgin/gtkdebug.c:695 +#: ../finch/gntdebug.c:231 ../pidgin/gtkconv.c:989 ../pidgin/gtkconv.c:2663 +#: ../pidgin/gtkdebug.c:220 ../pidgin/gtkft.c:543 +msgid "Unable to open file." +msgstr "Nem lehet megnyitni a fájlt." + +#: ../finch/gntdebug.c:271 ../finch/gntui.c:86 ../pidgin/gtkdebug.c:700 msgid "Debug Window" msgstr "Hibakereső ablak" @@ -1014,15 +1045,15 @@ #. * it's necessary to make the width of the debug window resizable ... like I said, #. * it doesn't make sense. The bug is likely in the packing in gntbox.c. #. -#: ../finch/gntdebug.c:256 ../pidgin/gtkdebug.c:754 +#: ../finch/gntdebug.c:292 ../pidgin/gtkdebug.c:759 msgid "Clear" msgstr "Törlés" -#: ../finch/gntdebug.c:262 -msgid "Filter: " +#: ../finch/gntdebug.c:303 +msgid "Filter:" msgstr "Szűrő:" -#: ../finch/gntdebug.c:266 ../pidgin/gtkdebug.c:763 +#: ../finch/gntdebug.c:309 ../pidgin/gtkdebug.c:768 msgid "Pause" msgstr "Szünet" @@ -1059,25 +1090,27 @@ #. XXX: Use of ggp_str_to_uin() is an ugly hack! #: ../finch/gntft.c:201 ../finch/gntstatus.c:547 ../finch/gntstatus.c:576 -#: ../libpurple/protocols/bonjour/bonjour.c:344 -#: ../libpurple/protocols/gg/gg.c:1039 ../libpurple/protocols/gg/gg.c:1576 -#: ../libpurple/protocols/gg/gg.c:1584 +#: ../libpurple/protocols/bonjour/bonjour.c:358 +#: ../libpurple/protocols/gg/gg.c:1050 ../libpurple/protocols/gg/gg.c:1587 +#: ../libpurple/protocols/gg/gg.c:1595 #: ../libpurple/protocols/jabber/buddy.c:778 #: ../libpurple/protocols/jabber/buddy.c:782 #: ../libpurple/protocols/jabber/buddy.c:941 -#: ../libpurple/protocols/jabber/jabber.c:1500 -#: ../libpurple/protocols/msn/msn.c:543 -#: ../libpurple/protocols/novell/novell.c:2835 +#: ../libpurple/protocols/jabber/jabber.c:1507 +#: ../libpurple/protocols/msn/msn.c:621 ../libpurple/protocols/msn/msn.c:631 +#: ../libpurple/protocols/msn/msn.c:636 ../libpurple/protocols/msn/msn.c:639 +#: ../libpurple/protocols/msnp9/msn.c:543 +#: ../libpurple/protocols/novell/novell.c:2840 #: ../libpurple/protocols/oscar/oscar.c:821 #: ../libpurple/protocols/oscar/oscar.c:826 #: ../libpurple/protocols/oscar/oscar.c:828 -#: ../libpurple/protocols/oscar/oscar.c:2700 -#: ../libpurple/protocols/oscar/oscar.c:3780 -#: ../libpurple/protocols/sametime/sametime.c:3263 -#: ../libpurple/protocols/sametime/sametime.c:4150 -#: ../libpurple/protocols/yahoo/yahoo.c:3248 ../pidgin/gtkblist.c:3104 -#: ../pidgin/gtkblist.c:3118 ../pidgin/gtkblist.c:3120 -#: ../pidgin/gtksavedstatuses.c:999 ../pidgin/gtksavedstatuses.c:1144 +#: ../libpurple/protocols/oscar/oscar.c:2715 +#: ../libpurple/protocols/oscar/oscar.c:3795 +#: ../libpurple/protocols/sametime/sametime.c:3264 +#: ../libpurple/protocols/sametime/sametime.c:4151 +#: ../libpurple/protocols/yahoo/yahoo.c:3250 ../pidgin/gtkblist.c:3322 +#: ../pidgin/gtkblist.c:3336 ../pidgin/gtkblist.c:3338 +#: ../pidgin/gtksavedstatuses.c:1005 ../pidgin/gtksavedstatuses.c:1150 msgid "Status" msgstr "Állapot" @@ -1120,7 +1153,8 @@ msgid "Finished" msgstr "Befejeződött" -#: ../finch/gntft.c:437 ../libpurple/protocols/msn/session.c:347 +#: ../finch/gntft.c:437 ../libpurple/protocols/msn/session.c:396 +#: ../libpurple/protocols/msnp9/session.c:347 msgid "Transferring" msgstr "Átvitel" @@ -1128,72 +1162,68 @@ msgid "Emails" msgstr "E-mailek" -#: ../finch/gntnotify.c:171 ../finch/gntnotify.c:225 +#: ../finch/gntnotify.c:171 ../finch/gntnotify.c:226 msgid "You have mail!" msgstr "Levele érkezett!" -#: ../finch/gntnotify.c:174 ../pidgin/gtknotify.c:513 +#: ../finch/gntnotify.c:174 ../pidgin/gtknotify.c:519 msgid "Sender" msgstr "Feladó" -#: ../finch/gntnotify.c:174 ../pidgin/gtknotify.c:520 +#: ../finch/gntnotify.c:174 ../pidgin/gtknotify.c:526 msgid "Subject" msgstr "Tárgy" -#: ../finch/gntnotify.c:201 +#: ../finch/gntnotify.c:202 #, c-format msgid "%s (%s) has %d new message." msgid_plural "%s (%s) has %d new messages." msgstr[0] "%s (%s) %d új üzenetet kapott." msgstr[1] "%s (%s) %d új üzenetet kapott." -#: ../finch/gntnotify.c:225 ../pidgin/gtknotify.c:341 +#: ../finch/gntnotify.c:226 ../pidgin/gtknotify.c:342 msgid "New Mail" msgstr "Új e-mail" -#: ../finch/gntnotify.c:290 ../pidgin/gtknotify.c:940 +#: ../finch/gntnotify.c:291 ../pidgin/gtknotify.c:949 #, c-format msgid "Info for %s" msgstr "%s információi" -#: ../finch/gntnotify.c:291 ../libpurple/protocols/toc/toc.c:476 -#: ../pidgin/gtknotify.c:941 +#: ../finch/gntnotify.c:292 ../libpurple/protocols/toc/toc.c:476 +#: ../pidgin/gtknotify.c:950 msgid "Buddy Information" msgstr "Partnerinformáció" -#: ../finch/gntnotify.c:377 ../libpurple/protocols/qq/group_join.c:367 +#: ../finch/gntnotify.c:382 ../libpurple/protocols/qq/group_join.c:367 msgid "Continue" msgstr "Folytatás" -#: ../finch/gntnotify.c:386 ../pidgin/gtkconv.c:1596 +#: ../finch/gntnotify.c:391 ../pidgin/gtkconv.c:1650 msgid "IM" msgstr "Azonnali üzenet" -#: ../finch/gntnotify.c:389 -msgid "Join" -msgstr "Csatlakozás" - -#: ../finch/gntnotify.c:392 ../libpurple/protocols/sametime/sametime.c:3473 +#: ../finch/gntnotify.c:397 ../libpurple/protocols/sametime/sametime.c:3474 msgid "Invite" msgstr "Meghívás" -#: ../finch/gntnotify.c:395 +#: ../finch/gntnotify.c:400 msgid "(none)" msgstr "(nincs)" -#: ../finch/gntplugin.c:75 ../finch/gntplugin.c:84 +#: ../finch/gntplugin.c:77 ../finch/gntplugin.c:86 msgid "ERROR" msgstr "HIBA" -#: ../finch/gntplugin.c:75 +#: ../finch/gntplugin.c:77 msgid "loading plugin failed" msgstr "a bővítmény betöltése sikertelen" -#: ../finch/gntplugin.c:84 +#: ../finch/gntplugin.c:86 msgid "unloading plugin failed" msgstr "a bővítmény eltávolítása meghiúsult" -#: ../finch/gntplugin.c:129 +#: ../finch/gntplugin.c:132 #, c-format msgid "" "Name: %s\n" @@ -1210,19 +1240,39 @@ "Weboldal: %s\n" "Fájlnév: %s\n" -#: ../finch/gntplugin.c:187 +#: ../finch/gntplugin.c:190 msgid "Plugin need to be loaded before you can configure it." msgstr "A bővítményt be kell tölteni, mielőtt beállíthatná." -#: ../finch/gntplugin.c:235 +#: ../finch/gntplugin.c:238 msgid "No configuration options for this plugin." msgstr "A bővítménynek nincsenek beállításai." +#: ../finch/gntplugin.c:259 +msgid "Error loading plugin" +msgstr "Hiba a bővítmény betöltésekor" + #: ../finch/gntplugin.c:260 +msgid "The selected file is not a valid plugin." +msgstr "A kiválasztott fájl nem egy érvényes bővítmény." + +#: ../finch/gntplugin.c:261 +msgid "Please open the debug window and try again to see the exact error message." +msgstr "Nyissa meg a hibakereső ablakot és próbálkozzon újra a pontos hibaüzenet megjelenítéséhez." + +#: ../finch/gntplugin.c:324 +msgid "Select plugin to install" +msgstr "Válassza ki a telepítendő bővítményt" + +#: ../finch/gntplugin.c:350 msgid "You can (un)load plugins from the following list." msgstr "A következő lista bővítményeit töltheti be vagy távolíthatja el." -#: ../finch/gntplugin.c:315 +#: ../finch/gntplugin.c:401 +msgid "Install Plugin..." +msgstr "Bővítmény telepítése..." + +#: ../finch/gntplugin.c:411 msgid "Configure Plugin" msgstr "Bővítmény beállítása" @@ -1231,186 +1281,186 @@ #. (that should have been "effect," right?) #. Back to instant-apply! I win! BU-HAHAHA! #. Create the window -#: ../finch/gntplugin.c:371 ../finch/gntplugin.c:378 ../finch/gntprefs.c:264 -#: ../finch/gntui.c:90 ../pidgin/gtkdocklet.c:524 ../pidgin/gtkprefs.c:2067 +#: ../finch/gntplugin.c:467 ../finch/gntplugin.c:474 ../finch/gntprefs.c:264 +#: ../finch/gntui.c:90 ../pidgin/gtkdocklet.c:717 ../pidgin/gtkprefs.c:2169 msgid "Preferences" msgstr "Beállítások" -#: ../finch/gntpounce.c:183 ../pidgin/gtkpounce.c:256 +#: ../finch/gntpounce.c:194 ../pidgin/gtkpounce.c:256 msgid "Please enter a buddy to pounce." msgstr "Adjon meg egy figyelendő partnert." -#: ../finch/gntpounce.c:328 ../pidgin/gtkpounce.c:517 +#: ../finch/gntpounce.c:339 ../pidgin/gtkpounce.c:531 msgid "New Buddy Pounce" msgstr "Új partnerfigyelmeztetés" -#: ../finch/gntpounce.c:328 ../pidgin/gtkpounce.c:517 +#: ../finch/gntpounce.c:339 ../pidgin/gtkpounce.c:531 msgid "Edit Buddy Pounce" msgstr "Partnerfigyelmeztetés szerkesztése" -#: ../finch/gntpounce.c:333 +#: ../finch/gntpounce.c:344 msgid "Pounce Who" msgstr "Kinél figyelmeztet" #. Account: -#: ../finch/gntpounce.c:336 ../finch/gntstatus.c:456 +#: ../finch/gntpounce.c:347 ../finch/gntstatus.c:456 msgid "Account:" msgstr "Fiók:" -#: ../finch/gntpounce.c:358 +#: ../finch/gntpounce.c:369 msgid "Buddy name:" msgstr "Partner neve:" #. Create the "Pounce When Buddy..." frame. -#: ../finch/gntpounce.c:374 ../pidgin/gtkpounce.c:585 +#: ../finch/gntpounce.c:387 ../pidgin/gtkpounce.c:600 msgid "Pounce When Buddy..." msgstr "Figyelmeztetés, ha a partner..." -#: ../finch/gntpounce.c:376 +#: ../finch/gntpounce.c:389 msgid "Signs on" msgstr "Bejelentkezik" -#: ../finch/gntpounce.c:377 +#: ../finch/gntpounce.c:390 msgid "Signs off" msgstr "Kijelentkezik" -#: ../finch/gntpounce.c:378 +#: ../finch/gntpounce.c:391 msgid "Goes away" msgstr "A partner elmegy" -#: ../finch/gntpounce.c:379 +#: ../finch/gntpounce.c:392 msgid "Returns from away" msgstr "Visszatér távollétből" -#: ../finch/gntpounce.c:380 +#: ../finch/gntpounce.c:393 msgid "Becomes idle" msgstr "Inaktív lesz" -#: ../finch/gntpounce.c:381 +#: ../finch/gntpounce.c:394 msgid "Is no longer idle" msgstr "Már nem inaktív" -#: ../finch/gntpounce.c:382 +#: ../finch/gntpounce.c:395 msgid "Starts typing" msgstr "Elkezd gépelni" -#: ../finch/gntpounce.c:383 +#: ../finch/gntpounce.c:396 msgid "Pauses while typing" msgstr "Felfüggeszti a gépelést" -#: ../finch/gntpounce.c:384 +#: ../finch/gntpounce.c:397 msgid "Stops typing" msgstr "Abbahagyja a gépelést" -#: ../finch/gntpounce.c:385 +#: ../finch/gntpounce.c:398 msgid "Sends a message" msgstr "Üzenetet küld" #. Create the "Action" frame. -#: ../finch/gntpounce.c:414 ../pidgin/gtkpounce.c:646 +#: ../finch/gntpounce.c:427 ../pidgin/gtkpounce.c:661 msgid "Action" msgstr "Művelet" -#: ../finch/gntpounce.c:416 +#: ../finch/gntpounce.c:429 msgid "Open an IM window" msgstr "Azonnali üzenőablak megnyitása" -#: ../finch/gntpounce.c:417 +#: ../finch/gntpounce.c:430 msgid "Pop up a notification" msgstr "Értesítés megjelenítése" -#: ../finch/gntpounce.c:418 +#: ../finch/gntpounce.c:431 msgid "Send a message" msgstr "Üzenet küldése" -#: ../finch/gntpounce.c:419 +#: ../finch/gntpounce.c:432 msgid "Execute a command" msgstr "Parancs végrehajtása" -#: ../finch/gntpounce.c:420 +#: ../finch/gntpounce.c:433 msgid "Play a sound" msgstr "Hang lejátszása" -#: ../finch/gntpounce.c:448 +#: ../finch/gntpounce.c:461 msgid "Pounce only when my status is not available" msgstr "Csak akkor figyelmeztet, ha az állapotom nem érhető el" -#: ../finch/gntpounce.c:450 ../pidgin/gtkpounce.c:1281 +#: ../finch/gntpounce.c:463 ../pidgin/gtkpounce.c:1301 msgid "Recurring" msgstr "Ismétlődő" -#: ../finch/gntpounce.c:618 +#: ../finch/gntpounce.c:631 msgid "Cannot create pounce" msgstr "Nem hozható létre figyelmeztetés" -#: ../finch/gntpounce.c:619 +#: ../finch/gntpounce.c:632 msgid "You do not have any accounts." msgstr "Nincs egyetlen fiókja sem." -#: ../finch/gntpounce.c:620 +#: ../finch/gntpounce.c:633 msgid "You must create an account first before you can create a pounce." msgstr "A figyelmeztetések létrehozása előtt létre kell hoznia egy fiókot." -#: ../finch/gntpounce.c:662 ../pidgin/gtkpounce.c:1096 +#: ../finch/gntpounce.c:675 ../pidgin/gtkpounce.c:1116 #, c-format msgid "Are you sure you want to delete the pounce on %s for %s?" msgstr "Biztos, hogy törölni akarja %s figyelmeztetését a következőnek: %s?" -#: ../finch/gntpounce.c:696 ../finch/gntui.c:84 ../pidgin/gtkpounce.c:1325 +#: ../finch/gntpounce.c:709 ../finch/gntui.c:84 ../pidgin/gtkpounce.c:1352 msgid "Buddy Pounces" msgstr "Partnerfigyelmeztetések" -#: ../finch/gntpounce.c:810 ../pidgin/gtkpounce.c:1452 +#: ../finch/gntpounce.c:823 ../pidgin/gtkpounce.c:1480 #, c-format msgid "%s has started typing to you (%s)" msgstr "%s gépelni kezdett Önnek (%s)" -#: ../finch/gntpounce.c:812 ../pidgin/gtkpounce.c:1454 +#: ../finch/gntpounce.c:825 ../pidgin/gtkpounce.c:1482 #, c-format msgid "%s has paused while typing to you (%s)" msgstr "%s szünetet tart az Önnek gépelés közben (%s)" -#: ../finch/gntpounce.c:814 ../pidgin/gtkpounce.c:1456 +#: ../finch/gntpounce.c:827 ../pidgin/gtkpounce.c:1484 #, c-format msgid "%s has signed on (%s)" msgstr "%s belépett (%s)" -#: ../finch/gntpounce.c:816 ../pidgin/gtkpounce.c:1458 +#: ../finch/gntpounce.c:829 ../pidgin/gtkpounce.c:1486 #, c-format msgid "%s has returned from being idle (%s)" msgstr "%s inaktív állapota megszűnt (%s)" -#: ../finch/gntpounce.c:818 ../pidgin/gtkpounce.c:1460 +#: ../finch/gntpounce.c:831 ../pidgin/gtkpounce.c:1488 #, c-format msgid "%s has returned from being away (%s)" msgstr "%s visszatért (%s)" -#: ../finch/gntpounce.c:820 ../pidgin/gtkpounce.c:1462 +#: ../finch/gntpounce.c:833 ../pidgin/gtkpounce.c:1490 #, c-format msgid "%s has stopped typing to you (%s)" msgstr "%s abbahagyta a gépelést (%s)" -#: ../finch/gntpounce.c:822 ../pidgin/gtkpounce.c:1464 +#: ../finch/gntpounce.c:835 ../pidgin/gtkpounce.c:1492 #, c-format msgid "%s has signed off (%s)" msgstr "%s kilépett (%s)" -#: ../finch/gntpounce.c:824 ../pidgin/gtkpounce.c:1466 +#: ../finch/gntpounce.c:837 ../pidgin/gtkpounce.c:1494 #, c-format msgid "%s has become idle (%s)" msgstr "%s állapota inaktív (%s)" -#: ../finch/gntpounce.c:826 ../pidgin/gtkpounce.c:1468 +#: ../finch/gntpounce.c:839 ../pidgin/gtkpounce.c:1496 #, c-format msgid "%s has gone away. (%s)" msgstr "%s távol van. (%s)" -#: ../finch/gntpounce.c:828 ../pidgin/gtkpounce.c:1470 +#: ../finch/gntpounce.c:841 ../pidgin/gtkpounce.c:1498 #, c-format msgid "%s has sent you a message. (%s)" msgstr "%s egy üzenetet küldött. (%s)" -#: ../finch/gntpounce.c:829 ../pidgin/gtkpounce.c:1471 +#: ../finch/gntpounce.c:842 ../pidgin/gtkpounce.c:1499 #, c-format msgid "Unknown pounce event. Please report this!" msgstr "Ismeretlen figyelmeztetési esemény. Kérjük jelentse ezt!" @@ -1419,12 +1469,12 @@ msgid "Based on keyboard use" msgstr "Billentyűzet használata alapján" -#: ../finch/gntprefs.c:94 ../pidgin/gtkprefs.c:1930 +#: ../finch/gntprefs.c:94 ../pidgin/gtkprefs.c:2031 msgid "From last sent message" msgstr "Utolsó elküldött üzenettől" -#: ../finch/gntprefs.c:96 ../pidgin/gtkprefs.c:898 ../pidgin/gtkprefs.c:907 -#: ../pidgin/gtkprefs.c:1929 ../pidgin/gtkprefs.c:1943 +#: ../finch/gntprefs.c:96 ../pidgin/gtkprefs.c:900 ../pidgin/gtkprefs.c:908 +#: ../pidgin/gtkprefs.c:2030 ../pidgin/gtkprefs.c:2044 #: ../pidgin/plugins/win32/winprefs/winprefs.c:333 msgid "Never" msgstr "Soha" @@ -1474,79 +1524,79 @@ msgstr "Állapot megváltoztatása a következőre" #. Conversations -#: ../finch/gntprefs.c:259 ../pidgin/gtkprefs.c:993 ../pidgin/gtkprefs.c:2033 +#: ../finch/gntprefs.c:259 ../pidgin/gtkprefs.c:995 ../pidgin/gtkprefs.c:2135 #: ../pidgin/plugins/win32/winprefs/winprefs.c:340 msgid "Conversations" msgstr "Társalgások" -#: ../finch/gntprefs.c:260 ../pidgin/gtkprefs.c:1467 ../pidgin/gtkprefs.c:2044 +#: ../finch/gntprefs.c:260 ../pidgin/gtkprefs.c:1563 ../pidgin/gtkprefs.c:2146 msgid "Logging" msgstr "Naplózás" -#: ../finch/gntrequest.c:583 +#: ../finch/gntrequest.c:585 msgid "Not implemented yet." msgstr "Még nincs megvalósítva." -#: ../finch/gntrequest.c:659 ../pidgin/gtkrequest.c:1555 -#: ../pidgin/gtkrequest.c:1601 +#: ../finch/gntrequest.c:661 ../pidgin/gtkrequest.c:1699 +#: ../pidgin/gtkrequest.c:1745 msgid "Save File..." msgstr "Fájl mentése..." -#: ../finch/gntrequest.c:659 ../pidgin/gtkrequest.c:1556 -#: ../pidgin/gtkrequest.c:1602 +#: ../finch/gntrequest.c:661 ../pidgin/gtkrequest.c:1700 +#: ../pidgin/gtkrequest.c:1746 msgid "Open File..." msgstr "Fájl megnyitása..." -#: ../finch/gntsound.c:97 ../pidgin/gtksound.c:64 +#: ../finch/gntsound.c:97 ../pidgin/gtksound.c:62 msgid "Buddy logs in" msgstr "Partner belép" -#: ../finch/gntsound.c:98 ../pidgin/gtksound.c:65 +#: ../finch/gntsound.c:98 ../pidgin/gtksound.c:63 msgid "Buddy logs out" msgstr "Partner kilép" -#: ../finch/gntsound.c:99 ../pidgin/gtksound.c:66 +#: ../finch/gntsound.c:99 ../pidgin/gtksound.c:64 msgid "Message received" msgstr "Üzenet fogadása" -#: ../finch/gntsound.c:100 ../pidgin/gtksound.c:67 +#: ../finch/gntsound.c:100 ../pidgin/gtksound.c:65 msgid "Message received begins conversation" msgstr "Társalgás kezdetét jelző üzenet" -#: ../finch/gntsound.c:101 ../pidgin/gtksound.c:68 +#: ../finch/gntsound.c:101 ../pidgin/gtksound.c:66 msgid "Message sent" msgstr "Üzenet elküldve" -#: ../finch/gntsound.c:102 ../pidgin/gtksound.c:69 +#: ../finch/gntsound.c:102 ../pidgin/gtksound.c:67 msgid "Person enters chat" msgstr "Egy személy csatlakozik a csevegéshez" -#: ../finch/gntsound.c:103 ../pidgin/gtksound.c:70 +#: ../finch/gntsound.c:103 ../pidgin/gtksound.c:68 msgid "Person leaves chat" msgstr "Egy személy elhagyja a csevegést" -#: ../finch/gntsound.c:104 ../pidgin/gtksound.c:71 +#: ../finch/gntsound.c:104 ../pidgin/gtksound.c:69 msgid "You talk in chat" msgstr "Ön beszél a csevegésben" -#: ../finch/gntsound.c:105 ../pidgin/gtksound.c:72 +#: ../finch/gntsound.c:105 ../pidgin/gtksound.c:70 msgid "Others talk in chat" msgstr "Mások beszélnek a csevegésben" -#: ../finch/gntsound.c:107 ../pidgin/gtksound.c:75 +#: ../finch/gntsound.c:107 ../pidgin/gtksound.c:73 msgid "Someone says your screen name in chat" msgstr "Valaki csevegés közben leírja az Ön felhasználónevét" -#: ../finch/gntsound.c:361 ../pidgin/gtksound.c:311 +#: ../finch/gntsound.c:361 ../pidgin/gtksound.c:306 msgid "GStreamer Failure" msgstr "GStreamer hiba" -#: ../finch/gntsound.c:362 ../pidgin/gtksound.c:312 +#: ../finch/gntsound.c:362 ../pidgin/gtksound.c:307 msgid "GStreamer failed to initialize." msgstr "A GStreamer inicializálása meghiúsult." -#: ../finch/gntsound.c:716 ../finch/gntsound.c:802 ../pidgin/gtkprefs.c:1587 -#: ../pidgin/gtkprefs.c:1676 ../pidgin/gtkprefs.c:1872 +#: ../finch/gntsound.c:716 ../finch/gntsound.c:802 ../pidgin/gtkprefs.c:1687 +#: ../pidgin/gtkprefs.c:1776 ../pidgin/gtkprefs.c:1972 msgid "(default)" msgstr "(alapértelmezett)" @@ -1562,7 +1612,7 @@ msgid "Profiles" msgstr "Profilok" -#: ../finch/gntsound.c:954 ../pidgin/gtkprefs.c:1717 +#: ../finch/gntsound.c:954 ../pidgin/gtkprefs.c:1817 msgid "Automatic" msgstr "Automatikus" @@ -1570,7 +1620,7 @@ msgid "Console Beep" msgstr "Konzolos hangjelzés" -#: ../finch/gntsound.c:958 ../pidgin/gtkprefs.c:1721 +#: ../finch/gntsound.c:958 ../pidgin/gtkprefs.c:1821 msgid "Command" msgstr "Parancs" @@ -1578,7 +1628,7 @@ msgid "No Sound" msgstr "Nincsenek hangok" -#: ../finch/gntsound.c:961 ../pidgin/gtkprefs.c:1712 +#: ../finch/gntsound.c:961 ../pidgin/gtkprefs.c:1812 msgid "Sound Method" msgstr "Hangrendszer" @@ -1596,7 +1646,7 @@ "(%s fájlnév megadásához)" #. Sound options -#: ../finch/gntsound.c:981 ../pidgin/gtkprefs.c:1756 +#: ../finch/gntsound.c:981 ../pidgin/gtkprefs.c:1856 msgid "Sound Options" msgstr "Hangbeállítások" @@ -1604,18 +1654,18 @@ msgid "Sounds when conversation has focus" msgstr "Hangok lejátszása, ha a társalgás ablaka aktív" -#: ../finch/gntsound.c:990 ../pidgin/gtkprefs.c:897 ../pidgin/gtkprefs.c:909 -#: ../pidgin/gtkprefs.c:1763 ../pidgin/plugins/timestamp_format.c:42 +#: ../finch/gntsound.c:990 ../pidgin/gtkprefs.c:898 ../pidgin/gtkprefs.c:910 +#: ../pidgin/gtkprefs.c:1863 ../pidgin/plugins/timestamp_format.c:42 #: ../pidgin/plugins/timestamp_format.c:51 #: ../pidgin/plugins/win32/winprefs/winprefs.c:334 msgid "Always" msgstr "Mindig" -#: ../finch/gntsound.c:991 ../pidgin/gtkprefs.c:1761 +#: ../finch/gntsound.c:991 ../pidgin/gtkprefs.c:1861 msgid "Only when available" msgstr "Csak ha elérhető" -#: ../finch/gntsound.c:992 ../pidgin/gtkprefs.c:1762 +#: ../finch/gntsound.c:992 ../pidgin/gtkprefs.c:1862 msgid "Only when not available" msgstr "Csak ha nem érhető el" @@ -1624,11 +1674,11 @@ msgstr "Hangerő (0-100):" #. Sound events -#: ../finch/gntsound.c:1018 ../pidgin/gtkprefs.c:1798 +#: ../finch/gntsound.c:1018 ../pidgin/gtkprefs.c:1898 msgid "Sound Events" msgstr "Hangesemények" -#: ../finch/gntsound.c:1020 ../pidgin/gtkprefs.c:1857 +#: ../finch/gntsound.c:1020 ../pidgin/gtkprefs.c:1957 msgid "Event" msgstr "Esemény" @@ -1636,15 +1686,15 @@ msgid "File" msgstr "Fájl" -#: ../finch/gntsound.c:1039 ../pidgin/gtkprefs.c:1876 +#: ../finch/gntsound.c:1039 ../pidgin/gtkprefs.c:1976 msgid "Test" msgstr "Teszt" -#: ../finch/gntsound.c:1042 ../pidgin/gtkprefs.c:1880 +#: ../finch/gntsound.c:1042 ../pidgin/gtkprefs.c:1980 msgid "Reset" msgstr "Visszaállítás" -#: ../finch/gntsound.c:1045 ../pidgin/gtkprefs.c:1884 +#: ../finch/gntsound.c:1045 ../pidgin/gtkprefs.c:1984 msgid "Choose..." msgstr "Kiválasztás..." @@ -1664,7 +1714,8 @@ #: ../finch/gntstatus.c:183 ../finch/gntstatus.c:539 #: ../libpurple/protocols/jabber/buddy.c:298 #: ../libpurple/protocols/jabber/buddy.c:1359 -#: ../libpurple/protocols/novell/novell.c:1484 +#: ../libpurple/protocols/msn/msn.c:725 +#: ../libpurple/protocols/novell/novell.c:1486 #: ../pidgin/gtksavedstatuses.c:500 msgid "Title" msgstr "Beosztás" @@ -1682,41 +1733,44 @@ #. not independent #. Attributes - each status can have a message. #: ../finch/gntstatus.c:183 ../finch/gntstatus.c:564 ../finch/gntstatus.c:576 -#: ../libpurple/protocols/bonjour/bonjour.c:256 -#: ../libpurple/protocols/bonjour/bonjour.c:263 -#: ../libpurple/protocols/bonjour/bonjour.c:346 -#: ../libpurple/protocols/gg/gg.c:1077 ../libpurple/protocols/gg/gg.c:1579 -#: ../libpurple/protocols/gg/gg.c:1597 ../libpurple/protocols/gg/gg.c:1607 -#: ../libpurple/protocols/gg/gg.c:1613 ../libpurple/protocols/gg/gg.c:1622 -#: ../libpurple/protocols/gg/gg.c:1627 ../libpurple/protocols/irc/irc.c:234 -#: ../libpurple/protocols/jabber/jabber.c:1532 -#: ../libpurple/protocols/jabber/jabber.c:1555 -#: ../libpurple/protocols/jabber/jabber.c:1578 -#: ../libpurple/protocols/jabber/jabber.c:1601 -#: ../libpurple/protocols/jabber/jabber.c:1624 -#: ../libpurple/protocols/jabber/jabber.c:1649 +#: ../libpurple/protocols/bonjour/bonjour.c:270 +#: ../libpurple/protocols/bonjour/bonjour.c:277 +#: ../libpurple/protocols/bonjour/bonjour.c:360 +#: ../libpurple/protocols/gg/gg.c:1088 ../libpurple/protocols/gg/gg.c:1590 +#: ../libpurple/protocols/gg/gg.c:1608 ../libpurple/protocols/gg/gg.c:1618 +#: ../libpurple/protocols/gg/gg.c:1624 ../libpurple/protocols/gg/gg.c:1633 +#: ../libpurple/protocols/gg/gg.c:1638 ../libpurple/protocols/irc/irc.c:234 +#: ../libpurple/protocols/jabber/jabber.c:1539 +#: ../libpurple/protocols/jabber/jabber.c:1553 +#: ../libpurple/protocols/jabber/jabber.c:1567 +#: ../libpurple/protocols/jabber/jabber.c:1581 +#: ../libpurple/protocols/jabber/jabber.c:1595 +#: ../libpurple/protocols/jabber/jabber.c:1611 +#: ../libpurple/protocols/msn/msn.c:677 ../libpurple/protocols/msn/msn.c:683 +#: ../libpurple/protocols/msn/msn.c:689 ../libpurple/protocols/msn/msn.c:695 +#: ../libpurple/protocols/msn/msn.c:700 ../libpurple/protocols/msn/msn.c:705 #: ../libpurple/protocols/myspace/myspace.c:148 -#: ../libpurple/protocols/novell/novell.c:2838 -#: ../libpurple/protocols/novell/novell.c:2941 -#: ../libpurple/protocols/novell/novell.c:2947 -#: ../libpurple/protocols/novell/novell.c:2953 -#: ../libpurple/protocols/oscar/oscar.c:5554 -#: ../libpurple/protocols/oscar/oscar.c:5772 -#: ../libpurple/protocols/oscar/oscar.c:5786 -#: ../libpurple/protocols/oscar/oscar.c:5802 -#: ../libpurple/protocols/oscar/oscar.c:5809 -#: ../libpurple/protocols/oscar/oscar.c:5816 -#: ../libpurple/protocols/sametime/sametime.c:3286 -#: ../libpurple/protocols/sametime/sametime.c:3292 -#: ../libpurple/protocols/sametime/sametime.c:3298 -#: ../libpurple/protocols/sametime/sametime.c:3377 -#: ../libpurple/protocols/silc/buddy.c:1551 -#: ../libpurple/protocols/silc10/buddy.c:1551 -#: ../libpurple/protocols/simple/simple.c:246 -#: ../libpurple/protocols/yahoo/yahoo.c:3751 -#: ../libpurple/protocols/yahoo/yahoo.c:3757 +#: ../libpurple/protocols/novell/novell.c:2843 +#: ../libpurple/protocols/novell/novell.c:2946 +#: ../libpurple/protocols/novell/novell.c:2952 +#: ../libpurple/protocols/novell/novell.c:2958 +#: ../libpurple/protocols/oscar/oscar.c:5609 +#: ../libpurple/protocols/oscar/oscar.c:5827 +#: ../libpurple/protocols/oscar/oscar.c:5841 +#: ../libpurple/protocols/oscar/oscar.c:5857 +#: ../libpurple/protocols/oscar/oscar.c:5864 +#: ../libpurple/protocols/oscar/oscar.c:5871 +#: ../libpurple/protocols/sametime/sametime.c:3287 +#: ../libpurple/protocols/sametime/sametime.c:3293 +#: ../libpurple/protocols/sametime/sametime.c:3299 +#: ../libpurple/protocols/sametime/sametime.c:3378 +#: ../libpurple/protocols/silc/buddy.c:1554 +#: ../libpurple/protocols/silc10/buddy.c:1554 +#: ../libpurple/protocols/simple/simple.c:247 +#: ../libpurple/protocols/yahoo/yahoo.c:3753 +#: ../libpurple/protocols/yahoo/yahoo.c:3759 #: ../libpurple/protocols/zephyr/zephyr.c:2337 -#: ../pidgin/gtksavedstatuses.c:526 ../pidgin/gtksavedstatuses.c:1010 +#: ../pidgin/gtksavedstatuses.c:526 ../pidgin/gtksavedstatuses.c:1016 msgid "Message" msgstr "Üzenet" @@ -1770,7 +1824,7 @@ msgid "Certificates" msgstr "Tanúsítványok" -#: ../finch/gntui.c:89 ../pidgin/gtkprefs.c:2035 +#: ../finch/gntui.c:89 ../pidgin/gtkprefs.c:2137 msgid "Sounds" msgstr "Hangok" @@ -1793,8 +1847,7 @@ #: ../finch/plugins/gntclipboard.c:129 msgid "This plugin cannot be loaded because it was not built with X11 support." -msgstr "" -"A bővítmény nem tölthető be, mivel X11 támogatás nélkül került lefordításra." +msgstr "A bővítmény nem tölthető be, mivel X11 támogatás nélkül került lefordításra." #: ../finch/plugins/gntclipboard.c:158 msgid "GntClipboard" @@ -1873,16 +1926,16 @@ msgid "Toaster plugin" msgstr "Kenyérpirító bővítmény" -#: ../finch/plugins/gnthistory.c:116 ../pidgin/plugins/history.c:120 +#: ../finch/plugins/gnthistory.c:116 ../pidgin/plugins/history.c:125 #, c-format msgid "<b>Conversation with %s on %s:</b><br>" msgstr "<b>Társalgás %s partnerrel ekkor: %s:</b><br>" -#: ../finch/plugins/gnthistory.c:138 ../pidgin/plugins/history.c:147 +#: ../finch/plugins/gnthistory.c:138 ../pidgin/plugins/history.c:153 msgid "History Plugin Requires Logging" msgstr "Az előzmények bővítmény megköveteli a naplózást" -#: ../finch/plugins/gnthistory.c:139 ../pidgin/plugins/history.c:148 +#: ../finch/plugins/gnthistory.c:139 ../pidgin/plugins/history.c:154 msgid "" "Logging can be enabled from Tools -> Preferences -> Logging.\n" "\n" @@ -1898,11 +1951,11 @@ msgid "GntHistory" msgstr "Gnt előzmények" -#: ../finch/plugins/gnthistory.c:181 ../pidgin/plugins/history.c:190 +#: ../finch/plugins/gnthistory.c:181 ../pidgin/plugins/history.c:197 msgid "Shows recently logged conversations in new conversations." msgstr "Legutóbb naplózott társalgások mutatása új társalgáskor." -#: ../finch/plugins/gnthistory.c:182 ../pidgin/plugins/history.c:191 +#: ../finch/plugins/gnthistory.c:182 ../pidgin/plugins/history.c:198 msgid "" "When a new conversation is opened this plugin will insert the last " "conversation into the current conversation." @@ -1927,89 +1980,89 @@ msgid "Lastlog plugin." msgstr "Lastlog bővítmény." -#: ../libpurple/account.c:791 +#: ../libpurple/account.c:794 msgid "accounts" msgstr "fiókok" -#: ../libpurple/account.c:958 ../libpurple/protocols/jabber/auth.c:195 +#: ../libpurple/account.c:961 ../libpurple/protocols/jabber/auth.c:195 msgid "Password is required to sign on." msgstr "A bejelentkezéshez jelszó szükséges." -#: ../libpurple/account.c:992 +#: ../libpurple/account.c:995 #, c-format msgid "Enter password for %s (%s)" msgstr "Adja meg a jelszót %s (%s) számára" -#: ../libpurple/account.c:999 +#: ../libpurple/account.c:1002 msgid "Enter Password" msgstr "Adja meg a jelszót" -#: ../libpurple/account.c:1004 +#: ../libpurple/account.c:1007 msgid "Save password" msgstr "Jelszó mentése" -#: ../libpurple/account.c:1039 ../libpurple/connection.c:105 +#: ../libpurple/account.c:1042 ../libpurple/connection.c:105 #: ../libpurple/connection.c:178 #, c-format msgid "Missing protocol plugin for %s" msgstr "Hiányzó protokollbővítmény a következőhöz: %s" -#: ../libpurple/account.c:1041 ../libpurple/connection.c:108 -#: ../pidgin/gtkblist.c:4036 +#: ../libpurple/account.c:1044 ../libpurple/connection.c:108 +#: ../pidgin/gtkblist.c:4384 msgid "Connection Error" msgstr "Kapcsolódási hiba" -#: ../libpurple/account.c:1199 ../libpurple/protocols/gg/gg.c:707 -#: ../libpurple/protocols/jabber/jabber.c:1687 +#: ../libpurple/account.c:1241 ../libpurple/protocols/gg/gg.c:717 +#: ../libpurple/protocols/jabber/jabber.c:1667 msgid "New passwords do not match." msgstr "Az új jelszavak nem egyeznek." -#: ../libpurple/account.c:1208 +#: ../libpurple/account.c:1250 msgid "Fill out all fields completely." msgstr "Minden mezőt töltsön ki." -#: ../libpurple/account.c:1231 +#: ../libpurple/account.c:1273 msgid "Original password" msgstr "Eredeti jelszó" -#: ../libpurple/account.c:1238 +#: ../libpurple/account.c:1280 msgid "New password" msgstr "Új jelszó" -#: ../libpurple/account.c:1245 +#: ../libpurple/account.c:1287 msgid "New password (again)" msgstr "Új jelszó (még egyszer)" -#: ../libpurple/account.c:1251 +#: ../libpurple/account.c:1293 #, c-format msgid "Change password for %s" msgstr "%s jelszavának megváltoztatása" -#: ../libpurple/account.c:1259 +#: ../libpurple/account.c:1301 msgid "Please enter your current password and your new password." -msgstr "Kérem adja meg a jelenlegi jelszavát és az új jelszót." - -#: ../libpurple/account.c:1290 +msgstr "Adja meg a jelenlegi jelszavát és az új jelszót." + +#: ../libpurple/account.c:1332 #, c-format msgid "Change user information for %s" msgstr "Felhasználó-információk megváltoztatása %s számára" -#: ../libpurple/account.c:1293 ../libpurple/protocols/toc/toc.c:1670 +#: ../libpurple/account.c:1335 ../libpurple/protocols/toc/toc.c:1670 msgid "Set User Info" msgstr "Felhasználói adatok beállítása" -#: ../libpurple/account.c:1764 ../libpurple/protocols/gg/gg.c:1017 +#: ../libpurple/account.c:1806 ../libpurple/protocols/gg/gg.c:1028 #: ../libpurple/protocols/jabber/buddy.c:782 -#: ../libpurple/protocols/jabber/buddy.c:2027 -#: ../libpurple/protocols/jabber/buddy.c:2044 -#: ../libpurple/protocols/novell/novell.c:2831 +#: ../libpurple/protocols/jabber/buddy.c:2030 +#: ../libpurple/protocols/jabber/buddy.c:2047 +#: ../libpurple/protocols/novell/novell.c:2836 #: ../libpurple/protocols/qq/qq.c:232 ../pidgin/gtkft.c:160 msgid "Unknown" msgstr "Ismeretlen" -#: ../libpurple/blist.c:521 ../libpurple/blist.c:1320 -#: ../libpurple/blist.c:1552 ../libpurple/protocols/jabber/roster.c:69 -#: ../libpurple/protocols/myspace/myspace.c:3244 ../pidgin/gtkblist.c:5373 +#: ../libpurple/blist.c:521 ../libpurple/blist.c:1321 +#: ../libpurple/blist.c:1531 ../libpurple/protocols/jabber/roster.c:69 +#: ../libpurple/protocols/myspace/myspace.c:3250 ../pidgin/gtkblist.c:5737 #: ../pidgin/plugins/gevolution/gevo-util.c:67 #: ../pidgin/plugins/gevolution/gevolution.c:96 msgid "Buddies" @@ -2019,59 +2072,59 @@ msgid "buddy list" msgstr "partnerlista" -#: ../libpurple/certificate.c:545 +#: ../libpurple/certificate.c:558 msgid "(DOES NOT MATCH)" -msgstr "" +msgstr "(NEM EGYEZIK)" #. Make messages -#: ../libpurple/certificate.c:549 +#: ../libpurple/certificate.c:562 #, c-format msgid "%s has presented the following certificate for just-this-once use:" -msgstr "" - -#: ../libpurple/certificate.c:550 +msgstr "%s a következő tanúsítványt mutatta be erre az egy alkalomra:" + +#: ../libpurple/certificate.c:563 #, c-format msgid "" "Common name: %s %s\n" "Fingerprint (SHA1): %s" msgstr "" +"Közönséges név: %s %s\n" +"Ujjlenyomat (SHA1): %s" #. TODO: Find what the handle ought to be -#: ../libpurple/certificate.c:555 +#: ../libpurple/certificate.c:568 msgid "Single-use Certificate Verification" -msgstr "" +msgstr "Egyszer használatos tanúsítvány ellenőrzése" #. Scheme name #. Pool name -#: ../libpurple/certificate.c:872 -#, fuzzy +#: ../libpurple/certificate.c:886 msgid "Certificate Authorities" -msgstr "Tanúsítványok" +msgstr "Hitelesítésszolgáltatók" #. Scheme name #. Pool name -#: ../libpurple/certificate.c:1040 +#: ../libpurple/certificate.c:1054 msgid "SSL Peers Cache" -msgstr "" +msgstr "SSL partner-gyorsítótár" #. Make messages -#: ../libpurple/certificate.c:1171 -#, fuzzy, c-format +#: ../libpurple/certificate.c:1185 +#, c-format msgid "Accept certificate for %s?" -msgstr "Elfogadja a meghívást a csevegésre?" +msgstr "Elfogadja a következő tanúsítványát: %s?" #. TODO: Find what the handle ought to be -#: ../libpurple/certificate.c:1177 +#: ../libpurple/certificate.c:1191 msgid "SSL Certificate Verification" -msgstr "" +msgstr "SSL tanúsítvány-ellenőrzés" #. Number of actions -#: ../libpurple/certificate.c:1186 -#, fuzzy +#: ../libpurple/certificate.c:1201 msgid "Accept" -msgstr "Elfog_adás" - -#: ../libpurple/certificate.c:1187 ../libpurple/protocols/qq/buddy_opt.c:214 +msgstr "Elfogadás" + +#: ../libpurple/certificate.c:1202 ../libpurple/protocols/qq/buddy_opt.c:214 #: ../libpurple/protocols/qq/group_im.c:144 #: ../libpurple/protocols/qq/group_opt.c:127 #: ../libpurple/protocols/qq/sys_msg.c:90 @@ -2079,78 +2132,84 @@ msgid "Reject" msgstr "Visszautasítás" -#: ../libpurple/certificate.c:1188 -#, fuzzy +#: ../libpurple/certificate.c:1203 msgid "_View Certificate..." -msgstr "Tanúsítványok" +msgstr "_Tanúsítvány megjelenítése..." #. Prompt the user to authenticate the certificate #. TODO: Provide the user with more guidance about why he is #. being prompted #. vrq will be completed by user_auth -#: ../libpurple/certificate.c:1288 +#: ../libpurple/certificate.c:1303 #, c-format msgid "" "The certificate presented by \"%s\" claims to be from \"%s\" instead. This " "could mean that you are not connecting to the service you believe you are." msgstr "" +"A(z) \"%s\" által bemutatott tanúsítvány a következőtől származónak mondja " +"magát: \"%s\". Ez azt jelentheti, hogy a kívánttól eltérő szolgáltatáshoz " +"kapcsolódik." #. Prompt the user to authenticate the certificate #. vrq will be completed by user_auth -#: ../libpurple/certificate.c:1313 +#: ../libpurple/certificate.c:1328 #, c-format msgid "" "The certificate presented by \"%s\" is self-signed. It cannot be " "automatically checked." msgstr "" - -#: ../libpurple/certificate.c:1331 +"A(z) \"%s\" által bemutatott tanúsítvány saját aláírású. Nem ellenőrizhető " +"automatikusan." + +#: ../libpurple/certificate.c:1346 #, c-format msgid "The certificate chain presented for %s is not valid." -msgstr "" +msgstr "A következőhöz bemutatott tanúsítványlánc nem érvényes: %s." #. TODO: Make this error either block the ensuing SSL #. connection error until the user dismisses this one, or #. stifle it. #. TODO: Probably wrong. #. TODO: Probably wrong -#: ../libpurple/certificate.c:1339 ../libpurple/certificate.c:1416 -#, fuzzy +#: ../libpurple/certificate.c:1354 ../libpurple/certificate.c:1423 msgid "SSL Certificate Error" -msgstr "Tanúsítványok" - -#: ../libpurple/certificate.c:1340 -#, fuzzy +msgstr "SSL tanúsítványhiba" + +#: ../libpurple/certificate.c:1355 msgid "Invalid certificate chain" -msgstr "Érvénytelen cím" +msgstr "Érvénytelen tanúsítványlánc" #. vrq will be completed by user_auth -#: ../libpurple/certificate.c:1360 +#: ../libpurple/certificate.c:1375 msgid "" "You have no database of root certificates, so this certificate cannot be " "validated." msgstr "" +"A gyökértanúsítványok adatbázisa nem érhető el, így ez a tanúsítvány nem " +"ellenőrizhető." #. vrq will be completed by user_auth -#: ../libpurple/certificate.c:1382 -msgid "" -"The root certificate this one claims to be issued by is unknown to Pidgin." -msgstr "" - -#: ../libpurple/certificate.c:1408 +#: ../libpurple/certificate.c:1398 +msgid "The root certificate this one claims to be issued by is unknown to Pidgin." +msgstr "A tanúsítványt kiadó gyökértanúsítványt a Pidgin nem ismeri." + +#: ../libpurple/certificate.c:1415 #, c-format msgid "" "The certificate chain presented by %s does not have a valid digital " "signature from the Certificate Authority from which it claims to have a " "signature." msgstr "" - -#: ../libpurple/certificate.c:1417 +"A(z) %s által bemutatott tanúsítványlánc nem rendelkezik érvényes digitális " +"aláírással attól a hitelesítésszolgáltatótól, amely aláírásával állítása " +"szerint rendelkezik." + +#: ../libpurple/certificate.c:1424 msgid "Invalid certificate authority signature" -msgstr "" +msgstr "A hitelesítésszolgáltató aláírása érvénytelen" #. Make messages -#: ../libpurple/certificate.c:1881 +#: ../libpurple/certificate.c:1888 #, c-format msgid "" "Common name: %s\n" @@ -2160,21 +2219,25 @@ "Activation date: %s\n" "Expiration date: %s\n" msgstr "" +"Közönséges név: %s\n" +"\n" +"Ujjlenyomat (SHA1): %s\n" +"\n" +"Aktiválás dátuma: %s\n" +"Lejárat dátuma: %s\n" #. TODO: Find what the handle ought to be -#: ../libpurple/certificate.c:1890 -#, fuzzy +#: ../libpurple/certificate.c:1897 msgid "Certificate Information" -msgstr "Kiszolgálóinformációk" +msgstr "Tanúsítványinformációk" #: ../libpurple/connection.c:107 msgid "Registration Error" msgstr "Regisztrációs hiba" #: ../libpurple/connection.c:180 -#, fuzzy msgid "Unregistration Error" -msgstr "Regisztrációs hiba" +msgstr "Regisztrációtörlési hiba" #: ../libpurple/connection.c:350 #, c-format @@ -2186,10 +2249,12 @@ msgid "+++ %s signed off" msgstr "+++ %s kilépett" -#: ../libpurple/connection.c:497 ../libpurple/plugin.c:282 -#: ../libpurple/protocols/jabber/buddy.c:2337 +#: ../libpurple/connection.c:497 ../libpurple/plugin.c:277 +#: ../libpurple/protocols/jabber/buddy.c:2350 #: ../libpurple/protocols/msn/servconn.c:141 -#: ../libpurple/protocols/msn/session.c:322 +#: ../libpurple/protocols/msn/session.c:371 +#: ../libpurple/protocols/msnp9/servconn.c:139 +#: ../libpurple/protocols/msnp9/session.c:322 msgid "Unknown error" msgstr "Ismeretlen hiba" @@ -2264,7 +2329,7 @@ msgid "Failed to get serv name: %s" msgstr "A szolgáltatásnév lekérése nem sikerült: %s" -#: ../libpurple/dbus-server.h:85 +#: ../libpurple/dbus-server.h:84 msgid "Purple's D-BUS server is not running for the reason listed below" msgstr "A Purple D-BUS kiszolgálója nem fut az alábbi okok miatt" @@ -2280,7 +2345,7 @@ msgid "Unable to send request to resolver process\n" msgstr "Nem küldhető üzenet a feloldó folyamatnak\n" -#: ../libpurple/dnsquery.c:549 ../libpurple/dnsquery.c:697 +#: ../libpurple/dnsquery.c:549 ../libpurple/dnsquery.c:698 #, c-format msgid "" "Error resolving %s:\n" @@ -2289,8 +2354,8 @@ "Hiba %s feloldásakor:\n" "%s" -#: ../libpurple/dnsquery.c:552 ../libpurple/dnsquery.c:711 -#: ../libpurple/dnsquery.c:831 +#: ../libpurple/dnsquery.c:552 ../libpurple/dnsquery.c:712 +#: ../libpurple/dnsquery.c:830 #, c-format msgid "Error resolving %s: %d" msgstr "Hiba %s feloldásakor: %d" @@ -2309,12 +2374,12 @@ msgid "EOF while reading from resolver process" msgstr "Fájl vége jel érkezett a feloldó folyamatból olvasás közben" -#: ../libpurple/dnsquery.c:761 +#: ../libpurple/dnsquery.c:762 #, c-format msgid "Thread creation failure: %s" msgstr "Szál-előállítási hiba: %s" -#: ../libpurple/dnsquery.c:762 +#: ../libpurple/dnsquery.c:763 msgid "Unknown reason" msgstr "Ismeretlen ok" @@ -2470,8 +2535,7 @@ #: ../libpurple/gconf/purple.schemas.in.h:6 msgid "The command used to handle \"msnim\" URLs, if enabled." -msgstr "" -"Az \"msnim\" URL címek kezelésére használt parancs, ha engedélyezve van." +msgstr "Az \"msnim\" URL címek kezelésére használt parancs, ha engedélyezve van." #: ../libpurple/gconf/purple.schemas.in.h:7 msgid "The command used to handle \"sip\" URLs, if enabled." @@ -2479,13 +2543,11 @@ #: ../libpurple/gconf/purple.schemas.in.h:8 msgid "The command used to handle \"xmpp\" URLs, if enabled." -msgstr "" -"Az \"xmpp\" URL címek kezelésére használt parancs, ha engedélyezve van." +msgstr "Az \"xmpp\" URL címek kezelésére használt parancs, ha engedélyezve van." #: ../libpurple/gconf/purple.schemas.in.h:9 msgid "The command used to handle \"ymsgr\" URLs, if enabled." -msgstr "" -"Az \"ymsgr\" URL címek kezelésére használt parancs, ha engedélyezve van." +msgstr "Az \"ymsgr\" URL címek kezelésére használt parancs, ha engedélyezve van." #: ../libpurple/gconf/purple.schemas.in.h:10 msgid "The handler for \"aim\" URLs" @@ -2625,8 +2687,7 @@ #: ../libpurple/log.c:183 msgid "<b><font color=\"red\">The logger has no read function</font></b>" -msgstr "" -"<b><font color=\"red\">A naplózónak nincsen olvasás funkciója</font></b>" +msgstr "<b><font color=\"red\">A naplózónak nincsen olvasás funkciója</font></b>" #: ../libpurple/log.c:598 msgid "HTML" @@ -2680,59 +2741,54 @@ msgid "(%s) %s <AUTO-REPLY>: %s\n" msgstr "(%s) %s <AUTOMATIKUS VÁLASZ>: %s\n" -#: ../libpurple/plugin.c:365 +#: ../libpurple/plugin.c:360 #, c-format msgid "You are using %s, but this plugin requires %s." msgstr "A(z) %s programot használja, de a bővítmény a következőt igényli: %s." -#: ../libpurple/plugin.c:380 +#: ../libpurple/plugin.c:375 #, c-format msgid "This plugin has not defined an ID." msgstr "A bővítmény nem adott meg azonosítót." -#: ../libpurple/plugin.c:448 +#: ../libpurple/plugin.c:443 #, c-format msgid "Plugin magic mismatch %d (need %d)" msgstr "A bővítmény típusa nem egyezik: %d (szükséges: %d" -#: ../libpurple/plugin.c:465 +#: ../libpurple/plugin.c:460 #, c-format msgid "ABI version mismatch %d.%d.x (need %d.%d.x)" msgstr "Az ABI verziója nem egyezik: %d.%d.x (szükséges: %d.%d.x)" -#: ../libpurple/plugin.c:482 +#: ../libpurple/plugin.c:477 msgid "Plugin does not implement all required functions" msgstr "A bővítmény nem valósítja meg az összes kívánt függvényt" -#: ../libpurple/plugin.c:547 +#: ../libpurple/plugin.c:542 #, c-format msgid "" "The required plugin %s was not found. Please install this plugin and try " "again." -msgstr "" -"A szükséges %s bővítmény nem található. Kérem telepítse, majd próbálja újra." - -#: ../libpurple/plugin.c:552 +msgstr "A szükséges %s bővítmény nem található. Kérem telepítse, majd próbálja újra." + +#: ../libpurple/plugin.c:547 msgid "Unable to load the plugin" msgstr "A bővítmény nem tölthető be" -#: ../libpurple/plugin.c:574 +#: ../libpurple/plugin.c:569 #, c-format msgid "The required plugin %s was unable to load." msgstr "A szükséges %s bővítményt nem sikerült betölteni." -#: ../libpurple/plugin.c:578 +#: ../libpurple/plugin.c:573 msgid "Unable to load your plugin." msgstr "A bővítménye nem tölthető be." -#: ../libpurple/plugin.c:677 -#, c-format -msgid "The dependent plugin %s failed to unload." -msgstr "A függő %s bővítmény eltávolítása meghiúsult." - -#: ../libpurple/plugin.c:681 -msgid "There were errors unloading the plugin." -msgstr "Hiba történt a bővítmény eltávolítása közben." +#: ../libpurple/plugin.c:663 +#, c-format +msgid "%s requires %s, but it failed to unload." +msgstr "%s megköveteli %s jelenlétét, de az eltávolítása meghiúsult." #: ../libpurple/plugins/autoaccept.c:23 msgid "Autoaccept" @@ -2768,14 +2824,15 @@ #: ../libpurple/plugins/autoaccept.c:165 ../libpurple/plugins/idle.c:170 #: ../libpurple/plugins/idle.c:204 ../libpurple/plugins/idle.c:230 -#: ../libpurple/protocols/oscar/oscar.c:1453 -#: ../libpurple/protocols/oscar/oscar.c:2233 -#: ../libpurple/protocols/oscar/oscar.c:2282 -#: ../libpurple/protocols/oscar/oscar.c:5886 +#: ../libpurple/protocols/oscar/oscar.c:1456 +#: ../libpurple/protocols/oscar/oscar.c:2248 +#: ../libpurple/protocols/oscar/oscar.c:2297 #: ../libpurple/protocols/oscar/oscar.c:5941 -#: ../libpurple/protocols/oscar/oscar.c:6167 -#: ../libpurple/protocols/oscar/oscar.c:6237 ../libpurple/request.h:1388 -#: ../libpurple/request.h:1398 +#: ../libpurple/protocols/oscar/oscar.c:5996 +#: ../libpurple/protocols/oscar/oscar.c:6222 +#: ../libpurple/protocols/oscar/oscar.c:6292 ../libpurple/request.h:1828 +#: ../libpurple/request.h:1841 ../libpurple/request.h:1854 +#: ../libpurple/request.h:1867 ../pidgin/gtkblist.c:530 msgid "_Cancel" msgstr "Mé_gsem" @@ -2806,8 +2863,7 @@ #: ../libpurple/plugins/autoaccept.c:220 msgid "Automatically reject from users not in buddy list" -msgstr "" -"Automatikus visszautasítás a partnerlistán nem szereplő felhasználóktól" +msgstr "Automatikus visszautasítás a partnerlistán nem szereplő felhasználóktól" #: ../libpurple/plugins/autoaccept.c:224 msgid "" @@ -2818,8 +2874,10 @@ "befejeződésekor\n" "(csak ha nem társalog a küldővel)" -#: ../libpurple/plugins/buddynote.c:46 ../libpurple/protocols/msn/msn.c:1660 -#: ../libpurple/protocols/msn/msn.c:1690 +#: ../libpurple/plugins/buddynote.c:46 ../libpurple/protocols/msn/msn.c:1806 +#: ../libpurple/protocols/msn/msn.c:1836 +#: ../libpurple/protocols/msnp9/msn.c:1658 +#: ../libpurple/protocols/msnp9/msn.c:1688 msgid "Notes" msgstr "Megjegyzések" @@ -3046,111 +3104,118 @@ #. * offset is way off. The user should never really see it, but #. * it's here just in case. The parens are to make it clear it's #. * not a real timezone. -#: ../libpurple/plugins/log_reader.c:493 +#: ../libpurple/plugins/log_reader.c:499 msgid "(UTC)" msgstr "(UTC)" -#: ../libpurple/plugins/log_reader.c:1577 +#: ../libpurple/plugins/log_reader.c:1554 msgid "User is offline." msgstr "A felhasználó nem érhető el." -#: ../libpurple/plugins/log_reader.c:1583 +#: ../libpurple/plugins/log_reader.c:1560 msgid "Auto-response sent:" msgstr "Automatikus válasz elküldve:" -#: ../libpurple/plugins/log_reader.c:1593 -#: ../libpurple/plugins/log_reader.c:1596 +#: ../libpurple/plugins/log_reader.c:1570 +#: ../libpurple/plugins/log_reader.c:1573 #: ../libpurple/plugins/statenotify.c:80 #, c-format msgid "%s has signed off." msgstr "%s kilépett." -#: ../libpurple/plugins/log_reader.c:1610 +#: ../libpurple/plugins/log_reader.c:1587 msgid "One or more messages may have been undeliverable." msgstr "Lehet, hogy néhány üzenet nem kézbesíthető." -#: ../libpurple/plugins/log_reader.c:1620 +#: ../libpurple/plugins/log_reader.c:1597 msgid "You were disconnected from the server." msgstr "Megszakadt a kapcsolat a kiszolgálóval." -#: ../libpurple/plugins/log_reader.c:1628 +#: ../libpurple/plugins/log_reader.c:1605 msgid "" "You are currently disconnected. Messages will not be received unless you are " "logged in." -msgstr "" -"Jelenleg nincs csatlakozva. Nem fogadhat üzeneteket, amíg nem jelentkezik be." - -#: ../libpurple/plugins/log_reader.c:1643 +msgstr "Jelenleg nincs csatlakozva. Nem fogadhat üzeneteket, amíg nem jelentkezik be." + +#: ../libpurple/plugins/log_reader.c:1620 msgid "Message could not be sent because the maximum length was exceeded." msgstr "Az üzenet nem küldhető el, mivel a maximális hossz el lett érve." -#: ../libpurple/plugins/log_reader.c:1648 +#: ../libpurple/plugins/log_reader.c:1625 msgid "Message could not be sent." msgstr "Az üzenet nem küldhető el." #. The names of IM clients are marked for translation at the request of #. translators who wanted to transliterate them. Many translators #. choose to leave them alone. Choose what's best for your language. -#: ../libpurple/plugins/log_reader.c:2349 -#: ../libpurple/plugins/log_reader.c:2472 +#: ../libpurple/plugins/log_reader.c:2699 +#: ../libpurple/plugins/log_reader.c:2835 msgid "Adium" msgstr "Adium" #. The names of IM clients are marked for translation at the request of #. translators who wanted to transliterate them. Many translators #. choose to leave them alone. Choose what's best for your language. -#: ../libpurple/plugins/log_reader.c:2362 -#: ../libpurple/plugins/log_reader.c:2477 +#: ../libpurple/plugins/log_reader.c:2712 +#: ../libpurple/plugins/log_reader.c:2840 msgid "Fire" msgstr "Tűz" #. The names of IM clients are marked for translation at the request of #. translators who wanted to transliterate them. Many translators #. choose to leave them alone. Choose what's best for your language. -#: ../libpurple/plugins/log_reader.c:2374 -#: ../libpurple/plugins/log_reader.c:2481 +#: ../libpurple/plugins/log_reader.c:2724 +#: ../libpurple/plugins/log_reader.c:2844 msgid "Messenger Plus!" msgstr "Messenger Plus!" #. The names of IM clients are marked for translation at the request of #. translators who wanted to transliterate them. Many translators #. choose to leave them alone. Choose what's best for your language. -#: ../libpurple/plugins/log_reader.c:2388 -#: ../libpurple/plugins/log_reader.c:2486 +#: ../libpurple/plugins/log_reader.c:2738 +#: ../libpurple/plugins/log_reader.c:2849 msgid "QIP" msgstr "QIP" #. The names of IM clients are marked for translation at the request of #. translators who wanted to transliterate them. Many translators #. choose to leave them alone. Choose what's best for your language. -#: ../libpurple/plugins/log_reader.c:2400 -#: ../libpurple/plugins/log_reader.c:2490 +#: ../libpurple/plugins/log_reader.c:2750 +#: ../libpurple/plugins/log_reader.c:2853 msgid "MSN Messenger" msgstr "MSN Messenger" #. The names of IM clients are marked for translation at the request of #. translators who wanted to transliterate them. Many translators #. choose to leave them alone. Choose what's best for your language. -#: ../libpurple/plugins/log_reader.c:2412 -#: ../libpurple/plugins/log_reader.c:2494 +#: ../libpurple/plugins/log_reader.c:2762 +#: ../libpurple/plugins/log_reader.c:2857 msgid "Trillian" msgstr "Trillian" +#. The names of IM clients are marked for translation at the request of +#. translators who wanted to transliterate them. Many translators +#. choose to leave them alone. Choose what's best for your language. +#: ../libpurple/plugins/log_reader.c:2774 +#: ../libpurple/plugins/log_reader.c:2861 +msgid "aMSN" +msgstr "aMSN" + #. Add general preferences. -#: ../libpurple/plugins/log_reader.c:2454 +#: ../libpurple/plugins/log_reader.c:2817 msgid "General Log Reading Configuration" msgstr "Általános naplóolvasás beállítása" -#: ../libpurple/plugins/log_reader.c:2458 +#: ../libpurple/plugins/log_reader.c:2821 msgid "Fast size calculations" msgstr "Gyors méretszámítások" -#: ../libpurple/plugins/log_reader.c:2462 +#: ../libpurple/plugins/log_reader.c:2825 msgid "Use name heuristics" msgstr "Névheurisztika használata" #. Add Log Directory preferences. -#: ../libpurple/plugins/log_reader.c:2468 +#: ../libpurple/plugins/log_reader.c:2831 msgid "Log Directory" msgstr "Naplókönyvtár" @@ -3160,19 +3225,19 @@ #. *< dependencies #. *< priority #. *< id -#: ../libpurple/plugins/log_reader.c:2523 +#: ../libpurple/plugins/log_reader.c:2890 msgid "Log Reader" msgstr "Naplómegjelenítő" #. *< name #. *< version #. * summary -#: ../libpurple/plugins/log_reader.c:2527 +#: ../libpurple/plugins/log_reader.c:2894 msgid "Includes other IM clients' logs in the log viewer." msgstr "Felveszi más azonnaliüzenő-kliensek naplóit a naplómegjelenítőbe." #. * description -#: ../libpurple/plugins/log_reader.c:2531 +#: ../libpurple/plugins/log_reader.c:2898 msgid "" "When viewing logs, this plugin will include logs from other IM clients. " "Currently, this includes Adium, MSN Messenger, and Trillian.\n" @@ -3244,10 +3309,7 @@ msgid "" "\"%s\" is currently offline. Do you want to save the rest of the messages in " "a pounce and automatically send them when \"%s\" logs back in?" -msgstr "" -"\"%s\" jelenleg nem érhető el. Kívánja menteni a további üzeneteket " -"figyelmeztetésként, majd elküldeni azokat, amikor \"%s\" legközelebb " -"bejelentkezik?" +msgstr "\"%s\" jelenleg nem érhető el. Kívánja a további üzeneteket figyelmeztetésként menteni, majd elküldeni \"%s\" következő bejelentkezésekor?" #: ../libpurple/plugins/offlinemsg.c:160 msgid "Offline Message" @@ -3260,26 +3322,32 @@ "törölheti" #: ../libpurple/plugins/offlinemsg.c:165 -#: ../libpurple/protocols/msn/dialog.c:133 -#: ../libpurple/protocols/msn/msn.c:550 ../libpurple/protocols/msn/msn.c:560 -#: ../libpurple/protocols/novell/novell.c:1917 +#: ../libpurple/protocols/msn/dialog.c:141 +#: ../libpurple/protocols/msn/msn.c:665 +#: ../libpurple/protocols/msnp9/dialog.c:133 +#: ../libpurple/protocols/msnp9/msn.c:550 +#: ../libpurple/protocols/msnp9/msn.c:564 +#: ../libpurple/protocols/novell/novell.c:1919 #: ../libpurple/protocols/silc/buddy.c:317 -#: ../libpurple/protocols/silc/pk.c:113 ../libpurple/protocols/silc/wb.c:304 +#: ../libpurple/protocols/silc/pk.c:113 ../libpurple/protocols/silc/wb.c:308 #: ../libpurple/protocols/silc10/buddy.c:314 #: ../libpurple/protocols/silc10/pk.c:119 -#: ../libpurple/protocols/silc10/wb.c:304 ../pidgin/gtkrequest.c:268 +#: ../libpurple/protocols/silc10/wb.c:307 ../pidgin/gtkrequest.c:318 msgid "Yes" msgstr "Igen" #: ../libpurple/plugins/offlinemsg.c:166 -#: ../libpurple/protocols/msn/dialog.c:134 -#: ../libpurple/protocols/msn/msn.c:550 ../libpurple/protocols/msn/msn.c:560 -#: ../libpurple/protocols/novell/novell.c:1918 +#: ../libpurple/protocols/msn/dialog.c:142 +#: ../libpurple/protocols/msn/msn.c:665 +#: ../libpurple/protocols/msnp9/dialog.c:134 +#: ../libpurple/protocols/msnp9/msn.c:550 +#: ../libpurple/protocols/msnp9/msn.c:564 +#: ../libpurple/protocols/novell/novell.c:1920 #: ../libpurple/protocols/silc/buddy.c:318 -#: ../libpurple/protocols/silc/pk.c:114 ../libpurple/protocols/silc/wb.c:305 +#: ../libpurple/protocols/silc/pk.c:114 ../libpurple/protocols/silc/wb.c:309 #: ../libpurple/protocols/silc10/buddy.c:315 #: ../libpurple/protocols/silc10/pk.c:120 -#: ../libpurple/protocols/silc10/wb.c:305 ../pidgin/gtkrequest.c:269 +#: ../libpurple/protocols/silc10/wb.c:308 ../pidgin/gtkrequest.c:319 msgid "No" msgstr "Nem" @@ -3351,7 +3419,7 @@ #. *< dependencies #. *< priority #. *< id -#: ../libpurple/plugins/signals-test.c:711 +#: ../libpurple/plugins/signals-test.c:739 msgid "Signals Test" msgstr "Szignálok tesztelése" @@ -3359,8 +3427,8 @@ #. *< version #. * summary #. * description -#: ../libpurple/plugins/signals-test.c:714 -#: ../libpurple/plugins/signals-test.c:716 +#: ../libpurple/plugins/signals-test.c:742 +#: ../libpurple/plugins/signals-test.c:744 msgid "Test to see that all signals are working properly." msgstr "Ellenőrzi, hogy minden szignál megfelelően működik-e." @@ -3383,8 +3451,8 @@ msgstr "Tesztek, hogy a legtöbb dolog működik-e." #. Scheme name -#: ../libpurple/plugins/ssl/ssl-gnutls.c:902 -#: ../libpurple/plugins/ssl/ssl-nss.c:725 +#: ../libpurple/plugins/ssl/ssl-gnutls.c:911 +#: ../libpurple/plugins/ssl/ssl-nss.c:731 msgid "X.509 Certificates" msgstr "X.509 tanúsítványok" @@ -3394,7 +3462,7 @@ #. *< dependencies #. *< priority #. *< id -#: ../libpurple/plugins/ssl/ssl-gnutls.c:986 +#: ../libpurple/plugins/ssl/ssl-gnutls.c:995 msgid "GNUTLS" msgstr "GNUTLS" @@ -3402,8 +3470,8 @@ #. *< version #. * summary #. * description -#: ../libpurple/plugins/ssl/ssl-gnutls.c:989 -#: ../libpurple/plugins/ssl/ssl-gnutls.c:991 +#: ../libpurple/plugins/ssl/ssl-gnutls.c:998 +#: ../libpurple/plugins/ssl/ssl-gnutls.c:1000 msgid "Provides SSL support through GNUTLS." msgstr "SSL támogatást biztosít a GNUTLS-en keresztül." @@ -3413,7 +3481,7 @@ #. *< dependencies #. *< priority #. *< id -#: ../libpurple/plugins/ssl/ssl-nss.c:810 +#: ../libpurple/plugins/ssl/ssl-nss.c:816 msgid "NSS" msgstr "NSS" @@ -3421,8 +3489,8 @@ #. *< version #. * summary #. * description -#: ../libpurple/plugins/ssl/ssl-nss.c:813 -#: ../libpurple/plugins/ssl/ssl-nss.c:815 +#: ../libpurple/plugins/ssl/ssl-nss.c:819 +#: ../libpurple/plugins/ssl/ssl-nss.c:821 msgid "Provides SSL support through Mozilla NSS." msgstr "SSL támogatást biztosít a Mozilla NSS-en keresztül." @@ -3508,15 +3576,15 @@ "Figyelmeztet egy társalgás ablakában amikor a partner távol van, inaktív, " "visszaérkezik vagy az inaktív állapota megszűnik." -#: ../libpurple/plugins/tcl/tcl.c:421 +#: ../libpurple/plugins/tcl/tcl.c:423 msgid "Tcl Plugin Loader" msgstr "Tcl bővítménybetöltő" -#: ../libpurple/plugins/tcl/tcl.c:423 ../libpurple/plugins/tcl/tcl.c:424 +#: ../libpurple/plugins/tcl/tcl.c:425 ../libpurple/plugins/tcl/tcl.c:426 msgid "Provides support for loading Tcl plugins" msgstr "Tcl bővítmények betöltését támogatja" -#: ../libpurple/plugins/tcl/tcl.c:507 +#: ../libpurple/plugins/tcl/tcl.c:509 msgid "" "Unable to detect ActiveTCL installation. If you wish to use TCL plugins, " "install ActiveTCL from http://www.activestate.com\n" @@ -3524,52 +3592,60 @@ "Az ActiveTCL telepítés nem észlelhető. Ha TCL bővítményeket kíván használni, " "akkor telepítse az ActiveTCL-t a http://www.activestate.com címről\n" +#: ../libpurple/protocols/bonjour/bonjour.c:107 +msgid "" +"The Apple Bonjour For Windows toolkit wasn't found, see the FAQ at: http://" +"developer.pidgin.im/wiki/Using%20Pidgin#CanIusePidginforBonjourLink-" +"LocalMessaging for more information." +msgstr "" +"Az Apple Bonjour For Windows eszközkészlet nem található, további " +"információkat a http://developer.pidgin.im/wiki/Using%" +"20Pidgin#CanIusePidginforBonjourLink-LocalMessaging oldalon találhat." + #. Send a message about the connection error -#: ../libpurple/protocols/bonjour/bonjour.c:112 +#: ../libpurple/protocols/bonjour/bonjour.c:124 msgid "Unable to listen for incoming IM connections\n" msgstr "Nem lehetséges a bejövő azonnali üzenő kapcsolatokat figyelni\n" -#: ../libpurple/protocols/bonjour/bonjour.c:137 -msgid "" -"Unable to establish connection with the local mDNS server. Is it running?" -msgstr "" -"Nem hozható létre kapcsolat a helyi mDNS kiszolgálóval. Egyáltalán fut?" +#: ../libpurple/protocols/bonjour/bonjour.c:149 +msgid "Unable to establish connection with the local mDNS server. Is it running?" +msgstr "Nem hozható létre kapcsolat a helyi mDNS kiszolgálóval. Egyáltalán fut?" #. Creating the options for the protocol -#: ../libpurple/protocols/bonjour/bonjour.c:351 -#: ../libpurple/protocols/bonjour/bonjour.c:656 -#: ../libpurple/protocols/gg/gg.c:632 +#: ../libpurple/protocols/bonjour/bonjour.c:365 +#: ../libpurple/protocols/bonjour/bonjour.c:670 +#: ../libpurple/protocols/gg/gg.c:642 #: ../libpurple/protocols/jabber/jabber.c:942 msgid "First name" msgstr "Utónév" -#: ../libpurple/protocols/bonjour/bonjour.c:353 -#: ../libpurple/protocols/bonjour/bonjour.c:659 -#: ../libpurple/protocols/gg/gg.c:627 +#: ../libpurple/protocols/bonjour/bonjour.c:367 +#: ../libpurple/protocols/bonjour/bonjour.c:673 +#: ../libpurple/protocols/gg/gg.c:637 #: ../libpurple/protocols/jabber/jabber.c:947 msgid "Last name" msgstr "Vezetéknév" -#: ../libpurple/protocols/bonjour/bonjour.c:357 +#: ../libpurple/protocols/bonjour/bonjour.c:371 #: ../libpurple/protocols/jabber/buddy.c:295 #: ../libpurple/protocols/jabber/buddy.c:1325 #: ../libpurple/protocols/jabber/buddy.c:1335 -#: ../libpurple/protocols/jabber/buddy.c:2216 +#: ../libpurple/protocols/jabber/buddy.c:2219 #: ../libpurple/protocols/silc/ops.c:1041 -#: ../libpurple/protocols/silc/util.c:555 +#: ../libpurple/protocols/silc/util.c:559 #: ../libpurple/protocols/silc10/ops.c:1075 #: ../libpurple/protocols/silc10/util.c:551 #: ../libpurple/protocols/yahoo/yahoo_profile.c:1061 msgid "E-Mail" msgstr "E-mail" -#: ../libpurple/protocols/bonjour/bonjour.c:360 -#: ../libpurple/protocols/bonjour/bonjour.c:665 +#: ../libpurple/protocols/bonjour/bonjour.c:374 +#: ../libpurple/protocols/bonjour/bonjour.c:679 msgid "AIM Account" msgstr "AIM fiók" -#: ../libpurple/protocols/bonjour/bonjour.c:363 -#: ../libpurple/protocols/bonjour/bonjour.c:668 +#: ../libpurple/protocols/bonjour/bonjour.c:377 +#: ../libpurple/protocols/bonjour/bonjour.c:682 msgid "XMPP Account" msgstr "XMPP fiók" @@ -3583,20 +3659,20 @@ #. *< version #. * summary #. * description -#: ../libpurple/protocols/bonjour/bonjour.c:467 -#: ../libpurple/protocols/bonjour/bonjour.c:469 +#: ../libpurple/protocols/bonjour/bonjour.c:481 +#: ../libpurple/protocols/bonjour/bonjour.c:483 msgid "Bonjour Protocol Plugin" msgstr "Bonjour protokollbővítmény" -#: ../libpurple/protocols/bonjour/bonjour.c:610 +#: ../libpurple/protocols/bonjour/bonjour.c:624 msgid "Purple Person" msgstr "Purple személy" -#: ../libpurple/protocols/bonjour/bonjour.c:662 -#: ../libpurple/protocols/gg/gg.c:477 +#: ../libpurple/protocols/bonjour/bonjour.c:676 +#: ../libpurple/protocols/gg/gg.c:487 #: ../libpurple/protocols/jabber/jabber.c:932 -#: ../libpurple/protocols/silc/silc.c:770 -#: ../libpurple/protocols/silc/silc.c:1011 +#: ../libpurple/protocols/silc/silc.c:901 +#: ../libpurple/protocols/silc/silc.c:1142 #: ../libpurple/protocols/silc10/silc.c:681 #: ../libpurple/protocols/silc10/silc.c:922 msgid "E-mail" @@ -3606,38 +3682,38 @@ msgid "Bonjour" msgstr "Bonjour" -#: ../libpurple/protocols/bonjour/jabber.c:380 +#: ../libpurple/protocols/bonjour/jabber.c:381 #, c-format msgid "%s has closed the conversation." msgstr "%s bezárta a társalgást." -#: ../libpurple/protocols/bonjour/jabber.c:437 -#: ../libpurple/protocols/bonjour/jabber.c:660 -#: ../libpurple/protocols/bonjour/jabber.c:678 +#: ../libpurple/protocols/bonjour/jabber.c:439 +#: ../libpurple/protocols/bonjour/jabber.c:664 +#: ../libpurple/protocols/bonjour/jabber.c:682 msgid "Unable to send the message, the conversation couldn't be started." msgstr "Nem küldhető el az üzenet, a társalgás nem kezdhető el." -#: ../libpurple/protocols/bonjour/jabber.c:583 +#: ../libpurple/protocols/bonjour/jabber.c:587 msgid "Cannot open socket" msgstr "Nem nyitható meg a foglalat" -#: ../libpurple/protocols/bonjour/jabber.c:591 +#: ../libpurple/protocols/bonjour/jabber.c:595 msgid "Error setting socket options" msgstr "Hiba a foglalat tulajdonságainak beállításakor" -#: ../libpurple/protocols/bonjour/jabber.c:615 +#: ../libpurple/protocols/bonjour/jabber.c:619 msgid "Could not bind socket to port" msgstr "Nem köthető a foglalat a porthoz" -#: ../libpurple/protocols/bonjour/jabber.c:623 +#: ../libpurple/protocols/bonjour/jabber.c:627 msgid "Could not listen on socket" msgstr "Nem lehet figyelni a foglalatot" -#: ../libpurple/protocols/gg/gg.c:76 ../libpurple/proxy.c:1829 +#: ../libpurple/protocols/gg/gg.c:76 ../libpurple/proxy.c:1845 msgid "Invalid proxy settings" msgstr "Érvénytelen proxybeállítások" -#: ../libpurple/protocols/gg/gg.c:77 ../libpurple/proxy.c:1829 +#: ../libpurple/protocols/gg/gg.c:77 ../libpurple/proxy.c:1845 msgid "" "Either the host name or port number specified for your given proxy type is " "invalid." @@ -3655,7 +3731,7 @@ msgid "Unable to fetch the token.\n" msgstr "Nem tölthető le a jelsor.\n" -#: ../libpurple/protocols/gg/gg.c:269 ../libpurple/protocols/gg/gg.c:288 +#: ../libpurple/protocols/gg/gg.c:269 ../libpurple/protocols/gg/gg.c:294 msgid "Save Buddylist..." msgstr "Partnerlista mentése..." @@ -3667,89 +3743,95 @@ msgid "Couldn't open file" msgstr "A fájl nem nyitható meg" -#: ../libpurple/protocols/gg/gg.c:289 +#: ../libpurple/protocols/gg/gg.c:287 +#, c-format +msgid "Couldn't write buddylist to %s" +msgstr "Nem írható a partnerlista a következőre: %s" + +#: ../libpurple/protocols/gg/gg.c:295 msgid "Buddylist saved successfully!" msgstr "A partnerlista mentése sikeres!" -#: ../libpurple/protocols/gg/gg.c:307 ../libpurple/protocols/gg/gg.c:308 +#: ../libpurple/protocols/gg/gg.c:317 ../libpurple/protocols/gg/gg.c:318 msgid "Couldn't load buddylist" msgstr "Nem tölthető be a partnerlista" -#: ../libpurple/protocols/gg/gg.c:324 +#: ../libpurple/protocols/gg/gg.c:334 msgid "Load Buddylist..." msgstr "Partnerlista betöltése..." -#: ../libpurple/protocols/gg/gg.c:325 +#: ../libpurple/protocols/gg/gg.c:335 msgid "Buddylist loaded successfully!" msgstr "A partnerlista betöltése sikeres!" -#: ../libpurple/protocols/gg/gg.c:336 +#: ../libpurple/protocols/gg/gg.c:346 msgid "Save buddylist..." msgstr "Partnerlista mentése..." -#: ../libpurple/protocols/gg/gg.c:384 +#: ../libpurple/protocols/gg/gg.c:394 msgid "Fill in the registration fields." msgstr "Töltse ki a regisztrációs mezőket." -#: ../libpurple/protocols/gg/gg.c:389 +#: ../libpurple/protocols/gg/gg.c:399 msgid "Passwords do not match." msgstr "A jelszavak nem egyeznek." -#: ../libpurple/protocols/gg/gg.c:398 +#: ../libpurple/protocols/gg/gg.c:408 msgid "Unable to register new account. Error occurred.\n" msgstr "Nem regisztrálható új fiók. Hiba történt.\n" -#: ../libpurple/protocols/gg/gg.c:411 +#: ../libpurple/protocols/gg/gg.c:421 msgid "New Gadu-Gadu Account Registered" msgstr "Az új Gadu-Gadu fiók regisztrálva" -#: ../libpurple/protocols/gg/gg.c:412 +#: ../libpurple/protocols/gg/gg.c:422 msgid "Registration completed successfully!" msgstr "A regisztráció sikeresen befejeződött!" -#: ../libpurple/protocols/gg/gg.c:482 ../libpurple/protocols/gg/gg.c:775 +#: ../libpurple/protocols/gg/gg.c:492 ../libpurple/protocols/gg/gg.c:785 #: ../libpurple/protocols/jabber/jabber.c:913 #: ../libpurple/protocols/jabber/jabber.c:916 -#: ../libpurple/protocols/jabber/jabber.c:1722 +#: ../libpurple/protocols/jabber/jabber.c:1700 msgid "Password" msgstr "Jelszó" -#: ../libpurple/protocols/gg/gg.c:487 ../libpurple/protocols/gg/gg.c:780 +#: ../libpurple/protocols/gg/gg.c:497 ../libpurple/protocols/gg/gg.c:790 msgid "Password (retype)" msgstr "Jelszó (megerősítés)" -#: ../libpurple/protocols/gg/gg.c:492 ../libpurple/protocols/gg/gg.c:785 +#: ../libpurple/protocols/gg/gg.c:502 ../libpurple/protocols/gg/gg.c:795 msgid "Enter current token" msgstr "Adja meg az aktuális jelsort" -#: ../libpurple/protocols/gg/gg.c:498 ../libpurple/protocols/gg/gg.c:791 +#: ../libpurple/protocols/gg/gg.c:508 ../libpurple/protocols/gg/gg.c:801 msgid "Current token" msgstr "Aktuális jelsor" -#: ../libpurple/protocols/gg/gg.c:502 ../libpurple/protocols/gg/gg.c:503 +#: ../libpurple/protocols/gg/gg.c:512 ../libpurple/protocols/gg/gg.c:513 msgid "Register New Gadu-Gadu Account" msgstr "Új Gadu-Gadu fiók regisztrálása" -#: ../libpurple/protocols/gg/gg.c:504 +#: ../libpurple/protocols/gg/gg.c:514 msgid "Please, fill in the following fields" msgstr "Töltse ki az alábbi mezőket" -#: ../libpurple/protocols/gg/gg.c:642 ../libpurple/protocols/gg/gg.c:1054 -#: ../libpurple/protocols/gg/gg.c:1126 +#: ../libpurple/protocols/gg/gg.c:652 ../libpurple/protocols/gg/gg.c:1065 +#: ../libpurple/protocols/gg/gg.c:1137 #: ../libpurple/protocols/jabber/jabber.c:957 -#: ../libpurple/protocols/oscar/oscar.c:3789 -#: ../libpurple/protocols/oscar/oscar.c:3802 +#: ../libpurple/protocols/oscar/oscar.c:3804 +#: ../libpurple/protocols/oscar/oscar.c:3817 #: ../libpurple/protocols/qq/buddy_info.c:49 msgid "City" msgstr "Város" -#: ../libpurple/protocols/gg/gg.c:647 +#: ../libpurple/protocols/gg/gg.c:657 msgid "Year of birth" msgstr "Születési év" -#: ../libpurple/protocols/gg/gg.c:650 ../libpurple/protocols/msn/msn.c:1589 -#: ../libpurple/protocols/myspace/user.c:115 -#: ../libpurple/protocols/oscar/oscar.c:3732 +#: ../libpurple/protocols/gg/gg.c:660 ../libpurple/protocols/msn/msn.c:1735 +#: ../libpurple/protocols/msnp9/msn.c:1587 +#: ../libpurple/protocols/myspace/user.c:119 +#: ../libpurple/protocols/oscar/oscar.c:3747 #: ../libpurple/protocols/qq/buddy_info.c:46 #: ../libpurple/protocols/qq/qq.c:226 ../libpurple/protocols/qq/qq.c:229 #: ../libpurple/protocols/qq/qq.c:232 ../libpurple/protocols/qq/qq.c:236 @@ -3757,243 +3839,248 @@ msgid "Gender" msgstr "Nem" -#: ../libpurple/protocols/gg/gg.c:651 +#: ../libpurple/protocols/gg/gg.c:661 msgid "Male or female" msgstr "Férfi vagy nő" -#: ../libpurple/protocols/gg/gg.c:652 -#: ../libpurple/protocols/oscar/oscar.c:3732 +#: ../libpurple/protocols/gg/gg.c:662 +#: ../libpurple/protocols/oscar/oscar.c:3747 #: ../libpurple/protocols/qq/buddy_info.c:83 #: ../libpurple/protocols/qq/qq.c:226 msgid "Male" msgstr "Férfi" -#: ../libpurple/protocols/gg/gg.c:653 -#: ../libpurple/protocols/oscar/oscar.c:3732 +#: ../libpurple/protocols/gg/gg.c:663 +#: ../libpurple/protocols/oscar/oscar.c:3747 #: ../libpurple/protocols/qq/buddy_info.c:84 #: ../libpurple/protocols/qq/qq.c:229 msgid "Female" msgstr "Nő" -#: ../libpurple/protocols/gg/gg.c:657 +#: ../libpurple/protocols/gg/gg.c:667 msgid "Only online" msgstr "Csak elérhetők" -#: ../libpurple/protocols/gg/gg.c:661 ../libpurple/protocols/gg/gg.c:662 +#: ../libpurple/protocols/gg/gg.c:671 ../libpurple/protocols/gg/gg.c:672 msgid "Find buddies" msgstr "Partnerek keresése" -#: ../libpurple/protocols/gg/gg.c:663 +#: ../libpurple/protocols/gg/gg.c:673 msgid "Please, enter your search criteria below" msgstr "Adja meg alább a keresési feltételt" -#: ../libpurple/protocols/gg/gg.c:701 +#: ../libpurple/protocols/gg/gg.c:711 msgid "Fill in the fields." msgstr "Töltse ki a mezőket." -#: ../libpurple/protocols/gg/gg.c:713 +#: ../libpurple/protocols/gg/gg.c:723 msgid "Your current password is different from the one that you specified." msgstr "A jelenlegi jelszava eltér a megadottól." -#: ../libpurple/protocols/gg/gg.c:727 +#: ../libpurple/protocols/gg/gg.c:737 msgid "Unable to change password. Error occurred.\n" msgstr "A jelszó nem változtatható meg. Hiba történt.\n" -#: ../libpurple/protocols/gg/gg.c:736 +#: ../libpurple/protocols/gg/gg.c:746 msgid "Change password for the Gadu-Gadu account" msgstr "A Gadu-Gadu fiók jelszavának megváltoztatása" -#: ../libpurple/protocols/gg/gg.c:737 +#: ../libpurple/protocols/gg/gg.c:747 msgid "Password was changed successfully!" msgstr "A jelszó sikeresen megváltoztatva!" -#: ../libpurple/protocols/gg/gg.c:770 +#: ../libpurple/protocols/gg/gg.c:780 msgid "Current password" msgstr "Jelenlegi jelszó" -#: ../libpurple/protocols/gg/gg.c:795 +#: ../libpurple/protocols/gg/gg.c:805 msgid "Please, enter your current password and your new password for UIN: " msgstr "Adja meg a jelenlegi jelszavát és az új jelszót az UIM-hez: " -#: ../libpurple/protocols/gg/gg.c:799 ../libpurple/protocols/gg/gg.c:800 +#: ../libpurple/protocols/gg/gg.c:809 ../libpurple/protocols/gg/gg.c:810 msgid "Change Gadu-Gadu Password" msgstr "A Gadu-Gadu jelszó megváltoztatása" -#: ../libpurple/protocols/gg/gg.c:876 +#: ../libpurple/protocols/gg/gg.c:887 #, c-format msgid "Select a chat for buddy: %s" msgstr "Válasszon egy csevegést a következő partnerhez: %s" -#: ../libpurple/protocols/gg/gg.c:879 ../libpurple/protocols/gg/gg.c:880 +#: ../libpurple/protocols/gg/gg.c:890 ../libpurple/protocols/gg/gg.c:891 msgid "Add to chat..." msgstr "Felvétel csevegéshez..." -#: ../libpurple/protocols/gg/gg.c:1008 -#: ../libpurple/protocols/jabber/buddy.c:2031 -#: ../libpurple/protocols/novell/novell.c:2828 +#: ../libpurple/protocols/gg/gg.c:1019 +#: ../libpurple/protocols/jabber/buddy.c:2034 +#: ../libpurple/protocols/novell/novell.c:2833 #: ../libpurple/protocols/oscar/oscar.c:828 -#: ../libpurple/protocols/oscar/oscar.c:5604 +#: ../libpurple/protocols/oscar/oscar.c:5659 #: ../libpurple/protocols/qq/qq.c:170 ../libpurple/protocols/qq/qq.c:177 #: ../libpurple/protocols/qq/qq.c:292 -#: ../libpurple/protocols/yahoo/yahoo.c:3099 ../libpurple/status.c:154 -#: ../pidgin/gtkblist.c:3104 ../pidgin/gtkblist.c:3436 -#: ../pidgin/gtkdocklet.c:450 ../pidgin/gtkstatusbox.c:1061 +#: ../libpurple/protocols/yahoo/yahoo.c:3101 ../libpurple/status.c:154 +#: ../pidgin/gtkblist.c:3322 ../pidgin/gtkblist.c:3660 +#: ../pidgin/gtkdocklet.c:561 ../pidgin/gtkstatusbox.c:1061 msgid "Offline" msgstr "Kilépett" -#: ../libpurple/protocols/gg/gg.c:1011 -#: ../libpurple/protocols/jabber/buddy.c:2033 +#: ../libpurple/protocols/gg/gg.c:1022 +#: ../libpurple/protocols/jabber/buddy.c:2036 #: ../libpurple/protocols/msn/state.c:29 ../libpurple/protocols/msn/state.c:30 #: ../libpurple/protocols/msn/state.c:37 ../libpurple/protocols/msn/state.c:38 -#: ../libpurple/protocols/novell/novell.c:2816 +#: ../libpurple/protocols/msnp9/state.c:29 +#: ../libpurple/protocols/msnp9/state.c:30 +#: ../libpurple/protocols/msnp9/state.c:37 +#: ../libpurple/protocols/msnp9/state.c:38 +#: ../libpurple/protocols/novell/novell.c:2821 #: ../libpurple/protocols/qq/qq.c:280 -#: ../libpurple/protocols/yahoo/yahoo.c:3101 ../libpurple/status.c:155 -#: ../pidgin/gtkdocklet.c:438 ../pidgin/gtkstatusbox.c:1057 +#: ../libpurple/protocols/yahoo/yahoo.c:3103 ../libpurple/status.c:155 +#: ../pidgin/gtkdocklet.c:545 ../pidgin/gtkstatusbox.c:1057 msgid "Available" msgstr "Elérhető" #. get_yahoo_status_from_purple_status() returns YAHOO_STATUS_CUSTOM for #. * the generic away state (YAHOO_STATUS_TYPE_AWAY) with no message #. Away stuff -#: ../libpurple/protocols/gg/gg.c:1014 ../libpurple/protocols/irc/irc.c:528 +#: ../libpurple/protocols/gg/gg.c:1025 ../libpurple/protocols/irc/irc.c:528 #: ../libpurple/protocols/irc/msgs.c:310 -#: ../libpurple/protocols/jabber/buddy.c:2037 -#: ../libpurple/protocols/novell/novell.c:2819 +#: ../libpurple/protocols/jabber/buddy.c:2040 +#: ../libpurple/protocols/novell/novell.c:2824 #: ../libpurple/protocols/oscar/oscar.c:733 -#: ../libpurple/protocols/oscar/oscar.c:4547 -#: ../libpurple/protocols/oscar/oscar.c:5632 +#: ../libpurple/protocols/oscar/oscar.c:4562 +#: ../libpurple/protocols/oscar/oscar.c:5687 #: ../libpurple/protocols/qq/qq.c:180 ../libpurple/protocols/qq/qq.c:284 -#: ../libpurple/protocols/silc/buddy.c:1476 -#: ../libpurple/protocols/silc10/buddy.c:1476 -#: ../libpurple/protocols/yahoo/yahoo.c:3653 -#: ../libpurple/protocols/yahoo/yahoo.c:3727 ../libpurple/status.c:158 -#: ../pidgin/gtkdocklet.c:442 ../pidgin/gtkprefs.c:1939 +#: ../libpurple/protocols/silc/buddy.c:1479 +#: ../libpurple/protocols/silc10/buddy.c:1479 +#: ../libpurple/protocols/yahoo/yahoo.c:3655 +#: ../libpurple/protocols/yahoo/yahoo.c:3729 ../libpurple/status.c:158 +#: ../pidgin/gtkdocklet.c:549 ../pidgin/gtkprefs.c:2040 #: ../pidgin/gtkstatusbox.c:1058 #, c-format msgid "Away" msgstr "Távol" -#: ../libpurple/protocols/gg/gg.c:1043 ../libpurple/protocols/gg/gg.c:1117 -#: ../libpurple/protocols/oscar/oscar.c:2699 -#: ../libpurple/protocols/oscar/oscar.c:3699 +#: ../libpurple/protocols/gg/gg.c:1054 ../libpurple/protocols/gg/gg.c:1128 +#: ../libpurple/protocols/oscar/oscar.c:2714 +#: ../libpurple/protocols/oscar/oscar.c:3714 msgid "UIN" msgstr "UIN" -#: ../libpurple/protocols/gg/gg.c:1046 ../libpurple/protocols/gg/gg.c:1120 -#: ../libpurple/protocols/jabber/buddy.c:2210 -#: ../libpurple/protocols/jabber/buddy.c:2386 -#: ../libpurple/protocols/oscar/oscar.c:3710 +#: ../libpurple/protocols/gg/gg.c:1057 ../libpurple/protocols/gg/gg.c:1131 +#: ../libpurple/protocols/jabber/buddy.c:2213 +#: ../libpurple/protocols/jabber/buddy.c:2399 +#: ../libpurple/protocols/oscar/oscar.c:3725 #: ../libpurple/protocols/silc/ops.c:990 #: ../libpurple/protocols/silc10/ops.c:1024 msgid "First Name" msgstr "Utónév" -#: ../libpurple/protocols/gg/gg.c:1059 ../libpurple/protocols/gg/gg.c:1129 +#: ../libpurple/protocols/gg/gg.c:1070 ../libpurple/protocols/gg/gg.c:1140 msgid "Birth Year" msgstr "Születési év" -#: ../libpurple/protocols/gg/gg.c:1111 ../libpurple/protocols/gg/gg.c:1180 -#: ../libpurple/protocols/oscar/oscar.c:3911 +#: ../libpurple/protocols/gg/gg.c:1122 ../libpurple/protocols/gg/gg.c:1191 +#: ../libpurple/protocols/oscar/oscar.c:3926 msgid "Unable to display the search results." msgstr "A keresés eredményei nem jeleníthetők meg." -#: ../libpurple/protocols/gg/gg.c:1171 +#: ../libpurple/protocols/gg/gg.c:1182 msgid "Gadu-Gadu Public Directory" msgstr "Gadu-Gadu nyilvános címtár" -#: ../libpurple/protocols/gg/gg.c:1172 +#: ../libpurple/protocols/gg/gg.c:1183 msgid "Search results" msgstr "Keresési eredmények" -#: ../libpurple/protocols/gg/gg.c:1215 +#: ../libpurple/protocols/gg/gg.c:1226 msgid "No matching users found" msgstr "Nem találhatók megfelelő felhasználók" -#: ../libpurple/protocols/gg/gg.c:1216 +#: ../libpurple/protocols/gg/gg.c:1227 msgid "There are no users matching your search criteria." msgstr "Nincsenek a keresési feltételnek megfelelő felhasználók." -#: ../libpurple/protocols/gg/gg.c:1310 ../libpurple/protocols/gg/gg.c:1463 +#: ../libpurple/protocols/gg/gg.c:1321 ../libpurple/protocols/gg/gg.c:1474 msgid "Unable to read socket" msgstr "A foglalatot nem lehet olvasni" -#: ../libpurple/protocols/gg/gg.c:1395 +#: ../libpurple/protocols/gg/gg.c:1406 msgid "Buddy list downloaded" msgstr "A partnerlista letöltve" -#: ../libpurple/protocols/gg/gg.c:1396 +#: ../libpurple/protocols/gg/gg.c:1407 msgid "Your buddy list was downloaded from the server." msgstr "A partnerlistája letöltve a kiszolgálóról." -#: ../libpurple/protocols/gg/gg.c:1403 +#: ../libpurple/protocols/gg/gg.c:1414 msgid "Buddy list uploaded" msgstr "A partnerlista feltöltve" -#: ../libpurple/protocols/gg/gg.c:1404 +#: ../libpurple/protocols/gg/gg.c:1415 msgid "Your buddy list was stored on the server." msgstr "A partnerlista tárolva a kiszolgálón." -#: ../libpurple/protocols/gg/gg.c:1509 ../libpurple/protocols/gg/gg.c:1715 +#: ../libpurple/protocols/gg/gg.c:1520 ../libpurple/protocols/gg/gg.c:1726 msgid "Connection failed." msgstr "A kapcsolódás meghiúsult." -#: ../libpurple/protocols/gg/gg.c:1621 ../libpurple/protocols/msn/msn.c:559 +#: ../libpurple/protocols/gg/gg.c:1632 ../libpurple/protocols/msn/msn.c:664 +#: ../libpurple/protocols/msnp9/msn.c:563 msgid "Blocked" msgstr "Tiltott" -#: ../libpurple/protocols/gg/gg.c:1644 +#: ../libpurple/protocols/gg/gg.c:1655 msgid "Add to chat" msgstr "Felvétel csevegéshez" -#: ../libpurple/protocols/gg/gg.c:1653 +#: ../libpurple/protocols/gg/gg.c:1664 msgid "Unblock" msgstr "Tiltás feloldása" -#: ../libpurple/protocols/gg/gg.c:1657 +#: ../libpurple/protocols/gg/gg.c:1668 msgid "Block" msgstr "Tiltás" -#: ../libpurple/protocols/gg/gg.c:1674 +#: ../libpurple/protocols/gg/gg.c:1685 msgid "Chat _name:" msgstr "Csevegés _neve:" -#: ../libpurple/protocols/gg/gg.c:1914 +#: ../libpurple/protocols/gg/gg.c:1934 msgid "Chat error" msgstr "Csevegéshiba" -#: ../libpurple/protocols/gg/gg.c:1915 +#: ../libpurple/protocols/gg/gg.c:1935 msgid "This chat name is already in use" msgstr "Ez a csevegésnév már használatban van" -#: ../libpurple/protocols/gg/gg.c:1998 +#: ../libpurple/protocols/gg/gg.c:2018 msgid "Not connected to the server." msgstr "Nincs kapcsolat a kiszolgálóval." -#: ../libpurple/protocols/gg/gg.c:2021 +#: ../libpurple/protocols/gg/gg.c:2041 msgid "Find buddies..." msgstr "Partnerek keresése..." -#: ../libpurple/protocols/gg/gg.c:2027 +#: ../libpurple/protocols/gg/gg.c:2047 msgid "Change password..." msgstr "Jelszó megváltoztatása..." -#: ../libpurple/protocols/gg/gg.c:2033 +#: ../libpurple/protocols/gg/gg.c:2053 msgid "Upload buddylist to Server" msgstr "Partnerlista feltöltése a kiszolgálóra" -#: ../libpurple/protocols/gg/gg.c:2037 +#: ../libpurple/protocols/gg/gg.c:2057 msgid "Download buddylist from Server" msgstr "Partnerlista letöltése a kiszolgálóról" -#: ../libpurple/protocols/gg/gg.c:2041 +#: ../libpurple/protocols/gg/gg.c:2061 msgid "Delete buddylist from Server" msgstr "Partnerlista törlése a kiszolgálóról" -#: ../libpurple/protocols/gg/gg.c:2045 +#: ../libpurple/protocols/gg/gg.c:2065 msgid "Save buddylist to file..." msgstr "Partnerlista mentése fájlba..." -#: ../libpurple/protocols/gg/gg.c:2049 +#: ../libpurple/protocols/gg/gg.c:2069 msgid "Load buddylist from file..." msgstr "Partnerlista betöltése fájlból..." @@ -4008,38 +4095,38 @@ #. id #. name #. version -#: ../libpurple/protocols/gg/gg.c:2153 +#: ../libpurple/protocols/gg/gg.c:2173 msgid "Gadu-Gadu Protocol Plugin" msgstr "Gadu-Gadu protokollbővítmény" #. summary -#: ../libpurple/protocols/gg/gg.c:2154 +#: ../libpurple/protocols/gg/gg.c:2174 msgid "Polish popular IM" msgstr "Népszerű lengyel azonnali üzenő" -#: ../libpurple/protocols/gg/gg.c:2208 +#: ../libpurple/protocols/gg/gg.c:2228 msgid "Gadu-Gadu User" msgstr "Gadu-Gadu felhasználó" #: ../libpurple/protocols/irc/cmds.c:43 -#: ../libpurple/protocols/silc/silc.c:1637 -#: ../libpurple/protocols/silc10/silc.c:1566 +#: ../libpurple/protocols/silc/silc.c:1768 +#: ../libpurple/protocols/silc10/silc.c:1569 #, c-format msgid "Unknown command: %s" msgstr "Ismeretlen parancs: %s" #: ../libpurple/protocols/irc/cmds.c:503 #: ../libpurple/protocols/jabber/chat.c:591 -#: ../libpurple/protocols/silc/silc.c:1345 -#: ../libpurple/protocols/silc10/silc.c:1274 +#: ../libpurple/protocols/silc/silc.c:1476 +#: ../libpurple/protocols/silc10/silc.c:1277 #, c-format msgid "current topic is: %s" msgstr "a jelenlegi téma: %s" #: ../libpurple/protocols/irc/cmds.c:507 #: ../libpurple/protocols/jabber/chat.c:595 -#: ../libpurple/protocols/silc/silc.c:1349 -#: ../libpurple/protocols/silc10/silc.c:1278 +#: ../libpurple/protocols/silc/silc.c:1480 +#: ../libpurple/protocols/silc10/silc.c:1281 msgid "No topic is set" msgstr "Nincs beállítva téma" @@ -4075,7 +4162,7 @@ #: ../libpurple/protocols/irc/irc.c:127 ../libpurple/protocols/irc/irc.c:165 #: ../libpurple/protocols/irc/irc.c:612 ../libpurple/protocols/irc/irc.c:637 -#: ../libpurple/protocols/myspace/myspace.c:2356 +#: ../libpurple/protocols/myspace/myspace.c:2361 msgid "Server has disconnected" msgstr "A kiszolgáló bontotta a kapcsolatot" @@ -4089,7 +4176,7 @@ msgstr "Cs_atorna:" #: ../libpurple/protocols/irc/irc.c:267 -#: ../libpurple/protocols/jabber/chat.c:59 ../pidgin/gtkaccount.c:524 +#: ../libpurple/protocols/jabber/chat.c:59 ../pidgin/gtkaccount.c:527 msgid "_Password:" msgstr "_Jelszó:" @@ -4101,14 +4188,15 @@ #. connect to the server #: ../libpurple/protocols/irc/irc.c:319 #: ../libpurple/protocols/jabber/jabber.c:1280 -#: ../libpurple/protocols/msn/session.c:345 -#: ../libpurple/protocols/myspace/myspace.c:301 -#: ../libpurple/protocols/novell/novell.c:2182 -#: ../libpurple/protocols/oscar/oscar.c:1287 +#: ../libpurple/protocols/msn/session.c:394 +#: ../libpurple/protocols/msnp9/session.c:345 +#: ../libpurple/protocols/myspace/myspace.c:302 +#: ../libpurple/protocols/novell/novell.c:2187 +#: ../libpurple/protocols/oscar/oscar.c:1290 #: ../libpurple/protocols/qq/qq.c:136 -#: ../libpurple/protocols/sametime/sametime.c:3723 -#: ../libpurple/protocols/simple/simple.c:1716 -#: ../libpurple/protocols/yahoo/yahoo.c:2939 +#: ../libpurple/protocols/sametime/sametime.c:3724 +#: ../libpurple/protocols/simple/simple.c:1871 +#: ../libpurple/protocols/yahoo/yahoo.c:2941 #: ../libpurple/protocols/zephyr/zephyr.c:1621 ../pidgin/gtkstatusbox.c:662 msgid "Connecting" msgstr "Kapcsolódás" @@ -4122,34 +4210,34 @@ #. TODO: try other ports if in auto mode, then save #. * working port and try that first next time. #: ../libpurple/protocols/irc/irc.c:338 -#: ../libpurple/protocols/myspace/myspace.c:317 -#: ../libpurple/protocols/simple/simple.c:464 -#: ../libpurple/protocols/simple/simple.c:1631 +#: ../libpurple/protocols/myspace/myspace.c:318 +#: ../libpurple/protocols/simple/simple.c:465 +#: ../libpurple/protocols/simple/simple.c:1786 msgid "Couldn't create socket" msgstr "Nem sikerült létrehozni a foglalatot" #: ../libpurple/protocols/irc/irc.c:421 -#: ../libpurple/protocols/myspace/myspace.c:2469 -#: ../libpurple/protocols/oscar/oscar.c:1283 +#: ../libpurple/protocols/myspace/myspace.c:2474 +#: ../libpurple/protocols/oscar/oscar.c:1286 msgid "Couldn't connect to host" msgstr "Nem sikerült kapcsolódni a kiszolgálóhoz" #: ../libpurple/protocols/irc/irc.c:609 ../libpurple/protocols/irc/irc.c:634 -#: ../libpurple/protocols/myspace/myspace.c:2352 +#: ../libpurple/protocols/myspace/myspace.c:2357 msgid "Read error" msgstr "Olvasási hiba" #: ../libpurple/protocols/irc/irc.c:773 -#: ../libpurple/protocols/silc/chat.c:1412 +#: ../libpurple/protocols/silc/chat.c:1398 #: ../libpurple/protocols/silc10/chat.c:1426 #: ../libpurple/protocols/yahoo/yahoochat.c:1497 msgid "Users" msgstr "Felhasználók" #: ../libpurple/protocols/irc/irc.c:776 -#: ../libpurple/protocols/sametime/sametime.c:3374 -#: ../libpurple/protocols/silc/chat.c:1415 -#: ../libpurple/protocols/silc/ops.c:1389 +#: ../libpurple/protocols/sametime/sametime.c:3375 +#: ../libpurple/protocols/silc/chat.c:1401 +#: ../libpurple/protocols/silc/ops.c:1393 #: ../libpurple/protocols/silc10/chat.c:1429 #: ../libpurple/protocols/silc10/ops.c:1382 #: ../libpurple/protocols/yahoo/yahoochat.c:1506 @@ -4175,26 +4263,28 @@ #. host to connect to #: ../libpurple/protocols/irc/irc.c:940 ../libpurple/protocols/irc/msgs.c:323 -#: ../libpurple/protocols/msn/msn.c:2185 -#: ../libpurple/protocols/oscar/oscar.c:6671 +#: ../libpurple/protocols/msn/msn.c:2333 +#: ../libpurple/protocols/msnp9/msn.c:2183 +#: ../libpurple/protocols/oscar/oscar.c:6726 #: ../libpurple/protocols/qq/qq.c:755 -#: ../libpurple/protocols/sametime/sametime.c:5727 +#: ../libpurple/protocols/sametime/sametime.c:5728 #: ../libpurple/protocols/silc/ops.c:1249 -#: ../libpurple/protocols/silc/ops.c:1341 +#: ../libpurple/protocols/silc/ops.c:1343 #: ../libpurple/protocols/silc10/ops.c:1244 #: ../libpurple/protocols/silc10/ops.c:1347 -#: ../libpurple/protocols/simple/simple.c:1896 +#: ../libpurple/protocols/simple/simple.c:2061 #: ../libpurple/protocols/toc/toc.c:2327 msgid "Server" msgstr "Kiszolgáló" #. port to connect to -#: ../libpurple/protocols/irc/irc.c:943 ../libpurple/protocols/msn/msn.c:2190 -#: ../libpurple/protocols/oscar/oscar.c:6674 +#: ../libpurple/protocols/irc/irc.c:943 ../libpurple/protocols/msn/msn.c:2338 +#: ../libpurple/protocols/msnp9/msn.c:2188 +#: ../libpurple/protocols/oscar/oscar.c:6729 #: ../libpurple/protocols/qq/qq.c:758 -#: ../libpurple/protocols/sametime/sametime.c:5732 -#: ../libpurple/protocols/silc/silc.c:1918 -#: ../libpurple/protocols/silc10/silc.c:1861 +#: ../libpurple/protocols/sametime/sametime.c:5733 +#: ../libpurple/protocols/silc/silc.c:2049 +#: ../libpurple/protocols/silc10/silc.c:1864 #: ../libpurple/protocols/toc/toc.c:2331 msgid "Port" msgstr "Port" @@ -4206,13 +4296,13 @@ #: ../libpurple/protocols/irc/irc.c:949 ../libpurple/protocols/irc/msgs.c:316 #: ../libpurple/protocols/jabber/jabber.c:904 #: ../libpurple/protocols/jabber/jabber.c:907 -#: ../libpurple/protocols/silc/buddy.c:1539 +#: ../libpurple/protocols/silc/buddy.c:1542 #: ../libpurple/protocols/silc/ops.c:1197 #: ../libpurple/protocols/silc/ops.c:1200 -#: ../libpurple/protocols/silc/ops.c:1334 -#: ../libpurple/protocols/silc/ops.c:1337 -#: ../libpurple/protocols/silc/silc.c:1005 -#: ../libpurple/protocols/silc10/buddy.c:1539 +#: ../libpurple/protocols/silc/ops.c:1336 +#: ../libpurple/protocols/silc/ops.c:1339 +#: ../libpurple/protocols/silc/silc.c:1136 +#: ../libpurple/protocols/silc10/buddy.c:1542 #: ../libpurple/protocols/silc10/ops.c:1191 #: ../libpurple/protocols/silc10/ops.c:1194 #: ../libpurple/protocols/silc10/ops.c:1340 @@ -4222,7 +4312,7 @@ msgstr "Felhasználónév" #: ../libpurple/protocols/irc/irc.c:952 ../libpurple/protocols/irc/msgs.c:317 -#: ../libpurple/protocols/silc/silc.c:1009 +#: ../libpurple/protocols/silc/silc.c:1140 #: ../libpurple/protocols/silc10/silc.c:920 msgid "Real name" msgstr "Valódi név" @@ -4262,8 +4352,8 @@ msgstr " <i>(azonosítva)</i>" #: ../libpurple/protocols/irc/msgs.c:303 -#: ../libpurple/protocols/oscar/oscar.c:3700 -#: ../libpurple/protocols/silc/ops.c:1418 +#: ../libpurple/protocols/oscar/oscar.c:3715 +#: ../libpurple/protocols/silc/ops.c:1422 #: ../libpurple/protocols/silc10/ops.c:1414 msgid "Nick" msgstr "Becenév" @@ -4361,28 +4451,28 @@ msgid "Invitation only" msgstr "Meghívásos" -#: ../libpurple/protocols/irc/msgs.c:795 +#: ../libpurple/protocols/irc/msgs.c:798 #, c-format msgid "You have been kicked by %s: (%s)" msgstr "%s kirúgta Önt: (%s)" #. Remove user from channel -#: ../libpurple/protocols/irc/msgs.c:800 ../libpurple/protocols/silc/ops.c:699 +#: ../libpurple/protocols/irc/msgs.c:803 ../libpurple/protocols/silc/ops.c:699 #: ../libpurple/protocols/silc10/ops.c:720 #, c-format msgid "Kicked by %s (%s)" msgstr "%s kizárta (%s)" -#: ../libpurple/protocols/irc/msgs.c:823 +#: ../libpurple/protocols/irc/msgs.c:826 #, c-format msgid "mode (%s %s) by %s" msgstr "mód (%s %s) %s által" -#: ../libpurple/protocols/irc/msgs.c:908 ../libpurple/protocols/irc/msgs.c:909 +#: ../libpurple/protocols/irc/msgs.c:911 ../libpurple/protocols/irc/msgs.c:912 msgid "Invalid nickname" msgstr "Érvénytelen becenév" -#: ../libpurple/protocols/irc/msgs.c:910 +#: ../libpurple/protocols/irc/msgs.c:913 msgid "" "Your selected nickname was rejected by the server. It probably contains " "invalid characters." @@ -4390,7 +4480,7 @@ "Az Ön által választott becenevet a kiszolgáló visszautasította. Valószínűleg " "érvénytelen karaktereket tartalmaz." -#: ../libpurple/protocols/irc/msgs.c:915 +#: ../libpurple/protocols/irc/msgs.c:918 msgid "" "Your selected account name was rejected by the server. It probably contains " "invalid characters." @@ -4398,44 +4488,44 @@ "Az Ön által választott fióknevet a kiszolgáló visszautasította. Valószínűleg " "érvénytelen karaktereket tartalmaz." -#: ../libpurple/protocols/irc/msgs.c:954 +#: ../libpurple/protocols/irc/msgs.c:957 msgid "Cannot change nick" msgstr "A becenév nem változtatható meg" -#: ../libpurple/protocols/irc/msgs.c:954 +#: ../libpurple/protocols/irc/msgs.c:957 msgid "Could not change nick" msgstr "Nem sikerült megváltoztatni a becenevet" -#: ../libpurple/protocols/irc/msgs.c:975 +#: ../libpurple/protocols/irc/msgs.c:978 #, c-format msgid "You have parted the channel%s%s" msgstr "Elhagyta a(z) %s%s csatornát" -#: ../libpurple/protocols/irc/msgs.c:1017 +#: ../libpurple/protocols/irc/msgs.c:1020 msgid "Error: invalid PONG from server" msgstr "Hiba: érvénytelen PONG a kiszolgálótól" -#: ../libpurple/protocols/irc/msgs.c:1019 +#: ../libpurple/protocols/irc/msgs.c:1022 #, c-format msgid "PING reply -- Lag: %lu seconds" msgstr "PING válasz -- Késleltetés %lu másodperc" -#: ../libpurple/protocols/irc/msgs.c:1110 +#: ../libpurple/protocols/irc/msgs.c:1113 #, c-format msgid "Cannot join %s: Registration is required." msgstr "%s csatornához nem lehet csatlakozni: Regisztráció szükséges." -#: ../libpurple/protocols/irc/msgs.c:1111 +#: ../libpurple/protocols/irc/msgs.c:1114 #: ../libpurple/protocols/silc/ops.c:1093 #: ../libpurple/protocols/silc10/ops.c:1128 msgid "Cannot join channel" msgstr "Nem lehet csatlakozni a csatornához" -#: ../libpurple/protocols/irc/msgs.c:1145 +#: ../libpurple/protocols/irc/msgs.c:1148 msgid "Nick or channel is temporarily unavailable." msgstr "A becenév vagy csatorna átmenetileg nem érhető el." -#: ../libpurple/protocols/irc/msgs.c:1157 +#: ../libpurple/protocols/irc/msgs.c:1160 #, c-format msgid "Wallops from %s" msgstr "Ütések a következőtől: %s" @@ -4545,7 +4635,7 @@ msgstr "names [csatorna]: Kilistázza a csatornán jelenlévő felhasználókat." #: ../libpurple/protocols/irc/parse.c:137 -#: ../libpurple/protocols/jabber/jabber.c:2261 +#: ../libpurple/protocols/jabber/jabber.c:2282 msgid "nick <new nickname>: Change your nickname." msgstr "nick <új becenév>: Megváltoztatja a becenevét." @@ -4621,8 +4711,7 @@ #: ../libpurple/protocols/irc/parse.c:149 msgid "topic [new topic]: View or change the channel topic." -msgstr "" -"topic [új téma]: A csatorna témájának megtekintése vagy megváltoztatása." +msgstr "topic [új téma]: A csatorna témájának megtekintése vagy megváltoztatása." #: ../libpurple/protocols/irc/parse.c:150 msgid "umode <+|-><A-Za-z>: Set or unset a user mode." @@ -4652,8 +4741,7 @@ #: ../libpurple/protocols/irc/parse.c:154 msgid "whois [server] <nick>: Get information on a user." -msgstr "" -"whois [kiszolgáló] <becenév>: Információk lekérése egy felhasználóról." +msgstr "whois [kiszolgáló] <becenév>: Információk lekérése egy felhasználóról." #: ../libpurple/protocols/irc/parse.c:155 msgid "whowas <nick>: Get information on a user that has logged off." @@ -4661,43 +4749,41 @@ "whowas <becenév>: Információk lekérése egy kijelentkezett " "felhasználóról." -#: ../libpurple/protocols/irc/parse.c:465 +#: ../libpurple/protocols/irc/parse.c:520 #, c-format msgid "Reply time from %s: %lu seconds" msgstr "Válaszidő a következőtől: %s: %lu másodperc" -#: ../libpurple/protocols/irc/parse.c:466 +#: ../libpurple/protocols/irc/parse.c:521 msgid "PONG" msgstr "PONG" -#: ../libpurple/protocols/irc/parse.c:466 +#: ../libpurple/protocols/irc/parse.c:521 msgid "CTCP PING reply" msgstr "CTCP PING válasz" -#: ../libpurple/protocols/irc/parse.c:577 -#: ../libpurple/protocols/irc/parse.c:581 ../libpurple/protocols/toc/toc.c:191 +#: ../libpurple/protocols/irc/parse.c:632 +#: ../libpurple/protocols/irc/parse.c:636 ../libpurple/protocols/toc/toc.c:191 #: ../libpurple/protocols/toc/toc.c:694 ../libpurple/protocols/toc/toc.c:710 #: ../libpurple/protocols/toc/toc.c:786 msgid "Disconnected." msgstr "Kapcsolat bontva." -#: ../libpurple/protocols/jabber/adhoccommands.c:137 +#: ../libpurple/protocols/jabber/adhoccommands.c:143 #: ../libpurple/protocols/jabber/jabber.c:671 #: ../libpurple/protocols/jabber/jabber.c:701 -#: ../libpurple/protocols/jabber/jabber.c:1887 +#: ../libpurple/protocols/jabber/jabber.c:1865 msgid "Unknown Error" msgstr "Ismeretlen hiba" -#: ../libpurple/protocols/jabber/adhoccommands.c:139 -#: ../libpurple/protocols/jabber/adhoccommands.c:140 -#, fuzzy +#: ../libpurple/protocols/jabber/adhoccommands.c:145 +#: ../libpurple/protocols/jabber/adhoccommands.c:146 msgid "Ad-Hoc Command Failed" -msgstr "a blocklist parancs sikertelen" - -#: ../libpurple/protocols/jabber/adhoccommands.c:173 -#, fuzzy +msgstr "Az eseti parancs meghiúsult" + +#: ../libpurple/protocols/jabber/adhoccommands.c:182 msgid "execute" -msgstr "Váratlan" +msgstr "végrehajtás" #: ../libpurple/protocols/jabber/auth.c:53 msgid "Server requires TLS/SSL for login. No TLS/SSL support found." @@ -4707,8 +4793,7 @@ #: ../libpurple/protocols/jabber/auth.c:116 msgid "Server requires plaintext authentication over an unencrypted stream" -msgstr "" -"A kiszolgáló szöveges hitelesítést követel meg egy nem titkosított csatornán" +msgstr "A kiszolgáló szöveges hitelesítést követel meg egy nem titkosított csatornán" #: ../libpurple/protocols/jabber/auth.c:319 #: ../libpurple/protocols/jabber/auth.c:508 @@ -4765,7 +4850,7 @@ #: ../libpurple/protocols/jabber/buddy.c:283 #: ../libpurple/protocols/jabber/buddy.c:1219 -#: ../libpurple/protocols/sametime/sametime.c:4128 +#: ../libpurple/protocols/sametime/sametime.c:4129 #: ../libpurple/protocols/silc/ops.c:986 #: ../libpurple/protocols/silc10/ops.c:1020 msgid "Full Name" @@ -4815,7 +4900,7 @@ #: ../libpurple/protocols/jabber/buddy.c:293 #: ../libpurple/protocols/jabber/buddy.c:1295 -#: ../libpurple/protocols/silc/silc.c:1015 +#: ../libpurple/protocols/silc/silc.c:1146 #: ../libpurple/protocols/silc10/silc.c:926 msgid "Country" msgstr "Ország" @@ -4843,16 +4928,17 @@ #: ../libpurple/protocols/jabber/buddy.c:300 #: ../libpurple/protocols/jabber/buddy.c:1250 -#: ../libpurple/protocols/msn/msn.c:1658 -#: ../libpurple/protocols/oscar/oscar.c:3749 +#: ../libpurple/protocols/msn/msn.c:1804 +#: ../libpurple/protocols/msnp9/msn.c:1656 +#: ../libpurple/protocols/oscar/oscar.c:3764 msgid "Birthday" msgstr "Születésnap" #: ../libpurple/protocols/jabber/buddy.c:301 #: ../libpurple/protocols/jabber/buddy.c:1365 #: ../libpurple/protocols/jabber/chat.c:775 -#: ../libpurple/protocols/jabber/usermood.c:175 ../pidgin/gtkblist.c:3116 -#: ../pidgin/gtkprefs.c:739 +#: ../libpurple/protocols/jabber/usermood.c:193 ../pidgin/gtkblist.c:3334 +#: ../pidgin/gtkprefs.c:740 msgid "Description" msgstr "Leírás" @@ -4879,244 +4965,218 @@ msgid "Operating System" msgstr "Operációs rendszer" +# fixme: innentől egy jó darabon xmpp protokollkiegészítések nevei vannak, lásd: http://www.xmpp.org/extensions/ #: ../libpurple/protocols/jabber/buddy.c:815 #: ../libpurple/protocols/jabber/buddy.c:975 msgid "Last Activity" -msgstr "" +msgstr "Utolsó művelet" #: ../libpurple/protocols/jabber/buddy.c:817 #: ../libpurple/protocols/jabber/buddy.c:977 -#, fuzzy msgid "Service Discovery Info" -msgstr "Könyvtárinformációk beállítása" +msgstr "Szolgáltatásfeltérképezési információk" #: ../libpurple/protocols/jabber/buddy.c:819 #: ../libpurple/protocols/jabber/buddy.c:979 msgid "Service Discovery Items" -msgstr "" +msgstr "Szolgáltatásfeltérképezési elemek" #: ../libpurple/protocols/jabber/buddy.c:821 #: ../libpurple/protocols/jabber/buddy.c:981 -#, fuzzy msgid "Extended Stanza Addressing" -msgstr "További cím" +msgstr "Kibővített kifejezéscímzés" #: ../libpurple/protocols/jabber/buddy.c:823 #: ../libpurple/protocols/jabber/buddy.c:983 -#, fuzzy msgid "Multi-User Chat" -msgstr "Csevegés álneve" +msgstr "Többfelhasználós csevegés" #: ../libpurple/protocols/jabber/buddy.c:825 #: ../libpurple/protocols/jabber/buddy.c:985 -#, fuzzy msgid "Multi-User Chat Extended Presence Information" -msgstr "A felhasználó nem rendelkezik címtár-információkkal." +msgstr "Többfelhasználós csevegés kibővített jelenlét-információi" #: ../libpurple/protocols/jabber/buddy.c:827 #: ../libpurple/protocols/jabber/buddy.c:987 msgid "In-Band Bytestreams" -msgstr "" +msgstr "Beágyazott bájtsorozat" #: ../libpurple/protocols/jabber/buddy.c:829 #: ../libpurple/protocols/jabber/buddy.c:989 -#, fuzzy msgid "Ad-Hoc Commands" -msgstr "Parancs" +msgstr "Eseti parancsok" #: ../libpurple/protocols/jabber/buddy.c:831 #: ../libpurple/protocols/jabber/buddy.c:991 msgid "PubSub Service" -msgstr "" +msgstr "PubSub szolgáltatás" #: ../libpurple/protocols/jabber/buddy.c:833 #: ../libpurple/protocols/jabber/buddy.c:993 msgid "SOCKS5 Bytestreams" -msgstr "" +msgstr "SOCKS5 bájtsorozat" #: ../libpurple/protocols/jabber/buddy.c:835 #: ../libpurple/protocols/jabber/buddy.c:995 msgid "Out of Band Data" -msgstr "" +msgstr "Külső adatok" #: ../libpurple/protocols/jabber/buddy.c:837 #: ../libpurple/protocols/jabber/buddy.c:997 -#, fuzzy msgid "XHTML-IM" -msgstr "HTML" - +msgstr "XHTML-IM" + +# fixme: mi a rák ez? #: ../libpurple/protocols/jabber/buddy.c:839 #: ../libpurple/protocols/jabber/buddy.c:999 -#, fuzzy msgid "In-Band Registration" -msgstr "Regisztrációs hiba" +msgstr "Beágyazott regisztráció" #: ../libpurple/protocols/jabber/buddy.c:841 #: ../libpurple/protocols/jabber/buddy.c:1001 -#, fuzzy msgid "User Location" -msgstr "Hely" +msgstr "Felhasználó helye" #: ../libpurple/protocols/jabber/buddy.c:843 #: ../libpurple/protocols/jabber/buddy.c:1003 -#, fuzzy msgid "User Avatar" -msgstr "Felhasználó keresése" +msgstr "Felhasználói avatar" #: ../libpurple/protocols/jabber/buddy.c:845 #: ../libpurple/protocols/jabber/buddy.c:1005 -#, fuzzy msgid "Chat State Notifications" -msgstr "Partnerállapot-értesítés" +msgstr "Csevegésállapot-értesítések" #: ../libpurple/protocols/jabber/buddy.c:847 #: ../libpurple/protocols/jabber/buddy.c:1007 -#, fuzzy msgid "Software Version" -msgstr "Nem támogatott verzió" +msgstr "Szoftververzió" #: ../libpurple/protocols/jabber/buddy.c:849 #: ../libpurple/protocols/jabber/buddy.c:1009 -#, fuzzy msgid "Stream Initiation" -msgstr "Tájolás" +msgstr "Adatátvitel kezdeményezése" #: ../libpurple/protocols/jabber/buddy.c:851 #: ../libpurple/protocols/jabber/buddy.c:1011 -#: ../libpurple/protocols/sametime/sametime.c:3235 +#: ../libpurple/protocols/sametime/sametime.c:3236 msgid "File Transfer" msgstr "Fájlátvitel" #: ../libpurple/protocols/jabber/buddy.c:853 #: ../libpurple/protocols/jabber/buddy.c:1013 -#, fuzzy msgid "User Mood" -msgstr "Felhasználói módok" +msgstr "Felhasználó hangulata" #: ../libpurple/protocols/jabber/buddy.c:855 #: ../libpurple/protocols/jabber/buddy.c:1015 -#, fuzzy msgid "User Activity" -msgstr "Felhasználók korlátozása" +msgstr "Felhasználói tevékenység" #: ../libpurple/protocols/jabber/buddy.c:857 #: ../libpurple/protocols/jabber/buddy.c:1017 -#, fuzzy msgid "Entity Capabilities" -msgstr "Képességek" +msgstr "Egyed képességei" #: ../libpurple/protocols/jabber/buddy.c:859 #: ../libpurple/protocols/jabber/buddy.c:1019 msgid "Encrypted Session Negotiations" -msgstr "" +msgstr "Titkosított munkamenet-egyeztetések" #: ../libpurple/protocols/jabber/buddy.c:861 #: ../libpurple/protocols/jabber/buddy.c:1021 -#, fuzzy msgid "User Tune" -msgstr "Felhasználónév" +msgstr "Hallgatott zene" #: ../libpurple/protocols/jabber/buddy.c:863 #: ../libpurple/protocols/jabber/buddy.c:1023 -#, fuzzy msgid "Roster Item Exchange" -msgstr "Azonnali üzenet kulcscserével" +msgstr "Partnerlista-elemek cseréje" #: ../libpurple/protocols/jabber/buddy.c:865 #: ../libpurple/protocols/jabber/buddy.c:1025 -#, fuzzy msgid "Reachability Address" -msgstr "E-mail cím" +msgstr "Elérhetőségi cím" #: ../libpurple/protocols/jabber/buddy.c:867 #: ../libpurple/protocols/jabber/buddy.c:1027 -#, fuzzy msgid "User Profile" -msgstr "Profil" +msgstr "Felhasználói profil" #: ../libpurple/protocols/jabber/buddy.c:869 #: ../libpurple/protocols/jabber/buddy.c:1029 -#, fuzzy msgid "Jingle" -msgstr "Csatlakozás" +msgstr "Jingle" #: ../libpurple/protocols/jabber/buddy.c:871 #: ../libpurple/protocols/jabber/buddy.c:1031 msgid "Jingle Audio" -msgstr "" +msgstr "Jingle hang" #: ../libpurple/protocols/jabber/buddy.c:873 #: ../libpurple/protocols/jabber/buddy.c:1033 -#, fuzzy msgid "User Nickname" -msgstr "Felhasználónév" +msgstr "Felhasználó beceneve" #: ../libpurple/protocols/jabber/buddy.c:875 #: ../libpurple/protocols/jabber/buddy.c:1035 msgid "Jingle ICE UDP" -msgstr "" +msgstr "Jingle ICE UDP" #: ../libpurple/protocols/jabber/buddy.c:877 #: ../libpurple/protocols/jabber/buddy.c:1037 msgid "Jingle ICE TCP" -msgstr "" +msgstr "Jingle ICE TCP" #: ../libpurple/protocols/jabber/buddy.c:879 #: ../libpurple/protocols/jabber/buddy.c:1039 msgid "Jingle Raw UDP" -msgstr "" +msgstr "Jingle Raw UDP" #: ../libpurple/protocols/jabber/buddy.c:881 #: ../libpurple/protocols/jabber/buddy.c:1041 -#, fuzzy msgid "Jingle Video" -msgstr "Élő videó" +msgstr "Jingle videó" #: ../libpurple/protocols/jabber/buddy.c:883 #: ../libpurple/protocols/jabber/buddy.c:1043 msgid "Jingle DTMF" -msgstr "" +msgstr "Jingle DTMF" #: ../libpurple/protocols/jabber/buddy.c:885 #: ../libpurple/protocols/jabber/buddy.c:1045 -#, fuzzy msgid "Message Receipts" -msgstr "Üzenet fogadása" +msgstr "Tértivevények" #: ../libpurple/protocols/jabber/buddy.c:887 #: ../libpurple/protocols/jabber/buddy.c:1047 -#, fuzzy msgid "Public Key Publishing" -msgstr "Nyilvános kulcs blablakódja" +msgstr "Nyilvános kulcs közzététele" #: ../libpurple/protocols/jabber/buddy.c:889 #: ../libpurple/protocols/jabber/buddy.c:1049 -#, fuzzy msgid "User Chatting" -msgstr "Felhasználói beállítások" +msgstr "Csevegőszobák" #: ../libpurple/protocols/jabber/buddy.c:891 #: ../libpurple/protocols/jabber/buddy.c:1051 -#, fuzzy msgid "User Browsing" -msgstr "Felhasználói módok" +msgstr "Böngészett oldalak" #: ../libpurple/protocols/jabber/buddy.c:893 #: ../libpurple/protocols/jabber/buddy.c:1053 -#, fuzzy msgid "User Gaming" -msgstr "Felhasználónév" +msgstr "Játékok" #: ../libpurple/protocols/jabber/buddy.c:895 #: ../libpurple/protocols/jabber/buddy.c:1055 -#, fuzzy msgid "User Viewing" -msgstr "Felhasználók korlátozása" +msgstr "Videók" #: ../libpurple/protocols/jabber/buddy.c:897 #: ../libpurple/protocols/jabber/buddy.c:1057 -#: ../libpurple/protocols/silc/ops.c:1596 -#: ../libpurple/protocols/silc/ops.c:1601 +#: ../libpurple/protocols/silc/ops.c:1600 +#: ../libpurple/protocols/silc/ops.c:1605 #: ../libpurple/protocols/silc10/ops.c:1612 #: ../libpurple/protocols/silc10/ops.c:1617 msgid "Ping" @@ -5124,63 +5184,63 @@ #: ../libpurple/protocols/jabber/buddy.c:899 #: ../libpurple/protocols/jabber/buddy.c:1059 -#, fuzzy msgid "Stanza Encryption" -msgstr "Trillian titkosítás" +msgstr "Kifejezéstitkosítás" #: ../libpurple/protocols/jabber/buddy.c:901 #: ../libpurple/protocols/jabber/buddy.c:1061 msgid "Entity Time" -msgstr "" +msgstr "Helyi idő" #: ../libpurple/protocols/jabber/buddy.c:903 #: ../libpurple/protocols/jabber/buddy.c:1063 msgid "Delayed Delivery" -msgstr "" +msgstr "Késleltetett kézbesítés" #: ../libpurple/protocols/jabber/buddy.c:905 #: ../libpurple/protocols/jabber/buddy.c:1065 msgid "Collaborative Data Objects" -msgstr "" +msgstr "Együttműködési adatobjektumok" #: ../libpurple/protocols/jabber/buddy.c:907 #: ../libpurple/protocols/jabber/buddy.c:1067 msgid "File Repository and Sharing" -msgstr "" +msgstr "Fájllerakat és -megosztás" #: ../libpurple/protocols/jabber/buddy.c:909 #: ../libpurple/protocols/jabber/buddy.c:1069 msgid "STUN Service Discovery for Jingle" -msgstr "" +msgstr "STUN szolgáltatásfeltérképezés a Jingle-höz" #: ../libpurple/protocols/jabber/buddy.c:911 #: ../libpurple/protocols/jabber/buddy.c:1071 msgid "Simplified Encrypted Session Negotiation" -msgstr "" - +msgstr "Egyszerűsített titkosított munkamenet-egyeztetés" + +# fixme: idáig egy jó darabon xmpp protokollkiegészítések nevei voltak, lásd: http://www.xmpp.org/extensions/ #: ../libpurple/protocols/jabber/buddy.c:913 #: ../libpurple/protocols/jabber/buddy.c:1073 msgid "Hop Check" -msgstr "" +msgstr "Ugrásellenőrzés" #: ../libpurple/protocols/jabber/buddy.c:921 #: ../libpurple/protocols/jabber/buddy.c:1081 -#: ../libpurple/protocols/oscar/oscar.c:2906 +#: ../libpurple/protocols/oscar/oscar.c:2921 msgid "Capabilities" msgstr "Képességek" #: ../libpurple/protocols/jabber/buddy.c:933 -#: ../libpurple/protocols/jabber/libxmpp.c:206 +#: ../libpurple/protocols/jabber/libxmpp.c:209 #: ../libpurple/protocols/jabber/si.c:859 msgid "Resource" msgstr "Erőforrás" #: ../libpurple/protocols/jabber/buddy.c:935 -#: ../libpurple/protocols/jabber/jabber.c:1531 -#: ../libpurple/protocols/jabber/jabber.c:1554 -#: ../libpurple/protocols/jabber/jabber.c:1577 -#: ../libpurple/protocols/jabber/jabber.c:1600 -#: ../libpurple/protocols/jabber/jabber.c:1623 +#: ../libpurple/protocols/jabber/jabber.c:1538 +#: ../libpurple/protocols/jabber/jabber.c:1552 +#: ../libpurple/protocols/jabber/jabber.c:1566 +#: ../libpurple/protocols/jabber/jabber.c:1580 +#: ../libpurple/protocols/jabber/jabber.c:1594 msgid "Priority" msgstr "Prioritás" @@ -5192,8 +5252,8 @@ #: ../libpurple/protocols/jabber/buddy.c:1270 #: ../libpurple/protocols/jabber/jabber.c:952 -#: ../libpurple/protocols/oscar/oscar.c:3788 -#: ../libpurple/protocols/oscar/oscar.c:3801 +#: ../libpurple/protocols/oscar/oscar.c:3803 +#: ../libpurple/protocols/oscar/oscar.c:3816 #: ../libpurple/protocols/qq/buddy_info.c:56 #: ../libpurple/protocols/silc/ops.c:1030 #: ../libpurple/protocols/silc10/ops.c:1064 @@ -5212,74 +5272,72 @@ msgid "Logo" msgstr "Logó" -#: ../libpurple/protocols/jabber/buddy.c:1942 +#: ../libpurple/protocols/jabber/buddy.c:1945 msgid "Un-hide From" msgstr "Rejtettség visszavonása" -#: ../libpurple/protocols/jabber/buddy.c:1946 +#: ../libpurple/protocols/jabber/buddy.c:1949 msgid "Temporarily Hide From" msgstr "Ideiglenesen elrejt" #. && NOT ME -#: ../libpurple/protocols/jabber/buddy.c:1954 +#: ../libpurple/protocols/jabber/buddy.c:1957 msgid "Cancel Presence Notification" msgstr "Jelenlét-értesítés törlése" -#: ../libpurple/protocols/jabber/buddy.c:1961 +#: ../libpurple/protocols/jabber/buddy.c:1964 msgid "(Re-)Request authorization" msgstr "Engedélyezés (újra)kérése" #. if(NOT ME) #. shouldn't this just happen automatically when the buddy is #. removed? -#: ../libpurple/protocols/jabber/buddy.c:1970 +#: ../libpurple/protocols/jabber/buddy.c:1973 msgid "Unsubscribe" msgstr "Leiratkozás" -#: ../libpurple/protocols/jabber/buddy.c:1985 -#, fuzzy +#: ../libpurple/protocols/jabber/buddy.c:1988 msgid "Log In" -msgstr "Bejelentkezve" - -#: ../libpurple/protocols/jabber/buddy.c:1989 -#, fuzzy +msgstr "Bejelentkezés" + +#: ../libpurple/protocols/jabber/buddy.c:1992 msgid "Log Out" -msgstr "Csevegések naplózása" - -#: ../libpurple/protocols/jabber/buddy.c:2035 -#: ../libpurple/protocols/jabber/jabber.c:1553 +msgstr "Kijelentkezés" + +#: ../libpurple/protocols/jabber/buddy.c:2038 +#: ../libpurple/protocols/jabber/jabber.c:1551 msgid "Chatty" msgstr "Beszédes" -#: ../libpurple/protocols/jabber/buddy.c:2039 +#: ../libpurple/protocols/jabber/buddy.c:2042 msgid "Extended Away" msgstr "Nem vagyok a gépnél" -#: ../libpurple/protocols/jabber/buddy.c:2041 -#: ../libpurple/protocols/jabber/jabber.c:1622 +#: ../libpurple/protocols/jabber/buddy.c:2044 +#: ../libpurple/protocols/jabber/jabber.c:1593 #: ../libpurple/protocols/oscar/oscar.c:727 -#: ../libpurple/protocols/oscar/oscar.c:5808 -#: ../libpurple/protocols/sametime/sametime.c:3297 +#: ../libpurple/protocols/oscar/oscar.c:5863 +#: ../libpurple/protocols/sametime/sametime.c:3298 #, c-format msgid "Do Not Disturb" msgstr "Ne zavarjanak" -#: ../libpurple/protocols/jabber/buddy.c:2208 +#: ../libpurple/protocols/jabber/buddy.c:2211 msgid "JID" msgstr "JID" -#: ../libpurple/protocols/jabber/buddy.c:2212 -#: ../libpurple/protocols/jabber/buddy.c:2391 -#: ../libpurple/protocols/oscar/oscar.c:3711 +#: ../libpurple/protocols/jabber/buddy.c:2215 +#: ../libpurple/protocols/jabber/buddy.c:2404 +#: ../libpurple/protocols/oscar/oscar.c:3726 msgid "Last Name" msgstr "Vezetéknév" -#: ../libpurple/protocols/jabber/buddy.c:2244 +#: ../libpurple/protocols/jabber/buddy.c:2247 msgid "The following are the results of your search" msgstr "A keresés eredményei a következők" #. current comment from Jabber User Directory users.jabber.org -#: ../libpurple/protocols/jabber/buddy.c:2319 +#: ../libpurple/protocols/jabber/buddy.c:2332 msgid "" "Find a contact by entering the search criteria in the given fields. Note: " "Each field supports wild card searches (%)" @@ -5287,69 +5345,68 @@ "Kapcsolat keresése a keresési feltételek megadásával az adott mezőkben. Ne " "feledje, hogy minden mező támogatja a helyettesítő karakteres keresést (%)" -#: ../libpurple/protocols/jabber/buddy.c:2339 +#: ../libpurple/protocols/jabber/buddy.c:2352 msgid "Directory Query Failed" msgstr "A címtárlekérdezés sikertelen" -#: ../libpurple/protocols/jabber/buddy.c:2340 +#: ../libpurple/protocols/jabber/buddy.c:2353 msgid "Could not query the directory server." msgstr "A címtárkiszolgáló lekérdezése nem sikerült." #. Try to translate the message (see static message #. list in jabber_user_dir_comments[]) -#: ../libpurple/protocols/jabber/buddy.c:2374 +#: ../libpurple/protocols/jabber/buddy.c:2387 #, c-format msgid "Server Instructions: %s" msgstr "Kiszolgálóutasítások: %s" -#: ../libpurple/protocols/jabber/buddy.c:2381 +#: ../libpurple/protocols/jabber/buddy.c:2394 msgid "Fill in one or more fields to search for any matching XMPP users." -msgstr "" -"Töltsön ki legalább egy mezőt a megfelelő XMPP felhasználók kereséséhez." - -#: ../libpurple/protocols/jabber/buddy.c:2401 -#: ../libpurple/protocols/novell/novell.c:1488 -#: ../libpurple/protocols/oscar/oscar.c:3714 -#: ../libpurple/protocols/oscar/oscar.c:3723 +msgstr "Töltsön ki legalább egy mezőt a megfelelő XMPP felhasználók kereséséhez." + +#: ../libpurple/protocols/jabber/buddy.c:2414 +#: ../libpurple/protocols/novell/novell.c:1490 +#: ../libpurple/protocols/oscar/oscar.c:3729 +#: ../libpurple/protocols/oscar/oscar.c:3738 msgid "E-Mail Address" msgstr "E-mail cím" -#: ../libpurple/protocols/jabber/buddy.c:2410 -#: ../libpurple/protocols/jabber/buddy.c:2411 +#: ../libpurple/protocols/jabber/buddy.c:2423 +#: ../libpurple/protocols/jabber/buddy.c:2424 msgid "Search for XMPP users" msgstr "XMPP felhasználók keresése" #. "Search" -#: ../libpurple/protocols/jabber/buddy.c:2412 +#: ../libpurple/protocols/jabber/buddy.c:2425 #: ../libpurple/protocols/qq/group.c:123 #: ../libpurple/protocols/qq/group_im.c:147 #: ../libpurple/protocols/qq/sys_msg.c:174 #: ../libpurple/protocols/qq/sys_msg.c:250 #: ../libpurple/protocols/qq/sys_msg.c:268 -#: ../libpurple/protocols/sametime/sametime.c:5611 +#: ../libpurple/protocols/sametime/sametime.c:5612 #: ../pidgin/plugins/gevolution/add_buddy_dialog.c:470 #: ../pidgin/plugins/gevolution/assoc-buddy.c:356 msgid "Search" msgstr "Keresés" -#: ../libpurple/protocols/jabber/buddy.c:2427 +#: ../libpurple/protocols/jabber/buddy.c:2440 msgid "Invalid Directory" msgstr "Érvénytelen címtár" -#: ../libpurple/protocols/jabber/buddy.c:2444 +#: ../libpurple/protocols/jabber/buddy.c:2457 msgid "Enter a User Directory" msgstr "Adjon meg egy felhasználói címtárat" -#: ../libpurple/protocols/jabber/buddy.c:2445 +#: ../libpurple/protocols/jabber/buddy.c:2458 msgid "Select a user directory to search" msgstr "Válasszon ki egy felhasználói címtárat a kereséshez" -#: ../libpurple/protocols/jabber/buddy.c:2448 +#: ../libpurple/protocols/jabber/buddy.c:2461 msgid "Search Directory" msgstr "Keresés a címtárban" #: ../libpurple/protocols/jabber/chat.c:41 -#: ../libpurple/protocols/oscar/oscar.c:5294 +#: ../libpurple/protocols/oscar/oscar.c:5347 #: ../libpurple/protocols/yahoo/yahoochat.c:1048 msgid "_Room:" msgstr "Sz_oba:" @@ -5419,7 +5476,7 @@ #: ../libpurple/protocols/jabber/chat.c:678 #: ../libpurple/protocols/jabber/chat.c:689 -#: ../libpurple/protocols/silc/ops.c:1456 +#: ../libpurple/protocols/silc/ops.c:1460 #: ../libpurple/protocols/silc10/ops.c:1451 msgid "Error retrieving room list" msgstr "Hiba szobalista letöltése közben" @@ -5446,7 +5503,7 @@ #: ../libpurple/protocols/jabber/jabber.c:145 msgid "You require encryption, but it is not available on this server." -msgstr "" +msgstr "Titkosítást igényel, de az nem áll rendelkezésre ezen a kiszolgálón." #: ../libpurple/protocols/jabber/jabber.c:259 #: ../libpurple/protocols/jabber/jabber.c:312 @@ -5460,9 +5517,9 @@ msgstr "Olvasási hiba" #: ../libpurple/protocols/jabber/jabber.c:482 -#: ../libpurple/protocols/oscar/flap_connection.c:394 -#: ../libpurple/protocols/yahoo/yahoo.c:2558 -#: ../libpurple/protocols/yahoo/yahoo.c:2590 +#: ../libpurple/protocols/oscar/flap_connection.c:396 +#: ../libpurple/protocols/yahoo/yahoo.c:2560 +#: ../libpurple/protocols/yahoo/yahoo.c:2592 #, c-format msgid "" "Could not establish a connection with the server:\n" @@ -5490,9 +5547,9 @@ msgstr "%s@%s regisztrációja sikeres" #: ../libpurple/protocols/jabber/jabber.c:662 -#, fuzzy, c-format +#, c-format msgid "Registration to %s successful" -msgstr "%s@%s regisztrációja sikeres" +msgstr "A regisztráció sikeres a következőre: %s" #: ../libpurple/protocols/jabber/jabber.c:664 #: ../libpurple/protocols/jabber/jabber.c:665 @@ -5505,21 +5562,19 @@ msgstr "A regisztráció sikertelen" #: ../libpurple/protocols/jabber/jabber.c:692 -#, fuzzy, c-format +#, c-format msgid "Registration from %s successfully removed" -msgstr "%s@%s regisztrációja sikeres" +msgstr "A regisztráció sikeresen megszüntetve a következőn: %s" #: ../libpurple/protocols/jabber/jabber.c:694 #: ../libpurple/protocols/jabber/jabber.c:695 -#, fuzzy msgid "Unregistration Successful" -msgstr "A regisztráció sikeres" +msgstr "A regisztráció megszüntetése sikeres" #: ../libpurple/protocols/jabber/jabber.c:703 #: ../libpurple/protocols/jabber/jabber.c:704 -#, fuzzy msgid "Unregistration Failed" -msgstr "A regisztráció sikertelen" +msgstr "A regisztráció megszüntetése sikertelen" #: ../libpurple/protocols/jabber/jabber.c:864 #: ../libpurple/protocols/jabber/jabber.c:865 @@ -5527,8 +5582,8 @@ msgstr "Már regisztrálva van" #: ../libpurple/protocols/jabber/jabber.c:962 -#: ../libpurple/protocols/oscar/oscar.c:3790 -#: ../libpurple/protocols/oscar/oscar.c:3803 +#: ../libpurple/protocols/oscar/oscar.c:3805 +#: ../libpurple/protocols/oscar/oscar.c:3818 msgid "State" msgstr "Állam" @@ -5538,8 +5593,8 @@ #: ../libpurple/protocols/jabber/jabber.c:972 #: ../libpurple/protocols/silc/ops.c:1035 -#: ../libpurple/protocols/silc/silc.c:772 -#: ../libpurple/protocols/silc/util.c:557 +#: ../libpurple/protocols/silc/silc.c:903 +#: ../libpurple/protocols/silc/util.c:561 #: ../libpurple/protocols/silc10/ops.c:1069 #: ../libpurple/protocols/silc10/silc.c:683 #: ../libpurple/protocols/silc10/util.c:553 @@ -5551,19 +5606,16 @@ msgstr "Dátum" #: ../libpurple/protocols/jabber/jabber.c:987 -#, fuzzy msgid "Unregister" -msgstr "Regisztráció" +msgstr "Regisztráció megszüntetése" #: ../libpurple/protocols/jabber/jabber.c:994 -#, fuzzy -msgid "" -"Please fill out the information below to change your account registration." -msgstr "Kérem adja meg a következő információkat az új fiók regisztrálásához." +msgid "Please fill out the information below to change your account registration." +msgstr "Adja meg a következő információkat a regisztrált fiók módosításához." #: ../libpurple/protocols/jabber/jabber.c:997 msgid "Please fill out the information below to register your new account." -msgstr "Kérem adja meg a következő információkat az új fiók regisztrálásához." +msgstr "Adja meg a következő információkat az új fiók regisztrálásához." #: ../libpurple/protocols/jabber/jabber.c:1005 #: ../libpurple/protocols/jabber/jabber.c:1006 @@ -5576,43 +5628,40 @@ msgstr "Regisztráció" #: ../libpurple/protocols/jabber/jabber.c:1012 -#, fuzzy, c-format +#, c-format msgid "Change Account Registration at %s" -msgstr "Felhasználó-információk megváltoztatása %s számára" +msgstr "A következőn regisztrált fiók módosítása: %s" #: ../libpurple/protocols/jabber/jabber.c:1013 -#, fuzzy, c-format +#, c-format msgid "Register New Account at %s" -msgstr "Új XMPP fiók regisztrálása" +msgstr "Új fiók regisztrálása a következőn: %s" #: ../libpurple/protocols/jabber/jabber.c:1016 -#, fuzzy msgid "Change Registration" -msgstr "Állapot megváltoztatása a következőre" +msgstr "Regisztráció módosítása" #: ../libpurple/protocols/jabber/jabber.c:1120 #: ../libpurple/protocols/jabber/jabber.c:1121 -#, fuzzy msgid "Error unregistering account" -msgstr "Hiba a fiók információinak megváltoztatása közben" +msgstr "Hiba a fiók regisztrációjának megszüntetése közben" #: ../libpurple/protocols/jabber/jabber.c:1126 #: ../libpurple/protocols/jabber/jabber.c:1127 -#, fuzzy msgid "Account successfully unregistered" -msgstr "Sikeresen létrehozott egy Qun-t" +msgstr "A fiók regisztrációja sikeresen megszüntetve" #: ../libpurple/protocols/jabber/jabber.c:1284 msgid "Initializing Stream" msgstr "Folyam inicializálása" #: ../libpurple/protocols/jabber/jabber.c:1289 -#, fuzzy msgid "Initializing SSL/TLS" -msgstr "Folyam inicializálása" +msgstr "SSL/TLS inicializálása" #: ../libpurple/protocols/jabber/jabber.c:1293 -#: ../libpurple/protocols/msn/session.c:351 +#: ../libpurple/protocols/msn/session.c:400 +#: ../libpurple/protocols/msnp9/session.c:351 msgid "Authenticating" msgstr "Hitelesítés" @@ -5621,475 +5670,455 @@ msgstr "A folyam újrainicializálása" #: ../libpurple/protocols/jabber/jabber.c:1396 -#: ../libpurple/protocols/jabber/jabber.c:1865 -#: ../libpurple/protocols/jabber/jabber.c:1909 -#: ../libpurple/protocols/jabber/jabber.c:1945 +#: ../libpurple/protocols/jabber/jabber.c:1843 +#: ../libpurple/protocols/jabber/jabber.c:1887 +#: ../libpurple/protocols/jabber/jabber.c:1923 #: ../libpurple/protocols/oscar/oscar.c:826 -#: ../libpurple/protocols/oscar/oscar.c:5602 +#: ../libpurple/protocols/oscar/oscar.c:5657 msgid "Not Authorized" msgstr "Nem engedélyezett" -#: ../libpurple/protocols/jabber/jabber.c:1442 +#: ../libpurple/protocols/jabber/jabber.c:1444 msgid "Both" msgstr "Mindkettő" -#: ../libpurple/protocols/jabber/jabber.c:1444 +#: ../libpurple/protocols/jabber/jabber.c:1446 msgid "From (To pending)" msgstr "Feladó (Címzett függőben)" -#: ../libpurple/protocols/jabber/jabber.c:1446 +#: ../libpurple/protocols/jabber/jabber.c:1448 msgid "From" msgstr "Feladó" -#: ../libpurple/protocols/jabber/jabber.c:1449 +#: ../libpurple/protocols/jabber/jabber.c:1451 msgid "To" msgstr "Címzett" -#: ../libpurple/protocols/jabber/jabber.c:1451 +#: ../libpurple/protocols/jabber/jabber.c:1453 msgid "None (To pending)" msgstr "Senki (Címzett függőben)" -#: ../libpurple/protocols/jabber/jabber.c:1453 +#: ../libpurple/protocols/jabber/jabber.c:1455 #: ../pidgin/plugins/gevolution/eds-utils.c:73 #: ../pidgin/plugins/gevolution/eds-utils.c:86 msgid "None" msgstr "Nincs" -#: ../libpurple/protocols/jabber/jabber.c:1456 +#: ../libpurple/protocols/jabber/jabber.c:1458 msgid "Subscription" msgstr "Feliratkozás" -#: ../libpurple/protocols/jabber/jabber.c:1466 -#: ../libpurple/protocols/jabber/jabber.c:1469 -#: ../libpurple/protocols/jabber/jabber.c:1533 -#: ../libpurple/protocols/jabber/jabber.c:1556 -#: ../libpurple/protocols/jabber/jabber.c:1579 -#: ../libpurple/protocols/jabber/jabber.c:1602 -#: ../libpurple/protocols/jabber/jabber.c:1625 -#: ../libpurple/protocols/jabber/usermood.c:166 -#: ../libpurple/protocols/silc/buddy.c:1557 +#: ../libpurple/protocols/jabber/jabber.c:1468 +#: ../libpurple/protocols/jabber/jabber.c:1471 +#: ../libpurple/protocols/jabber/jabber.c:1540 +#: ../libpurple/protocols/jabber/jabber.c:1554 +#: ../libpurple/protocols/jabber/jabber.c:1568 +#: ../libpurple/protocols/jabber/jabber.c:1582 +#: ../libpurple/protocols/jabber/jabber.c:1596 +#: ../libpurple/protocols/jabber/usermood.c:184 +#: ../libpurple/protocols/silc/buddy.c:1560 #: ../libpurple/protocols/silc/ops.c:1212 -#: ../libpurple/protocols/silc10/buddy.c:1557 +#: ../libpurple/protocols/silc10/buddy.c:1560 #: ../libpurple/protocols/silc10/ops.c:1207 msgid "Mood" msgstr "Hangulat" -#: ../libpurple/protocols/jabber/jabber.c:1534 -#: ../libpurple/protocols/jabber/jabber.c:1557 -#: ../libpurple/protocols/jabber/jabber.c:1580 -#: ../libpurple/protocols/jabber/jabber.c:1603 -#: ../libpurple/protocols/jabber/jabber.c:1626 -#, fuzzy -msgid "Mood Text" -msgstr "Vércsoport" - -#: ../libpurple/protocols/jabber/jabber.c:1535 -#: ../libpurple/protocols/jabber/jabber.c:1558 -#: ../libpurple/protocols/jabber/jabber.c:1581 -#: ../libpurple/protocols/jabber/jabber.c:1604 -#: ../libpurple/protocols/jabber/jabber.c:1627 -#, fuzzy -msgid "Tune Artist" -msgstr "Grafikusok" - -#: ../libpurple/protocols/jabber/jabber.c:1536 -#: ../libpurple/protocols/jabber/jabber.c:1559 -#: ../libpurple/protocols/jabber/jabber.c:1582 -#: ../libpurple/protocols/jabber/jabber.c:1605 -#: ../libpurple/protocols/jabber/jabber.c:1628 -#, fuzzy -msgid "Tune Title" -msgstr "Beosztás" - -#: ../libpurple/protocols/jabber/jabber.c:1537 -#: ../libpurple/protocols/jabber/jabber.c:1560 -#: ../libpurple/protocols/jabber/jabber.c:1583 -#: ../libpurple/protocols/jabber/jabber.c:1606 -#: ../libpurple/protocols/jabber/jabber.c:1629 -msgid "Tune Album" -msgstr "" - -#: ../libpurple/protocols/jabber/jabber.c:1538 -#: ../libpurple/protocols/jabber/jabber.c:1561 -#: ../libpurple/protocols/jabber/jabber.c:1584 -#: ../libpurple/protocols/jabber/jabber.c:1607 -#: ../libpurple/protocols/jabber/jabber.c:1630 -msgid "Tune Genre" -msgstr "" - -#: ../libpurple/protocols/jabber/jabber.c:1539 -#: ../libpurple/protocols/jabber/jabber.c:1562 -#: ../libpurple/protocols/jabber/jabber.c:1585 -#: ../libpurple/protocols/jabber/jabber.c:1608 -#: ../libpurple/protocols/jabber/jabber.c:1631 -#, fuzzy -msgid "Tune Comment" -msgstr "Partnermegjegyzés" - -#: ../libpurple/protocols/jabber/jabber.c:1540 -#: ../libpurple/protocols/jabber/jabber.c:1563 -#: ../libpurple/protocols/jabber/jabber.c:1586 -#: ../libpurple/protocols/jabber/jabber.c:1609 -#: ../libpurple/protocols/jabber/jabber.c:1632 -msgid "Tune Track" -msgstr "" +#: ../libpurple/protocols/jabber/jabber.c:1476 +#: ../libpurple/protocols/msn/msn.c:647 +msgid "Current media" +msgstr "Aktuális adathordozó" #: ../libpurple/protocols/jabber/jabber.c:1541 -#: ../libpurple/protocols/jabber/jabber.c:1564 -#: ../libpurple/protocols/jabber/jabber.c:1587 -#: ../libpurple/protocols/jabber/jabber.c:1610 -#: ../libpurple/protocols/jabber/jabber.c:1633 -msgid "Tune Time" -msgstr "" - -#: ../libpurple/protocols/jabber/jabber.c:1542 -#: ../libpurple/protocols/jabber/jabber.c:1565 -#: ../libpurple/protocols/jabber/jabber.c:1588 -#: ../libpurple/protocols/jabber/jabber.c:1611 -#: ../libpurple/protocols/jabber/jabber.c:1634 -msgid "Tune Year" -msgstr "" +#: ../libpurple/protocols/jabber/jabber.c:1555 +#: ../libpurple/protocols/jabber/jabber.c:1569 +#: ../libpurple/protocols/jabber/jabber.c:1583 +#: ../libpurple/protocols/jabber/jabber.c:1597 +msgid "Mood Text" +msgstr "Hangulatszöveg" #: ../libpurple/protocols/jabber/jabber.c:1543 -#: ../libpurple/protocols/jabber/jabber.c:1566 -#: ../libpurple/protocols/jabber/jabber.c:1589 -#: ../libpurple/protocols/jabber/jabber.c:1612 -#: ../libpurple/protocols/jabber/jabber.c:1635 +#: ../libpurple/protocols/jabber/jabber.c:1557 +#: ../libpurple/protocols/jabber/jabber.c:1571 +#: ../libpurple/protocols/jabber/jabber.c:1585 +#: ../libpurple/protocols/jabber/jabber.c:1599 +msgid "Allow Buzz" +msgstr "Csörgetés engedélyezése" + +#: ../libpurple/protocols/jabber/jabber.c:1617 +msgid "Tune Artist" +msgstr "Dal előadója" + +#: ../libpurple/protocols/jabber/jabber.c:1618 +msgid "Tune Title" +msgstr "Dal címe" + +#: ../libpurple/protocols/jabber/jabber.c:1619 +msgid "Tune Album" +msgstr "Dal albuma" + +#: ../libpurple/protocols/jabber/jabber.c:1620 +msgid "Tune Genre" +msgstr "Dal műfaja" + +#: ../libpurple/protocols/jabber/jabber.c:1621 +msgid "Tune Comment" +msgstr "Dal megjegyzése" + +#: ../libpurple/protocols/jabber/jabber.c:1622 +msgid "Tune Track" +msgstr "Dal sorszáma" + +#: ../libpurple/protocols/jabber/jabber.c:1623 +msgid "Tune Time" +msgstr "Dal időtartama" + +#: ../libpurple/protocols/jabber/jabber.c:1624 +msgid "Tune Year" +msgstr "Dal kiadási éve" + +#: ../libpurple/protocols/jabber/jabber.c:1625 msgid "Tune URL" -msgstr "" - -#: ../libpurple/protocols/jabber/jabber.c:1545 -#: ../libpurple/protocols/jabber/jabber.c:1568 -#: ../libpurple/protocols/jabber/jabber.c:1591 -#: ../libpurple/protocols/jabber/jabber.c:1614 -#: ../libpurple/protocols/jabber/jabber.c:1637 -#, fuzzy -msgid "Allow Buzz" -msgstr "Engedélyezés" - -#: ../libpurple/protocols/jabber/jabber.c:1665 +msgstr "Dal URL" + +#: ../libpurple/protocols/jabber/jabber.c:1641 msgid "Password Changed" msgstr "Jelszó megváltoztatva" -#: ../libpurple/protocols/jabber/jabber.c:1666 +#: ../libpurple/protocols/jabber/jabber.c:1642 msgid "Your password has been changed." msgstr "A jelszava meg lett változtatva." -#: ../libpurple/protocols/jabber/jabber.c:1670 -#: ../libpurple/protocols/jabber/jabber.c:1671 +#: ../libpurple/protocols/jabber/jabber.c:1648 +#: ../libpurple/protocols/jabber/jabber.c:1649 msgid "Error changing password" msgstr "Hiba a jelszó megváltoztatásakor" -#: ../libpurple/protocols/jabber/jabber.c:1728 +#: ../libpurple/protocols/jabber/jabber.c:1706 msgid "Password (again)" msgstr "Jelszó (még egyszer)" -#: ../libpurple/protocols/jabber/jabber.c:1734 -#: ../libpurple/protocols/jabber/jabber.c:1735 +#: ../libpurple/protocols/jabber/jabber.c:1712 +#: ../libpurple/protocols/jabber/jabber.c:1713 msgid "Change XMPP Password" msgstr "XMPP jelszó megváltoztatása" -#: ../libpurple/protocols/jabber/jabber.c:1735 +#: ../libpurple/protocols/jabber/jabber.c:1713 msgid "Please enter your new password" -msgstr "Kérem adja meg az új jelszavát" - -#: ../libpurple/protocols/jabber/jabber.c:1749 -#: ../libpurple/protocols/oscar/oscar.c:6388 -#: ../libpurple/protocols/silc/silc.c:1093 -#: ../libpurple/protocols/silc10/silc.c:1004 +msgstr "Adja meg az új jelszavát" + +#: ../libpurple/protocols/jabber/jabber.c:1727 +#: ../libpurple/protocols/oscar/oscar.c:6443 +#: ../libpurple/protocols/silc/silc.c:1224 +#: ../libpurple/protocols/silc10/silc.c:1007 msgid "Set User Info..." msgstr "Felhasználói információk beállítása..." #. if (js->protocol_options & CHANGE_PASSWORD) { -#: ../libpurple/protocols/jabber/jabber.c:1754 -#: ../libpurple/protocols/oscar/oscar.c:6399 -#: ../libpurple/protocols/silc/silc.c:1089 -#: ../libpurple/protocols/silc10/silc.c:1000 +#: ../libpurple/protocols/jabber/jabber.c:1732 +#: ../libpurple/protocols/oscar/oscar.c:6454 +#: ../libpurple/protocols/silc/silc.c:1220 +#: ../libpurple/protocols/silc10/silc.c:1003 msgid "Change Password..." msgstr "Jelszó megváltoztatása..." #. } -#: ../libpurple/protocols/jabber/jabber.c:1759 +#: ../libpurple/protocols/jabber/jabber.c:1737 msgid "Search for Users..." msgstr "Felhasználók keresése..." -#: ../libpurple/protocols/jabber/jabber.c:1845 +#: ../libpurple/protocols/jabber/jabber.c:1823 msgid "Bad Request" msgstr "Hibás kérés" -#: ../libpurple/protocols/jabber/jabber.c:1847 +#: ../libpurple/protocols/jabber/jabber.c:1825 msgid "Conflict" msgstr "Ütközés" -#: ../libpurple/protocols/jabber/jabber.c:1849 +#: ../libpurple/protocols/jabber/jabber.c:1827 msgid "Feature Not Implemented" msgstr "A szolgáltatás nincs megvalósítva" -#: ../libpurple/protocols/jabber/jabber.c:1851 +#: ../libpurple/protocols/jabber/jabber.c:1829 msgid "Forbidden" msgstr "Tiltva" -#: ../libpurple/protocols/jabber/jabber.c:1853 +#: ../libpurple/protocols/jabber/jabber.c:1831 msgid "Gone" msgstr "Elment" -#: ../libpurple/protocols/jabber/jabber.c:1855 -#: ../libpurple/protocols/jabber/jabber.c:1935 +#: ../libpurple/protocols/jabber/jabber.c:1833 +#: ../libpurple/protocols/jabber/jabber.c:1913 msgid "Internal Server Error" msgstr "Belső kiszolgálóhiba" -#: ../libpurple/protocols/jabber/jabber.c:1857 +#: ../libpurple/protocols/jabber/jabber.c:1835 msgid "Item Not Found" msgstr "Az elem nem található" -#: ../libpurple/protocols/jabber/jabber.c:1859 +#: ../libpurple/protocols/jabber/jabber.c:1837 msgid "Malformed XMPP ID" msgstr "Rosszul formázott XMPP azonosító" -#: ../libpurple/protocols/jabber/jabber.c:1861 +#: ../libpurple/protocols/jabber/jabber.c:1839 msgid "Not Acceptable" msgstr "Nem fogadható el" -#: ../libpurple/protocols/jabber/jabber.c:1863 +#: ../libpurple/protocols/jabber/jabber.c:1841 msgid "Not Allowed" msgstr "Nem engedélyezett" -#: ../libpurple/protocols/jabber/jabber.c:1867 +#: ../libpurple/protocols/jabber/jabber.c:1845 msgid "Payment Required" msgstr "Fizetés szükséges" -#: ../libpurple/protocols/jabber/jabber.c:1869 +#: ../libpurple/protocols/jabber/jabber.c:1847 msgid "Recipient Unavailable" msgstr "A címzett nem érhető el" -#: ../libpurple/protocols/jabber/jabber.c:1873 +#: ../libpurple/protocols/jabber/jabber.c:1851 msgid "Registration Required" msgstr "Regisztráció szükséges" -#: ../libpurple/protocols/jabber/jabber.c:1875 +#: ../libpurple/protocols/jabber/jabber.c:1853 msgid "Remote Server Not Found" msgstr "A távoli kiszolgáló nem található" -#: ../libpurple/protocols/jabber/jabber.c:1877 +#: ../libpurple/protocols/jabber/jabber.c:1855 msgid "Remote Server Timeout" msgstr "Időtúllépés a távoli kiszolgálón" -#: ../libpurple/protocols/jabber/jabber.c:1879 +#: ../libpurple/protocols/jabber/jabber.c:1857 msgid "Server Overloaded" msgstr "A kiszolgáló túl van terhelve" -#: ../libpurple/protocols/jabber/jabber.c:1881 +#: ../libpurple/protocols/jabber/jabber.c:1859 msgid "Service Unavailable" msgstr "A szolgáltatás nem érhető el" -#: ../libpurple/protocols/jabber/jabber.c:1883 +#: ../libpurple/protocols/jabber/jabber.c:1861 msgid "Subscription Required" msgstr "Feliratkozás szükséges" -#: ../libpurple/protocols/jabber/jabber.c:1885 +#: ../libpurple/protocols/jabber/jabber.c:1863 msgid "Unexpected Request" msgstr "Váratlan kérés" -#: ../libpurple/protocols/jabber/jabber.c:1892 +#: ../libpurple/protocols/jabber/jabber.c:1870 msgid "Authorization Aborted" msgstr "Hitelesítés megszakítva" -#: ../libpurple/protocols/jabber/jabber.c:1894 +#: ../libpurple/protocols/jabber/jabber.c:1872 msgid "Incorrect encoding in authorization" msgstr "Hibás kódolás a hitelesítésben" -#: ../libpurple/protocols/jabber/jabber.c:1897 +#: ../libpurple/protocols/jabber/jabber.c:1875 msgid "Invalid authzid" msgstr "Érvénytelen authzid" -#: ../libpurple/protocols/jabber/jabber.c:1900 +#: ../libpurple/protocols/jabber/jabber.c:1878 msgid "Invalid Authorization Mechanism" msgstr "Érvénytelen hitelesítési eljárás" -#: ../libpurple/protocols/jabber/jabber.c:1903 +#: ../libpurple/protocols/jabber/jabber.c:1881 msgid "Authorization mechanism too weak" msgstr "A hitelesítési eljárás túl gyenge" -#: ../libpurple/protocols/jabber/jabber.c:1911 +#: ../libpurple/protocols/jabber/jabber.c:1889 msgid "Temporary Authentication Failure" msgstr "Átmeneti hitelesítési hiba" -#: ../libpurple/protocols/jabber/jabber.c:1914 +#: ../libpurple/protocols/jabber/jabber.c:1892 msgid "Authentication Failure" msgstr "Hitelesítési hiba" -#: ../libpurple/protocols/jabber/jabber.c:1920 +#: ../libpurple/protocols/jabber/jabber.c:1898 msgid "Bad Format" msgstr "Rossz formátum" -#: ../libpurple/protocols/jabber/jabber.c:1922 +#: ../libpurple/protocols/jabber/jabber.c:1900 msgid "Bad Namespace Prefix" msgstr "Rossz névtér-előtag" -#: ../libpurple/protocols/jabber/jabber.c:1925 +#: ../libpurple/protocols/jabber/jabber.c:1903 msgid "Resource Conflict" msgstr "Erőforrás-ütközés" -#: ../libpurple/protocols/jabber/jabber.c:1927 -#: ../libpurple/protocols/silc/silc.c:244 +#: ../libpurple/protocols/jabber/jabber.c:1905 +#: ../libpurple/protocols/silc/silc.c:344 #: ../libpurple/protocols/silc10/ops.c:1720 msgid "Connection Timeout" msgstr "Időtúllépés miatt a kapcsolat megszakadt" -#: ../libpurple/protocols/jabber/jabber.c:1929 +#: ../libpurple/protocols/jabber/jabber.c:1907 msgid "Host Gone" msgstr "A gép eltűnt" -#: ../libpurple/protocols/jabber/jabber.c:1931 +#: ../libpurple/protocols/jabber/jabber.c:1909 msgid "Host Unknown" msgstr "Ismeretlen gép" -#: ../libpurple/protocols/jabber/jabber.c:1933 +#: ../libpurple/protocols/jabber/jabber.c:1911 msgid "Improper Addressing" msgstr "Hiányos címzés" -#: ../libpurple/protocols/jabber/jabber.c:1937 +#: ../libpurple/protocols/jabber/jabber.c:1915 msgid "Invalid ID" msgstr "Érvénytelen azonosító" -#: ../libpurple/protocols/jabber/jabber.c:1939 +#: ../libpurple/protocols/jabber/jabber.c:1917 msgid "Invalid Namespace" msgstr "Érvénytelen névtér" -#: ../libpurple/protocols/jabber/jabber.c:1941 +#: ../libpurple/protocols/jabber/jabber.c:1919 msgid "Invalid XML" msgstr "Érvénytelen XML" -#: ../libpurple/protocols/jabber/jabber.c:1943 +#: ../libpurple/protocols/jabber/jabber.c:1921 msgid "Non-matching Hosts" msgstr "Nem illeszkedő gépek" -#: ../libpurple/protocols/jabber/jabber.c:1947 +#: ../libpurple/protocols/jabber/jabber.c:1925 msgid "Policy Violation" msgstr "Szabályok megsértése" -#: ../libpurple/protocols/jabber/jabber.c:1949 +#: ../libpurple/protocols/jabber/jabber.c:1927 msgid "Remote Connection Failed" msgstr "Távoli kapcsolat sikertelen" -#: ../libpurple/protocols/jabber/jabber.c:1951 +#: ../libpurple/protocols/jabber/jabber.c:1929 msgid "Resource Constraint" msgstr "Erőforrás-megszorítás" -#: ../libpurple/protocols/jabber/jabber.c:1953 +#: ../libpurple/protocols/jabber/jabber.c:1931 msgid "Restricted XML" msgstr "Korlátozott XML" -#: ../libpurple/protocols/jabber/jabber.c:1955 +#: ../libpurple/protocols/jabber/jabber.c:1933 msgid "See Other Host" msgstr "Lásd a másik gépet" -#: ../libpurple/protocols/jabber/jabber.c:1957 +#: ../libpurple/protocols/jabber/jabber.c:1935 msgid "System Shutdown" msgstr "Rendszerleállítás" -#: ../libpurple/protocols/jabber/jabber.c:1959 +#: ../libpurple/protocols/jabber/jabber.c:1937 msgid "Undefined Condition" msgstr "Meghatározatlan feltétel" -#: ../libpurple/protocols/jabber/jabber.c:1961 +#: ../libpurple/protocols/jabber/jabber.c:1939 msgid "Unsupported Encoding" msgstr "Nem támogatott kódolás" -#: ../libpurple/protocols/jabber/jabber.c:1963 +#: ../libpurple/protocols/jabber/jabber.c:1941 msgid "Unsupported Stanza Type" msgstr "Nem támogatott Stanza típus" -#: ../libpurple/protocols/jabber/jabber.c:1965 +#: ../libpurple/protocols/jabber/jabber.c:1943 msgid "Unsupported Version" msgstr "Nem támogatott verzió" -#: ../libpurple/protocols/jabber/jabber.c:1967 +#: ../libpurple/protocols/jabber/jabber.c:1945 msgid "XML Not Well Formed" msgstr "Nem megfelelően formázott XML" -#: ../libpurple/protocols/jabber/jabber.c:1969 +#: ../libpurple/protocols/jabber/jabber.c:1947 msgid "Stream Error" msgstr "Folyamhiba" -#: ../libpurple/protocols/jabber/jabber.c:2052 +#: ../libpurple/protocols/jabber/jabber.c:2030 #, c-format msgid "Unable to ban user %s" msgstr "Nem lehet kitiltani %s felhasználót" -#: ../libpurple/protocols/jabber/jabber.c:2072 +#: ../libpurple/protocols/jabber/jabber.c:2050 #, c-format msgid "Unknown affiliation: \"%s\"" msgstr "Ismeretlen kapcsolat: \"%s\"" -#: ../libpurple/protocols/jabber/jabber.c:2077 +#: ../libpurple/protocols/jabber/jabber.c:2055 #, c-format msgid "Unable to affiliate user %s as \"%s\"" msgstr "%s felhasználó kapcsolata nem állítható be a következőre: \"%s\"" -#: ../libpurple/protocols/jabber/jabber.c:2096 +#: ../libpurple/protocols/jabber/jabber.c:2074 #, c-format msgid "Unknown role: \"%s\"" msgstr "Ismeretlen szerep: \"%s\"" -#: ../libpurple/protocols/jabber/jabber.c:2101 +#: ../libpurple/protocols/jabber/jabber.c:2079 #, c-format msgid "Unable to set role \"%s\" for user: %s" msgstr "A(z) \"%s\" szerep nem állítható be a következő felhasználónak: %s" -#: ../libpurple/protocols/jabber/jabber.c:2154 +#: ../libpurple/protocols/jabber/jabber.c:2132 #, c-format msgid "Unable to kick user %s" msgstr "Nem lehet kirúgni %s felhasználót" -#: ../libpurple/protocols/jabber/jabber.c:2185 -#, fuzzy, c-format +#: ../libpurple/protocols/jabber/jabber.c:2163 +#, c-format msgid "Unable to ping user %s" -msgstr "Nem lehet kitiltani %s felhasználót" - -#: ../libpurple/protocols/jabber/jabber.c:2207 -#: ../libpurple/protocols/jabber/jabber.c:2217 +msgstr "%s felhasználó nem pingelhető" + +#: ../libpurple/protocols/jabber/jabber.c:2181 +#: ../libpurple/protocols/jabber/jabber.c:2192 #, c-format msgid "Unable to buzz, because there is nothing known about user %s." -msgstr "" - -#: ../libpurple/protocols/jabber/jabber.c:2213 +msgstr "Nem lehet csörgetni, mivel nem érhető el információ %s felhasználóról." + +#: ../libpurple/protocols/jabber/jabber.c:2187 #, c-format msgid "Unable to buzz, because user %s might be offline." -msgstr "" - -#: ../libpurple/protocols/jabber/jabber.c:2239 -#, fuzzy, c-format +msgstr "Nem lehet csörgetni, mivel %s felhasználó kiléphetett." + +#: ../libpurple/protocols/jabber/jabber.c:2218 +#, c-format msgid "Unable to buzz, because the user %s does not support it." -msgstr "" -"Nem lehet fájlt küldeni a következőnek: %s, mert a felhasználó nem támogatja " -"fájlok átvitelét" - -#: ../libpurple/protocols/jabber/jabber.c:2253 +msgstr "Nem lehet csörgetni, mivel %s felhasználó nem támogatja azt." + +#: ../libpurple/protocols/jabber/jabber.c:2240 +#: ../libpurple/protocols/yahoo/yahoo.c:4121 +msgid "Buzz" +msgstr "Csörgetés" + +#: ../libpurple/protocols/jabber/jabber.c:2241 +#: ../libpurple/protocols/jabber/message.c:308 +#: ../libpurple/protocols/yahoo/yahoo.c:4122 +#, c-format +msgid "%s has buzzed you!" +msgstr "%s megcsörgette!" + +#: ../libpurple/protocols/jabber/jabber.c:2242 +#: ../libpurple/protocols/yahoo/yahoo.c:4123 +#, c-format +msgid "Buzzing %s..." +msgstr "%s csörgetése..." + +#: ../libpurple/protocols/jabber/jabber.c:2274 msgid "config: Configure a chat room." msgstr "config: Csevegőszoba beállítása." -#: ../libpurple/protocols/jabber/jabber.c:2257 +#: ../libpurple/protocols/jabber/jabber.c:2278 msgid "configure: Configure a chat room." msgstr "configure: Csevegőszoba beállítása." -#: ../libpurple/protocols/jabber/jabber.c:2266 +#: ../libpurple/protocols/jabber/jabber.c:2287 msgid "part [room]: Leave the room." msgstr "part [szoba]: A szoba elhagyása." -#: ../libpurple/protocols/jabber/jabber.c:2271 +#: ../libpurple/protocols/jabber/jabber.c:2292 msgid "register: Register with a chat room." msgstr "register: Regisztráció csevegőszobánál." -#: ../libpurple/protocols/jabber/jabber.c:2277 +#: ../libpurple/protocols/jabber/jabber.c:2298 msgid "topic [new topic]: View or change the topic." msgstr "topic [új téma]: A téma megtekintése vagy megváltoztatása." -#: ../libpurple/protocols/jabber/jabber.c:2283 +#: ../libpurple/protocols/jabber/jabber.c:2304 msgid "ban <user> [room]: Ban a user from the room." msgstr "ban <felhasználó> [szoba]: Felhasználó kitiltása a szobából." -#: ../libpurple/protocols/jabber/jabber.c:2289 +#: ../libpurple/protocols/jabber/jabber.c:2310 msgid "" "affiliate <user> <owner|admin|member|outcast|none>: Set a user's " "affiliation with the room." @@ -6097,7 +6126,7 @@ "affiliate <felhasználó> <owner|admin|member|outcast|none>: Egy " "felhasználó a szobával fennálló kapcsolatának beállítása." -#: ../libpurple/protocols/jabber/jabber.c:2295 +#: ../libpurple/protocols/jabber/jabber.c:2316 msgid "" "role <user> <moderator|participant|visitor|none>: Set a user's " "role in the room." @@ -6105,33 +6134,32 @@ "role <felhasználó> <moderator|participant|visitor|none>: " "Beállítja a felhasználó szerepét a szobában." -#: ../libpurple/protocols/jabber/jabber.c:2301 +#: ../libpurple/protocols/jabber/jabber.c:2322 msgid "invite <user> [message]: Invite a user to the room." msgstr "invite <felhasználó> [üzenet]: Felhasználó meghívása a szobába." -#: ../libpurple/protocols/jabber/jabber.c:2307 +#: ../libpurple/protocols/jabber/jabber.c:2328 msgid "join: <room> [server]: Join a chat on this server." msgstr "" "join: <szoba> [kiszolgáló]: Csatlakozás csevegéshez a megadott " "kiszolgálón." -#: ../libpurple/protocols/jabber/jabber.c:2313 +#: ../libpurple/protocols/jabber/jabber.c:2334 msgid "kick <user> [room]: Kick a user from the room." msgstr "kick <felhasználó> [szoba]: Felhasználó kirúgása a szobából." -#: ../libpurple/protocols/jabber/jabber.c:2318 -msgid "" -"msg <user> <message>: Send a private message to another user." +#: ../libpurple/protocols/jabber/jabber.c:2339 +msgid "msg <user> <message>: Send a private message to another user." msgstr "" "msg <felhasználó> <üzenet>: Magánüzenet küldése másik " "felhasználónak." -#: ../libpurple/protocols/jabber/jabber.c:2324 +#: ../libpurple/protocols/jabber/jabber.c:2345 msgid "ping <jid>:\tPing a user/component/server." -msgstr "" - -#: ../libpurple/protocols/jabber/jabber.c:2329 -#: ../libpurple/protocols/yahoo/yahoo.c:4145 +msgstr "ping <azonosító>:\tFelhasználó/összetevő/kiszolgáló pingelése" + +#: ../libpurple/protocols/jabber/jabber.c:2350 +#: ../libpurple/protocols/yahoo/yahoo.c:4147 msgid "buzz: Buzz a user to get their attention" msgstr "buzz: Felhasználó megcsörgetése figyelemfelhívási céllal" @@ -6151,35 +6179,35 @@ msgstr "XMPP protokollbővítmény" #. Translators: 'domain' is used here in the context of Internet domains, e.g. pidgin.im -#: ../libpurple/protocols/jabber/libxmpp.c:202 ../pidgin/gtkaccount.c:506 +#: ../libpurple/protocols/jabber/libxmpp.c:205 ../pidgin/gtkaccount.c:509 msgid "Domain" msgstr "Tartomány" -#: ../libpurple/protocols/jabber/libxmpp.c:210 +#: ../libpurple/protocols/jabber/libxmpp.c:213 msgid "Require SSL/TLS" -msgstr "" - -#: ../libpurple/protocols/jabber/libxmpp.c:214 +msgstr "SSL/TLS megkövetelése" + +#: ../libpurple/protocols/jabber/libxmpp.c:217 msgid "Force old (port 5223) SSL" msgstr "Régi (5223 port) SSL kényszerítése" -#: ../libpurple/protocols/jabber/libxmpp.c:219 +#: ../libpurple/protocols/jabber/libxmpp.c:222 msgid "Allow plaintext auth over unencrypted streams" msgstr "Egyszerű szöveges hitelesítés engedélyezése nem titkosított folyamokon" -#: ../libpurple/protocols/jabber/libxmpp.c:224 -#: ../libpurple/protocols/myspace/myspace.c:3277 -#: ../libpurple/protocols/simple/simple.c:1902 +#: ../libpurple/protocols/jabber/libxmpp.c:227 +#: ../libpurple/protocols/myspace/myspace.c:3283 +#: ../libpurple/protocols/simple/simple.c:2067 msgid "Connect port" msgstr "Kapcsolódási port" #. TODO: default to automatically try different ports. Make the user be #. * able to set the first port to try (like LastConnectedPort in Windows client). #. Account options -#: ../libpurple/protocols/jabber/libxmpp.c:228 -#: ../libpurple/protocols/myspace/myspace.c:3274 -#: ../libpurple/protocols/silc/silc.c:1914 -#: ../libpurple/protocols/silc10/silc.c:1857 ../pidgin/gtkaccount.c:837 +#: ../libpurple/protocols/jabber/libxmpp.c:231 +#: ../libpurple/protocols/myspace/myspace.c:3280 +#: ../libpurple/protocols/silc/silc.c:2045 +#: ../libpurple/protocols/silc10/silc.c:1860 ../pidgin/gtkaccount.c:840 msgid "Connect server" msgstr "Kapcsolatkiszolgáló" @@ -6188,37 +6216,31 @@ msgid "%s has left the conversation." msgstr "%s elhagyta a társalgást." -#: ../libpurple/protocols/jabber/message.c:161 +#: ../libpurple/protocols/jabber/message.c:162 #, c-format msgid "Message from %s" msgstr "%s üzenetet küldött" -#: ../libpurple/protocols/jabber/message.c:225 +#: ../libpurple/protocols/jabber/message.c:226 #, c-format msgid "%s has set the topic to: %s" msgstr "%s a következő témát állította be: %s" -#: ../libpurple/protocols/jabber/message.c:227 +#: ../libpurple/protocols/jabber/message.c:228 #, c-format msgid "The topic is: %s" msgstr "A téma: %s" -#: ../libpurple/protocols/jabber/message.c:275 +#: ../libpurple/protocols/jabber/message.c:276 #, c-format msgid "Message delivery to %s failed: %s" msgstr "Az üzenet eljuttatása a következőhöz: %s sikertelen: %s" -#: ../libpurple/protocols/jabber/message.c:278 +#: ../libpurple/protocols/jabber/message.c:279 msgid "XMPP Message Error" msgstr "XMPP üzenethiba" -#: ../libpurple/protocols/jabber/message.c:307 -#: ../libpurple/protocols/yahoo/yahoo.c:4120 -#, fuzzy, c-format -msgid "%s has buzzed you!" -msgstr "%s belépett." - -#: ../libpurple/protocols/jabber/message.c:407 +#: ../libpurple/protocols/jabber/message.c:408 #, c-format msgid " (Code %s)" msgstr " (%s kód)" @@ -6227,16 +6249,16 @@ msgid "XML Parse error" msgstr "XML elemzési hiba" -#: ../libpurple/protocols/jabber/presence.c:427 +#: ../libpurple/protocols/jabber/presence.c:435 msgid "Unknown Error in presence" msgstr "Ismeretlen hiba a jelenlétben" -#: ../libpurple/protocols/jabber/presence.c:508 -#: ../libpurple/protocols/jabber/presence.c:509 +#: ../libpurple/protocols/jabber/presence.c:516 +#: ../libpurple/protocols/jabber/presence.c:517 msgid "Create New Room" msgstr "Új szoba létrehozása" -#: ../libpurple/protocols/jabber/presence.c:510 +#: ../libpurple/protocols/jabber/presence.c:518 msgid "" "You are creating a new room. Would you like to configure it, or accept the " "default settings?" @@ -6244,20 +6266,20 @@ "Új szobát hoz létre. Szeretné beállítani, vagy elfogadja az " "alapbeállításokat?" -#: ../libpurple/protocols/jabber/presence.c:516 +#: ../libpurple/protocols/jabber/presence.c:524 msgid "_Configure Room" msgstr "Sz_oba beállítása" -#: ../libpurple/protocols/jabber/presence.c:517 +#: ../libpurple/protocols/jabber/presence.c:525 msgid "_Accept Defaults" msgstr "Alapértel_mezések elfogadása" -#: ../libpurple/protocols/jabber/presence.c:559 +#: ../libpurple/protocols/jabber/presence.c:567 #, c-format msgid "Error in chat %s" msgstr "Hiba a(z) %s csevegésben" -#: ../libpurple/protocols/jabber/presence.c:563 +#: ../libpurple/protocols/jabber/presence.c:571 #, c-format msgid "Error joining chat %s" msgstr "Hiba a(z) %s csevegéshez csatlakozás közben" @@ -6301,64 +6323,64 @@ msgid "Select a Resource" msgstr "Válasszon erőforrást" -#: ../libpurple/protocols/jabber/usermood.c:179 -#: ../libpurple/protocols/jabber/usermood.c:180 -#, fuzzy +#: ../libpurple/protocols/jabber/usermood.c:197 +#: ../libpurple/protocols/jabber/usermood.c:198 msgid "Edit User Mood" -msgstr "Felhasználói módok" - -#: ../libpurple/protocols/jabber/usermood.c:181 +msgstr "Felhasználói hangulat szerkesztése" + +#: ../libpurple/protocols/jabber/usermood.c:199 msgid "Please select your mood from the list." -msgstr "" - -#: ../libpurple/protocols/jabber/usermood.c:183 +msgstr "Válassza ki a hangulatát a listából." + +#: ../libpurple/protocols/jabber/usermood.c:201 #: ../libpurple/protocols/jabber/usernick.c:78 -#, fuzzy msgid "Set" -msgstr "_Beállítás" - -#: ../libpurple/protocols/jabber/usermood.c:191 -#, fuzzy +msgstr "Beállítás" + +#: ../libpurple/protocols/jabber/usermood.c:209 msgid "Set Mood..." -msgstr "Üzenet küldése..." +msgstr "Hangulat beállítása..." #: ../libpurple/protocols/jabber/usernick.c:76 -#, fuzzy msgid "Set User Nickname" -msgstr "Felhasználószám korlátozása" +msgstr "Felhasználói becenév beállítása" #: ../libpurple/protocols/jabber/usernick.c:76 -#, fuzzy msgid "Please specify a new nickname for you." -msgstr "Kérem adja meg új %snevét" +msgstr "Adja meg az új becenevét" #: ../libpurple/protocols/jabber/usernick.c:77 msgid "" "This information is visible to all contacts on your contact list, so choose " "something appropriate." msgstr "" - -#: ../libpurple/protocols/jabber/usernick.c:99 -#, fuzzy +"Ezen információk a partnerlistán lévő minden partner számára látható, " +"válasszon ennek megfelelően." + +#: ../libpurple/protocols/jabber/usernick.c:100 msgid "Set Nickname..." -msgstr "Becenév" +msgstr "Becenév beállítása..." #: ../libpurple/protocols/jabber/xdata.c:378 -#, fuzzy msgid "Actions" -msgstr "Művelet" +msgstr "Műveletek" #: ../libpurple/protocols/jabber/xdata.c:380 -#, fuzzy msgid "Select an action" -msgstr "Fájl kiválasztása" - -#: ../libpurple/protocols/msn/dialog.c:110 +msgstr "Válasszon műveletet" + +#: ../libpurple/protocols/msn/contact.c:712 +msgid "Unable to retrieve MSN Address Book" +msgstr "Az MSN címjegyzék nem kérhető le" + +#: ../libpurple/protocols/msn/dialog.c:118 +#: ../libpurple/protocols/msnp9/dialog.c:110 #, c-format msgid "Buddy list synchronization issue in %s (%s)" msgstr "Partnerlista-szinkronizációs probléma itt: %s (%s)" -#: ../libpurple/protocols/msn/dialog.c:116 +#: ../libpurple/protocols/msn/dialog.c:124 +#: ../libpurple/protocols/msnp9/dialog.c:116 #, c-format msgid "" "%s on the local list is inside the group \"%s\" but not on the server list. " @@ -6367,7 +6389,8 @@ "%s a helyi listán a(z) %s csoport tagja, de a kiszolgáló listáján nem az. " "Szeretné ezt a partnert felvenni?" -#: ../libpurple/protocols/msn/dialog.c:124 +#: ../libpurple/protocols/msn/dialog.c:132 +#: ../libpurple/protocols/msnp9/dialog.c:124 #, c-format msgid "" "%s is on the local list but not on the server list. Do you want this buddy " @@ -6377,163 +6400,195 @@ "partnert felvenni?" #: ../libpurple/protocols/msn/error.c:36 +#: ../libpurple/protocols/msnp9/error.c:36 #, c-format msgid "Unable to parse message" msgstr "Az üzenetet nem sikerült értelmezni" #: ../libpurple/protocols/msn/error.c:41 +#: ../libpurple/protocols/msnp9/error.c:41 #, c-format msgid "Syntax Error (probably a client bug)" msgstr "Szintaktikai hiba (valószínűleg klienshiba)" #: ../libpurple/protocols/msn/error.c:46 +#: ../libpurple/protocols/msnp9/error.c:46 #, c-format msgid "Invalid e-mail address" msgstr "Érvénytelen e-mail cím" #: ../libpurple/protocols/msn/error.c:49 +#: ../libpurple/protocols/msnp9/error.c:49 #, c-format msgid "User does not exist" msgstr "A felhasználó nem létezik" #: ../libpurple/protocols/msn/error.c:53 +#: ../libpurple/protocols/msnp9/error.c:53 #, c-format msgid "Fully qualified domain name missing" msgstr "A teljesen minősített tartománynév hiányzik" #: ../libpurple/protocols/msn/error.c:56 +#: ../libpurple/protocols/msnp9/error.c:56 #, c-format msgid "Already logged in" msgstr "Már be van jelentkezve" #: ../libpurple/protocols/msn/error.c:59 +#: ../libpurple/protocols/msnp9/error.c:59 #, c-format msgid "Invalid screen name" msgstr "Érvénytelen felhasználónév" #: ../libpurple/protocols/msn/error.c:62 +#: ../libpurple/protocols/msnp9/error.c:62 #, c-format msgid "Invalid friendly name" msgstr "Érvénytelen becenév" #: ../libpurple/protocols/msn/error.c:65 +#: ../libpurple/protocols/msnp9/error.c:65 #, c-format msgid "List full" msgstr "A lista megtelt" #: ../libpurple/protocols/msn/error.c:68 +#: ../libpurple/protocols/msnp9/error.c:68 #, c-format msgid "Already there" msgstr "Már rajta van" #: ../libpurple/protocols/msn/error.c:72 +#: ../libpurple/protocols/msnp9/error.c:72 #, c-format msgid "Not on list" msgstr "Nincs a listán" #: ../libpurple/protocols/msn/error.c:75 +#: ../libpurple/protocols/msnp9/error.c:75 #: ../libpurple/protocols/zephyr/zephyr.c:756 #, c-format msgid "User is offline" msgstr "A felhasználó nem érhető el" #: ../libpurple/protocols/msn/error.c:78 +#: ../libpurple/protocols/msnp9/error.c:78 #, c-format msgid "Already in the mode" msgstr "Már be van állítva ez a mód" #: ../libpurple/protocols/msn/error.c:82 +#: ../libpurple/protocols/msnp9/error.c:82 #, c-format msgid "Already in opposite list" msgstr "A másik listán már szerepel" #: ../libpurple/protocols/msn/error.c:86 +#: ../libpurple/protocols/msnp9/error.c:86 #, c-format msgid "Too many groups" msgstr "Túl sok csoport" #: ../libpurple/protocols/msn/error.c:89 +#: ../libpurple/protocols/msnp9/error.c:89 #, c-format msgid "Invalid group" msgstr "Érvénytelen csoport" #: ../libpurple/protocols/msn/error.c:92 +#: ../libpurple/protocols/msnp9/error.c:92 #, c-format msgid "User not in group" msgstr "A felhasználó nincs a csoportban" #: ../libpurple/protocols/msn/error.c:95 +#: ../libpurple/protocols/msnp9/error.c:95 #, c-format msgid "Group name too long" msgstr "A csoportnév túl hosszú" #: ../libpurple/protocols/msn/error.c:98 +#: ../libpurple/protocols/msnp9/error.c:98 #, c-format msgid "Cannot remove group zero" msgstr "A nulla csoportot nem lehet eltávolítani" #: ../libpurple/protocols/msn/error.c:103 +#: ../libpurple/protocols/msnp9/error.c:103 #, c-format msgid "Tried to add a user to a group that doesn't exist" msgstr "Nem létező csoporthoz próbált meg felvenni egy felhasználót" #: ../libpurple/protocols/msn/error.c:107 +#: ../libpurple/protocols/msnp9/error.c:107 #, c-format msgid "Switchboard failed" msgstr "A közvetítés sikertelen" #: ../libpurple/protocols/msn/error.c:111 +#: ../libpurple/protocols/msnp9/error.c:111 #, c-format msgid "Notify transfer failed" msgstr "A figyelmeztetés átvitele meghiúsult" #: ../libpurple/protocols/msn/error.c:116 +#: ../libpurple/protocols/msnp9/error.c:116 #, c-format msgid "Required fields missing" msgstr "Szükséges mezők hiányoznak" #: ../libpurple/protocols/msn/error.c:120 +#: ../libpurple/protocols/msnp9/error.c:120 #, c-format msgid "Too many hits to a FND" msgstr "Túl sok találat az FND-hez" #: ../libpurple/protocols/msn/error.c:124 +#: ../libpurple/protocols/msnp9/error.c:124 #: ../libpurple/protocols/oscar/oscar.c:120 #, c-format msgid "Not logged in" msgstr "Nincs bejelentkezve" #: ../libpurple/protocols/msn/error.c:128 +#: ../libpurple/protocols/msnp9/error.c:128 #, c-format msgid "Service temporarily unavailable" msgstr "A szolgáltatás átmenetileg nem érhető el" #: ../libpurple/protocols/msn/error.c:131 +#: ../libpurple/protocols/msnp9/error.c:131 #, c-format msgid "Database server error" msgstr "Adatbáziskiszolgáló-hiba" #: ../libpurple/protocols/msn/error.c:135 +#: ../libpurple/protocols/msnp9/error.c:135 #, c-format msgid "Command disabled" msgstr "Parancs letiltva" #: ../libpurple/protocols/msn/error.c:139 +#: ../libpurple/protocols/msnp9/error.c:139 #, c-format msgid "File operation error" msgstr "Fájlművelethiba" #: ../libpurple/protocols/msn/error.c:143 +#: ../libpurple/protocols/msnp9/error.c:143 #, c-format msgid "Memory allocation error" msgstr "Memóriafoglalási hiba" #: ../libpurple/protocols/msn/error.c:147 +#: ../libpurple/protocols/msnp9/error.c:147 #, c-format msgid "Wrong CHL value sent to server" msgstr "Hibás CHL érték lett küldve a kiszolgálónak" #: ../libpurple/protocols/msn/error.c:152 +#: ../libpurple/protocols/msnp9/error.c:152 #, c-format msgid "Server busy" msgstr "A kiszolgáló foglalt" @@ -6541,168 +6596,192 @@ #: ../libpurple/protocols/msn/error.c:155 #: ../libpurple/protocols/msn/error.c:170 #: ../libpurple/protocols/msn/error.c:230 +#: ../libpurple/protocols/msnp9/error.c:155 +#: ../libpurple/protocols/msnp9/error.c:170 +#: ../libpurple/protocols/msnp9/error.c:230 #, c-format msgid "Server unavailable" msgstr "A kiszolgáló nem érhető el" #: ../libpurple/protocols/msn/error.c:158 +#: ../libpurple/protocols/msnp9/error.c:158 #, c-format msgid "Peer notification server down" msgstr "A partnerértesítő kiszolgáló nem üzemel" #: ../libpurple/protocols/msn/error.c:162 +#: ../libpurple/protocols/msnp9/error.c:162 #, c-format msgid "Database connect error" msgstr "Adatbázis-kapcsolódási hiba" #: ../libpurple/protocols/msn/error.c:167 +#: ../libpurple/protocols/msnp9/error.c:167 #, c-format msgid "Server is going down (abandon ship)" msgstr "A kiszolgáló leáll (jelentkezzen ki)" #: ../libpurple/protocols/msn/error.c:174 +#: ../libpurple/protocols/msnp9/error.c:174 #, c-format msgid "Error creating connection" msgstr "Hiba a kapcsolat létrehozásakor" #: ../libpurple/protocols/msn/error.c:179 +#: ../libpurple/protocols/msnp9/error.c:179 #, c-format msgid "CVR parameters are either unknown or not allowed" msgstr "Ismeretlen vagy nem engedélyezett CVR paraméterek" #: ../libpurple/protocols/msn/error.c:183 +#: ../libpurple/protocols/msnp9/error.c:183 #, c-format msgid "Unable to write" msgstr "Nem lehet írni" #: ../libpurple/protocols/msn/error.c:186 +#: ../libpurple/protocols/msnp9/error.c:186 #, c-format msgid "Session overload" msgstr "Folyamat túlterhelve" #: ../libpurple/protocols/msn/error.c:190 +#: ../libpurple/protocols/msnp9/error.c:190 #, c-format msgid "User is too active" msgstr "A felhasználó túl aktív" #: ../libpurple/protocols/msn/error.c:193 +#: ../libpurple/protocols/msnp9/error.c:193 #, c-format msgid "Too many sessions" msgstr "Túl sok folyamat" #: ../libpurple/protocols/msn/error.c:196 +#: ../libpurple/protocols/msnp9/error.c:196 #, c-format msgid "Passport not verified" msgstr "Passport (MSN igazolvány) nincs ellenőrizve" #: ../libpurple/protocols/msn/error.c:199 +#: ../libpurple/protocols/msnp9/error.c:199 #, c-format msgid "Bad friend file" msgstr "Hibás barát-fájl" #: ../libpurple/protocols/msn/error.c:203 +#: ../libpurple/protocols/msnp9/error.c:203 #, c-format msgid "Not expected" msgstr "Váratlan" #: ../libpurple/protocols/msn/error.c:209 +#: ../libpurple/protocols/msnp9/error.c:209 #, c-format msgid "Friendly name changes too rapidly" msgstr "A felhasználónév túl gyorsan változik" #: ../libpurple/protocols/msn/error.c:218 +#: ../libpurple/protocols/msnp9/error.c:218 #, c-format msgid "Server too busy" msgstr "A kiszolgáló túl elfoglalt" #: ../libpurple/protocols/msn/error.c:222 -#: ../libpurple/protocols/oscar/oscar.c:1380 -#: ../libpurple/protocols/silc/silc.c:233 +#: ../libpurple/protocols/msnp9/error.c:222 +#: ../libpurple/protocols/oscar/oscar.c:1383 +#: ../libpurple/protocols/silc/silc.c:333 #: ../libpurple/protocols/silc10/ops.c:1709 -#: ../libpurple/protocols/toc/toc.c:728 ../libpurple/proxy.c:1380 +#: ../libpurple/protocols/toc/toc.c:728 ../libpurple/proxy.c:1393 #, c-format msgid "Authentication failed" msgstr "Hitelesítés sikertelen" #: ../libpurple/protocols/msn/error.c:225 +#: ../libpurple/protocols/msnp9/error.c:225 #, c-format msgid "Not allowed when offline" msgstr "Nem engedélyezett kijelentkezett állapotban" #: ../libpurple/protocols/msn/error.c:233 +#: ../libpurple/protocols/msnp9/error.c:233 #, c-format msgid "Not accepting new users" msgstr "Nem fogad új felhasználókat" #: ../libpurple/protocols/msn/error.c:237 +#: ../libpurple/protocols/msnp9/error.c:237 #, c-format msgid "Kids Passport without parental consent" msgstr "Gyermekek Passport-ja (MSN igazolvány) szülői beleegyezés nélkül" #: ../libpurple/protocols/msn/error.c:241 +#: ../libpurple/protocols/msnp9/error.c:241 #, c-format msgid "Passport account not yet verified" msgstr "Passport fiók (MSN igazolvány) még nincs ellenőrizve" #: ../libpurple/protocols/msn/error.c:244 +#: ../libpurple/protocols/msnp9/error.c:244 #, c-format msgid "Bad ticket" msgstr "Rossz jegy" #: ../libpurple/protocols/msn/error.c:249 +#: ../libpurple/protocols/msnp9/error.c:249 #, c-format msgid "Unknown Error Code %d" msgstr "Ismeretlen hibakód %d" #: ../libpurple/protocols/msn/error.c:263 +#: ../libpurple/protocols/msnp9/error.c:263 #, c-format msgid "MSN Error: %s\n" msgstr "MSN hiba: %s\n" -#: ../libpurple/protocols/msn/msn.c:130 -#, fuzzy +#: ../libpurple/protocols/msn/msn.c:130 ../libpurple/protocols/msnp9/msn.c:130 msgid "Nudge" -msgstr "bökés" - -#: ../libpurple/protocols/msn/msn.c:131 -#, fuzzy, c-format +msgstr "Bökés" + +#: ../libpurple/protocols/msn/msn.c:131 ../libpurple/protocols/msnp9/msn.c:131 +#, c-format msgid "%s has nudged you!" -msgstr "%s belépett." - -#: ../libpurple/protocols/msn/msn.c:132 -#, fuzzy, c-format +msgstr "%s megbökte!" + +#: ../libpurple/protocols/msn/msn.c:132 ../libpurple/protocols/msnp9/msn.c:132 +#, c-format msgid "Nudging %s..." -msgstr "Bökés" - -#: ../libpurple/protocols/msn/msn.c:174 +msgstr "%s bökése..." + +#: ../libpurple/protocols/msn/msn.c:174 ../libpurple/protocols/msnp9/msn.c:174 msgid "Your new MSN friendly name is too long." msgstr "Az új MSN beceneve túl hosszú." -#: ../libpurple/protocols/msn/msn.c:282 +#: ../libpurple/protocols/msn/msn.c:286 ../libpurple/protocols/msnp9/msn.c:282 msgid "Set your friendly name." msgstr "Becenév beállítása." -#: ../libpurple/protocols/msn/msn.c:283 +#: ../libpurple/protocols/msn/msn.c:287 ../libpurple/protocols/msnp9/msn.c:283 msgid "This is the name that other MSN buddies will see you as." msgstr "Ezen a néven fogják látni az MSN partnerei." -#: ../libpurple/protocols/msn/msn.c:301 +#: ../libpurple/protocols/msn/msn.c:305 ../libpurple/protocols/msnp9/msn.c:301 msgid "Set your home phone number." msgstr "Otthoni telefonszám beállítása." -#: ../libpurple/protocols/msn/msn.c:318 +#: ../libpurple/protocols/msn/msn.c:322 ../libpurple/protocols/msnp9/msn.c:318 msgid "Set your work phone number." msgstr "Munkahelyi telefonszám beállítása." -#: ../libpurple/protocols/msn/msn.c:335 +#: ../libpurple/protocols/msn/msn.c:339 ../libpurple/protocols/msnp9/msn.c:335 msgid "Set your mobile phone number." msgstr "Mobiltelefonszám beállítása." -#: ../libpurple/protocols/msn/msn.c:350 +#: ../libpurple/protocols/msn/msn.c:354 ../libpurple/protocols/msnp9/msn.c:350 msgid "Allow MSN Mobile pages?" msgstr "Engedélyezi az MSN mobil oldalakat?" -#: ../libpurple/protocols/msn/msn.c:351 +#: ../libpurple/protocols/msn/msn.c:355 ../libpurple/protocols/msnp9/msn.c:351 msgid "" "Do you want to allow or disallow people on your buddy list to send you MSN " "Mobile pages to your cell phone or other mobile device?" @@ -6710,323 +6789,392 @@ "Engedélyezi vagy megtiltja a listán szereplő partnereinek, hogy mobil " "oldalakat küldjenek a mobiltelefonjára vagy más mobil eszközre?" -#: ../libpurple/protocols/msn/msn.c:357 +#: ../libpurple/protocols/msn/msn.c:361 ../libpurple/protocols/msnp9/msn.c:357 msgid "Allow" msgstr "Engedélyezés" -#: ../libpurple/protocols/msn/msn.c:358 +#: ../libpurple/protocols/msn/msn.c:362 ../libpurple/protocols/msnp9/msn.c:358 msgid "Disallow" msgstr "Tiltás" -#: ../libpurple/protocols/msn/msn.c:374 +#: ../libpurple/protocols/msn/msn.c:378 ../libpurple/protocols/msnp9/msn.c:374 msgid "This Hotmail account may not be active." msgstr "Lehetséges, hogy ez a Hotmail fiók nem aktív." -#: ../libpurple/protocols/msn/msn.c:400 +#: ../libpurple/protocols/msn/msn.c:404 ../libpurple/protocols/msnp9/msn.c:400 msgid "Send a mobile message." msgstr "Mobilüzenet küldése." -#: ../libpurple/protocols/msn/msn.c:402 +#: ../libpurple/protocols/msn/msn.c:406 ../libpurple/protocols/msnp9/msn.c:402 msgid "Page" msgstr "Oldal" -#: ../libpurple/protocols/msn/msn.c:549 -msgid "Has you" -msgstr "Szerepel-e a listáján" - -#: ../libpurple/protocols/msn/msn.c:579 ../libpurple/protocols/msn/state.c:33 -#: ../libpurple/protocols/yahoo/yahoo.c:3077 -#: ../libpurple/protocols/yahoo/yahoo.c:3761 +#: ../libpurple/protocols/msn/msn.c:688 ../libpurple/protocols/msn/state.c:33 +#: ../libpurple/protocols/msnp9/msn.c:583 +#: ../libpurple/protocols/msnp9/state.c:33 +#: ../libpurple/protocols/yahoo/yahoo.c:3079 +#: ../libpurple/protocols/yahoo/yahoo.c:3763 msgid "Be Right Back" msgstr "Rögtön jövök" -#: ../libpurple/protocols/msn/msn.c:583 ../libpurple/protocols/msn/state.c:31 -#: ../libpurple/protocols/novell/novell.c:2822 -#: ../libpurple/protocols/novell/novell.c:2952 -#: ../libpurple/protocols/silc/buddy.c:1480 +#: ../libpurple/protocols/msn/msn.c:694 ../libpurple/protocols/msn/state.c:31 +#: ../libpurple/protocols/msnp9/msn.c:587 +#: ../libpurple/protocols/msnp9/state.c:31 +#: ../libpurple/protocols/novell/novell.c:2827 +#: ../libpurple/protocols/novell/novell.c:2957 +#: ../libpurple/protocols/silc/buddy.c:1483 #: ../libpurple/protocols/silc/silc.c:56 -#: ../libpurple/protocols/silc10/buddy.c:1480 +#: ../libpurple/protocols/silc10/buddy.c:1483 #: ../libpurple/protocols/silc10/silc.c:47 -#: ../libpurple/protocols/yahoo/yahoo.c:3079 -#: ../libpurple/protocols/yahoo/yahoo.c:3764 +#: ../libpurple/protocols/yahoo/yahoo.c:3081 +#: ../libpurple/protocols/yahoo/yahoo.c:3766 msgid "Busy" msgstr "Elfoglalt vagyok" -#: ../libpurple/protocols/msn/msn.c:587 -#: ../libpurple/protocols/yahoo/yahoo.c:3087 -#: ../libpurple/protocols/yahoo/yahoo.c:3776 +#: ../libpurple/protocols/msn/msn.c:699 ../libpurple/protocols/msnp9/msn.c:591 +#: ../libpurple/protocols/yahoo/yahoo.c:3089 +#: ../libpurple/protocols/yahoo/yahoo.c:3778 msgid "On the Phone" msgstr "Telefonálok" -#: ../libpurple/protocols/msn/msn.c:591 -#: ../libpurple/protocols/yahoo/yahoo.c:3091 -#: ../libpurple/protocols/yahoo/yahoo.c:3782 +#: ../libpurple/protocols/msn/msn.c:704 ../libpurple/protocols/msnp9/msn.c:595 +#: ../libpurple/protocols/yahoo/yahoo.c:3093 +#: ../libpurple/protocols/yahoo/yahoo.c:3784 msgid "Out to Lunch" msgstr "Ebédelni mentem" -#: ../libpurple/protocols/msn/msn.c:619 +#: ../libpurple/protocols/msn/msn.c:723 +msgid "Artist" +msgstr "Előadó" + +#: ../libpurple/protocols/msn/msn.c:724 +msgid "Album" +msgstr "Album" + +#: ../libpurple/protocols/msn/msn.c:742 ../libpurple/protocols/msnp9/msn.c:623 msgid "Set Friendly Name..." msgstr "Becenév beállítása..." -#: ../libpurple/protocols/msn/msn.c:624 +#: ../libpurple/protocols/msn/msn.c:747 ../libpurple/protocols/msnp9/msn.c:628 msgid "Set Home Phone Number..." msgstr "Otthoni telefonszám beállítása..." -#: ../libpurple/protocols/msn/msn.c:628 +#: ../libpurple/protocols/msn/msn.c:751 ../libpurple/protocols/msnp9/msn.c:632 msgid "Set Work Phone Number..." msgstr "Munkahelyi telefonszám beállítása..." -#: ../libpurple/protocols/msn/msn.c:632 +#: ../libpurple/protocols/msn/msn.c:755 ../libpurple/protocols/msnp9/msn.c:636 msgid "Set Mobile Phone Number..." msgstr "Mobiltelefonszám beállítása..." -#: ../libpurple/protocols/msn/msn.c:638 +#: ../libpurple/protocols/msn/msn.c:761 ../libpurple/protocols/msnp9/msn.c:642 msgid "Enable/Disable Mobile Devices..." msgstr "Mobileszközök engedélyezése/tiltása..." -#: ../libpurple/protocols/msn/msn.c:643 +#: ../libpurple/protocols/msn/msn.c:766 ../libpurple/protocols/msnp9/msn.c:647 msgid "Allow/Disallow Mobile Pages..." msgstr "Mobiloldalak engedélyezése/tiltása..." -#: ../libpurple/protocols/msn/msn.c:654 +#: ../libpurple/protocols/msn/msn.c:777 ../libpurple/protocols/msnp9/msn.c:658 msgid "Open Hotmail Inbox" msgstr "Hotmail bejövő levelek megnyitása" -#: ../libpurple/protocols/msn/msn.c:678 +#: ../libpurple/protocols/msn/msn.c:801 ../libpurple/protocols/msnp9/msn.c:682 msgid "Send to Mobile" msgstr "Küldés mobiltelefonra" -#: ../libpurple/protocols/msn/msn.c:688 -#: ../libpurple/protocols/novell/novell.c:3408 +#: ../libpurple/protocols/msn/msn.c:811 ../libpurple/protocols/msnp9/msn.c:692 +#: ../libpurple/protocols/novell/novell.c:3413 msgid "Initiate _Chat" msgstr "Csevegés ke_zdeményezése" -#: ../libpurple/protocols/msn/msn.c:726 +#: ../libpurple/protocols/msn/msn.c:849 ../libpurple/protocols/msnp9/msn.c:730 msgid "SSL support is needed for MSN. Please install a supported SSL library." msgstr "" "Az MSN használatához SSL támogatás szükséges. Telepítsen egy támogatott SSL " "könyvtárat." -#: ../libpurple/protocols/msn/msn.c:754 +#: ../libpurple/protocols/msn/msn.c:877 ../libpurple/protocols/msnp9/msn.c:758 msgid "Failed to connect to server." msgstr "Nem sikerült a kiszolgálóhoz kapcsolódni." -#: ../libpurple/protocols/msn/msn.c:1510 ../libpurple/protocols/msn/msn.c:1858 +#: ../libpurple/protocols/msn/msn.c:1661 ../libpurple/protocols/msn/msn.c:2004 +#: ../libpurple/protocols/msnp9/msn.c:1513 +#: ../libpurple/protocols/msnp9/msn.c:1856 #: ../libpurple/protocols/yahoo/yahoo_profile.c:808 msgid "Error retrieving profile" msgstr "Hiba a profil letöltése közben" -#: ../libpurple/protocols/msn/msn.c:1581 ../pidgin/plugins/convcolors.c:309 -#: ../pidgin/plugins/pidginrc.c:366 +#: ../libpurple/protocols/msn/msn.c:1727 +#: ../libpurple/protocols/msnp9/msn.c:1579 ../pidgin/plugins/convcolors.c:309 +#: ../pidgin/plugins/pidginrc.c:360 msgid "General" msgstr "Általános" -#: ../libpurple/protocols/msn/msn.c:1588 -#: ../libpurple/protocols/myspace/user.c:110 -#: ../libpurple/protocols/oscar/oscar.c:3755 +#: ../libpurple/protocols/msn/msn.c:1734 +#: ../libpurple/protocols/msnp9/msn.c:1586 +#: ../libpurple/protocols/myspace/user.c:115 +#: ../libpurple/protocols/oscar/oscar.c:3770 #: ../libpurple/protocols/qq/buddy_info.c:45 #: ../libpurple/protocols/qq/qq.c:221 #: ../libpurple/protocols/yahoo/yahoo_profile.c:1081 msgid "Age" msgstr "Kor" -#: ../libpurple/protocols/msn/msn.c:1590 +#: ../libpurple/protocols/msn/msn.c:1736 +#: ../libpurple/protocols/msnp9/msn.c:1588 #: ../libpurple/protocols/qq/buddy_info.c:51 #: ../libpurple/protocols/yahoo/yahoo_profile.c:1096 msgid "Occupation" msgstr "Foglalkozás" -#: ../libpurple/protocols/msn/msn.c:1591 -#: ../libpurple/protocols/myspace/user.c:119 -#: ../libpurple/protocols/novell/novell.c:1478 +#: ../libpurple/protocols/msn/msn.c:1737 +#: ../libpurple/protocols/msnp9/msn.c:1589 +#: ../libpurple/protocols/myspace/user.c:123 +#: ../libpurple/protocols/novell/novell.c:1480 #: ../libpurple/protocols/yahoo/yahoo_profile.c:1076 #: ../libpurple/protocols/zephyr/zephyr.c:798 #: ../libpurple/protocols/zephyr/zephyr.c:1215 msgid "Location" msgstr "Hely" -#: ../libpurple/protocols/msn/msn.c:1596 ../libpurple/protocols/msn/msn.c:1788 -#: ../libpurple/protocols/msn/msn.c:1794 ../libpurple/protocols/msn/msn.c:1801 +#: ../libpurple/protocols/msn/msn.c:1742 ../libpurple/protocols/msn/msn.c:1934 +#: ../libpurple/protocols/msn/msn.c:1940 ../libpurple/protocols/msn/msn.c:1947 +#: ../libpurple/protocols/msnp9/msn.c:1594 +#: ../libpurple/protocols/msnp9/msn.c:1786 +#: ../libpurple/protocols/msnp9/msn.c:1792 +#: ../libpurple/protocols/msnp9/msn.c:1799 msgid "Hobbies and Interests" msgstr "Hobbik és érdeklődési kör" -#: ../libpurple/protocols/msn/msn.c:1602 ../libpurple/protocols/msn/msn.c:1722 -#: ../libpurple/protocols/msn/msn.c:1728 ../libpurple/protocols/msn/msn.c:1735 -#: ../libpurple/protocols/msn/msn.c:1743 ../libpurple/protocols/msn/msn.c:1750 +#: ../libpurple/protocols/msn/msn.c:1748 ../libpurple/protocols/msn/msn.c:1868 +#: ../libpurple/protocols/msn/msn.c:1874 ../libpurple/protocols/msn/msn.c:1881 +#: ../libpurple/protocols/msn/msn.c:1889 ../libpurple/protocols/msn/msn.c:1896 +#: ../libpurple/protocols/msnp9/msn.c:1600 +#: ../libpurple/protocols/msnp9/msn.c:1720 +#: ../libpurple/protocols/msnp9/msn.c:1726 +#: ../libpurple/protocols/msnp9/msn.c:1733 +#: ../libpurple/protocols/msnp9/msn.c:1741 +#: ../libpurple/protocols/msnp9/msn.c:1748 msgid "A Little About Me" msgstr "Magamról röviden" -#: ../libpurple/protocols/msn/msn.c:1619 +#: ../libpurple/protocols/msn/msn.c:1765 +#: ../libpurple/protocols/msnp9/msn.c:1617 msgid "Social" msgstr "Társadalmi" -#: ../libpurple/protocols/msn/msn.c:1621 +#: ../libpurple/protocols/msn/msn.c:1767 +#: ../libpurple/protocols/msnp9/msn.c:1619 #: ../libpurple/protocols/yahoo/yahoo_profile.c:1086 msgid "Marital Status" msgstr "Családi állapot" -#: ../libpurple/protocols/msn/msn.c:1622 +#: ../libpurple/protocols/msn/msn.c:1768 +#: ../libpurple/protocols/msnp9/msn.c:1620 msgid "Interests" msgstr "Érdeklődési kör" -#: ../libpurple/protocols/msn/msn.c:1623 +#: ../libpurple/protocols/msn/msn.c:1769 +#: ../libpurple/protocols/msnp9/msn.c:1621 msgid "Pets" msgstr "Állatok" -#: ../libpurple/protocols/msn/msn.c:1624 +#: ../libpurple/protocols/msn/msn.c:1770 +#: ../libpurple/protocols/msnp9/msn.c:1622 msgid "Hometown" msgstr "Szülőváros" -#: ../libpurple/protocols/msn/msn.c:1625 +#: ../libpurple/protocols/msn/msn.c:1771 +#: ../libpurple/protocols/msnp9/msn.c:1623 msgid "Places Lived" msgstr "Lakóhelyek" -#: ../libpurple/protocols/msn/msn.c:1626 +#: ../libpurple/protocols/msn/msn.c:1772 +#: ../libpurple/protocols/msnp9/msn.c:1624 msgid "Fashion" msgstr "Divat" -#: ../libpurple/protocols/msn/msn.c:1627 +#: ../libpurple/protocols/msn/msn.c:1773 +#: ../libpurple/protocols/msnp9/msn.c:1625 msgid "Humor" msgstr "Humor" -#: ../libpurple/protocols/msn/msn.c:1628 +#: ../libpurple/protocols/msn/msn.c:1774 +#: ../libpurple/protocols/msnp9/msn.c:1626 msgid "Music" msgstr "Zene" -#: ../libpurple/protocols/msn/msn.c:1629 ../libpurple/protocols/msn/msn.c:1810 -#: ../libpurple/protocols/msn/msn.c:1816 +#: ../libpurple/protocols/msn/msn.c:1775 ../libpurple/protocols/msn/msn.c:1956 +#: ../libpurple/protocols/msn/msn.c:1962 +#: ../libpurple/protocols/msnp9/msn.c:1627 +#: ../libpurple/protocols/msnp9/msn.c:1808 +#: ../libpurple/protocols/msnp9/msn.c:1814 #: ../libpurple/protocols/yahoo/yahoo_profile.c:1138 msgid "Favorite Quote" msgstr "Kedvenc idézet" -#: ../libpurple/protocols/msn/msn.c:1646 +#: ../libpurple/protocols/msn/msn.c:1792 +#: ../libpurple/protocols/msnp9/msn.c:1644 msgid "Contact Info" msgstr "Kapcsolatinformációk" -#: ../libpurple/protocols/msn/msn.c:1647 +#: ../libpurple/protocols/msn/msn.c:1793 +#: ../libpurple/protocols/msnp9/msn.c:1645 msgid "Personal" msgstr "Személyes" -#: ../libpurple/protocols/msn/msn.c:1650 +#: ../libpurple/protocols/msn/msn.c:1796 +#: ../libpurple/protocols/msnp9/msn.c:1648 msgid "Significant Other" msgstr "Társ" -#: ../libpurple/protocols/msn/msn.c:1651 +#: ../libpurple/protocols/msn/msn.c:1797 +#: ../libpurple/protocols/msnp9/msn.c:1649 msgid "Home Phone" msgstr "Otthoni telefon" -#: ../libpurple/protocols/msn/msn.c:1652 +#: ../libpurple/protocols/msn/msn.c:1798 +#: ../libpurple/protocols/msnp9/msn.c:1650 msgid "Home Phone 2" msgstr "2. otthoni telefon" -#: ../libpurple/protocols/msn/msn.c:1653 -#: ../libpurple/protocols/oscar/oscar.c:3793 +#: ../libpurple/protocols/msn/msn.c:1799 +#: ../libpurple/protocols/msnp9/msn.c:1651 +#: ../libpurple/protocols/oscar/oscar.c:3808 msgid "Home Address" msgstr "Otthoni cím" -#: ../libpurple/protocols/msn/msn.c:1654 +#: ../libpurple/protocols/msn/msn.c:1800 +#: ../libpurple/protocols/msnp9/msn.c:1652 msgid "Personal Mobile" msgstr "Személyes mobil" -#: ../libpurple/protocols/msn/msn.c:1655 +#: ../libpurple/protocols/msn/msn.c:1801 +#: ../libpurple/protocols/msnp9/msn.c:1653 msgid "Home Fax" msgstr "Otthoni fax" -#: ../libpurple/protocols/msn/msn.c:1656 +#: ../libpurple/protocols/msn/msn.c:1802 +#: ../libpurple/protocols/msnp9/msn.c:1654 msgid "Personal E-Mail" msgstr "Saját e-mail" -#: ../libpurple/protocols/msn/msn.c:1657 +#: ../libpurple/protocols/msn/msn.c:1803 +#: ../libpurple/protocols/msnp9/msn.c:1655 msgid "Personal IM" msgstr "Saját azonnali üzenő" -#: ../libpurple/protocols/msn/msn.c:1659 +#: ../libpurple/protocols/msn/msn.c:1805 +#: ../libpurple/protocols/msnp9/msn.c:1657 msgid "Anniversary" msgstr "Évforduló" #. Business -#: ../libpurple/protocols/msn/msn.c:1675 +#: ../libpurple/protocols/msn/msn.c:1821 +#: ../libpurple/protocols/msnp9/msn.c:1673 msgid "Work" msgstr "Munka" -#: ../libpurple/protocols/msn/msn.c:1677 +#: ../libpurple/protocols/msn/msn.c:1823 +#: ../libpurple/protocols/msnp9/msn.c:1675 #: ../libpurple/protocols/silc/ops.c:1010 #: ../libpurple/protocols/silc10/ops.c:1044 msgid "Job Title" msgstr "Beosztás" -#: ../libpurple/protocols/msn/msn.c:1678 -#: ../libpurple/protocols/oscar/oscar.c:3814 +#: ../libpurple/protocols/msn/msn.c:1824 +#: ../libpurple/protocols/msnp9/msn.c:1676 +#: ../libpurple/protocols/oscar/oscar.c:3829 msgid "Company" msgstr "Cég" -#: ../libpurple/protocols/msn/msn.c:1679 -#: ../libpurple/protocols/novell/novell.c:1480 +#: ../libpurple/protocols/msn/msn.c:1825 +#: ../libpurple/protocols/msnp9/msn.c:1677 +#: ../libpurple/protocols/novell/novell.c:1482 msgid "Department" msgstr "Részleg" -#: ../libpurple/protocols/msn/msn.c:1680 +#: ../libpurple/protocols/msn/msn.c:1826 +#: ../libpurple/protocols/msnp9/msn.c:1678 msgid "Profession" msgstr "Foglalkozás" -#: ../libpurple/protocols/msn/msn.c:1681 +#: ../libpurple/protocols/msn/msn.c:1827 +#: ../libpurple/protocols/msnp9/msn.c:1679 msgid "Work Phone" msgstr "Munkahelyi telefon" -#: ../libpurple/protocols/msn/msn.c:1682 +#: ../libpurple/protocols/msn/msn.c:1828 +#: ../libpurple/protocols/msnp9/msn.c:1680 msgid "Work Phone 2" msgstr "2. munkahelyi telefon" -#: ../libpurple/protocols/msn/msn.c:1683 -#: ../libpurple/protocols/oscar/oscar.c:3806 +#: ../libpurple/protocols/msn/msn.c:1829 +#: ../libpurple/protocols/msnp9/msn.c:1681 +#: ../libpurple/protocols/oscar/oscar.c:3821 msgid "Work Address" msgstr "Munkahelyi cím" -#: ../libpurple/protocols/msn/msn.c:1684 +#: ../libpurple/protocols/msn/msn.c:1830 +#: ../libpurple/protocols/msnp9/msn.c:1682 msgid "Work Mobile" msgstr "Munkahelyi mobil" -#: ../libpurple/protocols/msn/msn.c:1685 +#: ../libpurple/protocols/msn/msn.c:1831 +#: ../libpurple/protocols/msnp9/msn.c:1683 msgid "Work Pager" msgstr "Munkahelyi személyhívó" -#: ../libpurple/protocols/msn/msn.c:1686 +#: ../libpurple/protocols/msn/msn.c:1832 +#: ../libpurple/protocols/msnp9/msn.c:1684 msgid "Work Fax" msgstr "Munkahelyi fax" -#: ../libpurple/protocols/msn/msn.c:1687 +#: ../libpurple/protocols/msn/msn.c:1833 +#: ../libpurple/protocols/msnp9/msn.c:1685 msgid "Work E-Mail" msgstr "Munkahelyi e-mail" -#: ../libpurple/protocols/msn/msn.c:1688 +#: ../libpurple/protocols/msn/msn.c:1834 +#: ../libpurple/protocols/msnp9/msn.c:1686 msgid "Work IM" msgstr "Munkahelyi azonnali üzenő" -#: ../libpurple/protocols/msn/msn.c:1689 +#: ../libpurple/protocols/msn/msn.c:1835 +#: ../libpurple/protocols/msnp9/msn.c:1687 msgid "Start Date" msgstr "Kezdés dátuma" -#: ../libpurple/protocols/msn/msn.c:1759 ../libpurple/protocols/msn/msn.c:1765 -#: ../libpurple/protocols/msn/msn.c:1772 ../libpurple/protocols/msn/msn.c:1779 +#: ../libpurple/protocols/msn/msn.c:1905 ../libpurple/protocols/msn/msn.c:1911 +#: ../libpurple/protocols/msn/msn.c:1918 ../libpurple/protocols/msn/msn.c:1925 +#: ../libpurple/protocols/msnp9/msn.c:1757 +#: ../libpurple/protocols/msnp9/msn.c:1763 +#: ../libpurple/protocols/msnp9/msn.c:1770 +#: ../libpurple/protocols/msnp9/msn.c:1777 msgid "Favorite Things" msgstr "Kedvenc dolgok" -#: ../libpurple/protocols/msn/msn.c:1824 +#: ../libpurple/protocols/msn/msn.c:1970 +#: ../libpurple/protocols/msnp9/msn.c:1822 msgid "Last Updated" msgstr "Utoljára frissítve" -#: ../libpurple/protocols/msn/msn.c:1835 +#: ../libpurple/protocols/msn/msn.c:1981 +#: ../libpurple/protocols/msnp9/msn.c:1833 #: ../libpurple/protocols/qq/buddy_info.c:60 #: ../libpurple/protocols/silc/ops.c:1026 #: ../libpurple/protocols/silc10/ops.c:1060 msgid "Homepage" msgstr "Honlap" -#: ../libpurple/protocols/msn/msn.c:1859 +#: ../libpurple/protocols/msn/msn.c:2005 +#: ../libpurple/protocols/msnp9/msn.c:1857 msgid "The user has not created a public profile." msgstr "A felhasználó nem hozott létre nyilvános profilt." -#: ../libpurple/protocols/msn/msn.c:1860 +#: ../libpurple/protocols/msn/msn.c:2006 +#: ../libpurple/protocols/msnp9/msn.c:1858 msgid "" "MSN reported not being able to find the user's profile. This either means " "that the user does not exist, or that the user exists but has not created a " @@ -7036,7 +7184,8 @@ "felhasználó nem létezik, vagy azt, hogy bár létezik, még nem hozott létre " "nyilvános profilt." -#: ../libpurple/protocols/msn/msn.c:1864 +#: ../libpurple/protocols/msn/msn.c:2010 +#: ../libpurple/protocols/msnp9/msn.c:1862 msgid "" "Could not find any information in the user's profile. The user most likely " "does not exist." @@ -7044,7 +7193,8 @@ "Nem találhatók információk a felhasználó profiljában. A felhasználó " "valószínűleg nem létezik." -#: ../libpurple/protocols/msn/msn.c:1872 +#: ../libpurple/protocols/msn/msn.c:2018 +#: ../libpurple/protocols/msnp9/msn.c:1870 #: ../libpurple/protocols/yahoo/yahoo_profile.c:1240 msgid "Profile URL" msgstr "Profil URL-je" @@ -7059,101 +7209,128 @@ #. *< version #. * summary #. * description -#: ../libpurple/protocols/msn/msn.c:2158 ../libpurple/protocols/msn/msn.c:2160 -msgid "MSN Protocol Plugin" -msgstr "MSN protokollbővítmény" - -#: ../libpurple/protocols/msn/msn.c:2194 +#: ../libpurple/protocols/msn/msn.c:2305 ../libpurple/protocols/msn/msn.c:2307 +msgid "Windows Live Messenger Protocol Plugin" +msgstr "Windows Live Messenger protokollbővítmény" + +#: ../libpurple/protocols/msn/msn.c:2342 +#: ../libpurple/protocols/msnp9/msn.c:2192 msgid "Use HTTP Method" msgstr "HTTP eljárás használata" -#: ../libpurple/protocols/msn/msn.c:2199 -#, fuzzy +#: ../libpurple/protocols/msn/msn.c:2347 +#: ../libpurple/protocols/msnp9/msn.c:2197 msgid "HTTP Method Server" -msgstr "IPC tesztkiszolgáló" - -#: ../libpurple/protocols/msn/msn.c:2204 +msgstr "HTTP eljáráskiszolgáló" + +#: ../libpurple/protocols/msn/msn.c:2352 +#: ../libpurple/protocols/msnp9/msn.c:2202 msgid "Show custom smileys" msgstr "Egyéni hangulatjelek megjelenítése" -#: ../libpurple/protocols/msn/msn.c:2212 +#: ../libpurple/protocols/msn/msn.c:2360 +#: ../libpurple/protocols/msnp9/msn.c:2210 msgid "nudge: nudge a user to get their attention" msgstr "nudge: felhasználó megbökése figyelemfelhívási céllal" -#: ../libpurple/protocols/msn/nexus.c:146 -#: ../libpurple/protocols/msn/servconn.c:135 -#: ../libpurple/protocols/qq/qq_proxy.c:242 -#: ../libpurple/protocols/qq/qq_proxy.c:321 -#: ../libpurple/protocols/qq/qq_proxy.c:366 -#: ../libpurple/protocols/qq/qq_proxy.c:399 -#: ../libpurple/protocols/qq/udp_proxy_s5.c:63 -#: ../libpurple/protocols/qq/udp_proxy_s5.c:163 -#: ../libpurple/protocols/qq/udp_proxy_s5.c:187 -#: ../libpurple/protocols/qq/udp_proxy_s5.c:200 -#: ../libpurple/protocols/qq/udp_proxy_s5.c:229 -#: ../libpurple/protocols/qq/udp_proxy_s5.c:243 -#: ../libpurple/protocols/qq/udp_proxy_s5.c:268 -#: ../libpurple/protocols/qq/udp_proxy_s5.c:302 -#: ../libpurple/protocols/qq/udp_proxy_s5.c:332 -#: ../libpurple/protocols/yahoo/yahoochat.c:1416 -#: ../libpurple/protocols/yahoo/yahoochat.c:1442 -msgid "Unable to connect" -msgstr "Nem lehet kapcsolódni" - -#: ../libpurple/protocols/msn/notification.c:178 +#: ../libpurple/protocols/msn/nexus.c:70 +msgid "Windows Live ID authentication:Unable to connect" +msgstr "Windows Live azonosító hitelesítése: nem lehet kapcsolódni" + +#. we must have failed! +#: ../libpurple/protocols/msn/nexus.c:126 +msgid "" +"Windows Live ID authentication: cannot find authenticate token in server " +"response" +msgstr "Windows Live azonosító hitelesítése: nem található hitelesítési jelsor a kiszolgáló válaszában" + +#: ../libpurple/protocols/msn/nexus.c:172 +msgid "Windows Live ID authentication Failed" +msgstr "Windows Live azonosító hitelesítése meghiúsult" + +#: ../libpurple/protocols/msn/notification.c:185 +#: ../libpurple/protocols/msnp9/notification.c:178 #, c-format msgid "%s is not a valid group." msgstr "%s érvénytelen csoport." -#: ../libpurple/protocols/msn/notification.c:184 -#: ../libpurple/protocols/msn/notification.c:532 -#: ../libpurple/protocols/msn/session.c:330 +#: ../libpurple/protocols/msn/notification.c:191 +#: ../libpurple/protocols/msn/notification.c:931 +#: ../libpurple/protocols/msn/session.c:379 +#: ../libpurple/protocols/msnp9/notification.c:184 +#: ../libpurple/protocols/msnp9/notification.c:532 +#: ../libpurple/protocols/msnp9/session.c:330 msgid "Unknown error." msgstr "Ismeretlen hiba." -#: ../libpurple/protocols/msn/notification.c:187 +#: ../libpurple/protocols/msn/notification.c:194 +#: ../libpurple/protocols/msnp9/notification.c:187 #, c-format msgid "%s on %s (%s)" msgstr "%s ezen: %s (%s)" -#: ../libpurple/protocols/msn/notification.c:498 +#: ../libpurple/protocols/msn/notification.c:509 +#, c-format +msgid "%s just sent you a Nudge!" +msgstr "%s megbökte!" + +#: ../libpurple/protocols/msn/notification.c:836 +#, c-format +msgid "Unknown error (%d)" +msgstr "Ismeretlen hiba (%d)" + +#: ../libpurple/protocols/msn/notification.c:837 +#: ../libpurple/protocols/sametime/sametime.c:4426 +msgid "Unable to add user" +msgstr "Nem vehető fel a felhasználó" + +#: ../libpurple/protocols/msn/notification.c:897 +#: ../libpurple/protocols/msnp9/notification.c:498 #, c-format msgid "Unable to add user on %s (%s)" msgstr "Nem lehet felhasználót felvenni ehhez: %s (%s)" -#: ../libpurple/protocols/msn/notification.c:502 +#: ../libpurple/protocols/msn/notification.c:901 +#: ../libpurple/protocols/msnp9/notification.c:502 #, c-format msgid "Unable to block user on %s (%s)" msgstr "Nem lehet letiltani a felhasználót ezen: %s (%s)" -#: ../libpurple/protocols/msn/notification.c:506 +#: ../libpurple/protocols/msn/notification.c:905 +#: ../libpurple/protocols/msnp9/notification.c:506 #, c-format msgid "Unable to permit user on %s (%s)" msgstr "Nem lehet engedélyezni a felhasználót ezen: %s (%s)" -#: ../libpurple/protocols/msn/notification.c:514 +#: ../libpurple/protocols/msn/notification.c:913 +#: ../libpurple/protocols/msnp9/notification.c:514 #, c-format msgid "%s could not be added because your buddy list is full." msgstr "%s nem adható hozzá, mert a partnerlista tele van." -#: ../libpurple/protocols/msn/notification.c:523 +#: ../libpurple/protocols/msn/notification.c:922 +#: ../libpurple/protocols/msnp9/notification.c:523 #, c-format msgid "%s is not a valid passport account." msgstr "%s érvénytelen passport fiók." -#: ../libpurple/protocols/msn/notification.c:528 +#: ../libpurple/protocols/msn/notification.c:927 +#: ../libpurple/protocols/msnp9/notification.c:528 msgid "Service Temporarily Unavailable." msgstr "A szolgáltatás átmenetileg nem érhető el." -#: ../libpurple/protocols/msn/notification.c:851 +#: ../libpurple/protocols/msn/notification.c:1263 +#: ../libpurple/protocols/msnp9/notification.c:851 msgid "Unable to rename group" msgstr "Nem lehet átnevezni a csoportot" -#: ../libpurple/protocols/msn/notification.c:906 +#: ../libpurple/protocols/msn/notification.c:1318 +#: ../libpurple/protocols/msnp9/notification.c:906 msgid "Unable to delete group" msgstr "Nem lehet törölni a csoportot" -#: ../libpurple/protocols/msn/notification.c:1325 +#: ../libpurple/protocols/msn/notification.c:1931 +#: ../libpurple/protocols/msnp9/notification.c:1325 #, c-format msgid "" "The MSN server will shut down for maintenance in %d minute. You will " @@ -7182,15 +7359,39 @@ "\n" "A karbantartás befejeződése után sikeresen be tud majd jelentkezni." +#: ../libpurple/protocols/msn/servconn.c:135 +#: ../libpurple/protocols/msnp9/nexus.c:146 +#: ../libpurple/protocols/msnp9/servconn.c:133 +#: ../libpurple/protocols/qq/qq_proxy.c:242 +#: ../libpurple/protocols/qq/qq_proxy.c:324 +#: ../libpurple/protocols/qq/qq_proxy.c:369 +#: ../libpurple/protocols/qq/qq_proxy.c:402 +#: ../libpurple/protocols/qq/udp_proxy_s5.c:64 +#: ../libpurple/protocols/qq/udp_proxy_s5.c:167 +#: ../libpurple/protocols/qq/udp_proxy_s5.c:191 +#: ../libpurple/protocols/qq/udp_proxy_s5.c:204 +#: ../libpurple/protocols/qq/udp_proxy_s5.c:233 +#: ../libpurple/protocols/qq/udp_proxy_s5.c:247 +#: ../libpurple/protocols/qq/udp_proxy_s5.c:272 +#: ../libpurple/protocols/qq/udp_proxy_s5.c:307 +#: ../libpurple/protocols/qq/udp_proxy_s5.c:338 +#: ../libpurple/protocols/yahoo/yahoochat.c:1416 +#: ../libpurple/protocols/yahoo/yahoochat.c:1442 +msgid "Unable to connect" +msgstr "Nem lehet kapcsolódni" + #: ../libpurple/protocols/msn/servconn.c:137 +#: ../libpurple/protocols/msnp9/servconn.c:135 msgid "Writing error" msgstr "Írási hiba" #: ../libpurple/protocols/msn/servconn.c:139 +#: ../libpurple/protocols/msnp9/servconn.c:137 msgid "Reading error" msgstr "Olvasási hiba" #: ../libpurple/protocols/msn/servconn.c:146 +#: ../libpurple/protocols/msnp9/servconn.c:144 #, c-format msgid "" "Connection error from %s server:\n" @@ -7199,97 +7400,117 @@ "Kapcsolódási hiba a(z) %s kiszolgálótól:\n" "%s" -#: ../libpurple/protocols/msn/session.c:299 +#: ../libpurple/protocols/msn/session.c:346 +#: ../libpurple/protocols/msnp9/session.c:299 msgid "Our protocol is not supported by the server." msgstr "A protokollt nem támogatja a kiszolgáló." -#: ../libpurple/protocols/msn/session.c:303 +#: ../libpurple/protocols/msn/session.c:350 +#: ../libpurple/protocols/msnp9/session.c:303 msgid "Error parsing HTTP." msgstr "Hiba a HTTP feldolgozása közben." -#: ../libpurple/protocols/msn/session.c:307 +#: ../libpurple/protocols/msn/session.c:354 +#: ../libpurple/protocols/msnp9/session.c:307 #: ../libpurple/protocols/oscar/flap_connection.c:384 -#: ../libpurple/protocols/yahoo/yahoo.c:205 +#: ../libpurple/protocols/yahoo/yahoo.c:207 msgid "You have signed on from another location." msgstr "Bejelentkezett egy másik helyről." -#: ../libpurple/protocols/msn/session.c:310 +#: ../libpurple/protocols/msn/session.c:359 +#: ../libpurple/protocols/msnp9/session.c:310 msgid "The MSN servers are temporarily unavailable. Please wait and try again." msgstr "" -"Az MSN kiszolgálók átmenetileg nem érhetőek el. Kérem várjon és próbálja " +"Az MSN kiszolgálók átmenetileg nem érhetők el. Kérem várjon és próbálja " "újra később." -#: ../libpurple/protocols/msn/session.c:315 +#: ../libpurple/protocols/msn/session.c:364 +#: ../libpurple/protocols/msnp9/session.c:315 msgid "The MSN servers are going down temporarily." msgstr "Az MSN kiszolgálók átmenetileg leállnak." -#: ../libpurple/protocols/msn/session.c:320 +#: ../libpurple/protocols/msn/session.c:369 +#: ../libpurple/protocols/msnp9/session.c:320 #, c-format msgid "Unable to authenticate: %s" msgstr "Nem sikerült a hitelesítés: %s" -#: ../libpurple/protocols/msn/session.c:325 -msgid "" -"Your MSN buddy list is temporarily unavailable. Please wait and try again." +#: ../libpurple/protocols/msn/session.c:374 +#: ../libpurple/protocols/msnp9/session.c:325 +msgid "Your MSN buddy list is temporarily unavailable. Please wait and try again." msgstr "" "Az Ön MSN partnerlistája átmenetileg nem érhető el. Kérem várjon és próbálja " "újra később." -#: ../libpurple/protocols/msn/session.c:346 -#: ../libpurple/protocols/msn/session.c:348 +#: ../libpurple/protocols/msn/session.c:395 +#: ../libpurple/protocols/msn/session.c:397 +#: ../libpurple/protocols/msnp9/session.c:346 +#: ../libpurple/protocols/msnp9/session.c:348 msgid "Handshaking" msgstr "Kézfogás" -#: ../libpurple/protocols/msn/session.c:349 +#: ../libpurple/protocols/msn/session.c:398 +#: ../libpurple/protocols/msnp9/session.c:349 msgid "Starting authentication" msgstr "Hitelesítés megkezdése" -#: ../libpurple/protocols/msn/session.c:350 +#: ../libpurple/protocols/msn/session.c:399 +#: ../libpurple/protocols/msnp9/session.c:350 msgid "Getting cookie" msgstr "Süti letöltése" -#: ../libpurple/protocols/msn/session.c:352 +#: ../libpurple/protocols/msn/session.c:401 +#: ../libpurple/protocols/msnp9/session.c:352 msgid "Sending cookie" msgstr "Süti küldése" -#: ../libpurple/protocols/msn/session.c:353 +#: ../libpurple/protocols/msn/session.c:402 +#: ../libpurple/protocols/msnp9/session.c:353 msgid "Retrieving buddy list" msgstr "Partnerlista fogadása" #: ../libpurple/protocols/msn/state.c:34 +#: ../libpurple/protocols/msnp9/state.c:34 msgid "Away From Computer" msgstr "Nem vagyok a gépnél" #: ../libpurple/protocols/msn/state.c:35 +#: ../libpurple/protocols/msnp9/state.c:35 msgid "On The Phone" msgstr "Telefonálok" #: ../libpurple/protocols/msn/state.c:36 +#: ../libpurple/protocols/msnp9/state.c:36 msgid "Out To Lunch" msgstr "Ebédelni mentem" -#: ../libpurple/protocols/msn/switchboard.c:400 +#: ../libpurple/protocols/msn/switchboard.c:398 +#: ../libpurple/protocols/msnp9/switchboard.c:400 msgid "Message may have not been sent because a timeout occurred:" -msgstr "" -"Időtúllépés következett be, emiatt az üzenet lehet, hogy nem lett elküldve:" - -#: ../libpurple/protocols/msn/switchboard.c:408 +msgstr "Időtúllépés következett be, emiatt az üzenet lehet, hogy nem lett elküldve:" + +#: ../libpurple/protocols/msn/switchboard.c:406 +#: ../libpurple/protocols/msnp9/switchboard.c:408 msgid "Message could not be sent, not allowed while invisible:" msgstr "Az üzenet nem küldhető el, láthatatlan módban nem engedélyezett:" -#: ../libpurple/protocols/msn/switchboard.c:412 +#: ../libpurple/protocols/msn/switchboard.c:410 +#: ../libpurple/protocols/msnp9/switchboard.c:412 msgid "Message could not be sent because the user is offline:" msgstr "Az üzenet nem küldhető el, mivel a felhasználó kijelentkezett:" -#: ../libpurple/protocols/msn/switchboard.c:416 +#: ../libpurple/protocols/msn/switchboard.c:414 +#: ../libpurple/protocols/msnp9/switchboard.c:416 msgid "Message could not be sent because a connection error occurred:" msgstr "Az üzenet kapcsolódási hiba miatt nem küldhető el:" -#: ../libpurple/protocols/msn/switchboard.c:420 +#: ../libpurple/protocols/msn/switchboard.c:418 +#: ../libpurple/protocols/msnp9/switchboard.c:420 msgid "Message could not be sent because we are sending too quickly:" msgstr "Az üzenet nem küldhető el, mivel túl gyorsan küldi:" -#: ../libpurple/protocols/msn/switchboard.c:424 +#: ../libpurple/protocols/msn/switchboard.c:422 +#: ../libpurple/protocols/msnp9/switchboard.c:424 msgid "" "Message could not be sent because we were unable to establish a session with " "the server. This is likely a server problem, try again in a few minutes:" @@ -7298,34 +7519,61 @@ "kiszolgálóval. Ez valószínűleg kiszolgálóhiba, pár perc múlva próbálkozzon " "újra." -#: ../libpurple/protocols/msn/switchboard.c:431 -msgid "" -"Message could not be sent because an error with the switchboard occurred:" +#: ../libpurple/protocols/msn/switchboard.c:429 +#: ../libpurple/protocols/msnp9/switchboard.c:431 +msgid "Message could not be sent because an error with the switchboard occurred:" msgstr "Az üzenet nem küldhető el, mivel hiba lépett fel a közvetítés közben:" -#: ../libpurple/protocols/msn/switchboard.c:439 +#: ../libpurple/protocols/msn/switchboard.c:437 +#: ../libpurple/protocols/msnp9/switchboard.c:439 msgid "Message may have not been sent because an unknown error occurred:" msgstr "Az üzenet ismeretlen hiba miatt lehet, hogy nem lett elküldve:" -#: ../libpurple/protocols/msn/userlist.c:252 +#: ../libpurple/protocols/msn/userlist.c:243 +#: ../libpurple/protocols/msnp9/userlist.c:252 #, c-format msgid "%s has added you to his or her buddy list." msgstr "%s felvette Önt a partnerlistájára." -#: ../libpurple/protocols/msn/userlist.c:321 +#: ../libpurple/protocols/msn/userlist.c:312 +#: ../libpurple/protocols/msnp9/userlist.c:321 #, c-format msgid "%s has removed you from his or her buddy list." msgstr "%s eltávolította Önt a partnerlistájáról." -#: ../libpurple/protocols/msn/userlist.c:643 +#. only notify the user about problems adding to the friends list +#. * maybe we should do something else for other lists, but it probably +#. * won't cause too many problems if we just ignore it +#: ../libpurple/protocols/msn/userlist.c:693 +#: ../libpurple/protocols/msnp9/userlist.c:643 #, c-format msgid "Unable to add \"%s\"." msgstr "Nem lehet hozzáadni a következőt: \"%s\"." -#: ../libpurple/protocols/msn/userlist.c:645 +#: ../libpurple/protocols/msn/userlist.c:696 +#: ../libpurple/protocols/msnp9/userlist.c:645 msgid "The screen name specified is invalid." msgstr "A megadott felhasználónév érvénytelen." +#: ../libpurple/protocols/msnp9/msn.c:549 +msgid "Has you" +msgstr "Szerepel-e a listáján" + +#. *< type +#. *< ui_requirement +#. *< flags +#. *< dependencies +#. *< priority +#. *< id +#. *< name +#. *< version +#. * summary +#. * description +#: ../libpurple/protocols/msnp9/msn.c:2156 +#: ../libpurple/protocols/msnp9/msn.c:2158 +msgid "MSN Protocol Plugin" +msgstr "MSN protokollbővítmény" + #: ../libpurple/protocols/myspace/myspace.c:111 msgid "Missing Cipher" msgstr "Hiányzó titkosító" @@ -7353,23 +7601,23 @@ #. Notify an error message also, because this is important! #: ../libpurple/protocols/myspace/myspace.c:292 -#: ../libpurple/protocols/myspace/myspace.c:1801 +#: ../libpurple/protocols/myspace/myspace.c:1810 msgid "MySpaceIM Error" msgstr "MySpaceIM hiba" -#: ../libpurple/protocols/myspace/myspace.c:349 +#: ../libpurple/protocols/myspace/myspace.c:350 msgid "Reading challenge" msgstr "Hívás olvasása" -#: ../libpurple/protocols/myspace/myspace.c:355 +#: ../libpurple/protocols/myspace/myspace.c:356 msgid "Unexpected challenge length from server" msgstr "Váratlan híváshossz a kiszolgálótól" -#: ../libpurple/protocols/myspace/myspace.c:359 +#: ../libpurple/protocols/myspace/myspace.c:360 msgid "Logging in" msgstr "Bejelentkezés" -#: ../libpurple/protocols/myspace/myspace.c:1286 +#: ../libpurple/protocols/myspace/myspace.c:1293 #, c-format msgid "Connection to server lost (no data received within %d seconds)" msgstr "" @@ -7377,44 +7625,44 @@ "belül)" #. Can't write _()'d strings in array initializers. Workaround. -#: ../libpurple/protocols/myspace/myspace.c:1328 +#: ../libpurple/protocols/myspace/myspace.c:1335 msgid "New mail messages" msgstr "Új levelek" -#: ../libpurple/protocols/myspace/myspace.c:1329 +#: ../libpurple/protocols/myspace/myspace.c:1336 msgid "New blog comments" msgstr "Új bloghozzászólások" -#: ../libpurple/protocols/myspace/myspace.c:1330 +#: ../libpurple/protocols/myspace/myspace.c:1337 msgid "New profile comments" msgstr "Új profilhozzászólások" -#: ../libpurple/protocols/myspace/myspace.c:1331 +#: ../libpurple/protocols/myspace/myspace.c:1338 msgid "New friend requests!" msgstr "Új barátkérések!" -#: ../libpurple/protocols/myspace/myspace.c:1332 +#: ../libpurple/protocols/myspace/myspace.c:1339 msgid "New picture comments" -msgstr "Új képhosszászólások" - -#: ../libpurple/protocols/myspace/myspace.c:1360 +msgstr "Új képhozzászólások" + +#: ../libpurple/protocols/myspace/myspace.c:1367 msgid "MySpace" msgstr "MySpace" #. The session is now set up, ready to be connected. This emits the #. * signedOn signal, so clients can now do anything with msimprpl, and #. * we're ready for it (session key, userid, username all setup). -#: ../libpurple/protocols/myspace/myspace.c:1543 +#: ../libpurple/protocols/myspace/myspace.c:1550 #: ../libpurple/protocols/sametime/sametime.c:1544 msgid "Connected" msgstr "Kapcsolódva" -#: ../libpurple/protocols/myspace/myspace.c:1554 -#: ../libpurple/protocols/myspace/myspace.c:1556 +#: ../libpurple/protocols/myspace/myspace.c:1561 +#: ../libpurple/protocols/myspace/myspace.c:1563 msgid "No username set" msgstr "Nincs beállítva felhasználónév" -#: ../libpurple/protocols/myspace/myspace.c:1555 +#: ../libpurple/protocols/myspace/myspace.c:1562 msgid "" "Please go to http://editprofile.myspace.com/index.cfm?fuseaction=profile." "username and choose a username and try to login again." @@ -7423,72 +7671,72 @@ "felhasználónév oldalt és válasszon egy felhasználónevet, majd próbáljon meg " "újra bejelentkezni." -#: ../libpurple/protocols/myspace/myspace.c:1782 +#: ../libpurple/protocols/myspace/myspace.c:1789 #, c-format msgid "Protocol error, code %d: %s" msgstr "Protokollhiba, %d. kód: %s" -#: ../libpurple/protocols/myspace/myspace.c:1972 -#: ../libpurple/protocols/myspace/myspace.c:2006 +#: ../libpurple/protocols/myspace/myspace.c:1981 +#: ../libpurple/protocols/myspace/myspace.c:2015 msgid "Failed to add buddy" msgstr "A partner felvétele sikertelen" -#: ../libpurple/protocols/myspace/myspace.c:1972 +#: ../libpurple/protocols/myspace/myspace.c:1981 msgid "'addbuddy' command failed." msgstr "az \"addbuddy\" parancs sikertelen." -#: ../libpurple/protocols/myspace/myspace.c:2006 -#: ../libpurple/protocols/myspace/myspace.c:2247 +#: ../libpurple/protocols/myspace/myspace.c:2015 +#: ../libpurple/protocols/myspace/myspace.c:2252 msgid "persist command failed" msgstr "A tárolás parancs sikertelen" -#: ../libpurple/protocols/myspace/myspace.c:2115 +#: ../libpurple/protocols/myspace/myspace.c:2120 #, c-format msgid "No such user: %s" msgstr "Nincs ilyen felhasználó: %s" -#: ../libpurple/protocols/myspace/myspace.c:2116 +#: ../libpurple/protocols/myspace/myspace.c:2121 msgid "User lookup" msgstr "Felhasználókeresés" -#: ../libpurple/protocols/myspace/myspace.c:2228 -#: ../libpurple/protocols/myspace/myspace.c:2247 -#: ../libpurple/protocols/myspace/myspace.c:2269 +#: ../libpurple/protocols/myspace/myspace.c:2233 +#: ../libpurple/protocols/myspace/myspace.c:2252 +#: ../libpurple/protocols/myspace/myspace.c:2274 msgid "Failed to remove buddy" msgstr "A partner eltávolítása sikertelen" -#: ../libpurple/protocols/myspace/myspace.c:2228 +#: ../libpurple/protocols/myspace/myspace.c:2233 msgid "'delbuddy' command failed" msgstr "a \"delbuddy parancs sikertelen" -#: ../libpurple/protocols/myspace/myspace.c:2269 +#: ../libpurple/protocols/myspace/myspace.c:2274 msgid "blocklist command failed" msgstr "a blocklist parancs sikertelen" -#: ../libpurple/protocols/myspace/myspace.c:2315 +#: ../libpurple/protocols/myspace/myspace.c:2320 msgid "Invalid input condition" msgstr "Érvénytelen bemeneti feltétel" #. TODO: g_realloc like msn, yahoo, irc, jabber? -#: ../libpurple/protocols/myspace/myspace.c:2333 -#: ../libpurple/protocols/myspace/myspace.c:2364 +#: ../libpurple/protocols/myspace/myspace.c:2338 +#: ../libpurple/protocols/myspace/myspace.c:2369 msgid "Read buffer full" msgstr "Az olvasási puffer megtelt" -#: ../libpurple/protocols/myspace/myspace.c:2402 +#: ../libpurple/protocols/myspace/myspace.c:2407 msgid "Unparseable message" msgstr "Értelmezhetetlen üzenet" -#: ../libpurple/protocols/myspace/myspace.c:2471 +#: ../libpurple/protocols/myspace/myspace.c:2476 #, c-format msgid "Couldn't connect to host: %s (%d)" msgstr "Nem sikerült kapcsolódni a kiszolgálóhoz: %s (%d)" -#: ../libpurple/protocols/myspace/myspace.c:2642 +#: ../libpurple/protocols/myspace/myspace.c:2647 msgid "IM Friends" msgstr "IM barátok" -#: ../libpurple/protocols/myspace/myspace.c:2741 +#: ../libpurple/protocols/myspace/myspace.c:2747 #, c-format msgid "" "%d buddies were added or updated from the server (including buddies already " @@ -7497,57 +7745,57 @@ "%d partner került felvételre vagy frissítésre a kiszolgálóról (beleértve a " "kiszolgálóoldali listán már jelen lévő partnereket)" -#: ../libpurple/protocols/myspace/myspace.c:2742 +#: ../libpurple/protocols/myspace/myspace.c:2748 msgid "Add contacts from server" msgstr "Kapcsolatok felvétele a kiszolgálóról." -#: ../libpurple/protocols/myspace/myspace.c:2794 -#: ../libpurple/protocols/myspace/myspace.c:2859 +#: ../libpurple/protocols/myspace/myspace.c:2800 +#: ../libpurple/protocols/myspace/myspace.c:2865 msgid "Add friends from MySpace.com" msgstr "Barátok felvétele a MySpace.com-ról" -#: ../libpurple/protocols/myspace/myspace.c:2795 +#: ../libpurple/protocols/myspace/myspace.c:2801 msgid "Importing friends failed" msgstr "A barátok importálása sikertelen" #. TODO: find out how -#: ../libpurple/protocols/myspace/myspace.c:2851 +#: ../libpurple/protocols/myspace/myspace.c:2857 msgid "Find people..." msgstr "Emberek keresése..." -#: ../libpurple/protocols/myspace/myspace.c:2854 +#: ../libpurple/protocols/myspace/myspace.c:2860 msgid "Change IM name..." msgstr "IM név megváltoztatása..." -#: ../libpurple/protocols/myspace/myspace.c:3156 +#: ../libpurple/protocols/myspace/myspace.c:3162 msgid "myim URL handler" msgstr "myim URL kezelő" -#: ../libpurple/protocols/myspace/myspace.c:3157 +#: ../libpurple/protocols/myspace/myspace.c:3163 msgid "No suitable MySpaceIM account could be found to open this myim URL." msgstr "Nem található megfelelő MySpaceIM fiók ezen myim URL megnyitásához." -#: ../libpurple/protocols/myspace/myspace.c:3158 +#: ../libpurple/protocols/myspace/myspace.c:3164 msgid "Enable the proper MySpaceIM account and try again." msgstr "Engedélyezze a megfelelő MySpaceIM fiókot és próbálkozzon újra." -#: ../libpurple/protocols/myspace/myspace.c:3281 +#: ../libpurple/protocols/myspace/myspace.c:3287 msgid "Show display name in status text" msgstr "A megjelenő név megjelenítése az állapotszövegben" -#: ../libpurple/protocols/myspace/myspace.c:3284 +#: ../libpurple/protocols/myspace/myspace.c:3290 msgid "Show headline in status text" msgstr "Fejléc megjelenítése az állapotszövegben" -#: ../libpurple/protocols/myspace/myspace.c:3289 +#: ../libpurple/protocols/myspace/myspace.c:3295 msgid "Send emoticons" msgstr "Hangulatjelek küldése" -#: ../libpurple/protocols/myspace/myspace.c:3294 +#: ../libpurple/protocols/myspace/myspace.c:3300 msgid "Screen resolution (dots per inch)" msgstr "Képernyőfelbontás (pont/hüvelyk)" -#: ../libpurple/protocols/myspace/myspace.c:3297 +#: ../libpurple/protocols/myspace/myspace.c:3303 msgid "Base font size (points)" msgstr "Alap betűkészletméret (pont)" @@ -7557,178 +7805,199 @@ msgid "User" msgstr "Felhasználó" -#. TODO: link to username, if available -#: ../libpurple/protocols/myspace/user.c:102 -#: ../libpurple/protocols/oscar/oscar.c:2964 +#: ../libpurple/protocols/myspace/user.c:105 +#: ../libpurple/protocols/oscar/oscar.c:2979 msgid "Profile" msgstr "Profil" -#: ../libpurple/protocols/myspace/user.c:124 -#, fuzzy +# fixme: talán ez... +#: ../libpurple/protocols/myspace/user.c:128 msgid "Headline" -msgstr "A_zonosító:" - -#: ../libpurple/protocols/myspace/user.c:129 -#, fuzzy +msgstr "Mottó" + +#: ../libpurple/protocols/myspace/user.c:133 msgid "Song" -msgstr "Hangok" - -#: ../libpurple/protocols/myspace/user.c:134 -#, fuzzy +msgstr "Dal" + +#: ../libpurple/protocols/myspace/user.c:141 msgid "Total Friends" -msgstr "IM barátok" - -#: ../libpurple/protocols/myspace/user.c:145 -#: ../libpurple/protocols/myspace/user.c:148 -#: ../libpurple/protocols/myspace/user.c:151 -#, fuzzy +msgstr "Barátok összesen" + +#: ../libpurple/protocols/myspace/user.c:159 msgid "Client Version" -msgstr "Társalgás bezárása" - +msgstr "Kliensverzió" + +# fixme: valami ilyesmi... #. TODO: icons for each zap -#: ../libpurple/protocols/myspace/zap.c:44 -#: ../libpurple/protocols/myspace/zap.c:177 +#. Lots of comments for translators: +#. Zap means "to strike suddenly and forcefully as if with a +#. * projectile or weapon." This term often has an electrical +#. * connotation, for example, "he was zapped by electricity when +#. * he put a fork in the toaster." +#: ../libpurple/protocols/myspace/zap.c:51 +#: ../libpurple/protocols/myspace/zap.c:214 msgid "Zap" -msgstr "" - -#: ../libpurple/protocols/myspace/zap.c:44 -#, fuzzy, c-format +msgstr "Ütés" + +#: ../libpurple/protocols/myspace/zap.c:51 +#, c-format msgid "%s has zapped you!" -msgstr "%s belépett." - -#: ../libpurple/protocols/myspace/zap.c:44 +msgstr "%s megütötte!" + +#: ../libpurple/protocols/myspace/zap.c:51 #, c-format msgid "Zapping %s..." -msgstr "" - -#: ../libpurple/protocols/myspace/zap.c:45 +msgstr "%s megütése..." + +# fixme: valami ilyesmi... +#. Whack means "to hit or strike someone with a sharp blow" +#: ../libpurple/protocols/myspace/zap.c:54 msgid "Whack" -msgstr "" - -#: ../libpurple/protocols/myspace/zap.c:45 -#, fuzzy, c-format +msgstr "Lecsapás" + +#: ../libpurple/protocols/myspace/zap.c:54 +#, c-format msgid "%s has whacked you!" -msgstr "A felhasználó letiltotta Önt" - -#: ../libpurple/protocols/myspace/zap.c:45 +msgstr "%s lecsapta!" + +#: ../libpurple/protocols/myspace/zap.c:54 #, c-format msgid "Whacking %s..." -msgstr "" - -#: ../libpurple/protocols/myspace/zap.c:46 -#, fuzzy +msgstr "%s lecsapása..." + +#. Torch means "to set on fire." Don't worry, this doesn't +#. * make a whole lot of sense in English, either. Feel free +#. * to translate it literally. +#: ../libpurple/protocols/myspace/zap.c:59 msgid "Torch" -msgstr "Téma" - -#: ../libpurple/protocols/myspace/zap.c:46 -#, fuzzy, c-format +msgstr "Égetés" + +#: ../libpurple/protocols/myspace/zap.c:59 +#, c-format msgid "%s has torched you!" -msgstr "A felhasználó letiltotta Önt" - -#: ../libpurple/protocols/myspace/zap.c:46 +msgstr "%s leégette!" + +#: ../libpurple/protocols/myspace/zap.c:59 #, c-format msgid "Torching %s..." -msgstr "" - -#: ../libpurple/protocols/myspace/zap.c:47 +msgstr "%s égetése..." + +#. Smooch means "to kiss someone, often enthusiastically" +#: ../libpurple/protocols/myspace/zap.c:62 msgid "Smooch" -msgstr "" - -#: ../libpurple/protocols/myspace/zap.c:47 -#, fuzzy, c-format +msgstr "Csók" + +#: ../libpurple/protocols/myspace/zap.c:62 +#, c-format msgid "%s has smooched you!" -msgstr "%s belépett." - -#: ../libpurple/protocols/myspace/zap.c:47 +msgstr "%s megcsókolta!" + +#: ../libpurple/protocols/myspace/zap.c:62 #, c-format msgid "Smooching %s..." -msgstr "" - -#: ../libpurple/protocols/myspace/zap.c:48 +msgstr "%s megcsókolása..." + +#. A hug is a display of affection; wrapping your arms around someone +#: ../libpurple/protocols/myspace/zap.c:65 msgid "Hug" -msgstr "" - -#: ../libpurple/protocols/myspace/zap.c:48 -#, fuzzy, c-format +msgstr "Ölelés" + +#: ../libpurple/protocols/myspace/zap.c:65 +#, c-format msgid "%s has hugged you!" -msgstr "%s belépett." - -#: ../libpurple/protocols/myspace/zap.c:48 +msgstr "%s megölelte!" + +#: ../libpurple/protocols/myspace/zap.c:65 #, c-format msgid "Hugging %s..." -msgstr "" - -#: ../libpurple/protocols/myspace/zap.c:49 -#, fuzzy +msgstr "%s ölelése..." + +#. Slap means "to hit someone with an open/flat hand" +#: ../libpurple/protocols/myspace/zap.c:68 msgid "Slap" -msgstr "Álmos" - -#: ../libpurple/protocols/myspace/zap.c:49 -#, fuzzy, c-format +msgstr "Pofon" + +#: ../libpurple/protocols/myspace/zap.c:68 +#, c-format msgid "%s has slapped you!" -msgstr "%s belépett." - -#: ../libpurple/protocols/myspace/zap.c:49 +msgstr "%s egy pofont küld!" + +#: ../libpurple/protocols/myspace/zap.c:68 #, c-format msgid "Slapping %s..." -msgstr "" - -#: ../libpurple/protocols/myspace/zap.c:50 -#, fuzzy +msgstr "%s pofozása..." + +# fixme: hát ez ezt jelenti ;) +#. Goose means "to pinch someone on their butt" +#: ../libpurple/protocols/myspace/zap.c:71 msgid "Goose" -msgstr "Elment" - -#: ../libpurple/protocols/myspace/zap.c:50 -#, fuzzy, c-format +msgstr "Seggberúgás" + +#: ../libpurple/protocols/myspace/zap.c:71 +#, c-format msgid "%s has goosed you!" -msgstr "%s elment." - -#: ../libpurple/protocols/myspace/zap.c:50 -#, fuzzy, c-format +msgstr "%s seggberúgta!" + +#: ../libpurple/protocols/myspace/zap.c:71 +#, c-format msgid "Goosing %s..." -msgstr "%s keresése" - -#: ../libpurple/protocols/myspace/zap.c:51 +msgstr "%s seggberúgása..." + +#. A high-five is when two people's hands slap each other +#. * in the air above their heads. It is done to celebrate +#. * something, often a victory, or to congratulate someone. +#: ../libpurple/protocols/myspace/zap.c:76 msgid "High-five" -msgstr "" - -#: ../libpurple/protocols/myspace/zap.c:51 -#, fuzzy, c-format +msgstr "Ötös" + +#: ../libpurple/protocols/myspace/zap.c:76 +#, c-format msgid "%s has high-fived you!" -msgstr "%s belépett." - -#: ../libpurple/protocols/myspace/zap.c:51 +msgstr "%s egy ötöst ad!" + +#: ../libpurple/protocols/myspace/zap.c:76 #, c-format msgid "High-fiving %s..." -msgstr "" - -#: ../libpurple/protocols/myspace/zap.c:52 +msgstr "%s ötöst kap..." + +#. We're not entirely sure what the MySpace people mean by +#. * this... but we think it's the equivalent of "prank." Or, for +#. * someone to perform a mischievous trick or practical joke. +#: ../libpurple/protocols/myspace/zap.c:81 msgid "Punk" -msgstr "" - -#: ../libpurple/protocols/myspace/zap.c:52 -#, fuzzy, c-format +msgstr "Tréfa" + +#: ../libpurple/protocols/myspace/zap.c:81 +#, c-format msgid "%s has punk'd you!" -msgstr "%s belépett." - -#: ../libpurple/protocols/myspace/zap.c:52 +msgstr "%s megtréfálta!" + +#: ../libpurple/protocols/myspace/zap.c:81 #, c-format msgid "Punking %s..." -msgstr "" - -#: ../libpurple/protocols/myspace/zap.c:53 +msgstr "%s megtréfálása..." + +# fixme: elvileg ezt jelenti... +#. Raspberry is a slang term for the vibrating sound made +#. * when you stick your tongue out of your mouth with your +#. * lips closed and blow. It is typically done when +#. * gloating or bragging. Nowadays it's a pretty silly +#. * gesture, so it does not carry a harsh negative +#. * connotation. It is generally used in a playful tone +#. * with friends. +#: ../libpurple/protocols/myspace/zap.c:90 msgid "Raspberry" -msgstr "" - -#: ../libpurple/protocols/myspace/zap.c:53 -#, fuzzy, c-format +msgstr "Nyelvöltés" + +#: ../libpurple/protocols/myspace/zap.c:90 +#, c-format msgid "%s has raspberried you!" -msgstr "%s belépett." - -#: ../libpurple/protocols/myspace/zap.c:53 +msgstr "%s nyelvet öltött!" + +#: ../libpurple/protocols/myspace/zap.c:90 #, c-format msgid "Raspberrying %s..." -msgstr "" +msgstr "Nyelvöltés erre: %s..." #: ../libpurple/protocols/novell/nmuser.c:1864 msgid "Required parameters not passed in" @@ -7844,8 +8113,7 @@ msgid "" "This evaluation version does not allow more than ten users to log in at one " "time" -msgstr "" -"Ez a próbaverzió nem engedélyezi tíznél több felhasználó egyidejű belépését" +msgstr "Ez a próbaverzió nem engedélyezi tíznél több felhasználó egyidejű belépését" #: ../libpurple/protocols/novell/nmuser.c:1953 msgid "The user is either offline or you are blocked" @@ -7861,44 +8129,43 @@ msgid "Login failed (%s)." msgstr "A bejelentkezés sikertelen (%s)." -#: ../libpurple/protocols/novell/novell.c:247 +#: ../libpurple/protocols/novell/novell.c:249 #, c-format msgid "Unable to send message. Could not get details for user (%s)." msgstr "" "Az üzenetet nem lehet elküldeni. A felhasználó részletei nem kérhetőek le (%" "s)." -#: ../libpurple/protocols/novell/novell.c:396 +#: ../libpurple/protocols/novell/novell.c:398 #, c-format msgid "Unable to add %s to your buddy list (%s)." msgstr "Nem lehet \"%s\"-t felvenni az Ön partnerlistájára (%s)." #. TODO: Improve this! message to who or for what conference? -#: ../libpurple/protocols/novell/novell.c:422 +#: ../libpurple/protocols/novell/novell.c:424 #, c-format msgid "Unable to send message (%s)." msgstr "Az üzenetet nem lehet elküldeni (%s)." -#: ../libpurple/protocols/novell/novell.c:493 -#: ../libpurple/protocols/novell/novell.c:985 +#: ../libpurple/protocols/novell/novell.c:495 +#: ../libpurple/protocols/novell/novell.c:987 #, c-format msgid "Unable to invite user (%s)." msgstr "Nem lehet meghívni a felhasználót (%s)." -#: ../libpurple/protocols/novell/novell.c:532 +#: ../libpurple/protocols/novell/novell.c:534 #, c-format msgid "Unable to send message to %s. Could not create the conference (%s)." msgstr "" "Az üzenetet nem lehet elküldeni a következőnek: %s. Nem sikerült létrehozni " "a konferenciát (%s)." -#: ../libpurple/protocols/novell/novell.c:537 +#: ../libpurple/protocols/novell/novell.c:539 #, c-format msgid "Unable to send message. Could not create the conference (%s)." -msgstr "" -"Az üzenetet nem lehet elküldeni. Nem sikerült létrehozni a konferenciát (%s)." - -#: ../libpurple/protocols/novell/novell.c:584 +msgstr "Az üzenetet nem lehet elküldeni. Nem sikerült létrehozni a konferenciát (%s)." + +#: ../libpurple/protocols/novell/novell.c:586 #, c-format msgid "" "Unable to move user %s to folder %s in the server side list. Error while " @@ -7907,7 +8174,7 @@ "Nem lehet %s felhasználót a(z) %s mappába mozgatni a kiszolgálóoldali " "listán. Hiba a mappa létrehozása közben (%s)." -#: ../libpurple/protocols/novell/novell.c:632 +#: ../libpurple/protocols/novell/novell.c:634 #, c-format msgid "" "Unable to add %s to your buddy list. Error creating folder in server side " @@ -7916,63 +8183,62 @@ "Nem lehet %s felhasználót felvenni a partnerlistára. Hiba a mappa " "létrehozása közben a kiszolgálóoldali listában (%s)." -#: ../libpurple/protocols/novell/novell.c:705 +#: ../libpurple/protocols/novell/novell.c:707 #, c-format msgid "Could not get details for user %s (%s)." msgstr "Nem sikerült %s felhasználó részleteit lekérni (%s)." -#: ../libpurple/protocols/novell/novell.c:751 -#: ../libpurple/protocols/novell/novell.c:897 +#: ../libpurple/protocols/novell/novell.c:753 +#: ../libpurple/protocols/novell/novell.c:899 #, c-format msgid "Unable to add user to privacy list (%s)." msgstr "Nem lehet a felhasználót felvenni a magánszféra-listára (%s)." -#: ../libpurple/protocols/novell/novell.c:798 +#: ../libpurple/protocols/novell/novell.c:800 #, c-format msgid "Unable to add %s to deny list (%s)." msgstr "Nem lehet %s felhasználót felvenni a tiltólistára (%s)." -#: ../libpurple/protocols/novell/novell.c:851 +#: ../libpurple/protocols/novell/novell.c:853 #, c-format msgid "Unable to add %s to permit list (%s)." msgstr "Nem lehet %s felhasználót felvenni az engedélyezési listára (%s)." -#: ../libpurple/protocols/novell/novell.c:919 +#: ../libpurple/protocols/novell/novell.c:921 #, c-format msgid "Unable to remove %s from privacy list (%s)." msgstr "Nem lehet %s felhasználót eltávolítani a magánszféra-listáról (%s)." -#: ../libpurple/protocols/novell/novell.c:942 -#: ../libpurple/protocols/novell/novell.c:1647 +#: ../libpurple/protocols/novell/novell.c:944 +#: ../libpurple/protocols/novell/novell.c:1649 #, c-format msgid "Unable to change server side privacy settings (%s)." -msgstr "" -"Nem lehet megváltoztatni a kiszolgálóoldali magánszféra-beállításokat (%s)." - -#: ../libpurple/protocols/novell/novell.c:1012 +msgstr "Nem lehet megváltoztatni a kiszolgálóoldali magánszféra-beállításokat (%s)." + +#: ../libpurple/protocols/novell/novell.c:1014 #, c-format msgid "Unable to create conference (%s)." msgstr "Nem lehet konferenciát létrehozni (%s)." -#: ../libpurple/protocols/novell/novell.c:1121 -#: ../libpurple/protocols/novell/novell.c:1692 +#: ../libpurple/protocols/novell/novell.c:1123 +#: ../libpurple/protocols/novell/novell.c:1694 msgid "Error communicating with server. Closing connection." msgstr "Hiba a kiszolgálóval végzett kommunikációban, a kapcsolat lezárása." -#: ../libpurple/protocols/novell/novell.c:1476 +#: ../libpurple/protocols/novell/novell.c:1478 msgid "Telephone Number" msgstr "Telefonszám" -#: ../libpurple/protocols/novell/novell.c:1482 +#: ../libpurple/protocols/novell/novell.c:1484 msgid "Personal Title" msgstr "Saját cím" -#: ../libpurple/protocols/novell/novell.c:1486 +#: ../libpurple/protocols/novell/novell.c:1488 msgid "Mailstop" msgstr "Postacím" -#: ../libpurple/protocols/novell/novell.c:1502 -#: ../libpurple/protocols/sametime/sametime.c:4122 +#: ../libpurple/protocols/novell/novell.c:1504 +#: ../libpurple/protocols/sametime/sametime.c:4123 msgid "User ID" msgstr "Felhasználóazonosító" @@ -7982,41 +8248,41 @@ #. purple_notify_user_info_add_pair(user_info, tag, value); #. } #. -#: ../libpurple/protocols/novell/novell.c:1515 +#: ../libpurple/protocols/novell/novell.c:1517 msgid "Full name" msgstr "Teljes név" -#: ../libpurple/protocols/novell/novell.c:1637 +#: ../libpurple/protocols/novell/novell.c:1639 #, c-format msgid "GroupWise Conference %d" msgstr "GroupWise konferencia %d" -#: ../libpurple/protocols/novell/novell.c:1668 +#: ../libpurple/protocols/novell/novell.c:1670 msgid "Unable to make SSL connection to server." msgstr "Nem lehet SSL kapcsolatot létrehozni a kiszolgálóhoz." -#: ../libpurple/protocols/novell/novell.c:1720 +#: ../libpurple/protocols/novell/novell.c:1722 msgid "Authenticating..." msgstr "Hitelesítés..." -#: ../libpurple/protocols/novell/novell.c:1732 +#: ../libpurple/protocols/novell/novell.c:1734 msgid "Unable to connect to server." msgstr "Nem lehet a kiszolgálóhoz kapcsolódni." -#: ../libpurple/protocols/novell/novell.c:1735 +#: ../libpurple/protocols/novell/novell.c:1737 msgid "Waiting for response..." msgstr "Várakozás válaszra..." -#: ../libpurple/protocols/novell/novell.c:1870 +#: ../libpurple/protocols/novell/novell.c:1872 #, c-format msgid "%s has been invited to this conversation." msgstr "%s meghívva erre a társalgásra." -#: ../libpurple/protocols/novell/novell.c:1898 +#: ../libpurple/protocols/novell/novell.c:1900 msgid "Invitation to Conversation" msgstr "Meghívás társalgásra" -#: ../libpurple/protocols/novell/novell.c:1899 +#: ../libpurple/protocols/novell/novell.c:1901 #, c-format msgid "" "Invitation from: %s\n" @@ -8027,27 +8293,24 @@ "\n" "Elküldve: %s" -#: ../libpurple/protocols/novell/novell.c:1901 +#: ../libpurple/protocols/novell/novell.c:1903 msgid "Would you like to join the conversation?" msgstr "Szeretne csatlakozni a társalgáshoz?" -#. we don't want to reconnect in this case -#: ../libpurple/protocols/novell/novell.c:2012 +#: ../libpurple/protocols/novell/novell.c:2017 msgid "You have been logged out because you logged in at another workstation." -msgstr "" -"Ki lett jelentkeztetve, mivel bejelentkezett egy másik munkaállomásról." - -#: ../libpurple/protocols/novell/novell.c:2069 -#, c-format -msgid "" -"%s appears to be offline and did not receive the message that you just sent." +msgstr "Ki lett jelentkeztetve, mivel bejelentkezett egy másik munkaállomásról." + +#: ../libpurple/protocols/novell/novell.c:2074 +#, c-format +msgid "%s appears to be offline and did not receive the message that you just sent." msgstr "Úgy tűnik, %s kilépett, és nem kapta meg az utoljára küldött üzenetet." #. TODO: Would be nice to prompt if not set! -#. * purple_request_fields(gc, _("Server Address"),...); +#. * purple_request_fields_with_hint(gc, _("Server Address"),...); #. #. ...but for now just error out with a nice message. -#: ../libpurple/protocols/novell/novell.c:2167 +#: ../libpurple/protocols/novell/novell.c:2172 msgid "" "Unable to connect to server. Please enter the address of the server you wish " "to connect to." @@ -8055,11 +8318,11 @@ "Nem lehet kapcsolódni a kiszolgálóhoz. Kérem adja meg a kiszolgáló címét, " "amelyikhez kapcsolódni szeretne." -#: ../libpurple/protocols/novell/novell.c:2195 +#: ../libpurple/protocols/novell/novell.c:2200 msgid "Error. SSL support is not installed." msgstr "Hiba: az SSL támogatás nincs telepítve." -#: ../libpurple/protocols/novell/novell.c:2504 +#: ../libpurple/protocols/novell/novell.c:2509 #, c-format msgid "This conference has been closed. No more messages can be sent." msgstr "Ez a konferencia le lett zárva. További üzenetek már nem küldhetőek." @@ -8074,33 +8337,33 @@ #. *< version #. * summary #. * description -#: ../libpurple/protocols/novell/novell.c:3518 -#: ../libpurple/protocols/novell/novell.c:3520 +#: ../libpurple/protocols/novell/novell.c:3523 +#: ../libpurple/protocols/novell/novell.c:3525 msgid "Novell GroupWise Messenger Protocol Plugin" msgstr "Novell GroupWise Messenger protokollbővítmény" -#: ../libpurple/protocols/novell/novell.c:3545 +#: ../libpurple/protocols/novell/novell.c:3550 msgid "Server address" msgstr "Kiszolgáló címe" -#: ../libpurple/protocols/novell/novell.c:3549 +#: ../libpurple/protocols/novell/novell.c:3554 msgid "Server port" msgstr "Kiszolgáló portja" -#: ../libpurple/protocols/oscar/flap_connection.c:387 -#: ../libpurple/protocols/yahoo/yahoo.c:2469 -#: ../libpurple/protocols/yahoo/yahoo.c:2636 -#: ../libpurple/protocols/yahoo/ycht.c:481 ../libpurple/proxy.c:581 -#: ../libpurple/proxy.c:1116 ../libpurple/proxy.c:1225 -#: ../libpurple/proxy.c:1325 ../libpurple/proxy.c:1453 +#: ../libpurple/protocols/oscar/flap_connection.c:389 +#: ../libpurple/protocols/yahoo/yahoo.c:2471 +#: ../libpurple/protocols/yahoo/yahoo.c:2638 +#: ../libpurple/protocols/yahoo/ycht.c:481 ../libpurple/proxy.c:584 +#: ../libpurple/proxy.c:1129 ../libpurple/proxy.c:1238 +#: ../libpurple/proxy.c:1338 ../libpurple/proxy.c:1466 msgid "Server closed the connection." msgstr "A kiszolgáló lezárta a kapcsolatot." -#: ../libpurple/protocols/oscar/flap_connection.c:389 -#: ../libpurple/protocols/yahoo/yahoo.c:2463 -#: ../libpurple/protocols/yahoo/yahoo.c:2630 ../libpurple/proxy.c:593 -#: ../libpurple/proxy.c:1128 ../libpurple/proxy.c:1237 -#: ../libpurple/proxy.c:1337 ../libpurple/proxy.c:1465 +#: ../libpurple/protocols/oscar/flap_connection.c:391 +#: ../libpurple/protocols/yahoo/yahoo.c:2465 +#: ../libpurple/protocols/yahoo/yahoo.c:2632 ../libpurple/proxy.c:596 +#: ../libpurple/proxy.c:1141 ../libpurple/proxy.c:1250 +#: ../libpurple/proxy.c:1350 ../libpurple/proxy.c:1478 #, c-format msgid "" "Lost connection with server:\n" @@ -8109,10 +8372,10 @@ "Elveszett a kapcsolat a kiszolgálóhoz:\n" "%s" -#: ../libpurple/protocols/oscar/flap_connection.c:392 -#: ../libpurple/proxy.c:1145 ../libpurple/proxy.c:1250 -#: ../libpurple/proxy.c:1349 ../libpurple/proxy.c:1421 -#: ../libpurple/proxy.c:1478 +#: ../libpurple/protocols/oscar/flap_connection.c:394 +#: ../libpurple/proxy.c:1158 ../libpurple/proxy.c:1263 +#: ../libpurple/proxy.c:1362 ../libpurple/proxy.c:1434 +#: ../libpurple/proxy.c:1491 msgid "Received invalid data on connection with server." msgstr "Érvénytelen adatok érkeztek a kapcsolaton a kiszolgálótól." @@ -8147,36 +8410,45 @@ msgstr "ICQ protokollbővítmény" #: ../libpurple/protocols/oscar/libicq.c:147 -#: ../libpurple/protocols/yahoo/yahoo.c:4410 +#: ../libpurple/protocols/yahoo/yahoo.c:4412 #: ../libpurple/protocols/zephyr/zephyr.c:2997 msgid "Encoding" msgstr "Kódolás" -#: ../libpurple/protocols/oscar/odc.c:40 +#: ../libpurple/protocols/oscar/odc.c:42 msgid "The remote user has closed the connection." msgstr "A távoli felhasználó lezárta a kapcsolatot." -#: ../libpurple/protocols/oscar/odc.c:42 +#: ../libpurple/protocols/oscar/odc.c:44 msgid "The remote user has declined your request." msgstr "A távoli felhasználó visszautasította a kérését." -#: ../libpurple/protocols/oscar/odc.c:44 +#: ../libpurple/protocols/oscar/odc.c:46 #, c-format msgid "Lost connection with the remote user:<br>%s" msgstr "A távoli felhasználóhoz elveszett a kapcsolat:<br>%s" -#: ../libpurple/protocols/oscar/odc.c:47 +#: ../libpurple/protocols/oscar/odc.c:49 msgid "Received invalid data on connection with remote user." msgstr "Érvénytelen adatok érkeztek a kapcsolaton a távoli felhasználótól." -#: ../libpurple/protocols/oscar/odc.c:49 +#: ../libpurple/protocols/oscar/odc.c:51 msgid "Could not establish a connection with the remote user." msgstr "Nem hozható létre kapcsolat a távoli felhasználóval." -#: ../libpurple/protocols/oscar/odc.c:560 +#: ../libpurple/protocols/oscar/odc.c:562 msgid "Direct IM established" msgstr "A közvetlen kapcsolat létrejött" +#: ../libpurple/protocols/oscar/odc.c:600 +#, c-format +msgid "" +"%s tried to send you a %s file, but we only allow files up to %s over Direct " +"IM. Try using file transfer instead.\n" +msgstr "" +"%s egy %s fájlt próbált küldeni, de közvetlen kapcsolatban legfeljebb csak %" +"s méretű fájl küldhető. Próbálkozzon inkább a fájlátvitellel.\n" + #: ../libpurple/protocols/oscar/oft.c:656 #, c-format msgid "File %s is %s, which is larger than the maximum size of %s." @@ -8300,8 +8572,8 @@ "kódolást használnak, vagy %s hibás klienst használ.)" #. Label -#: ../libpurple/protocols/oscar/oscar.c:639 ../pidgin/gtkutils.c:2387 -#: ../pidgin/gtkutils.c:2417 +#: ../libpurple/protocols/oscar/oscar.c:639 ../pidgin/gtkutils.c:2391 +#: ../pidgin/gtkutils.c:2421 #: ../pidgin/plugins/gevolution/new_person_dialog.c:332 msgid "Buddy Icon" msgstr "Partnerikon" @@ -8315,15 +8587,15 @@ msgstr "AIM közvetlen azonnali üzenetek" #: ../libpurple/protocols/oscar/oscar.c:648 -#: ../libpurple/protocols/silc/silc.c:768 -#: ../libpurple/protocols/silc/util.c:553 +#: ../libpurple/protocols/silc/silc.c:899 +#: ../libpurple/protocols/silc/util.c:557 #: ../libpurple/protocols/silc10/silc.c:679 #: ../libpurple/protocols/silc10/util.c:549 msgid "Chat" msgstr "Csevegés" #: ../libpurple/protocols/oscar/oscar.c:651 -#: ../libpurple/protocols/oscar/oscar.c:6010 +#: ../libpurple/protocols/oscar/oscar.c:6065 msgid "Get File" msgstr "Fájl letöltése" @@ -8396,19 +8668,19 @@ msgstr "Fényképezőgép" #: ../libpurple/protocols/oscar/oscar.c:725 -#: ../libpurple/protocols/oscar/oscar.c:5780 +#: ../libpurple/protocols/oscar/oscar.c:5835 #, c-format msgid "Free For Chat" msgstr "Ráérek csevegni" #: ../libpurple/protocols/oscar/oscar.c:729 -#: ../libpurple/protocols/oscar/oscar.c:5815 +#: ../libpurple/protocols/oscar/oscar.c:5870 #, c-format msgid "Not Available" msgstr "Nem érhető el" #: ../libpurple/protocols/oscar/oscar.c:731 -#: ../libpurple/protocols/oscar/oscar.c:5801 +#: ../libpurple/protocols/oscar/oscar.c:5856 #, c-format msgid "Occupied" msgstr "Elfoglalt" @@ -8420,8 +8692,8 @@ #: ../libpurple/protocols/oscar/oscar.c:737 ../libpurple/protocols/qq/qq.c:183 #: ../libpurple/protocols/qq/qq.c:288 -#: ../libpurple/protocols/yahoo/yahoo.c:3095 ../libpurple/status.c:157 -#: ../pidgin/gtkdocklet.c:446 ../pidgin/gtkstatusbox.c:1060 +#: ../libpurple/protocols/yahoo/yahoo.c:3097 ../libpurple/status.c:157 +#: ../pidgin/gtkdocklet.c:557 ../pidgin/gtkstatusbox.c:1060 #, c-format msgid "Invisible" msgstr "Láthatatlan" @@ -8432,13 +8704,13 @@ msgstr "Elérhető" #: ../libpurple/protocols/oscar/oscar.c:838 -#: ../libpurple/protocols/oscar/oscar.c:3707 -#: ../libpurple/protocols/yahoo/yahoo_profile.c:721 ../pidgin/gtkprefs.c:1126 +#: ../libpurple/protocols/oscar/oscar.c:3722 +#: ../libpurple/protocols/yahoo/yahoo_profile.c:721 ../pidgin/gtkprefs.c:1156 msgid "IP Address" msgstr "IP cím" #: ../libpurple/protocols/oscar/oscar.c:845 -#: ../libpurple/protocols/oscar/oscar.c:2891 +#: ../libpurple/protocols/oscar/oscar.c:2906 msgid "Warning Level" msgstr "Figyelmeztetési szint" @@ -8477,7 +8749,7 @@ msgid "Finalizing connection" msgstr "Kapcsolódás befejezése" -#: ../libpurple/protocols/oscar/oscar.c:1260 +#: ../libpurple/protocols/oscar/oscar.c:1262 #, c-format msgid "" "Unable to login: Could not sign on as %s because the screen name is " @@ -8489,29 +8761,29 @@ "betűvel kell kezdődniük és betűket, számokat, szóközöket, vagy csak számokat " "tartalmazhatnak." -#: ../libpurple/protocols/oscar/oscar.c:1345 -#: ../libpurple/protocols/yahoo/yahoo.c:2105 +#: ../libpurple/protocols/oscar/oscar.c:1348 +#: ../libpurple/protocols/yahoo/yahoo.c:2107 msgid "Invalid screen name." msgstr "Érvénytelen felhasználónév." -#: ../libpurple/protocols/oscar/oscar.c:1352 -#: ../libpurple/protocols/qq/login_logout.c:483 -#: ../libpurple/protocols/simple/simple.c:1045 -#: ../libpurple/protocols/yahoo/yahoo.c:2126 +#: ../libpurple/protocols/oscar/oscar.c:1355 +#: ../libpurple/protocols/qq/login_logout.c:485 +#: ../libpurple/protocols/simple/simple.c:1108 +#: ../libpurple/protocols/yahoo/yahoo.c:2128 msgid "Incorrect password." msgstr "Helytelen jelszó." -#: ../libpurple/protocols/oscar/oscar.c:1357 +#: ../libpurple/protocols/oscar/oscar.c:1360 msgid "Your account is currently suspended." msgstr "A fiókja jelenleg fel van függesztve." #. service temporarily unavailable -#: ../libpurple/protocols/oscar/oscar.c:1361 +#: ../libpurple/protocols/oscar/oscar.c:1364 msgid "The AOL Instant Messenger service is temporarily unavailable." msgstr "Az AOL azonnali üzenő szolgáltatás átmenetileg nem érhető el." -#: ../libpurple/protocols/oscar/oscar.c:1366 -#: ../libpurple/protocols/oscar/oscar.c:1377 +#: ../libpurple/protocols/oscar/oscar.c:1369 +#: ../libpurple/protocols/oscar/oscar.c:1380 msgid "" "You have been connecting and disconnecting too frequently. Wait ten minutes " "and try again. If you continue to try, you will need to wait even longer." @@ -8519,46 +8791,54 @@ "Ön túl gyakran jelentkezik ki/be. Várjon tíz percet és próbálja meg újra. Ha " "tovább folytatja, még többet kell majd várnia." -#: ../libpurple/protocols/oscar/oscar.c:1371 +#: ../libpurple/protocols/oscar/oscar.c:1374 #, c-format msgid "The client version you are using is too old. Please upgrade at %s" msgstr "" "A használt kliensprogram verziója túl régi. Kérem töltse le a frissítést a " "következő helyről: %s" -#: ../libpurple/protocols/oscar/oscar.c:1410 +#: ../libpurple/protocols/oscar/oscar.c:1413 msgid "Could Not Connect" msgstr "Nem sikerült kapcsolódni" -#: ../libpurple/protocols/oscar/oscar.c:1414 +#: ../libpurple/protocols/oscar/oscar.c:1417 msgid "Received authorization" msgstr "A hitelesítés fogadva" -#: ../libpurple/protocols/oscar/oscar.c:1436 +#: ../libpurple/protocols/oscar/oscar.c:1439 msgid "The SecurID key entered is invalid." msgstr "A megadott SecurID kulcs érvénytelen." -#: ../libpurple/protocols/oscar/oscar.c:1449 +#: ../libpurple/protocols/oscar/oscar.c:1452 msgid "Enter SecurID" msgstr "Adja meg a SecurID-t" -#: ../libpurple/protocols/oscar/oscar.c:1450 +#: ../libpurple/protocols/oscar/oscar.c:1453 msgid "Enter the 6 digit number from the digital display." msgstr "Írja be a hatjegyű számot a digitális képernyőről." #. * #. * A wrapper for purple_request_action() that uses @c OK and @c Cancel buttons. +#. * +#. * @since 2.3.0 #. -#: ../libpurple/protocols/oscar/oscar.c:1452 -#: ../libpurple/protocols/oscar/oscar.c:2232 -#: ../libpurple/protocols/oscar/oscar.c:2281 -#: ../libpurple/protocols/oscar/oscar.c:5885 -#: ../libpurple/protocols/oscar/oscar.c:6166 ../libpurple/request.h:1388 +#. * +#. * A wrapper for purple_request_action() that uses @c OK and @c Cancel buttons. +#. * +#. * @deprecated Please use purple_request_ok_cancel_with_hint instead. +#. +#: ../libpurple/protocols/oscar/oscar.c:1455 +#: ../libpurple/protocols/oscar/oscar.c:2247 +#: ../libpurple/protocols/oscar/oscar.c:2296 +#: ../libpurple/protocols/oscar/oscar.c:5940 +#: ../libpurple/protocols/oscar/oscar.c:6221 ../libpurple/request.h:1828 +#: ../libpurple/request.h:1841 msgid "_OK" msgstr "_OK" -#: ../libpurple/protocols/oscar/oscar.c:1491 -#: ../libpurple/protocols/oscar/oscar.c:1534 +#: ../libpurple/protocols/oscar/oscar.c:1494 +#: ../libpurple/protocols/oscar/oscar.c:1537 #, c-format msgid "" "You may be disconnected shortly. You may want to use TOC until this is " @@ -8567,55 +8847,55 @@ "Hamarosan megszakad a kapcsolat. A helyreállításig használja a TOC-ot. " "Frissítésekért keresse fel a következő címet: %s." -#: ../libpurple/protocols/oscar/oscar.c:1494 -#: ../libpurple/protocols/oscar/oscar.c:1537 +#: ../libpurple/protocols/oscar/oscar.c:1497 +#: ../libpurple/protocols/oscar/oscar.c:1540 msgid "Unable to get a valid AIM login hash." msgstr "Nem kérhető le érvényes AIM belépő hash." -#: ../libpurple/protocols/oscar/oscar.c:1622 +#: ../libpurple/protocols/oscar/oscar.c:1625 #, c-format msgid "You may be disconnected shortly. Check %s for updates." msgstr "" "Hamarosan megszakad a kapcsolat. Frissítésekért keresse fel a következő " "címet: %s." -#: ../libpurple/protocols/oscar/oscar.c:1625 +#: ../libpurple/protocols/oscar/oscar.c:1628 msgid "Unable to get a valid login hash." msgstr "Nem kérhető le érvényes belépő hash." -#: ../libpurple/protocols/oscar/oscar.c:1655 +#: ../libpurple/protocols/oscar/oscar.c:1658 msgid "Password sent" msgstr "Jelszó elküldve" -#: ../libpurple/protocols/oscar/oscar.c:1711 +#: ../libpurple/protocols/oscar/oscar.c:1714 msgid "Unable to initialize connection" msgstr "A kapcsolat nem inicializálható" -#: ../libpurple/protocols/oscar/oscar.c:2202 +#: ../libpurple/protocols/oscar/oscar.c:2205 msgid "Please authorize me so I can add you to my buddy list." msgstr "Kérem engedélyezze, hogy felvehessem a partnereim közé." -#: ../libpurple/protocols/oscar/oscar.c:2230 +#: ../libpurple/protocols/oscar/oscar.c:2245 msgid "Authorization Request Message:" msgstr "Engedélyezést kérő üzenet:" -#: ../libpurple/protocols/oscar/oscar.c:2231 +#: ../libpurple/protocols/oscar/oscar.c:2246 msgid "Please authorize me!" msgstr "Kérem engedélyezze, hogy felvegyem!" -#: ../libpurple/protocols/oscar/oscar.c:2272 -#: ../libpurple/protocols/oscar/oscar.c:2280 -#: ../libpurple/protocols/oscar/oscar.c:2407 -#: ../libpurple/protocols/oscar/oscar.c:5263 -#: ../libpurple/protocols/yahoo/yahoo.c:1030 +#: ../libpurple/protocols/oscar/oscar.c:2287 +#: ../libpurple/protocols/oscar/oscar.c:2295 +#: ../libpurple/protocols/oscar/oscar.c:2422 +#: ../libpurple/protocols/oscar/oscar.c:5316 +#: ../libpurple/protocols/yahoo/yahoo.c:1032 msgid "No reason given." msgstr "Nincs ok megadva." -#: ../libpurple/protocols/oscar/oscar.c:2279 +#: ../libpurple/protocols/oscar/oscar.c:2294 msgid "Authorization Denied Message:" msgstr "Engedélyezést elutasító üzenet:" -#: ../libpurple/protocols/oscar/oscar.c:2407 +#: ../libpurple/protocols/oscar/oscar.c:2422 #, c-format msgid "" "The user %u has denied your request to add them to your buddy list for the " @@ -8626,18 +8906,17 @@ "következő indoklással:\n" "%s" -#: ../libpurple/protocols/oscar/oscar.c:2408 +#: ../libpurple/protocols/oscar/oscar.c:2423 msgid "ICQ authorization denied." msgstr "ICQ engedélyezés elutasítva." #. Someone has granted you authorization -#: ../libpurple/protocols/oscar/oscar.c:2415 +#: ../libpurple/protocols/oscar/oscar.c:2430 #, c-format msgid "The user %u has granted your request to add them to your buddy list." -msgstr "" -"%u felhasználó elfogadta a kérését, így felveheti őt a partnerlistájára." - -#: ../libpurple/protocols/oscar/oscar.c:2423 +msgstr "%u felhasználó elfogadta a kérését, így felveheti őt a partnerlistájára." + +#: ../libpurple/protocols/oscar/oscar.c:2438 #, c-format msgid "" "You have received a special message\n" @@ -8650,7 +8929,7 @@ "Feladó: %s [%s]\n" "%s" -#: ../libpurple/protocols/oscar/oscar.c:2431 +#: ../libpurple/protocols/oscar/oscar.c:2446 #, c-format msgid "" "You have received an ICQ page\n" @@ -8663,7 +8942,7 @@ "Feladó: %s [%s]\n" "%s" -#: ../libpurple/protocols/oscar/oscar.c:2439 +#: ../libpurple/protocols/oscar/oscar.c:2454 #, c-format msgid "" "You have received an ICQ e-mail from %s [%s]\n" @@ -8676,50 +8955,44 @@ "Az üzenet:\n" "%s" -#: ../libpurple/protocols/oscar/oscar.c:2460 +#: ../libpurple/protocols/oscar/oscar.c:2475 #, c-format msgid "ICQ user %u has sent you a buddy: %s (%s)" msgstr "%u ICQ felhasználó küldött Önnek egy partnert: %s (%s)" -#: ../libpurple/protocols/oscar/oscar.c:2466 +#: ../libpurple/protocols/oscar/oscar.c:2481 msgid "Do you want to add this buddy to your buddy list?" msgstr "Fel kívánja venni ezt a partnert a listájára?" -#: ../libpurple/protocols/oscar/oscar.c:2471 ../pidgin/gtkroomlist.c:309 +#: ../libpurple/protocols/oscar/oscar.c:2486 ../pidgin/gtkroomlist.c:309 msgid "_Add" msgstr "Hozzá_adás" -#: ../libpurple/protocols/oscar/oscar.c:2472 +#: ../libpurple/protocols/oscar/oscar.c:2487 msgid "_Decline" msgstr "_Elutasítás" -#: ../libpurple/protocols/oscar/oscar.c:2596 +#: ../libpurple/protocols/oscar/oscar.c:2611 #, c-format msgid "You missed %hu message from %s because it was invalid." msgid_plural "You missed %hu messages from %s because they were invalid." -msgstr[0] "" -"Nem kapott meg %hu üzenetet a következőtől: %s, mert az érvénytelen volt." -msgstr[1] "" -"Nem kapott meg %hu üzenetet a következőtől: %s, mert az érvénytelen volt." - -#: ../libpurple/protocols/oscar/oscar.c:2605 +msgstr[0] "Nem kapott meg %hu üzenetet a következőtől: %s, mert az érvénytelen volt." +msgstr[1] "Nem kapott meg %hu üzenetet a következőtől: %s, mert az érvénytelen volt." + +#: ../libpurple/protocols/oscar/oscar.c:2620 #, c-format msgid "You missed %hu message from %s because it was too large." msgid_plural "You missed %hu messages from %s because they were too large." -msgstr[0] "" -"Nem kapott meg %hu üzenetet a következőtől: %s, mert az túl nagy volt." -msgstr[1] "" -"Nem kapott meg %hu üzenetet a következőtől: %s, mert az túl nagy volt." +msgstr[0] "Nem kapott meg %hu üzenetet a következőtől: %s, mert az túl nagy volt." +msgstr[1] "Nem kapott meg %hu üzenetet a következőtől: %s, mert az túl nagy volt." # #: ../src/protocols/oscar/oscar.c:1605 # #, c-format # msgid "You missed %d message from %s because the rate limit has been exceeded." -#: ../libpurple/protocols/oscar/oscar.c:2614 -#, c-format -msgid "" -"You missed %hu message from %s because the rate limit has been exceeded." -msgid_plural "" -"You missed %hu messages from %s because the rate limit has been exceeded." +#: ../libpurple/protocols/oscar/oscar.c:2629 +#, c-format +msgid "You missed %hu message from %s because the rate limit has been exceeded." +msgid_plural "You missed %hu messages from %s because the rate limit has been exceeded." msgstr[0] "" "Nem kapott meg %hu üzenetet a következőtől: %s, mert túllépte a küldés " "gyakoriságának a korlátját." @@ -8727,7 +9000,7 @@ "Nem kapott meg %hu üzenetet a következőtől: %s, mert túllépte a küldés " "gyakoriságának a korlátját." -#: ../libpurple/protocols/oscar/oscar.c:2623 +#: ../libpurple/protocols/oscar/oscar.c:2638 #, c-format msgid "You missed %hu message from %s because he/she was too evil." msgid_plural "You missed %hu messages from %s because he/she was too evil." @@ -8738,7 +9011,7 @@ "Nem kapott meg %hu üzenetet a következőtől: %s, mert a feladó túl " "rosszindulatú volt." -#: ../libpurple/protocols/oscar/oscar.c:2632 +#: ../libpurple/protocols/oscar/oscar.c:2647 #, c-format msgid "You missed %hu message from %s because you are too evil." msgid_plural "You missed %hu messages from %s because you are too evil." @@ -8749,7 +9022,7 @@ "Nem kapott meg %hu üzenetet a következőtől: %s, mert Ön túl rosszindulatú " "volt." -#: ../libpurple/protocols/oscar/oscar.c:2641 +#: ../libpurple/protocols/oscar/oscar.c:2656 #, c-format msgid "You missed %hu message from %s for an unknown reason." msgid_plural "You missed %hu messages from %s for an unknown reason." @@ -8757,47 +9030,47 @@ msgstr[1] "Nem kapott meg %hu üzenetet a következőtől: %s, ismeretlen okból." #. Data is assumed to be the destination sn -#: ../libpurple/protocols/oscar/oscar.c:2796 +#: ../libpurple/protocols/oscar/oscar.c:2811 #, c-format msgid "Unable to send message: %s" msgstr "Az üzenetet nem lehet elküldeni: %s" -#: ../libpurple/protocols/oscar/oscar.c:2796 -#: ../libpurple/protocols/oscar/oscar.c:2801 -#: ../libpurple/protocols/oscar/oscar.c:2865 +#: ../libpurple/protocols/oscar/oscar.c:2811 +#: ../libpurple/protocols/oscar/oscar.c:2816 +#: ../libpurple/protocols/oscar/oscar.c:2880 msgid "Unknown reason." msgstr "Ismeretlen ok." -#: ../libpurple/protocols/oscar/oscar.c:2799 -#: ../libpurple/protocols/sametime/sametime.c:2409 +#: ../libpurple/protocols/oscar/oscar.c:2814 +#: ../libpurple/protocols/sametime/sametime.c:2410 #, c-format msgid "Unable to send message to %s:" msgstr "Az üzenetet nem lehet elküldeni a következőnek: %s:" -#: ../libpurple/protocols/oscar/oscar.c:2865 +#: ../libpurple/protocols/oscar/oscar.c:2880 #, c-format msgid "User information not available: %s" msgstr "A felhasználó információi nem érhetőek el: %s" -#: ../libpurple/protocols/oscar/oscar.c:2896 +#: ../libpurple/protocols/oscar/oscar.c:2911 msgid "Online Since" msgstr "Kapcsolódva ezóta" -#: ../libpurple/protocols/oscar/oscar.c:2901 +#: ../libpurple/protocols/oscar/oscar.c:2916 #: ../libpurple/protocols/yahoo/yahoo_profile.c:1185 msgid "Member Since" -msgstr "Tag ezóta" - -#: ../libpurple/protocols/oscar/oscar.c:2936 +msgstr "Tagság kezdete" + +#: ../libpurple/protocols/oscar/oscar.c:2951 msgid "Available Message" msgstr "Elérhetőségi üzenet" -#: ../libpurple/protocols/oscar/oscar.c:3044 +#: ../libpurple/protocols/oscar/oscar.c:3059 msgid "Your AIM connection may be lost." msgstr "Az AIM kapcsolata megszakadhatott." #. The conversion failed! -#: ../libpurple/protocols/oscar/oscar.c:3232 +#: ../libpurple/protocols/oscar/oscar.c:3247 msgid "" "[Unable to display a message from this user because it contained invalid " "characters.]" @@ -8805,7 +9078,7 @@ "[Nem lehet megjeleníteni az üzenetet ettől a felhasználótól, mert az " "érvénytelen karaktereket tartalmazott.]" -#: ../libpurple/protocols/oscar/oscar.c:3396 +#: ../libpurple/protocols/oscar/oscar.c:3411 msgid "" "The last action you attempted could not be performed because you are over " "the rate limit. Please wait 10 seconds and try again." @@ -8813,83 +9086,83 @@ "Az utolsó művelet nem hajtható végre, mert a túllépte a sebességkorlátot. " "Kérem várjon 10 másodpercet és próbálja meg újra." -#: ../libpurple/protocols/oscar/oscar.c:3479 +#: ../libpurple/protocols/oscar/oscar.c:3494 #: ../libpurple/protocols/toc/toc.c:977 #, c-format msgid "You have been disconnected from chat room %s." msgstr "Kilépett a(z) %s csevegőszobából." -#: ../libpurple/protocols/oscar/oscar.c:3729 -#: ../libpurple/protocols/silc/util.c:585 +#: ../libpurple/protocols/oscar/oscar.c:3744 +#: ../libpurple/protocols/silc/util.c:589 #: ../libpurple/protocols/silc10/util.c:581 msgid "Mobile Phone" msgstr "Mobiltelefon" -#: ../libpurple/protocols/oscar/oscar.c:3759 +#: ../libpurple/protocols/oscar/oscar.c:3774 msgid "Personal Web Page" msgstr "Saját weboldal" -#: ../libpurple/protocols/oscar/oscar.c:3783 +#: ../libpurple/protocols/oscar/oscar.c:3798 #: ../libpurple/protocols/qq/buddy_info.c:40 msgid "Additional Information" msgstr "További információ" -#: ../libpurple/protocols/oscar/oscar.c:3791 -#: ../libpurple/protocols/oscar/oscar.c:3804 +#: ../libpurple/protocols/oscar/oscar.c:3806 +#: ../libpurple/protocols/oscar/oscar.c:3819 msgid "Zip Code" msgstr "Irányítószám" -#: ../libpurple/protocols/oscar/oscar.c:3815 +#: ../libpurple/protocols/oscar/oscar.c:3830 msgid "Division" msgstr "Részleg" -#: ../libpurple/protocols/oscar/oscar.c:3816 +#: ../libpurple/protocols/oscar/oscar.c:3831 msgid "Position" msgstr "Pozíció" -#: ../libpurple/protocols/oscar/oscar.c:3818 +#: ../libpurple/protocols/oscar/oscar.c:3833 msgid "Web Page" msgstr "Weboldal" -#: ../libpurple/protocols/oscar/oscar.c:3821 +#: ../libpurple/protocols/oscar/oscar.c:3836 msgid "Work Information" msgstr "Munkahelyi adatok" -#: ../libpurple/protocols/oscar/oscar.c:3877 +#: ../libpurple/protocols/oscar/oscar.c:3892 msgid "Pop-Up Message" msgstr "Felbukkanó üzenet" -#: ../libpurple/protocols/oscar/oscar.c:3917 +#: ../libpurple/protocols/oscar/oscar.c:3932 #, c-format msgid "The following screen name is associated with %s" msgid_plural "The following screen names are associated with %s" msgstr[0] "A következő felhasználónév a következőhöz van rendelve: %s" msgstr[1] "A következő felhasználónevek a következőhöz vannak rendelve: %s" -#: ../libpurple/protocols/oscar/oscar.c:3922 +#: ../libpurple/protocols/oscar/oscar.c:3937 msgid "Screen name" msgstr "Felhasználónév" -#: ../libpurple/protocols/oscar/oscar.c:3948 +#: ../libpurple/protocols/oscar/oscar.c:3963 #, c-format msgid "No results found for e-mail address %s" msgstr "Nem található eredmény a(z) %s e-mail címre" -#: ../libpurple/protocols/oscar/oscar.c:3969 +#: ../libpurple/protocols/oscar/oscar.c:3984 #, c-format msgid "You should receive an e-mail asking to confirm %s." msgstr "Kapnia kell egy %s jóváhagyását kérő levelet." -#: ../libpurple/protocols/oscar/oscar.c:3971 +#: ../libpurple/protocols/oscar/oscar.c:3986 msgid "Account Confirmation Requested" msgstr "Fiókjóváhagyás megkérve" -#: ../libpurple/protocols/oscar/oscar.c:4002 +#: ../libpurple/protocols/oscar/oscar.c:4017 #, c-format msgid "Error Changing Account Info" msgstr "Hiba a fiók információinak megváltoztatása közben" -#: ../libpurple/protocols/oscar/oscar.c:4005 +#: ../libpurple/protocols/oscar/oscar.c:4020 #, c-format msgid "" "Error 0x%04x: Unable to format screen name because the requested screen name " @@ -8898,14 +9171,14 @@ "Hiba 0x%04x: Nem sikerült a felhasználónevet megformázni, mert a kért " "felhasználónév eltér az eredetitől." -#: ../libpurple/protocols/oscar/oscar.c:4008 +#: ../libpurple/protocols/oscar/oscar.c:4023 #, c-format msgid "Error 0x%04x: Unable to format screen name because it is invalid." msgstr "" "Hiba 0x%04x: Nem sikerült a felhasználónevet megformázni, mivel az " "érvénytelen." -#: ../libpurple/protocols/oscar/oscar.c:4011 +#: ../libpurple/protocols/oscar/oscar.c:4026 #, c-format msgid "" "Error 0x%04x: Unable to format screen name because the requested screen name " @@ -8914,7 +9187,7 @@ "Hiba 0x%04x: Nem sikerült a felhasználónevet megformázni, mert a kért " "felhasználónév túl hosszú." -#: ../libpurple/protocols/oscar/oscar.c:4014 +#: ../libpurple/protocols/oscar/oscar.c:4029 #, c-format msgid "" "Error 0x%04x: Unable to change e-mail address because there is already a " @@ -8923,7 +9196,7 @@ "Hiba 0x%04x: Nem sikerült megváltoztatni az e-mail címet, mert egy kérés már " "függőben van erre a felhasználónévre." -#: ../libpurple/protocols/oscar/oscar.c:4017 +#: ../libpurple/protocols/oscar/oscar.c:4032 #, c-format msgid "" "Error 0x%04x: Unable to change e-mail address because the given address has " @@ -8932,7 +9205,7 @@ "Hiba 0x%04x: Nem sikerült megváltoztatni az e-mail címet, mert a megadott " "cím túl sok felhasználónévhez van társítva." -#: ../libpurple/protocols/oscar/oscar.c:4020 +#: ../libpurple/protocols/oscar/oscar.c:4035 #, c-format msgid "" "Error 0x%04x: Unable to change e-mail address because the given address is " @@ -8941,32 +9214,31 @@ "Hiba 0x%04x: Nem sikerült megváltoztatni az e-mail címet, mert a megadott " "cím érvénytelen." -#: ../libpurple/protocols/oscar/oscar.c:4023 +#: ../libpurple/protocols/oscar/oscar.c:4038 #, c-format msgid "Error 0x%04x: Unknown error." msgstr "Hiba 0x%04x: Ismeretlen hiba." -#: ../libpurple/protocols/oscar/oscar.c:4033 +#: ../libpurple/protocols/oscar/oscar.c:4048 #, c-format msgid "The e-mail address for %s is %s" msgstr "%s e-mail címe a következő: %s" -#: ../libpurple/protocols/oscar/oscar.c:4035 +#: ../libpurple/protocols/oscar/oscar.c:4050 msgid "Account Info" msgstr "Fiókinformációk" -#: ../libpurple/protocols/oscar/oscar.c:4218 -msgid "" -"Your IM Image was not sent. You must be Direct Connected to send IM Images." +#: ../libpurple/protocols/oscar/oscar.c:4233 +msgid "Your IM Image was not sent. You must be Direct Connected to send IM Images." msgstr "" "Az Ön IM képe nem lett elküldve. IM képek küldéséhez közvetlen kapcsolatban " "kell lennie." -#: ../libpurple/protocols/oscar/oscar.c:4489 +#: ../libpurple/protocols/oscar/oscar.c:4504 msgid "Unable to set AIM profile." msgstr "Nem lehet beállítani az AIM profilt." -#: ../libpurple/protocols/oscar/oscar.c:4490 +#: ../libpurple/protocols/oscar/oscar.c:4505 msgid "" "You have probably requested to set your profile before the login procedure " "completed. Your profile remains unset; try setting it again when you are " @@ -8976,7 +9248,7 @@ "beállítani a profilt. Próbálja újra beállítani, ha a bejelentkezés már " "megtörtént." -#: ../libpurple/protocols/oscar/oscar.c:4504 +#: ../libpurple/protocols/oscar/oscar.c:4519 #, c-format msgid "" "The maximum profile length of %d byte has been exceeded. It has been " @@ -8984,16 +9256,14 @@ msgid_plural "" "The maximum profile length of %d bytes has been exceeded. It has been " "truncated for you." -msgstr[0] "" -"A profil mérete túllépte a maximális %d bájtot. Ez csonkításra került." -msgstr[1] "" -"A profil mérete túllépte a maximális %d bájtot. Ez csonkításra került." - -#: ../libpurple/protocols/oscar/oscar.c:4509 +msgstr[0] "A profil mérete túllépte a maximális %d bájtot. Ez csonkításra került." +msgstr[1] "A profil mérete túllépte a maximális %d bájtot. Ez csonkításra került." + +#: ../libpurple/protocols/oscar/oscar.c:4524 msgid "Profile too long." msgstr "A profil túl hosszú." -#: ../libpurple/protocols/oscar/oscar.c:4554 +#: ../libpurple/protocols/oscar/oscar.c:4569 #, c-format msgid "" "The maximum away message length of %d byte has been exceeded. It has been " @@ -9008,11 +9278,11 @@ "A távollét üzenet hossza túllépte a maximális %d bájtot. Ez csonkításra " "került." -#: ../libpurple/protocols/oscar/oscar.c:4559 +#: ../libpurple/protocols/oscar/oscar.c:4574 msgid "Away message too long." msgstr "A távollét-üzenet túl hosszú." -#: ../libpurple/protocols/oscar/oscar.c:4628 +#: ../libpurple/protocols/oscar/oscar.c:4647 #, c-format msgid "" "Could not add the buddy %s because the screen name is invalid. Screen names " @@ -9024,34 +9294,34 @@ "kezdődniük, és betűket, számokat és szóközöket, vagy csak számokból " "állhatnak." -#: ../libpurple/protocols/oscar/oscar.c:4630 -#: ../libpurple/protocols/oscar/oscar.c:5060 -#: ../libpurple/protocols/oscar/oscar.c:5075 +#: ../libpurple/protocols/oscar/oscar.c:4649 +#: ../libpurple/protocols/oscar/oscar.c:5102 +#: ../libpurple/protocols/oscar/oscar.c:5117 msgid "Unable To Add" msgstr "Nem sikerült felvenni" -#: ../libpurple/protocols/oscar/oscar.c:4739 +#: ../libpurple/protocols/oscar/oscar.c:4768 msgid "Unable To Retrieve Buddy List" msgstr "Nem lehet lekérni a partnerek listáját" -#: ../libpurple/protocols/oscar/oscar.c:4740 +#: ../libpurple/protocols/oscar/oscar.c:4769 msgid "" "The AIM servers were temporarily unable to send your buddy list. Your buddy " -"list is not lost, and will probably become available in a few hours." +"list is not lost, and will probably become available in a few minutes." msgstr "" "Az AIM kiszolgálók ideiglenesen nem tudták elküldeni a partnerlistáját. A " -"partnerlistája nem veszett el és néhány órán belül valószínűleg elérhetővé " +"partnerlistája nem veszett el és néhány percen belül valószínűleg elérhetővé " "válik." -#: ../libpurple/protocols/oscar/oscar.c:4922 -#: ../libpurple/protocols/oscar/oscar.c:4924 -#: ../libpurple/protocols/oscar/oscar.c:5140 -#: ../libpurple/protocols/oscar/oscar.c:5141 -#: ../libpurple/protocols/oscar/oscar.c:5146 +#: ../libpurple/protocols/oscar/oscar.c:4952 +#: ../libpurple/protocols/oscar/oscar.c:4954 +#: ../libpurple/protocols/oscar/oscar.c:5182 +#: ../libpurple/protocols/oscar/oscar.c:5183 +#: ../libpurple/protocols/oscar/oscar.c:5188 msgid "Orphans" msgstr "Árvák" -#: ../libpurple/protocols/oscar/oscar.c:5058 +#: ../libpurple/protocols/oscar/oscar.c:5100 #, c-format msgid "" "Could not add the buddy %s because you have too many buddies in your buddy " @@ -9060,17 +9330,17 @@ "%s partnert nem lehet felvenni, mert túl sok partner van a partnerlistáján. " "Kérem töröljön egyet közülük és próbálja meg újra." -#: ../libpurple/protocols/oscar/oscar.c:5058 -#: ../libpurple/protocols/oscar/oscar.c:5073 +#: ../libpurple/protocols/oscar/oscar.c:5100 +#: ../libpurple/protocols/oscar/oscar.c:5115 msgid "(no name)" msgstr "(nincs név)" -#: ../libpurple/protocols/oscar/oscar.c:5072 +#: ../libpurple/protocols/oscar/oscar.c:5114 #, c-format msgid "Could not add the buddy %s for an unknown reason." msgstr "A(z) %s partner ismeretlen ok miatt nem adható hozzá." -#: ../libpurple/protocols/oscar/oscar.c:5178 +#: ../libpurple/protocols/oscar/oscar.c:5231 #, c-format msgid "" "The user %s has given you permission to add you to their buddy list. Do you " @@ -9079,22 +9349,22 @@ "%s felhasználó megadta az engedélyt, hogy felvegye őt a partnerei közé. Fel " "akarja venni őt?" -#: ../libpurple/protocols/oscar/oscar.c:5186 +#: ../libpurple/protocols/oscar/oscar.c:5239 msgid "Authorization Given" msgstr "Engedély megadva" #. Granted -#: ../libpurple/protocols/oscar/oscar.c:5259 +#: ../libpurple/protocols/oscar/oscar.c:5312 #, c-format msgid "The user %s has granted your request to add them to your buddy list." msgstr "%s felhasználó engedélyezi, hogy felvegye őt a partnerei közé." -#: ../libpurple/protocols/oscar/oscar.c:5260 +#: ../libpurple/protocols/oscar/oscar.c:5313 msgid "Authorization Granted" msgstr "Engedély kiadva" #. Denied -#: ../libpurple/protocols/oscar/oscar.c:5263 +#: ../libpurple/protocols/oscar/oscar.c:5316 #, c-format msgid "" "The user %s has denied your request to add them to your buddy list for the " @@ -9105,52 +9375,51 @@ "következő indoklással:\n" "%s" -#: ../libpurple/protocols/oscar/oscar.c:5264 +#: ../libpurple/protocols/oscar/oscar.c:5317 msgid "Authorization Denied" msgstr "Engedély elutasítva" -#: ../libpurple/protocols/oscar/oscar.c:5300 +#: ../libpurple/protocols/oscar/oscar.c:5353 #: ../libpurple/protocols/toc/toc.c:1371 msgid "_Exchange:" msgstr "_Váltás:" -#: ../libpurple/protocols/oscar/oscar.c:5340 +#: ../libpurple/protocols/oscar/oscar.c:5393 msgid "Invalid chat name specified." msgstr "A megadott csevegésnév érvénytelen." -#: ../libpurple/protocols/oscar/oscar.c:5409 +#: ../libpurple/protocols/oscar/oscar.c:5462 msgid "Your IM Image was not sent. You cannot send IM Images in AIM chats." -msgstr "" -"Az Ön IM képe nem lett elküldve. Nem küldhet IM képeket AIM csevegésekbe." - -#: ../libpurple/protocols/oscar/oscar.c:5569 -#: ../libpurple/protocols/oscar/oscar.c:5574 +msgstr "Az Ön IM képe nem lett elküldve. Nem küldhet IM képeket AIM csevegésekbe." + +#: ../libpurple/protocols/oscar/oscar.c:5624 +#: ../libpurple/protocols/oscar/oscar.c:5629 msgid "Away Message" msgstr "Távol üzenet" -#: ../libpurple/protocols/oscar/oscar.c:5574 +#: ../libpurple/protocols/oscar/oscar.c:5629 msgid "<i>(retrieving)</i>" msgstr "<i>(lekérés)</i>" -#: ../libpurple/protocols/oscar/oscar.c:5774 +#: ../libpurple/protocols/oscar/oscar.c:5829 msgid "iTunes Music Store Link" msgstr "iTunes zenebolt hivatkozás" -#: ../libpurple/protocols/oscar/oscar.c:5882 +#: ../libpurple/protocols/oscar/oscar.c:5937 #, c-format msgid "Buddy Comment for %s" msgstr "%s partnermegjegyzése" -#: ../libpurple/protocols/oscar/oscar.c:5883 +#: ../libpurple/protocols/oscar/oscar.c:5938 msgid "Buddy Comment:" msgstr "Partnermegjegyzés:" -#: ../libpurple/protocols/oscar/oscar.c:5930 +#: ../libpurple/protocols/oscar/oscar.c:5985 #, c-format msgid "You have selected to open a Direct IM connection with %s." msgstr "Közvetlen kapcsolat nyitását választotta %s partnerrel." -#: ../libpurple/protocols/oscar/oscar.c:5934 +#: ../libpurple/protocols/oscar/oscar.c:5989 msgid "" "Because this reveals your IP address, it may be considered a security risk. " "Do you wish to continue?" @@ -9158,66 +9427,66 @@ "Mivel ezzel láthatóvá válik az IP címe, ez kezelhető biztonsági " "kockázatként. Folytatni kívánja?" -#: ../libpurple/protocols/oscar/oscar.c:5940 -#: ../libpurple/protocols/oscar/peer.c:1045 +#: ../libpurple/protocols/oscar/oscar.c:5995 +#: ../libpurple/protocols/oscar/peer.c:1047 msgid "C_onnect" msgstr "Kapcs_olódás" -#: ../libpurple/protocols/oscar/oscar.c:5975 +#: ../libpurple/protocols/oscar/oscar.c:6030 msgid "Get AIM Info" msgstr "AIM információk lekérése" -#: ../libpurple/protocols/oscar/oscar.c:5981 +#: ../libpurple/protocols/oscar/oscar.c:6036 msgid "Edit Buddy Comment" msgstr "Partnermegjegyzés szerkesztése" -#: ../libpurple/protocols/oscar/oscar.c:5989 +#: ../libpurple/protocols/oscar/oscar.c:6044 msgid "Get Status Msg" msgstr "Állapotüzenet lekérése" -#: ../libpurple/protocols/oscar/oscar.c:6002 +#: ../libpurple/protocols/oscar/oscar.c:6057 msgid "Direct IM" msgstr "Közvetlen IM" -#: ../libpurple/protocols/oscar/oscar.c:6024 +#: ../libpurple/protocols/oscar/oscar.c:6079 msgid "Re-request Authorization" msgstr "Engedélyezés újrakérése" -#: ../libpurple/protocols/oscar/oscar.c:6083 +#: ../libpurple/protocols/oscar/oscar.c:6138 msgid "Require authorization" msgstr "Engedélyezés kérése" -#: ../libpurple/protocols/oscar/oscar.c:6086 +#: ../libpurple/protocols/oscar/oscar.c:6141 msgid "Web aware (enabling this will cause you to receive SPAM!)" msgstr "A weben ismert (ennek engedélyezése után SPAM-et fog kapni!)" -#: ../libpurple/protocols/oscar/oscar.c:6091 +#: ../libpurple/protocols/oscar/oscar.c:6146 msgid "ICQ Privacy Options" msgstr "ICQ magánszféra beállításai" -#: ../libpurple/protocols/oscar/oscar.c:6110 +#: ../libpurple/protocols/oscar/oscar.c:6165 msgid "The new formatting is invalid." msgstr "Az új formázás érvénytelen." -#: ../libpurple/protocols/oscar/oscar.c:6111 +#: ../libpurple/protocols/oscar/oscar.c:6166 msgid "Screen name formatting can change only capitalization and whitespace." msgstr "" "A felhasználónév formázása csak a kis/nagybetűsséget és az üreshely " "karaktereket változtathatja meg." -#: ../libpurple/protocols/oscar/oscar.c:6164 +#: ../libpurple/protocols/oscar/oscar.c:6219 msgid "Change Address To:" msgstr "Cím megváltoztatása a következőre:" -#: ../libpurple/protocols/oscar/oscar.c:6210 +#: ../libpurple/protocols/oscar/oscar.c:6265 msgid "<i>you are not waiting for authorization</i>" msgstr "<i>Ön nem vár engedélyezésre</i>" -#: ../libpurple/protocols/oscar/oscar.c:6213 +#: ../libpurple/protocols/oscar/oscar.c:6268 msgid "You are awaiting authorization from the following buddies" msgstr "A következő partnerektől vár engedélyezésre" -#: ../libpurple/protocols/oscar/oscar.c:6214 +#: ../libpurple/protocols/oscar/oscar.c:6269 msgid "" "You can re-request authorization from these buddies by right-clicking on " "them and selecting \"Re-request Authorization.\"" @@ -9225,73 +9494,73 @@ "Újra kérheti engedélyezést ezektől a partnerektől a jobb egérgombbal " "kattintva a nevükön, és az \"Engedélyezés újra kérése\" választásával" -#: ../libpurple/protocols/oscar/oscar.c:6231 +#: ../libpurple/protocols/oscar/oscar.c:6286 msgid "Find Buddy by E-Mail" msgstr "Partnerek keresése e-mail cím szerint" -#: ../libpurple/protocols/oscar/oscar.c:6232 +#: ../libpurple/protocols/oscar/oscar.c:6287 msgid "Search for a buddy by e-mail address" msgstr "Partner keresése e-mail cím alapján" -#: ../libpurple/protocols/oscar/oscar.c:6233 +#: ../libpurple/protocols/oscar/oscar.c:6288 msgid "Type the e-mail address of the buddy you are searching for." msgstr "Adja meg annak a partnernek az e-mail címét, akit keres." -#: ../libpurple/protocols/oscar/oscar.c:6236 +#: ../libpurple/protocols/oscar/oscar.c:6291 msgid "_Search" msgstr "_Keresés" -#: ../libpurple/protocols/oscar/oscar.c:6394 +#: ../libpurple/protocols/oscar/oscar.c:6449 msgid "Set User Info (URL)..." msgstr "Felhasználói információk beállítása (URL)..." -#: ../libpurple/protocols/oscar/oscar.c:6405 +#: ../libpurple/protocols/oscar/oscar.c:6460 msgid "Change Password (URL)" msgstr "Jelszó megváltoztatása (URL)" -#: ../libpurple/protocols/oscar/oscar.c:6409 +#: ../libpurple/protocols/oscar/oscar.c:6464 msgid "Configure IM Forwarding (URL)" msgstr "Üzenettovábbítás beállítása (URL)" #. ICQ actions -#: ../libpurple/protocols/oscar/oscar.c:6419 +#: ../libpurple/protocols/oscar/oscar.c:6474 msgid "Set Privacy Options..." msgstr "Magánszféra-beállítások..." #. AIM actions -#: ../libpurple/protocols/oscar/oscar.c:6426 +#: ../libpurple/protocols/oscar/oscar.c:6481 msgid "Confirm Account" msgstr "Fiók jóváhagyása" -#: ../libpurple/protocols/oscar/oscar.c:6430 +#: ../libpurple/protocols/oscar/oscar.c:6485 msgid "Display Currently Registered E-Mail Address" msgstr "A jelenleg regisztrált e-mail cím megjelenítése" -#: ../libpurple/protocols/oscar/oscar.c:6434 +#: ../libpurple/protocols/oscar/oscar.c:6489 msgid "Change Currently Registered E-Mail Address..." msgstr "A jelenleg regisztrált e-mail cím megváltoztatása..." -#: ../libpurple/protocols/oscar/oscar.c:6441 +#: ../libpurple/protocols/oscar/oscar.c:6496 msgid "Show Buddies Awaiting Authorization" msgstr "Engedélyezésre váró partnerek megjelenítése" -#: ../libpurple/protocols/oscar/oscar.c:6447 +#: ../libpurple/protocols/oscar/oscar.c:6502 msgid "Search for Buddy by E-Mail Address..." msgstr "Partner keresése e-mail cím szerint..." -#: ../libpurple/protocols/oscar/oscar.c:6452 +#: ../libpurple/protocols/oscar/oscar.c:6507 msgid "Search for Buddy by Information" msgstr "Partner keresése információ alapján" -#: ../libpurple/protocols/oscar/oscar.c:6520 +#: ../libpurple/protocols/oscar/oscar.c:6575 msgid "Use recent buddies group" msgstr "A legutóbbi partnerek csoport használata" -#: ../libpurple/protocols/oscar/oscar.c:6523 +#: ../libpurple/protocols/oscar/oscar.c:6578 msgid "Show how long you have been idle" msgstr "Megjeleníti, meddig volt inaktív" -#: ../libpurple/protocols/oscar/oscar.c:6678 +#: ../libpurple/protocols/oscar/oscar.c:6733 msgid "" "Always use ICQ proxy server for file transfers\n" "(slower, but does not reveal your IP address)" @@ -9299,28 +9568,27 @@ "Mindig az ICQ proxy kiszolgáló használata fájlátvitelhez\n" "(lassabb, de nem jeleníti meg az IP címet)" -#: ../libpurple/protocols/oscar/peer.c:697 +#: ../libpurple/protocols/oscar/peer.c:699 #, c-format msgid "Asking %s to connect to us at %s:%hu for Direct IM." -msgstr "" -"%s felkérése, hogy kapcsolódjon hozzánk ezen: %s:%hu közvetlen kapcsolattal." - -#: ../libpurple/protocols/oscar/peer.c:782 +msgstr "%s felkérése, hogy kapcsolódjon hozzánk ezen: %s:%hu közvetlen kapcsolattal." + +#: ../libpurple/protocols/oscar/peer.c:784 #, c-format msgid "Attempting to connect to %s:%hu." msgstr "Kapcsolódási kísérlet a következőhöz: %s:%hu." -#: ../libpurple/protocols/oscar/peer.c:856 +#: ../libpurple/protocols/oscar/peer.c:858 #, c-format msgid "Attempting to connect via proxy server." msgstr "Kapcsolódási kísérlet proxy kiszolgálón keresztül." -#: ../libpurple/protocols/oscar/peer.c:1033 +#: ../libpurple/protocols/oscar/peer.c:1035 #, c-format msgid "%s has just asked to directly connect to %s" msgstr "%s felkérte a közvetlen kapcsolatra a következőhöz: %s" -#: ../libpurple/protocols/oscar/peer.c:1037 +#: ../libpurple/protocols/oscar/peer.c:1039 msgid "" "This requires a direct connection between the two computers and is necessary " "for IM Images. Because your IP address will be revealed, this may be " @@ -9482,20 +9750,20 @@ msgid "Other" msgstr "Egyéb" -#: ../libpurple/protocols/qq/buddy_info.c:481 -#: ../libpurple/protocols/qq/buddy_info.c:482 +#: ../libpurple/protocols/qq/buddy_info.c:522 +#: ../libpurple/protocols/qq/buddy_info.c:523 msgid "Modify my information" msgstr "Információk módosítása" -#: ../libpurple/protocols/qq/buddy_info.c:483 +#: ../libpurple/protocols/qq/buddy_info.c:524 msgid "Update my information" msgstr "Információk frissítése" -#: ../libpurple/protocols/qq/buddy_info.c:507 +#: ../libpurple/protocols/qq/buddy_info.c:548 msgid "Your information has been updated" msgstr "Információi frissítve lettek" -#: ../libpurple/protocols/qq/buddy_info.c:560 +#: ../libpurple/protocols/qq/buddy_info.c:601 #, c-format msgid "" "Setting custom faces is not currently supported. Please choose an image from " @@ -9504,8 +9772,8 @@ "Az egyéni arcképek beállítása jelenleg nem támogatott. Válasszon egy képet " "innen: %s." -#: ../libpurple/protocols/qq/buddy_info.c:577 -#: ../libpurple/protocols/qq/buddy_info.c:590 +#: ../libpurple/protocols/qq/buddy_info.c:618 +#: ../libpurple/protocols/qq/buddy_info.c:631 msgid "Invalid QQ Face" msgstr "Érvénytelen QQ arckép" @@ -9776,7 +10044,7 @@ msgid "Error requesting login token" msgstr "Hiba a bejelentkezési jelsor lekérésekor" -#: ../libpurple/protocols/qq/login_logout.c:486 +#: ../libpurple/protocols/qq/login_logout.c:488 msgid "Unable to login, check debug log" msgstr "Nem lehet bejelentkezni, nézze meg a hibakeresési naplót" @@ -10034,8 +10302,7 @@ #: ../libpurple/protocols/sametime/sametime.c:1645 #, c-format -msgid "" -"A Sametime administrator has issued the following announcement on server %s" +msgid "A Sametime administrator has issued the following announcement on server %s" msgstr "" "Egy Sametime adminisztrátor a következő bejelentést adta ki a(z) %s " "kiszolgálón" @@ -10048,61 +10315,61 @@ msgid "Connection reset" msgstr "Kapcsolat visszaállítva" -#: ../libpurple/protocols/sametime/sametime.c:1709 +#: ../libpurple/protocols/sametime/sametime.c:1710 #, c-format msgid "Error reading from socket: %s" msgstr "Hiba a foglalatból olvasás közben: %s" #. this is a regular connect, error out -#: ../libpurple/protocols/sametime/sametime.c:1732 -#: ../libpurple/protocols/sametime/sametime.c:3726 +#: ../libpurple/protocols/sametime/sametime.c:1733 +#: ../libpurple/protocols/sametime/sametime.c:3727 msgid "Unable to connect to host" msgstr "Nem lehet a kiszolgálóhoz kapcsolódni." -#: ../libpurple/protocols/sametime/sametime.c:1770 +#: ../libpurple/protocols/sametime/sametime.c:1771 #, c-format msgid "Announcement from %s" msgstr "Bejelentés a következőtől: %s" -#: ../libpurple/protocols/sametime/sametime.c:1944 +#: ../libpurple/protocols/sametime/sametime.c:1945 msgid "Conference Closed" msgstr "A konferencia lezárva" -#: ../libpurple/protocols/sametime/sametime.c:2403 +#: ../libpurple/protocols/sametime/sametime.c:2404 msgid "Unable to send message: " msgstr "Az üzenet nem küldhető el: " -#: ../libpurple/protocols/sametime/sametime.c:2959 +#: ../libpurple/protocols/sametime/sametime.c:2960 msgid "Place Closed" msgstr "Hely lezárva" -#: ../libpurple/protocols/sametime/sametime.c:3229 +#: ../libpurple/protocols/sametime/sametime.c:3230 msgid "Microphone" msgstr "Mikrofon" -#: ../libpurple/protocols/sametime/sametime.c:3230 +#: ../libpurple/protocols/sametime/sametime.c:3231 msgid "Speakers" msgstr "Hangszórók" -#: ../libpurple/protocols/sametime/sametime.c:3231 +#: ../libpurple/protocols/sametime/sametime.c:3232 msgid "Video Camera" msgstr "Videokamera" -#: ../libpurple/protocols/sametime/sametime.c:3269 -#: ../libpurple/protocols/sametime/sametime.c:4145 +#: ../libpurple/protocols/sametime/sametime.c:3270 +#: ../libpurple/protocols/sametime/sametime.c:4146 msgid "Supports" msgstr "Támogatja" -#: ../libpurple/protocols/sametime/sametime.c:3274 -#: ../libpurple/protocols/sametime/sametime.c:4119 +#: ../libpurple/protocols/sametime/sametime.c:3275 +#: ../libpurple/protocols/sametime/sametime.c:4120 msgid "External User" msgstr "Külső felhasználó" -#: ../libpurple/protocols/sametime/sametime.c:3380 +#: ../libpurple/protocols/sametime/sametime.c:3381 msgid "Create conference with user" msgstr "Konferencia létrehozása a következő felhasználóval" -#: ../libpurple/protocols/sametime/sametime.c:3381 +#: ../libpurple/protocols/sametime/sametime.c:3382 #, c-format msgid "" "Please enter a topic for the new conference, and an invitation message to be " @@ -10111,27 +10378,27 @@ "Adja meg az új konferencia témáját és a(z) %s számára elküldendő " "meghívóüzenetet." -#: ../libpurple/protocols/sametime/sametime.c:3385 +#: ../libpurple/protocols/sametime/sametime.c:3386 msgid "New Conference" msgstr "Új konferencia" -#: ../libpurple/protocols/sametime/sametime.c:3387 +#: ../libpurple/protocols/sametime/sametime.c:3388 msgid "Create" msgstr "Létrehozás" -#: ../libpurple/protocols/sametime/sametime.c:3452 +#: ../libpurple/protocols/sametime/sametime.c:3453 msgid "Available Conferences" msgstr "Elérhető konferenciák" -#: ../libpurple/protocols/sametime/sametime.c:3458 +#: ../libpurple/protocols/sametime/sametime.c:3459 msgid "Create New Conference..." msgstr "Új konferencia létrehozása..." -#: ../libpurple/protocols/sametime/sametime.c:3465 +#: ../libpurple/protocols/sametime/sametime.c:3466 msgid "Invite user to a conference" msgstr "Felhasználó meghívása konferenciára" -#: ../libpurple/protocols/sametime/sametime.c:3466 +#: ../libpurple/protocols/sametime/sametime.c:3467 #, c-format msgid "" "Select a conference from the list below to send an invite to user %s. Select " @@ -10142,27 +10409,27 @@ "felhasználónak. Válassza az \"Új konferencia létrehozása\" gombot, ha új " "konferenciát kíván létrehozni, amelyre meghívja a felhasználót." -#: ../libpurple/protocols/sametime/sametime.c:3471 +#: ../libpurple/protocols/sametime/sametime.c:3472 msgid "Invite to Conference" msgstr "Meghívás konferenciára" -#: ../libpurple/protocols/sametime/sametime.c:3562 +#: ../libpurple/protocols/sametime/sametime.c:3563 msgid "Invite to Conference..." msgstr "Meghívás konferenciára..." -#: ../libpurple/protocols/sametime/sametime.c:3567 +#: ../libpurple/protocols/sametime/sametime.c:3568 msgid "Send TEST Announcement" msgstr "TESZT bejelentés küldése" -#: ../libpurple/protocols/sametime/sametime.c:3586 ../pidgin/gtkconv.c:4354 +#: ../libpurple/protocols/sametime/sametime.c:3587 ../pidgin/gtkconv.c:4437 msgid "Topic:" msgstr "Téma:" -#: ../libpurple/protocols/sametime/sametime.c:3614 +#: ../libpurple/protocols/sametime/sametime.c:3615 msgid "No Sametime Community Server specified" msgstr "Nincs megadva Sametime közösségi kiszolgáló" -#: ../libpurple/protocols/sametime/sametime.c:3636 +#: ../libpurple/protocols/sametime/sametime.c:3637 #, c-format msgid "" "No host or IP address has been configured for the Meanwhile account %s. " @@ -10171,42 +10438,42 @@ "Nincs gép vagy IP cím megadva a(z) %s Meanwhile fiókhoz. A bejelentkezés " "folytatásához adjon meg egyet alább." -#: ../libpurple/protocols/sametime/sametime.c:3641 +#: ../libpurple/protocols/sametime/sametime.c:3642 msgid "Meanwhile Connection Setup" msgstr "Meanwhile kapcsolat beállítása" -#: ../libpurple/protocols/sametime/sametime.c:3642 +#: ../libpurple/protocols/sametime/sametime.c:3643 msgid "No Sametime Community Server Specified" msgstr "Nincs megadva Sametime közösségi kiszolgáló" -#: ../libpurple/protocols/sametime/sametime.c:3644 ../pidgin/gtkblist.c:4041 +#: ../libpurple/protocols/sametime/sametime.c:3645 ../pidgin/gtkblist.c:4389 msgid "Connect" msgstr "Kapcsolódás" -#: ../libpurple/protocols/sametime/sametime.c:4135 +#: ../libpurple/protocols/sametime/sametime.c:4136 #, c-format msgid "Unknown (0x%04x)<br>" msgstr "Ismeretlen (0x%04x)<br>" -#: ../libpurple/protocols/sametime/sametime.c:4137 +#: ../libpurple/protocols/sametime/sametime.c:4138 msgid "Last Known Client" msgstr "Utolsó ismert kliens" -#: ../libpurple/protocols/sametime/sametime.c:4301 -#: ../libpurple/protocols/sametime/sametime.c:5506 +#: ../libpurple/protocols/sametime/sametime.c:4302 +#: ../libpurple/protocols/sametime/sametime.c:5507 msgid "User Name" msgstr "Felhasználónév" -#: ../libpurple/protocols/sametime/sametime.c:4304 -#: ../libpurple/protocols/sametime/sametime.c:5509 +#: ../libpurple/protocols/sametime/sametime.c:4305 +#: ../libpurple/protocols/sametime/sametime.c:5510 msgid "Sametime ID" msgstr "Sametime azonosító" -#: ../libpurple/protocols/sametime/sametime.c:4328 +#: ../libpurple/protocols/sametime/sametime.c:4329 msgid "An ambiguous user ID was entered" msgstr "Kétértelmű felhasználói azonosító került megadásra" -#: ../libpurple/protocols/sametime/sametime.c:4329 +#: ../libpurple/protocols/sametime/sametime.c:4330 #, c-format msgid "" "The identifier '%s' may possibly refer to any of the following users. Please " @@ -10215,15 +10482,15 @@ "A(z) %s azonosító az alábbi felhasználók bármelyikére hivatkozhat. Válassza " "ki a partnerlistához adandó megfelelő felhasználót az alábbi listából." -#: ../libpurple/protocols/sametime/sametime.c:4334 +#: ../libpurple/protocols/sametime/sametime.c:4335 msgid "Select User" msgstr "Válasszon felhasználót" -#: ../libpurple/protocols/sametime/sametime.c:4418 +#: ../libpurple/protocols/sametime/sametime.c:4419 msgid "Unable to add user: user not found" msgstr "A felhasználó nem vehető fel: a felhasználó nem található" -#: ../libpurple/protocols/sametime/sametime.c:4420 +#: ../libpurple/protocols/sametime/sametime.c:4421 #, c-format msgid "" "The identifier '%s' did not match any users in your Sametime community. This " @@ -10232,11 +10499,7 @@ "A(z) \"%s\" azonosító nem található meg a Sametime közösségben. Ez a " "bejegyzés eltávolításra került a partnerlistájából." -#: ../libpurple/protocols/sametime/sametime.c:4425 -msgid "Unable to add user" -msgstr "Nem vehető fel a felhasználó" - -#: ../libpurple/protocols/sametime/sametime.c:5011 +#: ../libpurple/protocols/sametime/sametime.c:5012 #, c-format msgid "" "Error reading file %s: \n" @@ -10245,63 +10508,63 @@ "Hiba a(z) %s fájl olvasásakor: \n" "%s.\n" -#: ../libpurple/protocols/sametime/sametime.c:5146 +#: ../libpurple/protocols/sametime/sametime.c:5147 msgid "Remotely Stored Buddy List" msgstr "Távol tárolt partnerlista" -#: ../libpurple/protocols/sametime/sametime.c:5151 +#: ../libpurple/protocols/sametime/sametime.c:5152 msgid "Buddy List Storage Mode" msgstr "Partnerlista tárolási módja" -#: ../libpurple/protocols/sametime/sametime.c:5154 +#: ../libpurple/protocols/sametime/sametime.c:5155 msgid "Local Buddy List Only" msgstr "Csak helyi partnerlista" -#: ../libpurple/protocols/sametime/sametime.c:5156 +#: ../libpurple/protocols/sametime/sametime.c:5157 msgid "Merge List from Server" msgstr "Partnerlista összefésülése a kiszolgálóról" -#: ../libpurple/protocols/sametime/sametime.c:5158 +#: ../libpurple/protocols/sametime/sametime.c:5159 msgid "Merge and Save List to Server" msgstr "Lista összefésülése a kiszolgálóról és mentés oda" -#: ../libpurple/protocols/sametime/sametime.c:5160 +#: ../libpurple/protocols/sametime/sametime.c:5161 msgid "Synchronize List with Server" msgstr "Lista szinkronizálása a kiszolgálóval" -#: ../libpurple/protocols/sametime/sametime.c:5215 +#: ../libpurple/protocols/sametime/sametime.c:5216 #, c-format msgid "Import Sametime List for Account %s" msgstr "A(z) %s fiók Sametime listájának importálása" -#: ../libpurple/protocols/sametime/sametime.c:5255 +#: ../libpurple/protocols/sametime/sametime.c:5256 #, c-format msgid "Export Sametime List for Account %s" msgstr "A(z) %s fiók Sametime listájának exportálása" -#: ../libpurple/protocols/sametime/sametime.c:5309 +#: ../libpurple/protocols/sametime/sametime.c:5310 msgid "Unable to add group: group exists" msgstr "A csoport nem vehető fel: a csoport már létezik" -#: ../libpurple/protocols/sametime/sametime.c:5310 +#: ../libpurple/protocols/sametime/sametime.c:5311 #, c-format msgid "A group named '%s' already exists in your buddy list." msgstr "Már létezik \"%s\" nevű csoport a partnerlistán." -#: ../libpurple/protocols/sametime/sametime.c:5313 -#: ../libpurple/protocols/sametime/sametime.c:5443 +#: ../libpurple/protocols/sametime/sametime.c:5314 +#: ../libpurple/protocols/sametime/sametime.c:5444 msgid "Unable to add group" msgstr "Nem vehető fel a csoport" -#: ../libpurple/protocols/sametime/sametime.c:5372 +#: ../libpurple/protocols/sametime/sametime.c:5373 msgid "Possible Matches" msgstr "Lehetséges találatok" -#: ../libpurple/protocols/sametime/sametime.c:5388 +#: ../libpurple/protocols/sametime/sametime.c:5389 msgid "Notes Address Book group results" msgstr "Notes címjegyzék csoporteredmények" -#: ../libpurple/protocols/sametime/sametime.c:5389 +#: ../libpurple/protocols/sametime/sametime.c:5390 #, c-format msgid "" "The identifier '%s' may possibly refer to any of the following Notes Address " @@ -10312,15 +10575,15 @@ "hivatkozhat. Válassza ki a partnerlistához adandó megfelelő csoportot az " "alábbi listából." -#: ../libpurple/protocols/sametime/sametime.c:5394 +#: ../libpurple/protocols/sametime/sametime.c:5395 msgid "Select Notes Address Book" msgstr "Válasszon Notes címjegyzéket" -#: ../libpurple/protocols/sametime/sametime.c:5437 +#: ../libpurple/protocols/sametime/sametime.c:5438 msgid "Unable to add group: group not found" msgstr "Nem vehető fel a csoport: a csoport nem található" -#: ../libpurple/protocols/sametime/sametime.c:5439 +#: ../libpurple/protocols/sametime/sametime.c:5440 #, c-format msgid "" "The identifier '%s' did not match any Notes Address Book groups in your " @@ -10329,11 +10592,11 @@ "A(z) \"%s\" azonosító a Sametime közösség egyetlen Notes " "címjegyzékcsoportjának sem felelt meg." -#: ../libpurple/protocols/sametime/sametime.c:5480 +#: ../libpurple/protocols/sametime/sametime.c:5481 msgid "Notes Address Book Group" msgstr "Notes címjegyzékcsoport" -#: ../libpurple/protocols/sametime/sametime.c:5481 +#: ../libpurple/protocols/sametime/sametime.c:5482 msgid "" "Enter the name of a Notes Address Book group in the field below to add the " "group and its members to your buddy list." @@ -10341,12 +10604,12 @@ "Az alábbi mezőben adja meg a Notes címjegyzékcsoport nevét, amelyet " "tagjaival együtt fel kíván venni a partnerlistájára." -#: ../libpurple/protocols/sametime/sametime.c:5530 +#: ../libpurple/protocols/sametime/sametime.c:5531 #, c-format msgid "Search results for '%s'" msgstr "\"%s\" keresésének eredménye" -#: ../libpurple/protocols/sametime/sametime.c:5531 +#: ../libpurple/protocols/sametime/sametime.c:5532 #, c-format msgid "" "The identifier '%s' may possibly refer to any of the following users. You " @@ -10357,30 +10620,30 @@ "partnerlistájára ezeket felhasználókat, vagy üzeneteket küldhet nekik az " "alábbi műveletgombokkal." -#: ../libpurple/protocols/sametime/sametime.c:5538 ../pidgin/gtknotify.c:756 +#: ../libpurple/protocols/sametime/sametime.c:5539 ../pidgin/gtknotify.c:763 msgid "Search Results" msgstr "A keresés eredménye" -#: ../libpurple/protocols/sametime/sametime.c:5563 +#: ../libpurple/protocols/sametime/sametime.c:5564 msgid "No matches" msgstr "Nincs találat" -#: ../libpurple/protocols/sametime/sametime.c:5564 +#: ../libpurple/protocols/sametime/sametime.c:5565 #, c-format msgid "The identifier '%s' did not match any users in your Sametime community." msgstr "" "Nem található a(z) \"%s\" azonosítónak megfelelő felhasználó a Sametime " "közösségben." -#: ../libpurple/protocols/sametime/sametime.c:5568 +#: ../libpurple/protocols/sametime/sametime.c:5569 msgid "No Matches" msgstr "Nincs találat" -#: ../libpurple/protocols/sametime/sametime.c:5605 +#: ../libpurple/protocols/sametime/sametime.c:5606 msgid "Search for a user" msgstr "Felhasználó keresése" -#: ../libpurple/protocols/sametime/sametime.c:5606 +#: ../libpurple/protocols/sametime/sametime.c:5607 msgid "" "Enter a name or partial ID in the field below to search for matching users " "in your Sametime community." @@ -10388,32 +10651,32 @@ "Az alábbi mezőben adjon meg egy nevet vagy részleges azonosítót, amelyhez " "felhasználókat keres a Sametime közösségben." -#: ../libpurple/protocols/sametime/sametime.c:5609 +#: ../libpurple/protocols/sametime/sametime.c:5610 msgid "User Search" msgstr "Felhasználó keresése" -#: ../libpurple/protocols/sametime/sametime.c:5622 +#: ../libpurple/protocols/sametime/sametime.c:5623 msgid "Import Sametime List..." msgstr "Sametime lista importálása..." -#: ../libpurple/protocols/sametime/sametime.c:5626 +#: ../libpurple/protocols/sametime/sametime.c:5627 msgid "Export Sametime List..." msgstr "Sametime lista exportálása..." -#: ../libpurple/protocols/sametime/sametime.c:5630 +#: ../libpurple/protocols/sametime/sametime.c:5631 msgid "Add Notes Address Book Group..." msgstr "Notes címjegyzékcsoport hozzáadása..." -#: ../libpurple/protocols/sametime/sametime.c:5634 +#: ../libpurple/protocols/sametime/sametime.c:5635 msgid "User Search..." msgstr "Felhasználó keresése..." -#: ../libpurple/protocols/sametime/sametime.c:5740 +#: ../libpurple/protocols/sametime/sametime.c:5741 msgid "Force login (ignore server redirects)" msgstr "Bejelentkezés kényszerítése (kiszolgáló átirányítások mellőzése)" #. pretend to be Sametime Connect -#: ../libpurple/protocols/sametime/sametime.c:5750 +#: ../libpurple/protocols/sametime/sametime.c:5751 msgid "Hide client identity" msgstr "Kliens azonosságának elrejtése" @@ -10544,8 +10807,8 @@ #: ../libpurple/protocols/silc/buddy.c:496 #: ../libpurple/protocols/silc/buddy.c:507 #: ../libpurple/protocols/silc/buddy.c:540 -#: ../libpurple/protocols/silc/ops.c:1499 -#: ../libpurple/protocols/silc/ops.c:1510 +#: ../libpurple/protocols/silc/ops.c:1503 +#: ../libpurple/protocols/silc/ops.c:1514 #: ../libpurple/protocols/silc10/buddy.c:513 #: ../libpurple/protocols/silc10/buddy.c:548 #: ../libpurple/protocols/silc10/ops.c:1494 @@ -10554,8 +10817,8 @@ msgstr "Nyilvános kulcs lekérése" #: ../libpurple/protocols/silc/buddy.c:541 -#: ../libpurple/protocols/silc/ops.c:1500 -#: ../libpurple/protocols/silc/ops.c:1511 +#: ../libpurple/protocols/silc/ops.c:1504 +#: ../libpurple/protocols/silc/ops.c:1515 #: ../libpurple/protocols/silc10/buddy.c:549 #: ../libpurple/protocols/silc10/ops.c:1495 #: ../libpurple/protocols/silc10/ops.c:1506 @@ -10563,17 +10826,17 @@ msgstr "A nyilvános kulcs nem tölthető le" #: ../libpurple/protocols/silc/buddy.c:622 -#: ../libpurple/protocols/silc/buddy.c:1655 +#: ../libpurple/protocols/silc/buddy.c:1658 #: ../libpurple/protocols/silc10/buddy.c:635 -#: ../libpurple/protocols/silc10/buddy.c:1654 +#: ../libpurple/protocols/silc10/buddy.c:1657 msgid "Show Public Key" msgstr "Nyilvános kulcs megjelenítése" #: ../libpurple/protocols/silc/buddy.c:623 -#: ../libpurple/protocols/silc/buddy.c:1027 -#: ../libpurple/protocols/silc/chat.c:237 +#: ../libpurple/protocols/silc/buddy.c:1030 +#: ../libpurple/protocols/silc/chat.c:239 #: ../libpurple/protocols/silc10/buddy.c:636 -#: ../libpurple/protocols/silc10/buddy.c:1033 +#: ../libpurple/protocols/silc10/buddy.c:1036 #: ../libpurple/protocols/silc10/chat.c:237 msgid "Could not load public key" msgstr "Nem sikerült a nyilvános kulcsot betölteni" @@ -10581,9 +10844,9 @@ #: ../libpurple/protocols/silc/buddy.c:701 #: ../libpurple/protocols/silc/ops.c:1053 #: ../libpurple/protocols/silc/ops.c:1168 -#: ../libpurple/protocols/silc/ops.c:1288 -#: ../libpurple/protocols/silc/ops.c:1289 -#: ../libpurple/protocols/silc/ops.c:1307 +#: ../libpurple/protocols/silc/ops.c:1290 +#: ../libpurple/protocols/silc/ops.c:1291 +#: ../libpurple/protocols/silc/ops.c:1309 #: ../libpurple/protocols/silc10/buddy.c:713 #: ../libpurple/protocols/silc10/ops.c:1087 #: ../libpurple/protocols/silc10/ops.c:1159 @@ -10595,7 +10858,7 @@ #: ../libpurple/protocols/silc/buddy.c:702 #: ../libpurple/protocols/silc/ops.c:1169 -#: ../libpurple/protocols/silc/ops.c:1308 +#: ../libpurple/protocols/silc/ops.c:1310 #: ../libpurple/protocols/silc10/buddy.c:714 #: ../libpurple/protocols/silc10/ops.c:1160 #: ../libpurple/protocols/silc10/ops.c:1314 @@ -10619,19 +10882,19 @@ "töltheti le." #. Open file selector to select the public key. -#: ../libpurple/protocols/silc/buddy.c:1059 -#: ../libpurple/protocols/silc10/buddy.c:1067 +#: ../libpurple/protocols/silc/buddy.c:1062 +#: ../libpurple/protocols/silc10/buddy.c:1070 msgid "Open..." msgstr "Megnyitás..." -#: ../libpurple/protocols/silc/buddy.c:1070 -#: ../libpurple/protocols/silc10/buddy.c:1078 +#: ../libpurple/protocols/silc/buddy.c:1073 +#: ../libpurple/protocols/silc10/buddy.c:1081 #, c-format msgid "The %s buddy is not present in the network" msgstr "%s partner nincs jelen a hálózatban" -#: ../libpurple/protocols/silc/buddy.c:1073 -#: ../libpurple/protocols/silc10/buddy.c:1081 +#: ../libpurple/protocols/silc/buddy.c:1076 +#: ../libpurple/protocols/silc10/buddy.c:1084 msgid "" "To add the buddy you must import his/her public key. Press Import to import " "a public key." @@ -10639,18 +10902,18 @@ "Partner hozzáadásához importálnia kell a nyilvános kulcsát, ehhez kattintson " "az Importálásra." -#: ../libpurple/protocols/silc/buddy.c:1077 -#: ../libpurple/protocols/silc10/buddy.c:1085 +#: ../libpurple/protocols/silc/buddy.c:1080 +#: ../libpurple/protocols/silc10/buddy.c:1088 msgid "_Import..." msgstr "_Importálás..." -#: ../libpurple/protocols/silc/buddy.c:1183 -#: ../libpurple/protocols/silc10/buddy.c:1181 +#: ../libpurple/protocols/silc/buddy.c:1186 +#: ../libpurple/protocols/silc10/buddy.c:1184 msgid "Select correct user" msgstr "Megfelelő felhasználó kiválasztása" -#: ../libpurple/protocols/silc/buddy.c:1185 -#: ../libpurple/protocols/silc10/buddy.c:1183 +#: ../libpurple/protocols/silc/buddy.c:1188 +#: ../libpurple/protocols/silc10/buddy.c:1186 msgid "" "More than one user was found with the same public key. Select the correct " "user from the list to add to the buddy list." @@ -10658,8 +10921,8 @@ "Több felhasználó található ugyanazzal a nyilvános kulccsal. Válassza ki a " "partnerlistához adandó megfelelő felhasználót a listából." -#: ../libpurple/protocols/silc/buddy.c:1187 -#: ../libpurple/protocols/silc10/buddy.c:1185 +#: ../libpurple/protocols/silc/buddy.c:1190 +#: ../libpurple/protocols/silc10/buddy.c:1188 msgid "" "More than one user was found with the same name. Select the correct user " "from the list to add to the buddy list." @@ -10667,208 +10930,208 @@ "Több felhasználó található ugyanazzal a névvel. Válassza ki a " "partnerlistához adandó megfelelő felhasználót a listából." -#: ../libpurple/protocols/silc/buddy.c:1474 -#: ../libpurple/protocols/silc10/buddy.c:1474 +#: ../libpurple/protocols/silc/buddy.c:1477 +#: ../libpurple/protocols/silc10/buddy.c:1477 msgid "Detached" msgstr "Leválasztott" -#: ../libpurple/protocols/silc/buddy.c:1478 +#: ../libpurple/protocols/silc/buddy.c:1481 #: ../libpurple/protocols/silc/silc.c:58 -#: ../libpurple/protocols/silc10/buddy.c:1478 +#: ../libpurple/protocols/silc10/buddy.c:1481 #: ../libpurple/protocols/silc10/silc.c:49 msgid "Indisposed" msgstr "Gyengélkedik" -#: ../libpurple/protocols/silc/buddy.c:1482 +#: ../libpurple/protocols/silc/buddy.c:1485 #: ../libpurple/protocols/silc/silc.c:60 -#: ../libpurple/protocols/silc10/buddy.c:1482 +#: ../libpurple/protocols/silc10/buddy.c:1485 #: ../libpurple/protocols/silc10/silc.c:51 msgid "Wake Me Up" msgstr "Ébresszen fel" -#: ../libpurple/protocols/silc/buddy.c:1484 +#: ../libpurple/protocols/silc/buddy.c:1487 #: ../libpurple/protocols/silc/silc.c:52 -#: ../libpurple/protocols/silc10/buddy.c:1484 +#: ../libpurple/protocols/silc10/buddy.c:1487 #: ../libpurple/protocols/silc10/silc.c:43 msgid "Hyper Active" msgstr "Hiperaktív" -#: ../libpurple/protocols/silc/buddy.c:1486 -#: ../libpurple/protocols/silc10/buddy.c:1486 +#: ../libpurple/protocols/silc/buddy.c:1489 +#: ../libpurple/protocols/silc10/buddy.c:1489 msgid "Robot" msgstr "Robot" -#: ../libpurple/protocols/silc/buddy.c:1493 -#: ../libpurple/protocols/silc/silc.c:743 -#: ../libpurple/protocols/silc/util.c:516 -#: ../libpurple/protocols/silc10/buddy.c:1493 +#: ../libpurple/protocols/silc/buddy.c:1496 +#: ../libpurple/protocols/silc/silc.c:874 +#: ../libpurple/protocols/silc/util.c:520 +#: ../libpurple/protocols/silc10/buddy.c:1496 #: ../libpurple/protocols/silc10/silc.c:654 #: ../libpurple/protocols/silc10/util.c:512 msgid "Happy" msgstr "Boldog" -#: ../libpurple/protocols/silc/buddy.c:1495 -#: ../libpurple/protocols/silc/silc.c:745 -#: ../libpurple/protocols/silc/util.c:518 -#: ../libpurple/protocols/silc10/buddy.c:1495 +#: ../libpurple/protocols/silc/buddy.c:1498 +#: ../libpurple/protocols/silc/silc.c:876 +#: ../libpurple/protocols/silc/util.c:522 +#: ../libpurple/protocols/silc10/buddy.c:1498 #: ../libpurple/protocols/silc10/silc.c:656 #: ../libpurple/protocols/silc10/util.c:514 msgid "Sad" msgstr "Szomorú" -#: ../libpurple/protocols/silc/buddy.c:1497 -#: ../libpurple/protocols/silc/silc.c:747 -#: ../libpurple/protocols/silc/util.c:520 -#: ../libpurple/protocols/silc10/buddy.c:1497 +#: ../libpurple/protocols/silc/buddy.c:1500 +#: ../libpurple/protocols/silc/silc.c:878 +#: ../libpurple/protocols/silc/util.c:524 +#: ../libpurple/protocols/silc10/buddy.c:1500 #: ../libpurple/protocols/silc10/silc.c:658 #: ../libpurple/protocols/silc10/util.c:516 msgid "Angry" msgstr "Dühös" -#: ../libpurple/protocols/silc/buddy.c:1499 -#: ../libpurple/protocols/silc/silc.c:749 -#: ../libpurple/protocols/silc/util.c:522 -#: ../libpurple/protocols/silc10/buddy.c:1499 +#: ../libpurple/protocols/silc/buddy.c:1502 +#: ../libpurple/protocols/silc/silc.c:880 +#: ../libpurple/protocols/silc/util.c:526 +#: ../libpurple/protocols/silc10/buddy.c:1502 #: ../libpurple/protocols/silc10/silc.c:660 #: ../libpurple/protocols/silc10/util.c:518 msgid "Jealous" msgstr "Féltékeny" -#: ../libpurple/protocols/silc/buddy.c:1501 -#: ../libpurple/protocols/silc/silc.c:751 -#: ../libpurple/protocols/silc/util.c:524 -#: ../libpurple/protocols/silc10/buddy.c:1501 +#: ../libpurple/protocols/silc/buddy.c:1504 +#: ../libpurple/protocols/silc/silc.c:882 +#: ../libpurple/protocols/silc/util.c:528 +#: ../libpurple/protocols/silc10/buddy.c:1504 #: ../libpurple/protocols/silc10/silc.c:662 #: ../libpurple/protocols/silc10/util.c:520 msgid "Ashamed" msgstr "Megszégyenült" -#: ../libpurple/protocols/silc/buddy.c:1503 -#: ../libpurple/protocols/silc/silc.c:753 -#: ../libpurple/protocols/silc/util.c:526 -#: ../libpurple/protocols/silc10/buddy.c:1503 +#: ../libpurple/protocols/silc/buddy.c:1506 +#: ../libpurple/protocols/silc/silc.c:884 +#: ../libpurple/protocols/silc/util.c:530 +#: ../libpurple/protocols/silc10/buddy.c:1506 #: ../libpurple/protocols/silc10/silc.c:664 #: ../libpurple/protocols/silc10/util.c:522 msgid "Invincible" msgstr "Legyőzhetetlen" -#: ../libpurple/protocols/silc/buddy.c:1505 -#: ../libpurple/protocols/silc/util.c:528 -#: ../libpurple/protocols/silc10/buddy.c:1505 +#: ../libpurple/protocols/silc/buddy.c:1508 +#: ../libpurple/protocols/silc/util.c:532 +#: ../libpurple/protocols/silc10/buddy.c:1508 #: ../libpurple/protocols/silc10/util.c:524 msgid "In Love" msgstr "Szerelmes" -#: ../libpurple/protocols/silc/buddy.c:1507 -#: ../libpurple/protocols/silc/silc.c:757 -#: ../libpurple/protocols/silc/util.c:530 -#: ../libpurple/protocols/silc10/buddy.c:1507 +#: ../libpurple/protocols/silc/buddy.c:1510 +#: ../libpurple/protocols/silc/silc.c:888 +#: ../libpurple/protocols/silc/util.c:534 +#: ../libpurple/protocols/silc10/buddy.c:1510 #: ../libpurple/protocols/silc10/silc.c:668 #: ../libpurple/protocols/silc10/util.c:526 msgid "Sleepy" msgstr "Álmos" -#: ../libpurple/protocols/silc/buddy.c:1509 -#: ../libpurple/protocols/silc/silc.c:759 -#: ../libpurple/protocols/silc/util.c:532 -#: ../libpurple/protocols/silc10/buddy.c:1509 +#: ../libpurple/protocols/silc/buddy.c:1512 +#: ../libpurple/protocols/silc/silc.c:890 +#: ../libpurple/protocols/silc/util.c:536 +#: ../libpurple/protocols/silc10/buddy.c:1512 #: ../libpurple/protocols/silc10/silc.c:670 #: ../libpurple/protocols/silc10/util.c:528 msgid "Bored" msgstr "Unott" -#: ../libpurple/protocols/silc/buddy.c:1511 -#: ../libpurple/protocols/silc/silc.c:761 -#: ../libpurple/protocols/silc/util.c:534 -#: ../libpurple/protocols/silc10/buddy.c:1511 +#: ../libpurple/protocols/silc/buddy.c:1514 +#: ../libpurple/protocols/silc/silc.c:892 +#: ../libpurple/protocols/silc/util.c:538 +#: ../libpurple/protocols/silc10/buddy.c:1514 #: ../libpurple/protocols/silc10/silc.c:672 #: ../libpurple/protocols/silc10/util.c:530 msgid "Excited" msgstr "Érdeklődő" -#: ../libpurple/protocols/silc/buddy.c:1513 -#: ../libpurple/protocols/silc/silc.c:763 -#: ../libpurple/protocols/silc/util.c:536 -#: ../libpurple/protocols/silc10/buddy.c:1513 +#: ../libpurple/protocols/silc/buddy.c:1516 +#: ../libpurple/protocols/silc/silc.c:894 +#: ../libpurple/protocols/silc/util.c:540 +#: ../libpurple/protocols/silc10/buddy.c:1516 #: ../libpurple/protocols/silc10/silc.c:674 #: ../libpurple/protocols/silc10/util.c:532 msgid "Anxious" msgstr "Nyugtalan" -#: ../libpurple/protocols/silc/buddy.c:1545 +#: ../libpurple/protocols/silc/buddy.c:1548 #: ../libpurple/protocols/silc/ops.c:1207 -#: ../libpurple/protocols/silc10/buddy.c:1545 +#: ../libpurple/protocols/silc10/buddy.c:1548 #: ../libpurple/protocols/silc10/ops.c:1202 msgid "User Modes" msgstr "Felhasználói módok" -#: ../libpurple/protocols/silc/buddy.c:1562 +#: ../libpurple/protocols/silc/buddy.c:1565 #: ../libpurple/protocols/silc/ops.c:1224 -#: ../libpurple/protocols/silc10/buddy.c:1562 +#: ../libpurple/protocols/silc10/buddy.c:1565 #: ../libpurple/protocols/silc10/ops.c:1219 msgid "Preferred Contact" msgstr "Előnyben részesített kapcsolat" -#: ../libpurple/protocols/silc/buddy.c:1567 +#: ../libpurple/protocols/silc/buddy.c:1570 #: ../libpurple/protocols/silc/ops.c:1229 -#: ../libpurple/protocols/silc10/buddy.c:1567 +#: ../libpurple/protocols/silc10/buddy.c:1570 #: ../libpurple/protocols/silc10/ops.c:1224 msgid "Preferred Language" msgstr "Előnyben részesített nyelv" -#: ../libpurple/protocols/silc/buddy.c:1572 +#: ../libpurple/protocols/silc/buddy.c:1575 #: ../libpurple/protocols/silc/ops.c:1234 -#: ../libpurple/protocols/silc10/buddy.c:1572 +#: ../libpurple/protocols/silc10/buddy.c:1575 #: ../libpurple/protocols/silc10/ops.c:1229 msgid "Device" msgstr "Eszköz" -#: ../libpurple/protocols/silc/buddy.c:1577 +#: ../libpurple/protocols/silc/buddy.c:1580 #: ../libpurple/protocols/silc/ops.c:1239 -#: ../libpurple/protocols/silc10/buddy.c:1577 +#: ../libpurple/protocols/silc10/buddy.c:1580 #: ../libpurple/protocols/silc10/ops.c:1234 #: ../libpurple/protocols/silc10/silc.c:722 #: ../libpurple/protocols/silc10/silc.c:724 msgid "Timezone" msgstr "Időzóna" -#: ../libpurple/protocols/silc/buddy.c:1582 +#: ../libpurple/protocols/silc/buddy.c:1585 #: ../libpurple/protocols/silc/ops.c:1244 -#: ../libpurple/protocols/silc10/buddy.c:1582 +#: ../libpurple/protocols/silc10/buddy.c:1585 #: ../libpurple/protocols/silc10/ops.c:1239 msgid "Geolocation" msgstr "Földrajzi hely" -#: ../libpurple/protocols/silc/buddy.c:1638 -#: ../libpurple/protocols/silc10/buddy.c:1636 +#: ../libpurple/protocols/silc/buddy.c:1641 +#: ../libpurple/protocols/silc10/buddy.c:1639 msgid "Reset IM Key" msgstr "Azonnali üzenőkulcs visszaállítása" -#: ../libpurple/protocols/silc/buddy.c:1643 -#: ../libpurple/protocols/silc10/buddy.c:1642 +#: ../libpurple/protocols/silc/buddy.c:1646 +#: ../libpurple/protocols/silc10/buddy.c:1645 msgid "IM with Key Exchange" msgstr "Azonnali üzenet kulcscserével" -#: ../libpurple/protocols/silc/buddy.c:1648 -#: ../libpurple/protocols/silc10/buddy.c:1647 +#: ../libpurple/protocols/silc/buddy.c:1651 +#: ../libpurple/protocols/silc10/buddy.c:1650 msgid "IM with Password" msgstr "Azonnali üzenet jelszóval" -#: ../libpurple/protocols/silc/buddy.c:1661 -#: ../libpurple/protocols/silc10/buddy.c:1660 +#: ../libpurple/protocols/silc/buddy.c:1664 +#: ../libpurple/protocols/silc10/buddy.c:1663 msgid "Get Public Key..." msgstr "Nyilvános kulcs letöltése..." -#: ../libpurple/protocols/silc/buddy.c:1668 -#: ../libpurple/protocols/silc/ops.c:1608 -#: ../libpurple/protocols/silc10/buddy.c:1667 +#: ../libpurple/protocols/silc/buddy.c:1671 +#: ../libpurple/protocols/silc/ops.c:1612 +#: ../libpurple/protocols/silc10/buddy.c:1670 #: ../libpurple/protocols/silc10/ops.c:1624 msgid "Kill User" msgstr "Felhasználó kidobása" -#: ../libpurple/protocols/silc/buddy.c:1678 -#: ../libpurple/protocols/silc/chat.c:993 -#: ../libpurple/protocols/silc10/buddy.c:1677 +#: ../libpurple/protocols/silc/buddy.c:1681 +#: ../libpurple/protocols/silc/chat.c:997 +#: ../libpurple/protocols/silc10/buddy.c:1680 #: ../libpurple/protocols/silc10/chat.c:977 msgid "Draw On Whiteboard" msgstr "Rajzolás a rajzlapra" @@ -10885,7 +11148,7 @@ msgstr "A(z) %s csatorna nem létezik a hálózatban" #: ../libpurple/protocols/silc/chat.c:81 -#: ../libpurple/protocols/silc/chat.c:175 +#: ../libpurple/protocols/silc/chat.c:177 #: ../libpurple/protocols/silc10/chat.c:81 #: ../libpurple/protocols/silc10/chat.c:174 msgid "Channel Information" @@ -10939,40 +11202,40 @@ msgid "<br><b>Channel Modes:</b> " msgstr "<br><b>Csatorna módjai:</b> " -#: ../libpurple/protocols/silc/chat.c:166 +#: ../libpurple/protocols/silc/chat.c:167 #: ../libpurple/protocols/silc10/chat.c:165 #, c-format msgid "<br><b>Founder Key Fingerprint:</b><br>%s" msgstr "<br><b>Alapító kulcsának ujjlenyomata:</b><br> %s" -#: ../libpurple/protocols/silc/chat.c:167 +#: ../libpurple/protocols/silc/chat.c:168 #: ../libpurple/protocols/silc10/chat.c:166 #, c-format msgid "<br><b>Founder Key Babbleprint:</b><br>%s" msgstr "<br><b>Alapító kulcsának blablakódja:</b><br> %s" -#: ../libpurple/protocols/silc/chat.c:236 +#: ../libpurple/protocols/silc/chat.c:238 #: ../libpurple/protocols/silc10/chat.c:236 msgid "Add Channel Public Key" msgstr "Csatorna nyilvános kulcsának hozzáadása" #. Add new public key -#: ../libpurple/protocols/silc/chat.c:304 +#: ../libpurple/protocols/silc/chat.c:306 #: ../libpurple/protocols/silc10/chat.c:291 msgid "Open Public Key..." msgstr "Nyilvános kulcs megnyitása..." -#: ../libpurple/protocols/silc/chat.c:423 +#: ../libpurple/protocols/silc/chat.c:425 #: ../libpurple/protocols/silc10/chat.c:401 msgid "Channel Passphrase" msgstr "Csatorna jelmondata" -#: ../libpurple/protocols/silc/chat.c:430 +#: ../libpurple/protocols/silc/chat.c:432 #: ../libpurple/protocols/silc10/chat.c:408 msgid "Channel Public Keys List" msgstr "Csatorna nyilvános kulcsainak listája" -#: ../libpurple/protocols/silc/chat.c:435 +#: ../libpurple/protocols/silc/chat.c:437 #: ../libpurple/protocols/silc10/chat.c:413 #, c-format msgid "" @@ -10988,11 +11251,11 @@ "szükséges. Ha a csatorna nyilvános kulcsai vannak beállítva, akkor csak azok " "a felhasználók csatlakozhatnak, akiknek a nyilvános kulcsa fel van sorolva." -#: ../libpurple/protocols/silc/chat.c:444 -#: ../libpurple/protocols/silc/chat.c:445 -#: ../libpurple/protocols/silc/chat.c:479 -#: ../libpurple/protocols/silc/chat.c:480 -#: ../libpurple/protocols/silc/chat.c:927 +#: ../libpurple/protocols/silc/chat.c:446 +#: ../libpurple/protocols/silc/chat.c:447 +#: ../libpurple/protocols/silc/chat.c:483 +#: ../libpurple/protocols/silc/chat.c:484 +#: ../libpurple/protocols/silc/chat.c:931 #: ../libpurple/protocols/silc10/chat.c:422 #: ../libpurple/protocols/silc10/chat.c:423 #: ../libpurple/protocols/silc10/chat.c:461 @@ -11001,28 +11264,28 @@ msgid "Channel Authentication" msgstr "Csatornahitelesítés" -#: ../libpurple/protocols/silc/chat.c:446 -#: ../libpurple/protocols/silc/chat.c:481 +#: ../libpurple/protocols/silc/chat.c:448 +#: ../libpurple/protocols/silc/chat.c:485 #: ../libpurple/protocols/silc10/chat.c:424 #: ../libpurple/protocols/silc10/chat.c:463 msgid "Add / Remove" msgstr "Hozzáadás / Eltávolítás" -#: ../libpurple/protocols/silc/chat.c:597 +#: ../libpurple/protocols/silc/chat.c:601 #: ../libpurple/protocols/silc10/chat.c:581 msgid "Group Name" msgstr "Csoportnév" -#: ../libpurple/protocols/silc/chat.c:601 -#: ../libpurple/protocols/silc/ops.c:1813 -#: ../libpurple/protocols/silc/silc.c:1020 +#: ../libpurple/protocols/silc/chat.c:605 +#: ../libpurple/protocols/silc/ops.c:1817 +#: ../libpurple/protocols/silc/silc.c:1151 #: ../libpurple/protocols/silc10/chat.c:585 #: ../libpurple/protocols/silc10/ops.c:1901 #: ../libpurple/protocols/silc10/silc.c:931 msgid "Passphrase" msgstr "Jelmondat" -#: ../libpurple/protocols/silc/chat.c:612 +#: ../libpurple/protocols/silc/chat.c:616 #: ../libpurple/protocols/silc10/chat.c:596 #, c-format msgid "Please enter the %s channel private group name and passphrase." @@ -11030,120 +11293,119 @@ "Adja meg a(z) %s csatornához felvenni kívánt magáncsoport nevét és " "jelmondatát." -#: ../libpurple/protocols/silc/chat.c:614 +#: ../libpurple/protocols/silc/chat.c:618 #: ../libpurple/protocols/silc10/chat.c:598 msgid "Add Channel Private Group" msgstr "Csatorna magáncsoport felvétele" -#: ../libpurple/protocols/silc/chat.c:742 +#: ../libpurple/protocols/silc/chat.c:746 #: ../libpurple/protocols/silc10/chat.c:726 msgid "User Limit" msgstr "Felhasználók korlátozása" -#: ../libpurple/protocols/silc/chat.c:743 +#: ../libpurple/protocols/silc/chat.c:747 #: ../libpurple/protocols/silc10/chat.c:727 msgid "Set user limit on channel. Set to zero to reset user limit." msgstr "" "A csatorna legnagyobb felhasználószámának beállítása. A felhasználószám-" "korlátozás feloldásához állítsa nullára." -#: ../libpurple/protocols/silc/chat.c:907 +#: ../libpurple/protocols/silc/chat.c:911 #: ../libpurple/protocols/silc10/chat.c:891 msgid "Invite List" msgstr "Meghívási lista" -#: ../libpurple/protocols/silc/chat.c:912 +#: ../libpurple/protocols/silc/chat.c:916 #: ../libpurple/protocols/silc10/chat.c:896 msgid "Ban List" msgstr "Kitiltási lista" -#: ../libpurple/protocols/silc/chat.c:920 +#: ../libpurple/protocols/silc/chat.c:924 #: ../libpurple/protocols/silc10/chat.c:904 msgid "Add Private Group" msgstr "Magáncsoport felvétele" -#: ../libpurple/protocols/silc/chat.c:933 +#: ../libpurple/protocols/silc/chat.c:937 #: ../libpurple/protocols/silc10/chat.c:917 msgid "Reset Permanent" msgstr "Állandóság visszavonása" -#: ../libpurple/protocols/silc/chat.c:938 +#: ../libpurple/protocols/silc/chat.c:942 #: ../libpurple/protocols/silc10/chat.c:922 msgid "Set Permanent" msgstr "Állandóság beállítása" -#: ../libpurple/protocols/silc/chat.c:946 +#: ../libpurple/protocols/silc/chat.c:950 #: ../libpurple/protocols/silc10/chat.c:930 msgid "Set User Limit" msgstr "Felhasználószám korlátozása" -#: ../libpurple/protocols/silc/chat.c:952 +#: ../libpurple/protocols/silc/chat.c:956 #: ../libpurple/protocols/silc10/chat.c:936 msgid "Reset Topic Restriction" msgstr "Témamegszorítás visszavonása" -#: ../libpurple/protocols/silc/chat.c:957 +#: ../libpurple/protocols/silc/chat.c:961 #: ../libpurple/protocols/silc10/chat.c:941 msgid "Set Topic Restriction" msgstr "Témamegszorítás beállítása" -#: ../libpurple/protocols/silc/chat.c:964 +#: ../libpurple/protocols/silc/chat.c:968 #: ../libpurple/protocols/silc10/chat.c:948 msgid "Reset Private Channel" msgstr "Magáncsatorna visszavonása" -#: ../libpurple/protocols/silc/chat.c:969 +#: ../libpurple/protocols/silc/chat.c:973 #: ../libpurple/protocols/silc10/chat.c:953 msgid "Set Private Channel" msgstr "Magáncsatorna beállítása" -#: ../libpurple/protocols/silc/chat.c:976 +#: ../libpurple/protocols/silc/chat.c:980 #: ../libpurple/protocols/silc10/chat.c:960 msgid "Reset Secret Channel" msgstr "Titkos csatorna visszavonása" -#: ../libpurple/protocols/silc/chat.c:981 +#: ../libpurple/protocols/silc/chat.c:985 #: ../libpurple/protocols/silc10/chat.c:965 msgid "Set Secret Channel" msgstr "Titkos csatorna beállítása" -#: ../libpurple/protocols/silc/chat.c:1045 +#: ../libpurple/protocols/silc/chat.c:1046 #: ../libpurple/protocols/silc10/chat.c:1102 #, c-format -msgid "" -"You have to join the %s channel before you are able to join the private group" +msgid "You have to join the %s channel before you are able to join the private group" msgstr "" "Mielőtt csatlakozhatna a magáncsoporthoz, csatlakoznia kell a(z) %s " "csatornához" -#: ../libpurple/protocols/silc/chat.c:1047 +#: ../libpurple/protocols/silc/chat.c:1048 #: ../libpurple/protocols/silc10/chat.c:1104 msgid "Join Private Group" msgstr "Kapcsolódás magáncsoporthoz" -#: ../libpurple/protocols/silc/chat.c:1048 +#: ../libpurple/protocols/silc/chat.c:1049 #: ../libpurple/protocols/silc10/chat.c:1105 msgid "Cannot join private group" msgstr "Nem lehet kapcsolódni a magáncsoporthoz" -#: ../libpurple/protocols/silc/chat.c:1260 -#: ../libpurple/protocols/silc/silc.c:1217 +#: ../libpurple/protocols/silc/chat.c:1245 +#: ../libpurple/protocols/silc/silc.c:1348 #: ../libpurple/protocols/silc10/chat.c:1299 -#: ../libpurple/protocols/silc10/silc.c:1137 +#: ../libpurple/protocols/silc10/silc.c:1140 msgid "Call Command" msgstr "Hívás parancsa" -#: ../libpurple/protocols/silc/chat.c:1260 -#: ../libpurple/protocols/silc/silc.c:1218 +#: ../libpurple/protocols/silc/chat.c:1245 +#: ../libpurple/protocols/silc/silc.c:1349 #: ../libpurple/protocols/silc10/chat.c:1299 -#: ../libpurple/protocols/silc10/silc.c:1137 +#: ../libpurple/protocols/silc10/silc.c:1140 msgid "Cannot call command" msgstr "Nem lehet meghívni a parancsot" -#: ../libpurple/protocols/silc/chat.c:1261 -#: ../libpurple/protocols/silc/silc.c:1219 +#: ../libpurple/protocols/silc/chat.c:1246 +#: ../libpurple/protocols/silc/silc.c:1350 #: ../libpurple/protocols/silc10/chat.c:1300 -#: ../libpurple/protocols/silc10/silc.c:1138 +#: ../libpurple/protocols/silc10/silc.c:1141 msgid "Unknown command" msgstr "Ismeretlen parancs" @@ -11236,8 +11498,7 @@ #: ../libpurple/protocols/silc10/ops.c:638 #, c-format msgid "<I>%s</I> set channel <I>%s</I> modes to: %s" -msgstr "" -"<I>%s</I> átállította a(z) <I>%s</I> csatorna üzemmódjait a következőkre: %s" +msgstr "<I>%s</I> átállította a(z) <I>%s</I> csatorna üzemmódjait a következőkre: %s" #: ../libpurple/protocols/silc/ops.c:621 #: ../libpurple/protocols/silc10/ops.c:642 @@ -11302,7 +11563,7 @@ msgstr "Pozíció" #: ../libpurple/protocols/silc/ops.c:1018 -#: ../libpurple/protocols/silc/silc.c:1013 +#: ../libpurple/protocols/silc/silc.c:1144 #: ../libpurple/protocols/silc10/ops.c:1052 #: ../libpurple/protocols/silc10/silc.c:924 msgid "Organization" @@ -11336,7 +11597,7 @@ msgstr "A csatornaalapító a következőn: <I>%s</I>: <I>%s</I>" #: ../libpurple/protocols/silc/ops.c:1190 -#: ../libpurple/protocols/silc/ops.c:1326 +#: ../libpurple/protocols/silc/ops.c:1328 #: ../libpurple/protocols/silc10/ops.c:1183 #: ../libpurple/protocols/silc10/ops.c:1332 #: ../libpurple/protocols/yahoo/yahoo_profile.c:1071 @@ -11348,90 +11609,90 @@ msgid "Status Text" msgstr "Állapotszöveg" -#: ../libpurple/protocols/silc/ops.c:1279 -#: ../libpurple/protocols/silc/ops.c:1351 +#: ../libpurple/protocols/silc/ops.c:1280 +#: ../libpurple/protocols/silc/ops.c:1354 #: ../libpurple/protocols/silc10/ops.c:1285 #: ../libpurple/protocols/silc10/ops.c:1357 msgid "Public Key Fingerprint" msgstr "Nyilvános kulcs ujjlenyomata" -#: ../libpurple/protocols/silc/ops.c:1280 -#: ../libpurple/protocols/silc/ops.c:1352 +#: ../libpurple/protocols/silc/ops.c:1281 +#: ../libpurple/protocols/silc/ops.c:1355 #: ../libpurple/protocols/silc10/ops.c:1286 #: ../libpurple/protocols/silc10/ops.c:1358 msgid "Public Key Babbleprint" msgstr "Nyilvános kulcs blablakódja" -#: ../libpurple/protocols/silc/ops.c:1292 +#: ../libpurple/protocols/silc/ops.c:1294 #: ../libpurple/protocols/silc10/ops.c:1298 msgid "_More..." msgstr "_Több..." -#: ../libpurple/protocols/silc/ops.c:1369 -#: ../libpurple/protocols/silc/silc.c:1077 +#: ../libpurple/protocols/silc/ops.c:1373 +#: ../libpurple/protocols/silc/silc.c:1208 #: ../libpurple/protocols/silc10/ops.c:1371 -#: ../libpurple/protocols/silc10/silc.c:988 +#: ../libpurple/protocols/silc10/silc.c:991 msgid "Detach From Server" msgstr "Leválás a kiszolgálóról" -#: ../libpurple/protocols/silc/ops.c:1369 +#: ../libpurple/protocols/silc/ops.c:1373 #: ../libpurple/protocols/silc10/ops.c:1371 msgid "Cannot detach" msgstr "Nem lehet leválni" -#: ../libpurple/protocols/silc/ops.c:1389 +#: ../libpurple/protocols/silc/ops.c:1393 #: ../libpurple/protocols/silc10/ops.c:1382 msgid "Cannot set topic" msgstr "Nem lehet beállítani a témát" -#: ../libpurple/protocols/silc/ops.c:1418 +#: ../libpurple/protocols/silc/ops.c:1422 #: ../libpurple/protocols/silc10/ops.c:1414 msgid "Failed to change nickname" msgstr "Nem sikerült a becenevet megváltoztatni" -#: ../libpurple/protocols/silc/ops.c:1467 +#: ../libpurple/protocols/silc/ops.c:1471 #: ../libpurple/protocols/silc10/ops.c:1462 msgid "Roomlist" msgstr "Szobalista" -#: ../libpurple/protocols/silc/ops.c:1467 +#: ../libpurple/protocols/silc/ops.c:1471 #: ../libpurple/protocols/silc10/ops.c:1462 msgid "Cannot get room list" msgstr "Nem sikerült lekérni a szobalistát" -#: ../libpurple/protocols/silc/ops.c:1468 +#: ../libpurple/protocols/silc/ops.c:1472 msgid "Network is empty" msgstr "A hálózat üres" -#: ../libpurple/protocols/silc/ops.c:1512 +#: ../libpurple/protocols/silc/ops.c:1516 #: ../libpurple/protocols/silc10/ops.c:1507 msgid "No public key was received" msgstr "Nem érkezett nyilvános kulcs" -#: ../libpurple/protocols/silc/ops.c:1524 -#: ../libpurple/protocols/silc/ops.c:1537 +#: ../libpurple/protocols/silc/ops.c:1528 +#: ../libpurple/protocols/silc/ops.c:1541 #: ../libpurple/protocols/silc10/ops.c:1519 #: ../libpurple/protocols/silc10/ops.c:1532 msgid "Server Information" msgstr "Kiszolgálóinformációk" -#: ../libpurple/protocols/silc/ops.c:1525 +#: ../libpurple/protocols/silc/ops.c:1529 #: ../libpurple/protocols/silc10/ops.c:1520 msgid "Cannot get server information" msgstr "Nem lehet lekérni a kiszolgálóinformációkat" -#: ../libpurple/protocols/silc/ops.c:1548 +#: ../libpurple/protocols/silc/ops.c:1552 #: ../libpurple/protocols/silc10/ops.c:1549 #: ../libpurple/protocols/silc10/ops.c:1558 msgid "Server Statistics" msgstr "Kiszolgálóstatisztikák" -#: ../libpurple/protocols/silc/ops.c:1549 +#: ../libpurple/protocols/silc/ops.c:1553 #: ../libpurple/protocols/silc10/ops.c:1550 msgid "Cannot get server statistics" msgstr "Nem lehet lekérni a kiszolgálóstatisztikákat" -#: ../libpurple/protocols/silc/ops.c:1556 +#: ../libpurple/protocols/silc/ops.c:1560 #: ../libpurple/protocols/silc10/ops.c:1581 #, c-format msgid "" @@ -11467,54 +11728,54 @@ "Kiszolgáló-operátorok összesen: %d\n" "Útválasztó-operátorok összesen: %d\n" -#: ../libpurple/protocols/silc/ops.c:1588 +#: ../libpurple/protocols/silc/ops.c:1592 #: ../libpurple/protocols/silc10/ops.c:1604 msgid "Network Statistics" msgstr "Hálózati statisztika" -#: ../libpurple/protocols/silc/ops.c:1596 +#: ../libpurple/protocols/silc/ops.c:1600 #: ../libpurple/protocols/silc10/ops.c:1612 msgid "Ping failed" msgstr "Ping sikertelen" -#: ../libpurple/protocols/silc/ops.c:1601 +#: ../libpurple/protocols/silc/ops.c:1605 #: ../libpurple/protocols/silc10/ops.c:1617 msgid "Ping reply received from server" msgstr "Ping válasz érkezett a kiszolgálótól" -#: ../libpurple/protocols/silc/ops.c:1609 +#: ../libpurple/protocols/silc/ops.c:1613 #: ../libpurple/protocols/silc10/ops.c:1625 msgid "Could not kill user" msgstr "Nem sikerült kidobni a felhasználót" -#: ../libpurple/protocols/silc/ops.c:1648 +#: ../libpurple/protocols/silc/ops.c:1652 msgid "WATCH" msgstr "FIGYELÉS" -#: ../libpurple/protocols/silc/ops.c:1648 +#: ../libpurple/protocols/silc/ops.c:1652 msgid "Cannot watch user" msgstr "A felhasználó nem figyelhető" -#: ../libpurple/protocols/silc/ops.c:1724 -#: ../libpurple/protocols/silc/ops.c:1775 -#: ../libpurple/protocols/silc/silc.c:277 +#: ../libpurple/protocols/silc/ops.c:1728 +#: ../libpurple/protocols/silc/ops.c:1779 +#: ../libpurple/protocols/silc/silc.c:377 #: ../libpurple/protocols/silc10/ops.c:1811 #: ../libpurple/protocols/silc10/ops.c:1858 #: ../libpurple/protocols/silc10/silc.c:190 msgid "Resuming session" msgstr "Folyamat folytatása" -#: ../libpurple/protocols/silc/ops.c:1726 +#: ../libpurple/protocols/silc/ops.c:1730 #: ../libpurple/protocols/silc10/ops.c:1813 msgid "Authenticating connection" msgstr "Kapcsolat hitelesítése" -#: ../libpurple/protocols/silc/ops.c:1777 +#: ../libpurple/protocols/silc/ops.c:1781 #: ../libpurple/protocols/silc10/ops.c:1860 msgid "Verifying server public key" msgstr "Kiszolgáló nyilvános kulcsának ellenőrzése" -#: ../libpurple/protocols/silc/ops.c:1814 +#: ../libpurple/protocols/silc/ops.c:1818 #: ../libpurple/protocols/silc10/ops.c:1902 msgid "Passphrase required" msgstr "Jelmondat szükséges" @@ -11531,8 +11792,7 @@ #: ../libpurple/protocols/silc/pk.c:103 ../libpurple/protocols/silc10/pk.c:109 #, c-format msgid "Received %s's public key. Would you like to accept this public key?" -msgstr "" -"%s nyilvános kulcsa megérkezett. El kívánja fogadni ezt a nyilvános kulcsot?" +msgstr "%s nyilvános kulcsa megérkezett. El kívánja fogadni ezt a nyilvános kulcsot?" #: ../libpurple/protocols/silc/pk.c:107 ../libpurple/protocols/silc10/pk.c:113 #, c-format @@ -11561,87 +11821,86 @@ msgid "Unsupported public key type" msgstr "Nem támogatott típusú nyilvános kulcs" -#: ../libpurple/protocols/silc/silc.c:217 +#: ../libpurple/protocols/silc/silc.c:317 #: ../libpurple/protocols/silc10/ops.c:1749 msgid "Disconnected by server" msgstr "A kiszolgáló bontotta a kapcsolatot" -#: ../libpurple/protocols/silc/silc.c:224 +#: ../libpurple/protocols/silc/silc.c:324 #: ../libpurple/protocols/silc10/ops.c:1700 msgid "Error during connecting to SILC Server" msgstr "Hiba a SILC kiszolgálóhoz kapcsolódás közben" -#: ../libpurple/protocols/silc/silc.c:229 +#: ../libpurple/protocols/silc/silc.c:329 #: ../libpurple/protocols/silc10/ops.c:1705 msgid "Key Exchange failed" msgstr "Kulcscsere sikertelen" -#: ../libpurple/protocols/silc/silc.c:238 +#: ../libpurple/protocols/silc/silc.c:338 #: ../libpurple/protocols/silc10/ops.c:1714 -msgid "" -"Resuming detached session failed. Press Reconnect to create new connection." +msgid "Resuming detached session failed. Press Reconnect to create new connection." msgstr "" "A leválasztott folyamat folytatása sikertelen. Kattintson az Újrakapcsolódás " "gombra egy új kapcsolat létrehozásához." -#: ../libpurple/protocols/silc/silc.c:265 -#: ../libpurple/protocols/silc/silc.c:311 +#: ../libpurple/protocols/silc/silc.c:365 +#: ../libpurple/protocols/silc/silc.c:411 #: ../libpurple/protocols/silc10/silc.c:161 msgid "Connection failed" msgstr "Kapcsolódás sikertelen" -#: ../libpurple/protocols/silc/silc.c:280 +#: ../libpurple/protocols/silc/silc.c:380 #: ../libpurple/protocols/silc10/silc.c:193 msgid "Performing key exchange" msgstr "Kulcscsere elvégzése" #. Progress -#: ../libpurple/protocols/silc/silc.c:343 +#: ../libpurple/protocols/silc/silc.c:435 #: ../libpurple/protocols/silc10/silc.c:325 msgid "Connecting to SILC Server" msgstr "Kapcsolódás a SILC kiszolgálóhoz" -#: ../libpurple/protocols/silc/silc.c:352 +#: ../libpurple/protocols/silc/silc.c:444 #, c-format msgid "Could not load SILC key pair" msgstr "Nem sikerült a SILC kulcspárt betölteni" -#: ../libpurple/protocols/silc/silc.c:366 +#: ../libpurple/protocols/silc/silc.c:458 #: ../libpurple/protocols/silc10/silc.c:355 msgid "Unable to create connection" msgstr "Nem hozható létre kapcsolat" -#: ../libpurple/protocols/silc/silc.c:395 +#: ../libpurple/protocols/silc/silc.c:487 #: ../libpurple/protocols/silc10/silc.c:267 msgid "Out of memory" msgstr "Elfogyott a memória" -#: ../libpurple/protocols/silc/silc.c:438 +#: ../libpurple/protocols/silc/silc.c:538 #: ../libpurple/protocols/silc10/silc.c:313 msgid "Cannot initialize SILC protocol" msgstr "Nem lehet inicializálni a SILC protokollt" -#: ../libpurple/protocols/silc/silc.c:445 +#: ../libpurple/protocols/silc/silc.c:547 msgid "Error loading SILC key pair" msgstr "Hiba a SILC kulcspár betöltésekor" -#: ../libpurple/protocols/silc/silc.c:739 +#: ../libpurple/protocols/silc/silc.c:870 #: ../libpurple/protocols/silc10/silc.c:650 msgid "Your Current Mood" msgstr "Az Ön jelenlegi hangulata" -#: ../libpurple/protocols/silc/silc.c:741 -#: ../libpurple/protocols/silc10/silc.c:652 ../pidgin/gtkprefs.c:1641 +#: ../libpurple/protocols/silc/silc.c:872 +#: ../libpurple/protocols/silc10/silc.c:652 ../pidgin/gtkprefs.c:1741 #, c-format msgid "Normal" msgstr "Normál" -#: ../libpurple/protocols/silc/silc.c:755 +#: ../libpurple/protocols/silc/silc.c:886 #: ../libpurple/protocols/silc10/silc.c:666 msgid "In love" msgstr "Szerelmes" -#: ../libpurple/protocols/silc/silc.c:766 +#: ../libpurple/protocols/silc/silc.c:897 #: ../libpurple/protocols/silc10/silc.c:677 msgid "" "\n" @@ -11650,62 +11909,62 @@ "\n" "Az előnyben részesített kapcsolatfelvételi módszerek" -#: ../libpurple/protocols/silc/silc.c:774 -#: ../libpurple/protocols/silc/util.c:561 +#: ../libpurple/protocols/silc/silc.c:905 +#: ../libpurple/protocols/silc/util.c:565 #: ../libpurple/protocols/silc10/silc.c:685 #: ../libpurple/protocols/silc10/util.c:557 msgid "SMS" msgstr "SMS" -#: ../libpurple/protocols/silc/silc.c:776 -#: ../libpurple/protocols/silc/util.c:563 +#: ../libpurple/protocols/silc/silc.c:907 +#: ../libpurple/protocols/silc/util.c:567 #: ../libpurple/protocols/silc10/silc.c:687 #: ../libpurple/protocols/silc10/util.c:559 msgid "MMS" msgstr "MMS" -#: ../libpurple/protocols/silc/silc.c:778 +#: ../libpurple/protocols/silc/silc.c:909 #: ../libpurple/protocols/silc10/silc.c:689 msgid "Video conferencing" msgstr "Videokonferencia" -#: ../libpurple/protocols/silc/silc.c:783 +#: ../libpurple/protocols/silc/silc.c:914 #: ../libpurple/protocols/silc10/silc.c:694 msgid "Your Current Status" msgstr "Az Ön jelenlegi állapota" -#: ../libpurple/protocols/silc/silc.c:790 +#: ../libpurple/protocols/silc/silc.c:921 #: ../libpurple/protocols/silc10/silc.c:701 msgid "Online Services" msgstr "Elérhető szolgáltatások" -#: ../libpurple/protocols/silc/silc.c:793 +#: ../libpurple/protocols/silc/silc.c:924 #: ../libpurple/protocols/silc10/silc.c:704 msgid "Let others see what services you are using" msgstr "Mások láthatják milyen szolgáltatásokat használ" -#: ../libpurple/protocols/silc/silc.c:799 +#: ../libpurple/protocols/silc/silc.c:930 #: ../libpurple/protocols/silc10/silc.c:710 msgid "Let others see what computer you are using" msgstr "Mások láthatják milyen számítógépet használ" -#: ../libpurple/protocols/silc/silc.c:806 +#: ../libpurple/protocols/silc/silc.c:937 #: ../libpurple/protocols/silc10/silc.c:717 msgid "Your VCard File" msgstr "Az Ön VCard fájlja" -#: ../libpurple/protocols/silc/silc.c:812 +#: ../libpurple/protocols/silc/silc.c:943 msgid "Timezone (UTC)" msgstr "Időzóna (UTC)" -#: ../libpurple/protocols/silc/silc.c:816 -#: ../libpurple/protocols/silc/silc.c:817 +#: ../libpurple/protocols/silc/silc.c:947 +#: ../libpurple/protocols/silc/silc.c:948 #: ../libpurple/protocols/silc10/silc.c:729 #: ../libpurple/protocols/silc10/silc.c:730 msgid "User Online Status Attributes" msgstr "Felhasználó online állapotattribútumai" -#: ../libpurple/protocols/silc/silc.c:818 +#: ../libpurple/protocols/silc/silc.c:949 #: ../libpurple/protocols/silc10/silc.c:731 msgid "" "You can let other users see your online status information and your personal " @@ -11716,31 +11975,31 @@ "személyes információit. Kérem töltse ki azokat az információkat, amelyeket " "más felhasználók láthatnak Önről." -#: ../libpurple/protocols/silc/silc.c:859 -#: ../libpurple/protocols/silc/silc.c:865 -#: ../libpurple/protocols/silc/silc.c:1486 +#: ../libpurple/protocols/silc/silc.c:990 +#: ../libpurple/protocols/silc/silc.c:996 +#: ../libpurple/protocols/silc/silc.c:1617 #: ../libpurple/protocols/silc10/silc.c:772 #: ../libpurple/protocols/silc10/silc.c:778 -#: ../libpurple/protocols/silc10/silc.c:1415 +#: ../libpurple/protocols/silc10/silc.c:1418 msgid "Message of the Day" msgstr "A nap üzenete" -#: ../libpurple/protocols/silc/silc.c:859 +#: ../libpurple/protocols/silc/silc.c:990 #: ../libpurple/protocols/silc10/silc.c:772 msgid "No Message of the Day available" msgstr "Nem érhető el a nap üzenete" -#: ../libpurple/protocols/silc/silc.c:860 -#: ../libpurple/protocols/silc/silc.c:1481 +#: ../libpurple/protocols/silc/silc.c:991 +#: ../libpurple/protocols/silc/silc.c:1612 #: ../libpurple/protocols/silc10/silc.c:773 -#: ../libpurple/protocols/silc10/silc.c:1410 +#: ../libpurple/protocols/silc10/silc.c:1413 msgid "There is no Message of the Day associated with this connection" msgstr "Nincs \"nap üzenete\" hozzárendelve ehhez a kapcsolathoz" -#: ../libpurple/protocols/silc/silc.c:911 -#: ../libpurple/protocols/silc/silc.c:957 -#: ../libpurple/protocols/silc/silc.c:1028 -#: ../libpurple/protocols/silc/silc.c:1029 +#: ../libpurple/protocols/silc/silc.c:1042 +#: ../libpurple/protocols/silc/silc.c:1088 +#: ../libpurple/protocols/silc/silc.c:1159 +#: ../libpurple/protocols/silc/silc.c:1160 #: ../libpurple/protocols/silc10/silc.c:824 #: ../libpurple/protocols/silc10/silc.c:868 #: ../libpurple/protocols/silc10/silc.c:939 @@ -11748,191 +12007,190 @@ msgid "Create New SILC Key Pair" msgstr "Új SILC kulcspár létrehozása" -#: ../libpurple/protocols/silc/silc.c:911 +#: ../libpurple/protocols/silc/silc.c:1042 #: ../libpurple/protocols/silc10/silc.c:824 msgid "Passphrases do not match" msgstr "A jelmondatok nem egyeznek" -#: ../libpurple/protocols/silc/silc.c:957 +#: ../libpurple/protocols/silc/silc.c:1088 #: ../libpurple/protocols/silc10/silc.c:868 msgid "Key Pair Generation failed" msgstr "A kulcselőállítás meghiúsult" -#: ../libpurple/protocols/silc/silc.c:996 +#: ../libpurple/protocols/silc/silc.c:1127 #: ../libpurple/protocols/silc10/silc.c:907 msgid "Key length" msgstr "Kulcs hossza" -#: ../libpurple/protocols/silc/silc.c:998 +#: ../libpurple/protocols/silc/silc.c:1129 #: ../libpurple/protocols/silc10/silc.c:909 msgid "Public key file" msgstr "Nyilvános kulcs fájlja" -#: ../libpurple/protocols/silc/silc.c:1000 +#: ../libpurple/protocols/silc/silc.c:1131 #: ../libpurple/protocols/silc10/silc.c:911 msgid "Private key file" msgstr "Személyes kulcs fájlja" -#: ../libpurple/protocols/silc/silc.c:1023 +#: ../libpurple/protocols/silc/silc.c:1154 #: ../libpurple/protocols/silc10/silc.c:934 msgid "Passphrase (retype)" msgstr "Jelmondat (megerősítés)" -#: ../libpurple/protocols/silc/silc.c:1030 +#: ../libpurple/protocols/silc/silc.c:1161 #: ../libpurple/protocols/silc10/silc.c:941 msgid "Generate Key Pair" msgstr "Kulcspár előállítása" -#: ../libpurple/protocols/silc/silc.c:1073 -#: ../libpurple/protocols/silc10/silc.c:984 +#: ../libpurple/protocols/silc/silc.c:1204 +#: ../libpurple/protocols/silc10/silc.c:987 msgid "Online Status" msgstr "Elérhető állapot" -#: ../libpurple/protocols/silc/silc.c:1081 -#: ../libpurple/protocols/silc10/silc.c:992 +#: ../libpurple/protocols/silc/silc.c:1212 +#: ../libpurple/protocols/silc10/silc.c:995 msgid "View Message of the Day" msgstr "A nap üzenetének megtekintése" -#: ../libpurple/protocols/silc/silc.c:1085 -#: ../libpurple/protocols/silc10/silc.c:996 +#: ../libpurple/protocols/silc/silc.c:1216 +#: ../libpurple/protocols/silc10/silc.c:999 msgid "Create SILC Key Pair..." msgstr "SILC kulcspár létrehozása..." -#: ../libpurple/protocols/silc/silc.c:1177 -#: ../libpurple/protocols/silc10/silc.c:1095 +#: ../libpurple/protocols/silc/silc.c:1308 +#: ../libpurple/protocols/silc10/silc.c:1098 #, c-format msgid "User <I>%s</I> is not present in the network" msgstr "<I>%s</I> felhasználó nincs jelen a hálózatban" -#: ../libpurple/protocols/silc/silc.c:1357 -#: ../libpurple/protocols/silc10/silc.c:1286 +#: ../libpurple/protocols/silc/silc.c:1488 +#: ../libpurple/protocols/silc10/silc.c:1289 msgid "Topic too long" msgstr "A téma túl hosszú" -#: ../libpurple/protocols/silc/silc.c:1438 -#: ../libpurple/protocols/silc10/silc.c:1367 +#: ../libpurple/protocols/silc/silc.c:1569 +#: ../libpurple/protocols/silc10/silc.c:1370 msgid "You must specify a nick" msgstr "Meg kell adnia egy becenevet" -#: ../libpurple/protocols/silc/silc.c:1540 -#: ../libpurple/protocols/silc10/silc.c:1469 +#: ../libpurple/protocols/silc/silc.c:1671 +#: ../libpurple/protocols/silc10/silc.c:1472 #, c-format msgid "channel %s not found" msgstr "%s csatorna nem található" -#: ../libpurple/protocols/silc/silc.c:1545 -#: ../libpurple/protocols/silc10/silc.c:1474 +#: ../libpurple/protocols/silc/silc.c:1676 +#: ../libpurple/protocols/silc10/silc.c:1477 #, c-format msgid "channel modes for %s: %s" msgstr "csatorna üzemmódok a következőhöz: %s: %s" -#: ../libpurple/protocols/silc/silc.c:1547 -#: ../libpurple/protocols/silc10/silc.c:1476 +#: ../libpurple/protocols/silc/silc.c:1678 +#: ../libpurple/protocols/silc10/silc.c:1479 #, c-format msgid "no channel modes are set on %s" msgstr "nincsenek csatorna üzemmódok beállítva a következőn: %s" -#: ../libpurple/protocols/silc/silc.c:1560 -#: ../libpurple/protocols/silc10/silc.c:1489 +#: ../libpurple/protocols/silc/silc.c:1691 +#: ../libpurple/protocols/silc10/silc.c:1492 #, c-format msgid "Failed to set cmodes for %s" msgstr "Nem sikerült beállítani a csatorna üzemmódokat a következőhöz: %s" -#: ../libpurple/protocols/silc/silc.c:1590 -#: ../libpurple/protocols/silc10/silc.c:1519 +#: ../libpurple/protocols/silc/silc.c:1721 +#: ../libpurple/protocols/silc10/silc.c:1522 #, c-format msgid "Unknown command: %s, (may be a client bug)" msgstr "Ismeretlen parancs: %s, (talán klienshiba)" -#: ../libpurple/protocols/silc/silc.c:1653 -#: ../libpurple/protocols/silc10/silc.c:1582 +#: ../libpurple/protocols/silc/silc.c:1784 +#: ../libpurple/protocols/silc10/silc.c:1585 msgid "part [channel]: Leave the chat" msgstr "part [csatorna]: A csevegés elhagyása" -#: ../libpurple/protocols/silc/silc.c:1657 -#: ../libpurple/protocols/silc10/silc.c:1586 +#: ../libpurple/protocols/silc/silc.c:1788 +#: ../libpurple/protocols/silc10/silc.c:1589 msgid "leave [channel]: Leave the chat" msgstr "leave [csatorna]: A csevegés elhagyása" -#: ../libpurple/protocols/silc/silc.c:1661 -#: ../libpurple/protocols/silc10/silc.c:1590 +#: ../libpurple/protocols/silc/silc.c:1792 +#: ../libpurple/protocols/silc10/silc.c:1593 msgid "topic [<new topic>]: View or change the topic" msgstr "topic [<új téma>]: A téma megtekintése vagy módosítása" -#: ../libpurple/protocols/silc/silc.c:1666 -#: ../libpurple/protocols/silc10/silc.c:1595 +#: ../libpurple/protocols/silc/silc.c:1797 +#: ../libpurple/protocols/silc10/silc.c:1598 msgid "join <channel> [<password>]: Join a chat on this network" msgstr "" "join <csatorna> [<jelszó>]: Csatlakozás csatornához ezen a " "hálózaton" -#: ../libpurple/protocols/silc/silc.c:1670 -#: ../libpurple/protocols/silc10/silc.c:1599 +#: ../libpurple/protocols/silc/silc.c:1801 +#: ../libpurple/protocols/silc10/silc.c:1602 msgid "list: List channels on this network" msgstr "list: Csatornák listázása ezen a hálózaton" -#: ../libpurple/protocols/silc/silc.c:1674 -#: ../libpurple/protocols/silc10/silc.c:1603 +#: ../libpurple/protocols/silc/silc.c:1805 +#: ../libpurple/protocols/silc10/silc.c:1606 msgid "whois <nick>: View nick's information" msgstr "whois <becenév>: A becenévhez tartozó információk megjelenítése" -#: ../libpurple/protocols/silc/silc.c:1678 -#: ../libpurple/protocols/silc10/silc.c:1607 +#: ../libpurple/protocols/silc/silc.c:1809 +#: ../libpurple/protocols/silc10/silc.c:1610 #: ../libpurple/protocols/zephyr/zephyr.c:2685 msgid "msg <nick> <message>: Send a private message to a user" -msgstr "" -"msg <becenév> <message>: Magánüzenet küldése a felhasználónak" - -#: ../libpurple/protocols/silc/silc.c:1682 -#: ../libpurple/protocols/silc10/silc.c:1611 +msgstr "msg <becenév> <message>: Magánüzenet küldése a felhasználónak" + +#: ../libpurple/protocols/silc/silc.c:1813 +#: ../libpurple/protocols/silc10/silc.c:1614 msgid "query <nick> [<message>]: Send a private message to a user" msgstr "" "query <becenév> [<message>]: Magánüzenet küldése a " "felhasználónak" -#: ../libpurple/protocols/silc/silc.c:1686 -#: ../libpurple/protocols/silc10/silc.c:1615 +#: ../libpurple/protocols/silc/silc.c:1817 +#: ../libpurple/protocols/silc10/silc.c:1618 msgid "motd: View the server's Message Of The Day" msgstr "motd: A kiszolgáló napi üzenetének megjelenítése" -#: ../libpurple/protocols/silc/silc.c:1690 -#: ../libpurple/protocols/silc10/silc.c:1619 +#: ../libpurple/protocols/silc/silc.c:1821 +#: ../libpurple/protocols/silc10/silc.c:1622 msgid "detach: Detach this session" msgstr "detach: Ezen folyamat leválasztása" -#: ../libpurple/protocols/silc/silc.c:1694 -#: ../libpurple/protocols/silc10/silc.c:1623 +#: ../libpurple/protocols/silc/silc.c:1825 +#: ../libpurple/protocols/silc10/silc.c:1626 msgid "quit [message]: Disconnect from the server, with an optional message" msgstr "" "quit [message]: Kapcsolat bontása a kiszolgálóval, egy opcionális üzenet " "kíséretében" -#: ../libpurple/protocols/silc/silc.c:1698 -#: ../libpurple/protocols/silc10/silc.c:1627 +#: ../libpurple/protocols/silc/silc.c:1829 +#: ../libpurple/protocols/silc10/silc.c:1630 msgid "call <command>: Call any silc client command" msgstr "call <command>: Egy silc kliensparancs meghívása" -#: ../libpurple/protocols/silc/silc.c:1704 -#: ../libpurple/protocols/silc10/silc.c:1633 +#: ../libpurple/protocols/silc/silc.c:1835 +#: ../libpurple/protocols/silc10/silc.c:1636 msgid "kill <nick> [-pubkey|<reason>]: Kill nick" msgstr "" "kill <becenév> [-pubkey|<ok>]: A \"becenév\" nevű felhasználó " "kidobása" -#: ../libpurple/protocols/silc/silc.c:1708 -#: ../libpurple/protocols/silc10/silc.c:1637 +#: ../libpurple/protocols/silc/silc.c:1839 +#: ../libpurple/protocols/silc10/silc.c:1640 msgid "nick <newnick>: Change your nickname" msgstr "nick <új becenév>: A becenevének megváltoztatása" -#: ../libpurple/protocols/silc/silc.c:1712 -#: ../libpurple/protocols/silc10/silc.c:1641 +#: ../libpurple/protocols/silc/silc.c:1843 +#: ../libpurple/protocols/silc10/silc.c:1644 msgid "whowas <nick>: View nick's information" msgstr "" "whowas <becenév>: A becenév nevű felhasználó információinak " "megjelenítése" -#: ../libpurple/protocols/silc/silc.c:1716 -#: ../libpurple/protocols/silc10/silc.c:1645 +#: ../libpurple/protocols/silc/silc.c:1847 +#: ../libpurple/protocols/silc10/silc.c:1648 msgid "" "cmode <channel> [+|-<modes>] [arguments]: Change or display " "channel modes" @@ -11940,8 +12198,8 @@ "cmode <csatorna> [+|-<módok>] [paraméterek]: Csatorna " "üzemmódjainak megjelenítése vagy megváltoztatása" -#: ../libpurple/protocols/silc/silc.c:1720 -#: ../libpurple/protocols/silc10/silc.c:1649 +#: ../libpurple/protocols/silc/silc.c:1851 +#: ../libpurple/protocols/silc10/silc.c:1652 msgid "" "cumode <channel> +|-<modes> <nick>: Change nick's modes " "on channel" @@ -11949,20 +12207,20 @@ "cumode <csatorna> +|-<modes> <becenév>: A becenév " "módjainak megváltoztatása a csatornán" -#: ../libpurple/protocols/silc/silc.c:1724 -#: ../libpurple/protocols/silc10/silc.c:1653 +#: ../libpurple/protocols/silc/silc.c:1855 +#: ../libpurple/protocols/silc10/silc.c:1656 msgid "umode <usermodes>: Set your modes in the network" msgstr "" "umode <felhasználói módok>: A felhasználói módjainak beállítása a " "hálózaton" -#: ../libpurple/protocols/silc/silc.c:1728 -#: ../libpurple/protocols/silc10/silc.c:1657 +#: ../libpurple/protocols/silc/silc.c:1859 +#: ../libpurple/protocols/silc10/silc.c:1660 msgid "oper <nick> [-pubkey]: Get server operator privileges" msgstr "oper <becenév> [-pubkey]: Kiszolgáló-operátori jogok kérése" -#: ../libpurple/protocols/silc/silc.c:1732 -#: ../libpurple/protocols/silc10/silc.c:1661 +#: ../libpurple/protocols/silc/silc.c:1863 +#: ../libpurple/protocols/silc10/silc.c:1664 msgid "" "invite <channel> [-|+]<nick>: invite nick or add/remove from " "channel invite list" @@ -11970,49 +12228,47 @@ "invite <csatorna> [-|+]<becenév>: A becenév nevű felhasználó " "meghívása vagy a csatorna meghívási listájához/ról hozzáadása/eltávolítása" -#: ../libpurple/protocols/silc/silc.c:1736 -#: ../libpurple/protocols/silc10/silc.c:1665 +#: ../libpurple/protocols/silc/silc.c:1867 +#: ../libpurple/protocols/silc10/silc.c:1668 msgid "kick <channel> <nick> [comment]: Kick client from channel" msgstr "" "kick <csatorna> <becenév> [megjegyzés]: Kliens kirúgása a " "csatornáról" -#: ../libpurple/protocols/silc/silc.c:1740 -#: ../libpurple/protocols/silc10/silc.c:1669 +#: ../libpurple/protocols/silc/silc.c:1871 +#: ../libpurple/protocols/silc10/silc.c:1672 msgid "info [server]: View server administrative details" -msgstr "" -"info [kiszolgáló]: A kiszolgáló adminisztrációs részleteinek megjelenítése" - -#: ../libpurple/protocols/silc/silc.c:1744 -#: ../libpurple/protocols/silc10/silc.c:1673 +msgstr "info [kiszolgáló]: A kiszolgáló adminisztrációs részleteinek megjelenítése" + +#: ../libpurple/protocols/silc/silc.c:1875 +#: ../libpurple/protocols/silc10/silc.c:1676 msgid "ban [<channel> +|-<nick>]: Ban client from channel" -msgstr "" -"ban [<csatorna> +|-<becenév>]: Kliens kitiltása a csatornáról" - -#: ../libpurple/protocols/silc/silc.c:1748 -#: ../libpurple/protocols/silc10/silc.c:1677 +msgstr "ban [<csatorna> +|-<becenév>]: Kliens kitiltása a csatornáról" + +#: ../libpurple/protocols/silc/silc.c:1879 +#: ../libpurple/protocols/silc10/silc.c:1680 msgid "getkey <nick|server>: Retrieve client's or server's public key" msgstr "" "getkey <becenév|kiszolgáló>: A kliens vagy a kiszolgáló nyilvános " "kulcsának letöltése" -#: ../libpurple/protocols/silc/silc.c:1752 -#: ../libpurple/protocols/silc10/silc.c:1681 +#: ../libpurple/protocols/silc/silc.c:1883 +#: ../libpurple/protocols/silc10/silc.c:1684 msgid "stats: View server and network statistics" msgstr "stats: A kiszolgáló és a hálózat statisztikáinak megjelenítése" -#: ../libpurple/protocols/silc/silc.c:1756 -#: ../libpurple/protocols/silc10/silc.c:1685 +#: ../libpurple/protocols/silc/silc.c:1887 +#: ../libpurple/protocols/silc10/silc.c:1688 msgid "ping: Send PING to the connected server" msgstr "ping: PING küldése a kapcsolódott kiszolgálónak" -#: ../libpurple/protocols/silc/silc.c:1761 -#: ../libpurple/protocols/silc10/silc.c:1690 +#: ../libpurple/protocols/silc/silc.c:1892 +#: ../libpurple/protocols/silc10/silc.c:1693 msgid "users <channel>: List users in channel" msgstr "users <csatorna>: Egy csatorna felhasználóit listázza ki" -#: ../libpurple/protocols/silc/silc.c:1765 -#: ../libpurple/protocols/silc10/silc.c:1694 +#: ../libpurple/protocols/silc/silc.c:1896 +#: ../libpurple/protocols/silc10/silc.c:1697 msgid "" "names [-count|-ops|-halfops|-voices|-normal] <channel(s)>: List " "specific users in channel(s)" @@ -12029,68 +12285,68 @@ #. *< name #. *< version #. * summary -#: ../libpurple/protocols/silc/silc.c:1876 -#: ../libpurple/protocols/silc10/silc.c:1819 +#: ../libpurple/protocols/silc/silc.c:2007 +#: ../libpurple/protocols/silc10/silc.c:1822 msgid "SILC Protocol Plugin" msgstr "SILC protokollbővítmény" #. * description -#: ../libpurple/protocols/silc/silc.c:1878 -#: ../libpurple/protocols/silc10/silc.c:1821 +#: ../libpurple/protocols/silc/silc.c:2009 +#: ../libpurple/protocols/silc10/silc.c:1824 msgid "Secure Internet Live Conferencing (SILC) Protocol" msgstr "Secure Internet Live Conferencing (SILC) protokoll" -#: ../libpurple/protocols/silc/silc.c:1910 -#: ../libpurple/protocols/silc10/silc.c:1853 ../pidgin/gtkprefs.c:2036 +#: ../libpurple/protocols/silc/silc.c:2041 +#: ../libpurple/protocols/silc10/silc.c:1856 ../pidgin/gtkprefs.c:2138 msgid "Network" msgstr "Hálózat" -#: ../libpurple/protocols/silc/silc.c:1921 -#: ../libpurple/protocols/silc10/silc.c:1864 +#: ../libpurple/protocols/silc/silc.c:2052 +#: ../libpurple/protocols/silc10/silc.c:1867 msgid "Public Key file" msgstr "Nyilvános kulcs fájlja" -#: ../libpurple/protocols/silc/silc.c:1925 -#: ../libpurple/protocols/silc10/silc.c:1868 +#: ../libpurple/protocols/silc/silc.c:2056 +#: ../libpurple/protocols/silc10/silc.c:1871 msgid "Private Key file" msgstr "Személyes kulcs fájlja" -#: ../libpurple/protocols/silc/silc.c:1935 -#: ../libpurple/protocols/silc10/silc.c:1878 +#: ../libpurple/protocols/silc/silc.c:2066 +#: ../libpurple/protocols/silc10/silc.c:1881 msgid "Cipher" msgstr "Titkosító" -#: ../libpurple/protocols/silc/silc.c:1945 -#: ../libpurple/protocols/silc10/silc.c:1888 +#: ../libpurple/protocols/silc/silc.c:2076 +#: ../libpurple/protocols/silc10/silc.c:1891 msgid "HMAC" msgstr "HMAC" -#: ../libpurple/protocols/silc/silc.c:1948 +#: ../libpurple/protocols/silc/silc.c:2079 msgid "Use Perfect Forward Secrecy" msgstr "Tökéletes továbbítási titkosság használata" -#: ../libpurple/protocols/silc/silc.c:1952 -#: ../libpurple/protocols/silc10/silc.c:1891 +#: ../libpurple/protocols/silc/silc.c:2083 +#: ../libpurple/protocols/silc10/silc.c:1894 msgid "Public key authentication" msgstr "Nyilvános kulcs hitelesítése" -#: ../libpurple/protocols/silc/silc.c:1955 -#: ../libpurple/protocols/silc10/silc.c:1894 +#: ../libpurple/protocols/silc/silc.c:2086 +#: ../libpurple/protocols/silc10/silc.c:1897 msgid "Block IMs without Key Exchange" msgstr "Kulcscsere nélküli azonnali üzenetváltások tiltása" -#: ../libpurple/protocols/silc/silc.c:1958 -#: ../libpurple/protocols/silc10/silc.c:1897 +#: ../libpurple/protocols/silc/silc.c:2089 +#: ../libpurple/protocols/silc10/silc.c:1900 msgid "Block messages to whiteboard" msgstr "Üzenetek tiltása a rajzlapra" -#: ../libpurple/protocols/silc/silc.c:1961 -#: ../libpurple/protocols/silc10/silc.c:1900 +#: ../libpurple/protocols/silc/silc.c:2092 +#: ../libpurple/protocols/silc10/silc.c:1903 msgid "Automatically open whiteboard" msgstr "Rajzlap automatikus megnyitása" -#: ../libpurple/protocols/silc/silc.c:1964 -#: ../libpurple/protocols/silc10/silc.c:1903 +#: ../libpurple/protocols/silc/silc.c:2095 +#: ../libpurple/protocols/silc10/silc.c:1906 msgid "Digitally sign and verify all messages" msgstr "Minden üzenet digitális aláírása és ellenőrzése" @@ -12109,60 +12365,60 @@ #. Hint for translators: Please check the tabulator width here and in #. the next strings (short strings: 2 tabs, longer strings 1 tab, #. sum: 3 tabs or 24 characters) -#: ../libpurple/protocols/silc/util.c:358 +#: ../libpurple/protocols/silc/util.c:362 #: ../libpurple/protocols/silc10/util.c:355 #, c-format msgid "Real Name: \t%s\n" msgstr "Valódi név: \t%s\n" -#: ../libpurple/protocols/silc/util.c:360 +#: ../libpurple/protocols/silc/util.c:364 #: ../libpurple/protocols/silc10/util.c:357 #, c-format msgid "User Name: \t%s\n" msgstr "Felhasználónév: \t%s\n" -#: ../libpurple/protocols/silc/util.c:362 +#: ../libpurple/protocols/silc/util.c:366 #: ../libpurple/protocols/silc10/util.c:359 #, c-format msgid "E-Mail: \t\t%s\n" msgstr "E-mail: \t\t%s\n" -#: ../libpurple/protocols/silc/util.c:364 +#: ../libpurple/protocols/silc/util.c:368 #: ../libpurple/protocols/silc10/util.c:361 #, c-format msgid "Host Name: \t%s\n" msgstr "Kiszolgálónév: \t%s\n" -#: ../libpurple/protocols/silc/util.c:366 +#: ../libpurple/protocols/silc/util.c:370 #: ../libpurple/protocols/silc10/util.c:363 #, c-format msgid "Organization: \t%s\n" msgstr "Szervezet: \t%s\n" -#: ../libpurple/protocols/silc/util.c:368 +#: ../libpurple/protocols/silc/util.c:372 #: ../libpurple/protocols/silc10/util.c:365 #, c-format msgid "Country: \t%s\n" msgstr "Ország: \t%s\n" -#: ../libpurple/protocols/silc/util.c:369 +#: ../libpurple/protocols/silc/util.c:373 #: ../libpurple/protocols/silc10/util.c:366 #, c-format msgid "Algorithm: \t%s\n" msgstr "Algoritmus: \t%s\n" -#: ../libpurple/protocols/silc/util.c:370 +#: ../libpurple/protocols/silc/util.c:374 #: ../libpurple/protocols/silc10/util.c:367 #, c-format msgid "Key Length: \t%d bits\n" msgstr "Kulcs hossza: \t%d bit\n" -#: ../libpurple/protocols/silc/util.c:372 +#: ../libpurple/protocols/silc/util.c:376 #, c-format msgid "Version: \t%s\n" msgstr "Verzió: \t%s\n" -#: ../libpurple/protocols/silc/util.c:374 +#: ../libpurple/protocols/silc/util.c:378 #: ../libpurple/protocols/silc10/util.c:369 #, c-format msgid "" @@ -12174,7 +12430,7 @@ "%s\n" "\n" -#: ../libpurple/protocols/silc/util.c:375 +#: ../libpurple/protocols/silc/util.c:379 #: ../libpurple/protocols/silc10/util.c:370 #, c-format msgid "" @@ -12184,44 +12440,44 @@ "Nyilvános kulcs blablakódja:\n" "%s" -#: ../libpurple/protocols/silc/util.c:379 -#: ../libpurple/protocols/silc/util.c:380 +#: ../libpurple/protocols/silc/util.c:383 +#: ../libpurple/protocols/silc/util.c:384 #: ../libpurple/protocols/silc10/util.c:374 #: ../libpurple/protocols/silc10/util.c:375 msgid "Public Key Information" msgstr "Nyilvános kulcs információi" -#: ../libpurple/protocols/silc/util.c:559 +#: ../libpurple/protocols/silc/util.c:563 #: ../libpurple/protocols/silc10/util.c:555 msgid "Paging" msgstr "Lapozás" -#: ../libpurple/protocols/silc/util.c:565 +#: ../libpurple/protocols/silc/util.c:569 #: ../libpurple/protocols/silc10/util.c:561 msgid "Video Conferencing" msgstr "Videokonferencia" -#: ../libpurple/protocols/silc/util.c:583 +#: ../libpurple/protocols/silc/util.c:587 #: ../libpurple/protocols/silc10/util.c:579 msgid "Computer" msgstr "Számítógép" -#: ../libpurple/protocols/silc/util.c:587 +#: ../libpurple/protocols/silc/util.c:591 #: ../libpurple/protocols/silc10/util.c:583 msgid "PDA" msgstr "PDA" -#: ../libpurple/protocols/silc/util.c:589 +#: ../libpurple/protocols/silc/util.c:593 #: ../libpurple/protocols/silc10/util.c:585 msgid "Terminal" msgstr "Terminál" -#: ../libpurple/protocols/silc/wb.c:284 ../libpurple/protocols/silc10/wb.c:284 +#: ../libpurple/protocols/silc/wb.c:288 ../libpurple/protocols/silc10/wb.c:287 #, c-format msgid "%s sent message to whiteboard. Would you like to open the whiteboard?" msgstr "%s üzenetet küldött a rajzlapra. Meg kívánja nyitni a rajzlapot?" -#: ../libpurple/protocols/silc/wb.c:288 ../libpurple/protocols/silc10/wb.c:288 +#: ../libpurple/protocols/silc/wb.c:292 ../libpurple/protocols/silc10/wb.c:291 #, c-format msgid "" "%s sent message to whiteboard on %s channel. Would you like to open the " @@ -12230,7 +12486,7 @@ "%s üzenetet küldött a rajzlapra a(z) %s csatornán. Meg kívánja nyitni a " "rajzlapot?" -#: ../libpurple/protocols/silc/wb.c:302 ../libpurple/protocols/silc10/wb.c:302 +#: ../libpurple/protocols/silc/wb.c:306 ../libpurple/protocols/silc10/wb.c:305 msgid "Whiteboard" msgstr "Rajzlap" @@ -12246,8 +12502,7 @@ #: ../libpurple/protocols/silc10/ops.c:1934 #, c-format msgid "Failure: Remote does not trust/support your public key" -msgstr "" -"Hiba: A távoli fél nem bízik meg vagy nem támogatja az Ön nyilvános kulcsát" +msgstr "Hiba: A távoli fél nem bízik meg vagy nem támogatja az Ön nyilvános kulcsát" #: ../libpurple/protocols/silc10/ops.c:1937 #, c-format @@ -12307,36 +12562,35 @@ msgstr "Nem sikerült a SILC kulcspárt betölteni: %s" #. TODO: do we really want to disconnect on a failure to write? -#: ../libpurple/protocols/simple/simple.c:416 +#: ../libpurple/protocols/simple/simple.c:417 msgid "Could not write" msgstr "Nem sikerült az írás" -#: ../libpurple/protocols/simple/simple.c:438 -#: ../libpurple/protocols/simple/simple.c:1529 +#: ../libpurple/protocols/simple/simple.c:439 +#: ../libpurple/protocols/simple/simple.c:1684 msgid "Could not connect" msgstr "Nem sikerült kapcsolódni" -#: ../libpurple/protocols/simple/simple.c:1059 -#, fuzzy +#: ../libpurple/protocols/simple/simple.c:1122 msgid "Unknown server response." -msgstr "Ismeretlen ok." - -#: ../libpurple/protocols/simple/simple.c:1563 -#: ../libpurple/protocols/simple/simple.c:1605 -#: ../libpurple/protocols/simple/simple.c:1618 -#: ../libpurple/protocols/simple/simple.c:1669 +msgstr "Ismeretlen kiszolgálóválasz." + +#: ../libpurple/protocols/simple/simple.c:1718 +#: ../libpurple/protocols/simple/simple.c:1760 +#: ../libpurple/protocols/simple/simple.c:1773 +#: ../libpurple/protocols/simple/simple.c:1824 msgid "Could not create listen socket" msgstr "Nem sikerült létrehozni a figyelő foglalatot" -#: ../libpurple/protocols/simple/simple.c:1586 +#: ../libpurple/protocols/simple/simple.c:1741 msgid "Couldn't resolve host" msgstr "Nem sikerült a kiszolgáló feloldása" -#: ../libpurple/protocols/simple/simple.c:1677 +#: ../libpurple/protocols/simple/simple.c:1832 msgid "Could not resolve hostname" msgstr "A gépnév nem oldható fel" -#: ../libpurple/protocols/simple/simple.c:1694 +#: ../libpurple/protocols/simple/simple.c:1849 msgid "SIP screen names may not contain whitespaces or @ symbols" msgstr "A SIP felhasználónevek nem tartalmazhatnak szóközt vagy @ szimbólumot" @@ -12348,36 +12602,36 @@ #. *< id #. *< name #. *< version -#: ../libpurple/protocols/simple/simple.c:1870 +#: ../libpurple/protocols/simple/simple.c:2035 msgid "SIP/SIMPLE Protocol Plugin" msgstr "SIP/SIMPLE protokollbővítmény" #. * summary -#: ../libpurple/protocols/simple/simple.c:1871 +#: ../libpurple/protocols/simple/simple.c:2036 msgid "The SIP/SIMPLE Protocol Plugin" msgstr "A SIP/SIMPLE protokollbővítmény" -#: ../libpurple/protocols/simple/simple.c:1899 +#: ../libpurple/protocols/simple/simple.c:2064 msgid "Publish status (note: everyone may watch you)" msgstr "Állapot közzététele (megjegyzés: mindenki figyelheti)" -#: ../libpurple/protocols/simple/simple.c:1905 +#: ../libpurple/protocols/simple/simple.c:2070 msgid "Use UDP" msgstr "UDP használata" -#: ../libpurple/protocols/simple/simple.c:1907 +#: ../libpurple/protocols/simple/simple.c:2072 msgid "Use proxy" msgstr "Proxy használata" -#: ../libpurple/protocols/simple/simple.c:1909 +#: ../libpurple/protocols/simple/simple.c:2074 msgid "Proxy" msgstr "Proxy" -#: ../libpurple/protocols/simple/simple.c:1911 +#: ../libpurple/protocols/simple/simple.c:2076 msgid "Auth User" msgstr "Felhasználó hitelesítése" -#: ../libpurple/protocols/simple/simple.c:1913 +#: ../libpurple/protocols/simple/simple.c:2078 msgid "Auth Domain" msgstr "Tartomány hitelesítése" @@ -12424,8 +12678,7 @@ #: ../libpurple/protocols/toc/toc.c:503 #, c-format msgid "A message has been dropped, you are exceeding the server speed limit." -msgstr "" -"Egy üzenet el lett dobva, Ön túllépte a kiszolgáló átviteli sebességhatárát." +msgstr "Egy üzenet el lett dobva, Ön túllépte a kiszolgáló átviteli sebességhatárát." #: ../libpurple/protocols/toc/toc.c:506 #, c-format @@ -12553,8 +12806,8 @@ msgid "Password Change Successful" msgstr "Jelszó sikeresen megváltoztatva" -#: ../libpurple/protocols/toc/toc.c:1366 ../pidgin/gtkblist.c:5582 -#: ../pidgin/gtkblist.c:5932 +#: ../libpurple/protocols/toc/toc.c:1366 ../pidgin/gtkblist.c:5948 +#: ../pidgin/gtkblist.c:6306 msgid "_Group:" msgstr "_Csoport:" @@ -12614,25 +12867,25 @@ msgid "TOC Protocol Plugin" msgstr "TOC protokollbővítmény" -#: ../libpurple/protocols/yahoo/yahoo.c:782 +#: ../libpurple/protocols/yahoo/yahoo.c:784 #, c-format msgid "%s has sent you a webcam invite, which is not yet supported." msgstr "%s webkamera-meghívást küldött, ami még nem támogatott." -#: ../libpurple/protocols/yahoo/yahoo.c:838 +#: ../libpurple/protocols/yahoo/yahoo.c:840 msgid "Your Yahoo! message did not get sent." msgstr "Az Ön Yahoo! üzenete nem lett elküldve." -#: ../libpurple/protocols/yahoo/yahoo.c:960 +#: ../libpurple/protocols/yahoo/yahoo.c:962 #, c-format msgid "Yahoo! system message for %s:" msgstr "Yahoo! rendszerüzenet %s számára:" -#: ../libpurple/protocols/yahoo/yahoo.c:1029 +#: ../libpurple/protocols/yahoo/yahoo.c:1031 msgid "Authorization denied message:" msgstr "Hozzáférés elutasítva üzenet:" -#: ../libpurple/protocols/yahoo/yahoo.c:1047 +#: ../libpurple/protocols/yahoo/yahoo.c:1049 #, c-format msgid "" "%s has (retroactively) denied your request to add them to your list for the " @@ -12641,18 +12894,18 @@ "%s visszamenőlegesen megtagadta az engedélyt, hogy felvegye őt a partnerei " "közé, a következő magyarázattal: %s." -#: ../libpurple/protocols/yahoo/yahoo.c:1050 +#: ../libpurple/protocols/yahoo/yahoo.c:1052 #, c-format msgid "%s has (retroactively) denied your request to add them to your list." msgstr "" "%s visszamenőlegesen megtagadta az engedélyt, hogy felvegye őt a partnerei " "közé." -#: ../libpurple/protocols/yahoo/yahoo.c:1052 +#: ../libpurple/protocols/yahoo/yahoo.c:1054 msgid "Add buddy rejected" msgstr "Partner felvétele megtagadva" -#: ../libpurple/protocols/yahoo/yahoo.c:1994 +#: ../libpurple/protocols/yahoo/yahoo.c:1996 #, c-format msgid "" "The Yahoo server has requested the use of an unrecognized authentication " @@ -12663,11 +12916,11 @@ "Valószínűleg nem fog tudni sikeresen bejelentkezni. Keressen esetleges " "frissítéseket a következő helyen: %s." -#: ../libpurple/protocols/yahoo/yahoo.c:1997 +#: ../libpurple/protocols/yahoo/yahoo.c:1999 msgid "Failed Yahoo! Authentication" msgstr "Yahoo! hitelesítés sikertelen" -#: ../libpurple/protocols/yahoo/yahoo.c:2063 +#: ../libpurple/protocols/yahoo/yahoo.c:2065 #, c-format msgid "" "You have tried to ignore %s, but the user is on your buddy list. Clicking " @@ -12677,52 +12930,52 @@ "az \"Igen\"-re kattint, eltávolítja a listáról és mellőzni fogja a " "felhasználót." -#: ../libpurple/protocols/yahoo/yahoo.c:2066 +#: ../libpurple/protocols/yahoo/yahoo.c:2068 msgid "Ignore buddy?" msgstr "Mellőzi a partnert?" -#: ../libpurple/protocols/yahoo/yahoo.c:2129 +#: ../libpurple/protocols/yahoo/yahoo.c:2131 msgid "Your account is locked, please log in to the Yahoo! website." msgstr "A fiókja zárolva van, kérem jelentkezzen be a Yahoo! weboldalára." -#: ../libpurple/protocols/yahoo/yahoo.c:2132 +#: ../libpurple/protocols/yahoo/yahoo.c:2134 #, c-format msgid "Unknown error number %d. Logging into the Yahoo! website may fix this." msgstr "" "Ismeretlen hibaszám: %d. A Yahoo! weboldalára bejelentkezve talán " "megoldhatja ezt a problémát." -#: ../libpurple/protocols/yahoo/yahoo.c:2186 +#: ../libpurple/protocols/yahoo/yahoo.c:2188 #, c-format msgid "Could not add buddy %s to group %s to the server list on account %s." msgstr "" "Nem sikerült a(z) %s partner hozzáadása a(z) %s csoporthoz, a(z) %s fiókhoz " "tartozó kiszolgálóoldali listán." -#: ../libpurple/protocols/yahoo/yahoo.c:2189 +#: ../libpurple/protocols/yahoo/yahoo.c:2191 msgid "Could not add buddy to server list" msgstr "Nem sikerült a partnert hozzáadni a kiszolgálóoldali listához" -#: ../libpurple/protocols/yahoo/yahoo.c:2308 +#: ../libpurple/protocols/yahoo/yahoo.c:2310 #, c-format msgid "[ Audible %s/%s/%s.swf ] %s" msgstr "[ Hallható %s/%s/%s.swf ] %s" -#: ../libpurple/protocols/yahoo/yahoo.c:2651 +#: ../libpurple/protocols/yahoo/yahoo.c:2653 msgid "Received unexpected HTTP response from server." msgstr "Váratlan HTTP válasz érkezett a kiszolgálótól." -#: ../libpurple/protocols/yahoo/yahoo.c:2675 -#: ../libpurple/protocols/yahoo/yahoo.c:2861 -#: ../libpurple/protocols/yahoo/yahoo.c:2964 -#: ../libpurple/protocols/yahoo/yahoo.c:2974 +#: ../libpurple/protocols/yahoo/yahoo.c:2677 +#: ../libpurple/protocols/yahoo/yahoo.c:2863 +#: ../libpurple/protocols/yahoo/yahoo.c:2966 +#: ../libpurple/protocols/yahoo/yahoo.c:2976 #: ../libpurple/protocols/yahoo/yahoochat.c:1514 #: ../libpurple/protocols/yahoo/yahoochat.c:1584 #: ../libpurple/protocols/yahoo/ycht.c:585 msgid "Connection problem" msgstr "Kapcsolathiba" -#: ../libpurple/protocols/yahoo/yahoo.c:2701 +#: ../libpurple/protocols/yahoo/yahoo.c:2703 #, c-format msgid "" "Lost connection with %s:\n" @@ -12731,7 +12984,7 @@ "Elveszett a kapcsolat a következővel: %s:\n" "%s" -#: ../libpurple/protocols/yahoo/yahoo.c:2726 +#: ../libpurple/protocols/yahoo/yahoo.c:2728 #, c-format msgid "" "Could not establish a connection with %s:\n" @@ -12740,113 +12993,103 @@ "Nem hozható létre kapcsolat a következővel: %s:\n" "%s" -#: ../libpurple/protocols/yahoo/yahoo.c:3081 -#: ../libpurple/protocols/yahoo/yahoo.c:3767 +#: ../libpurple/protocols/yahoo/yahoo.c:3083 +#: ../libpurple/protocols/yahoo/yahoo.c:3769 msgid "Not at Home" msgstr "Nem vagyok itthon" -#: ../libpurple/protocols/yahoo/yahoo.c:3083 -#: ../libpurple/protocols/yahoo/yahoo.c:3770 -msgid "Not at Desk" -msgstr "Nem vagyok az asztalnál" - #: ../libpurple/protocols/yahoo/yahoo.c:3085 -#: ../libpurple/protocols/yahoo/yahoo.c:3773 +#: ../libpurple/protocols/yahoo/yahoo.c:3772 +msgid "Not at Desk" +msgstr "Nem vagyok az asztalnál" + +#: ../libpurple/protocols/yahoo/yahoo.c:3087 +#: ../libpurple/protocols/yahoo/yahoo.c:3775 msgid "Not in Office" msgstr "Nem vagyok a munkahelyemen" -#: ../libpurple/protocols/yahoo/yahoo.c:3089 -#: ../libpurple/protocols/yahoo/yahoo.c:3779 +#: ../libpurple/protocols/yahoo/yahoo.c:3091 +#: ../libpurple/protocols/yahoo/yahoo.c:3781 msgid "On Vacation" msgstr "Nyaralok" -#: ../libpurple/protocols/yahoo/yahoo.c:3093 -#: ../libpurple/protocols/yahoo/yahoo.c:3785 +#: ../libpurple/protocols/yahoo/yahoo.c:3095 +#: ../libpurple/protocols/yahoo/yahoo.c:3787 msgid "Stepped Out" msgstr "Kilépett" -#: ../libpurple/protocols/yahoo/yahoo.c:3186 -#: ../libpurple/protocols/yahoo/yahoo.c:3216 +#: ../libpurple/protocols/yahoo/yahoo.c:3188 +#: ../libpurple/protocols/yahoo/yahoo.c:3218 msgid "Not on server list" msgstr "Nincs a szerverlistán" -#: ../libpurple/protocols/yahoo/yahoo.c:3233 -#: ../libpurple/protocols/yahoo/yahoo.c:3291 +#: ../libpurple/protocols/yahoo/yahoo.c:3235 +#: ../libpurple/protocols/yahoo/yahoo.c:3293 msgid "Appear Online" msgstr "Belépettként látszik" -#: ../libpurple/protocols/yahoo/yahoo.c:3236 -#: ../libpurple/protocols/yahoo/yahoo.c:3312 +#: ../libpurple/protocols/yahoo/yahoo.c:3238 +#: ../libpurple/protocols/yahoo/yahoo.c:3314 msgid "Appear Permanently Offline" msgstr "Tartósan kilépettként látszik" -#: ../libpurple/protocols/yahoo/yahoo.c:3254 +#: ../libpurple/protocols/yahoo/yahoo.c:3256 msgid "Presence" msgstr "Jelenlét" -#: ../libpurple/protocols/yahoo/yahoo.c:3297 +#: ../libpurple/protocols/yahoo/yahoo.c:3299 msgid "Appear Offline" msgstr "Kilépettként látszik" -#: ../libpurple/protocols/yahoo/yahoo.c:3306 +#: ../libpurple/protocols/yahoo/yahoo.c:3308 msgid "Don't Appear Permanently Offline" msgstr "Ne látsszon tartósan kilépettként" -#: ../libpurple/protocols/yahoo/yahoo.c:3354 +#: ../libpurple/protocols/yahoo/yahoo.c:3356 msgid "Join in Chat" msgstr "Csatlakozás a csevegéshez" -#: ../libpurple/protocols/yahoo/yahoo.c:3360 +#: ../libpurple/protocols/yahoo/yahoo.c:3362 msgid "Initiate Conference" msgstr "Konferencia kezdeményezése" -#: ../libpurple/protocols/yahoo/yahoo.c:3388 +#: ../libpurple/protocols/yahoo/yahoo.c:3390 msgid "Presence Settings" msgstr "Jelenlét beállításai" -#: ../libpurple/protocols/yahoo/yahoo.c:3394 +#: ../libpurple/protocols/yahoo/yahoo.c:3396 msgid "Start Doodling" msgstr "Firkálás megkezdése" -#: ../libpurple/protocols/yahoo/yahoo.c:3495 +#: ../libpurple/protocols/yahoo/yahoo.c:3497 msgid "Activate which ID?" msgstr "Melyik azonosítót aktiválja?" -#: ../libpurple/protocols/yahoo/yahoo.c:3506 -msgid "Join whom in chat?" +#: ../libpurple/protocols/yahoo/yahoo.c:3508 +msgid "Join who in chat?" msgstr "Kihez csatlakozik a csevegésben?" -#: ../libpurple/protocols/yahoo/yahoo.c:3518 +#: ../libpurple/protocols/yahoo/yahoo.c:3520 msgid "Activate ID..." msgstr "Azonosító aktiválása..." -#: ../libpurple/protocols/yahoo/yahoo.c:3522 +#: ../libpurple/protocols/yahoo/yahoo.c:3524 msgid "Join User in Chat..." msgstr "Felhasználó csatlakoztatása csevegéshez..." -#: ../libpurple/protocols/yahoo/yahoo.c:3527 +#: ../libpurple/protocols/yahoo/yahoo.c:3529 msgid "Open Inbox" msgstr "Bejövő levelek megnyitása" -#: ../libpurple/protocols/yahoo/yahoo.c:4119 -#, fuzzy -msgid "Buzz" -msgstr "csörgetés" - -#: ../libpurple/protocols/yahoo/yahoo.c:4121 -#, fuzzy, c-format -msgid "Buzzing %s..." -msgstr "Csörgetés" - -#: ../libpurple/protocols/yahoo/yahoo.c:4136 +#: ../libpurple/protocols/yahoo/yahoo.c:4138 msgid "join <room>: Join a chat room on the Yahoo network" msgstr "join <szoba>: Csatlakozás csevegőszobához a Yahoo hálózatán" -#: ../libpurple/protocols/yahoo/yahoo.c:4141 +#: ../libpurple/protocols/yahoo/yahoo.c:4143 msgid "list: List rooms on the Yahoo network" msgstr "list: Csatornák listázása a Yahoo hálózatán" -#: ../libpurple/protocols/yahoo/yahoo.c:4149 +#: ../libpurple/protocols/yahoo/yahoo.c:4151 msgid "doodle: Request user to start a Doodle session" msgstr "doodle: Kérés a felhasználóhoz egy firkálási folyamat indítására" @@ -12860,56 +13103,56 @@ #. *< version #. * summary #. * description -#: ../libpurple/protocols/yahoo/yahoo.c:4358 #: ../libpurple/protocols/yahoo/yahoo.c:4360 +#: ../libpurple/protocols/yahoo/yahoo.c:4362 msgid "Yahoo Protocol Plugin" msgstr "Yahoo protokollbővítmény" -#: ../libpurple/protocols/yahoo/yahoo.c:4383 +#: ../libpurple/protocols/yahoo/yahoo.c:4385 msgid "Yahoo Japan" msgstr "Yahoo Japán" -#: ../libpurple/protocols/yahoo/yahoo.c:4386 +#: ../libpurple/protocols/yahoo/yahoo.c:4388 msgid "Pager server" msgstr "Személyhívó kiszolgáló" -#: ../libpurple/protocols/yahoo/yahoo.c:4389 +#: ../libpurple/protocols/yahoo/yahoo.c:4391 msgid "Japan Pager server" msgstr "Japán személyhívó kiszolgáló" -#: ../libpurple/protocols/yahoo/yahoo.c:4392 +#: ../libpurple/protocols/yahoo/yahoo.c:4394 msgid "Pager port" msgstr "Személyhívó Port" -#: ../libpurple/protocols/yahoo/yahoo.c:4395 +#: ../libpurple/protocols/yahoo/yahoo.c:4397 msgid "File transfer server" msgstr "Fájlátviteli kiszolgáló" -#: ../libpurple/protocols/yahoo/yahoo.c:4398 +#: ../libpurple/protocols/yahoo/yahoo.c:4400 msgid "Japan file transfer server" msgstr "Japán fájlátviteli kiszolgáló" -#: ../libpurple/protocols/yahoo/yahoo.c:4401 +#: ../libpurple/protocols/yahoo/yahoo.c:4403 msgid "File transfer port" msgstr "Fájlátviteli port" -#: ../libpurple/protocols/yahoo/yahoo.c:4404 +#: ../libpurple/protocols/yahoo/yahoo.c:4406 msgid "Chat room locale" msgstr "Csevegőszoba nyelve" -#: ../libpurple/protocols/yahoo/yahoo.c:4407 +#: ../libpurple/protocols/yahoo/yahoo.c:4409 msgid "Ignore conference and chatroom invitations" msgstr "Konferencia- és csevegőszoba-meghívások figyelmen kívül hagyása" -#: ../libpurple/protocols/yahoo/yahoo.c:4415 +#: ../libpurple/protocols/yahoo/yahoo.c:4417 msgid "Chat room list URL" msgstr "Csevegőszobák listájának URL címe" -#: ../libpurple/protocols/yahoo/yahoo.c:4418 +#: ../libpurple/protocols/yahoo/yahoo.c:4420 msgid "Yahoo Chat server" msgstr "Yahoo csevegőkiszolgáló" -#: ../libpurple/protocols/yahoo/yahoo.c:4421 +#: ../libpurple/protocols/yahoo/yahoo.c:4423 msgid "Yahoo Chat port" msgstr "Yahoo csevegőport" @@ -12927,7 +13170,7 @@ msgstr "Nem lehet a fájlleírót létrehozni." #. TODO: what to do here - do we really have to disconnect? -#: ../libpurple/protocols/yahoo/yahoo_packet.c:307 +#: ../libpurple/protocols/yahoo/yahoo_packet.c:306 msgid "Write Error" msgstr "Írási hiba" @@ -13185,8 +13428,7 @@ "csevegéshez" #: ../libpurple/protocols/zephyr/zephyr.c:2721 -msgid "" -"zi <instance>: Send a message to <message,<i>instance</i>,*>" +msgid "zi <instance>: Send a message to <message,<i>instance</i>,*>" msgstr "" "zi <példány>: Üzenet küldése a következőnek: <üzenet,<i>példány</i>," "*>" @@ -13276,8 +13518,8 @@ msgid "Exposure" msgstr "Exportálás" -#: ../libpurple/proxy.c:459 ../libpurple/proxy.c:894 ../libpurple/proxy.c:1049 -#: ../libpurple/proxy.c:1617 +#: ../libpurple/proxy.c:461 ../libpurple/proxy.c:902 ../libpurple/proxy.c:1061 +#: ../libpurple/proxy.c:1632 #, c-format msgid "" "Unable to create socket:\n" @@ -13286,48 +13528,62 @@ "Nem lehet létrehozni a foglalatot:\n" "%s" -#: ../libpurple/proxy.c:659 +#: ../libpurple/proxy.c:662 #, c-format msgid "Unable to parse response from HTTP proxy: %s\n" msgstr "A válasz nem dolgozható fel a HTTP proxytól: %s\n" -#: ../libpurple/proxy.c:698 ../libpurple/proxy.c:744 ../libpurple/proxy.c:780 -#: ../libpurple/proxy.c:792 +#: ../libpurple/proxy.c:702 ../libpurple/proxy.c:750 ../libpurple/proxy.c:786 +#: ../libpurple/proxy.c:798 #, c-format msgid "HTTP proxy connection error %d" msgstr "%d HTTP proxy kapcsolathiba" -#: ../libpurple/proxy.c:788 +#: ../libpurple/proxy.c:794 #, c-format msgid "Access denied: HTTP proxy server forbids port %d tunneling." msgstr "" "Hozzáférés megtagadva: a HTTP proxy kiszolgáló tiltja az alagutazást a(z) %" "d. porton." -#: ../libpurple/proxy.c:1012 +#: ../libpurple/proxy.c:1022 #, c-format msgid "Error resolving %s" msgstr "Hiba %s feloldásakor" -#: ../libpurple/proxy.c:1714 +#: ../libpurple/proxy.c:1730 msgid "Could not resolve host name" msgstr "A gépnév nem oldható fel" #. * #. * A wrapper for purple_request_action() that uses @c Yes and @c No buttons. +#. * +#. * @since 2.3.0 #. -#: ../libpurple/request.h:1378 +#. * +#. * A wrapper for purple_request_action() that uses @c Yes and @c No buttons. +#. * +#. * @deprecated Please use purple_request_yes_no_with_hint instead. +#. +#: ../libpurple/request.h:1802 ../libpurple/request.h:1815 msgid "_Yes" msgstr "_Igen" -#: ../libpurple/request.h:1378 +#: ../libpurple/request.h:1802 ../libpurple/request.h:1815 msgid "_No" msgstr "_Nem" #. * #. * A wrapper for purple_request_action() that uses Accept and Cancel buttons. +#. * +#. * @since 2.3.0 #. -#: ../libpurple/request.h:1398 +#. * +#. * A wrapper for purple_request_action() that uses Accept and Cancel buttons. +#. * +#. * @deprecated Please use purple_request_accept_cancel_with_hint instead. +#. +#: ../libpurple/request.h:1854 ../libpurple/request.h:1867 msgid "_Accept" msgstr "Elfog_adás" @@ -13350,14 +13606,14 @@ #: ../libpurple/server.c:302 #, c-format msgid "Requesting %s's attention..." -msgstr "" +msgstr "%s figyelmének kérése..." #: ../libpurple/server.c:347 #, c-format msgid "%s has requested your attention!" -msgstr "" - -#: ../libpurple/server.c:796 +msgstr "%s a figyelmét kéri!" + +#: ../libpurple/server.c:793 #, c-format msgid "" "%s has invited %s to the chat room %s:\n" @@ -13366,39 +13622,37 @@ "%s meghívta %s felhasználót a(z) %s csevegőszobába:\n" "%s" -#: ../libpurple/server.c:801 +#: ../libpurple/server.c:798 #, c-format msgid "%s has invited %s to the chat room %s\n" msgstr "%s meghívta %s felhasználót a(z) %s csevegőszobába:\n" -#: ../libpurple/server.c:805 +#: ../libpurple/server.c:802 msgid "Accept chat invitation?" msgstr "Elfogadja a meghívást a csevegésre?" #: ../libpurple/sslconn.c:164 -#, fuzzy msgid "SSL Connection Failed" -msgstr "Kapcsolódás sikertelen" +msgstr "Az SSL kapcsolat meghiúsult" #: ../libpurple/sslconn.c:166 -#, fuzzy msgid "SSL Handshake Failed" -msgstr "A fájlátvitel meghiúsult" +msgstr "Az SSL kézfogás meghiúsult" #: ../libpurple/sslconn.c:168 msgid "SSL peer presented an invalid certificate" -msgstr "" +msgstr "Az SSL partner érvénytelen tanúsítványt mutatott be" #: ../libpurple/sslconn.c:171 -#, fuzzy msgid "Unknown SSL error" -msgstr "Ismeretlen hiba" +msgstr "Ismeretlen SSL hiba" #: ../libpurple/status.c:153 msgid "Unset" msgstr "Visszaállítás" -#: ../libpurple/status.c:156 ../pidgin/gtkstatusbox.c:1059 +#: ../libpurple/status.c:156 ../pidgin/gtkdocklet.c:553 +#: ../pidgin/gtkstatusbox.c:1059 msgid "Do not disturb" msgstr "Ne zavarjanak" @@ -13410,52 +13664,71 @@ msgid "Mobile" msgstr "Mobil" -#: ../libpurple/status.c:609 +#: ../libpurple/status.c:161 +msgid "Listening to music" +msgstr "Zenét hallgat" + +#: ../libpurple/status.c:610 #, c-format msgid "%s changed status from %s to %s" msgstr "%s megváltoztatta az állapotát (%s -> %s)" -#: ../libpurple/status.c:619 +#: ../libpurple/status.c:613 +#, c-format +msgid "%s (%s) changed status from %s to %s" +msgstr "%s (%s) megváltoztatta az állapotát (%s -> %s)" + +#: ../libpurple/status.c:624 #, c-format msgid "%s is now %s" msgstr "%s ezentúl %s" -#: ../libpurple/status.c:624 +#: ../libpurple/status.c:626 +#, c-format +msgid "%s (%s) is now %s" +msgstr "%s (%s) ezentúl %s" + +#: ../libpurple/status.c:632 #, c-format msgid "%s is no longer %s" msgstr "%s már nem %s" -#: ../libpurple/status.c:1234 +#: ../libpurple/status.c:634 +#, c-format +msgid "%s (%s) is no longer %s" +msgstr "%s (%s) már nem %s" + +#: ../libpurple/status.c:1247 #, c-format msgid "%s became idle" msgstr "%s inaktív lett" -#: ../libpurple/status.c:1251 +#: ../libpurple/status.c:1264 #, c-format msgid "%s became unidle" msgstr "%s már nem inaktív" -#: ../libpurple/status.c:1314 +#: ../libpurple/status.c:1327 #, c-format msgid "+++ %s became idle" msgstr "+++ %s inaktív lett" -#: ../libpurple/status.c:1316 +#: ../libpurple/status.c:1329 #, c-format msgid "+++ %s became unidle" msgstr "+++ %s már nem inaktív" -#: ../libpurple/util.c:718 +#: ../libpurple/util.c:721 #, c-format msgid "%x %X" msgstr "%x %X" -#: ../libpurple/util.c:2722 +#: ../libpurple/util.c:2783 #, c-format msgid "Error Reading %s" msgstr "Hiba %s olvasásakor" -#: ../libpurple/util.c:2723 +#: ../libpurple/util.c:2784 #, c-format msgid "" "An error was encountered reading your %s. They have not been loaded, and " @@ -13464,67 +13737,67 @@ "Hiba lépett fel a(z) %s feldolgozása közben. Ezek nem lettek betöltve, a " "régi fájl %s~ néven lett elmentve." -#: ../libpurple/util.c:3223 +#: ../libpurple/util.c:3281 msgid "Calculating..." msgstr "Számítás..." -#: ../libpurple/util.c:3226 +#: ../libpurple/util.c:3284 msgid "Unknown." msgstr "Ismeretlen." -#: ../libpurple/util.c:3252 +#: ../libpurple/util.c:3310 #, c-format msgid "%d second" msgid_plural "%d seconds" msgstr[0] "%d másodperc" msgstr[1] "%d másodperc" -#: ../libpurple/util.c:3264 +#: ../libpurple/util.c:3322 #, c-format msgid "%d day" msgid_plural "%d days" msgstr[0] "%d nap" msgstr[1] "%d nap" -#: ../libpurple/util.c:3272 +#: ../libpurple/util.c:3330 #, c-format msgid "%s, %d hour" msgid_plural "%s, %d hours" msgstr[0] "%s, %d óra" msgstr[1] "%s, %d óra" -#: ../libpurple/util.c:3278 +#: ../libpurple/util.c:3336 #, c-format msgid "%d hour" msgid_plural "%d hours" msgstr[0] "%d óra" msgstr[1] "%d óra" -#: ../libpurple/util.c:3286 +#: ../libpurple/util.c:3344 #, c-format msgid "%s, %d minute" msgid_plural "%s, %d minutes" msgstr[0] "%s, %d perc" msgstr[1] "%s, %d perc" -#: ../libpurple/util.c:3292 +#: ../libpurple/util.c:3350 #, c-format msgid "%d minute" msgid_plural "%d minutes" msgstr[0] "%d perc" msgstr[1] "%d perc" -#: ../libpurple/util.c:3552 +#: ../libpurple/util.c:3610 #, c-format msgid "Could not open %s: Redirected too many times" msgstr "%s nem nyitható meg: túl sok átirányítás" -#: ../libpurple/util.c:3589 ../libpurple/util.c:3885 +#: ../libpurple/util.c:3647 ../libpurple/util.c:3943 #, c-format msgid "Unable to connect to %s" msgstr "Nem lehet csatlakozni a következőhöz: %s" -#: ../libpurple/util.c:3712 +#: ../libpurple/util.c:3770 #, c-format msgid "" "Unable to allocate enough memory to hold the contents from %s. The web " @@ -13533,17 +13806,17 @@ "Nem lehet elég memóriát lefoglalni a(z) %s tartalmának tárolásához. " "Lehetséges, hogy a webkiszolgáló valami ártalmassal próbálkozik." -#: ../libpurple/util.c:3747 +#: ../libpurple/util.c:3805 #, c-format msgid "Error reading from %s: %s" msgstr "Hiba %s olvasása közben: %s" -#: ../libpurple/util.c:3778 +#: ../libpurple/util.c:3836 #, c-format msgid "Error writing to %s: %s" msgstr "Hiba %s írása közben: %s" -#: ../libpurple/util.c:3803 +#: ../libpurple/util.c:3861 #, c-format msgid "Unable to connect to %s: %s" msgstr "Nem lehet a következőhöz kapcsolódni: %s: %s" @@ -13560,80 +13833,80 @@ msgid "Send instant messages over multiple protocols" msgstr "Azonnali üzenetek küldése több protokoll használatával" -#: ../pidgin/eggtrayicon.c:129 +#: ../pidgin/eggtrayicon.c:128 msgid "Orientation" msgstr "Tájolás" -#: ../pidgin/eggtrayicon.c:130 +#: ../pidgin/eggtrayicon.c:129 msgid "The orientation of the tray." msgstr "A tálca tájolása." #. Build the login options frame. -#: ../pidgin/gtkaccount.c:407 +#: ../pidgin/gtkaccount.c:410 msgid "Login Options" msgstr "Bejelentkezés beállításai" -#: ../pidgin/gtkaccount.c:428 +#: ../pidgin/gtkaccount.c:431 msgid "Pro_tocol:" msgstr "_Protokoll:" -#: ../pidgin/gtkaccount.c:439 +#: ../pidgin/gtkaccount.c:442 msgid "Screen _name:" msgstr "_Felhasználónév:" -#: ../pidgin/gtkaccount.c:529 +#: ../pidgin/gtkaccount.c:532 msgid "_Local alias:" msgstr "_Helyi álnév:" -#: ../pidgin/gtkaccount.c:533 +#: ../pidgin/gtkaccount.c:536 msgid "Remember pass_word" msgstr "E_mlékezzen a jelszóra" #. Build the user options frame. -#: ../pidgin/gtkaccount.c:591 +#: ../pidgin/gtkaccount.c:594 msgid "User Options" msgstr "Felhasználói beállítások" -#: ../pidgin/gtkaccount.c:604 +#: ../pidgin/gtkaccount.c:607 msgid "New _mail notifications" msgstr "Értesítések új le_vélre" #. Buddy icon -#: ../pidgin/gtkaccount.c:609 +#: ../pidgin/gtkaccount.c:612 msgid "Use this buddy _icon for this account:" msgstr "Ezen _partnerikon használata a fiókhoz:" #. Build the protocol options frame. -#: ../pidgin/gtkaccount.c:731 +#: ../pidgin/gtkaccount.c:734 #, c-format msgid "%s Options" msgstr "%s beállításai" -#: ../pidgin/gtkaccount.c:936 +#: ../pidgin/gtkaccount.c:939 msgid "Use GNOME Proxy Settings" msgstr "GNOME proxybeállítások használata" -#: ../pidgin/gtkaccount.c:937 +#: ../pidgin/gtkaccount.c:940 msgid "Use Global Proxy Settings" msgstr "Globális proxybeállítások használata" -#: ../pidgin/gtkaccount.c:943 +#: ../pidgin/gtkaccount.c:946 msgid "No Proxy" msgstr "Nincs Proxy" -#: ../pidgin/gtkaccount.c:949 +#: ../pidgin/gtkaccount.c:952 msgid "HTTP" msgstr "HTTP" -#: ../pidgin/gtkaccount.c:955 +#: ../pidgin/gtkaccount.c:958 msgid "SOCKS 4" msgstr "SOCKS 4" -#: ../pidgin/gtkaccount.c:961 +#: ../pidgin/gtkaccount.c:964 msgid "SOCKS 5" msgstr "SOCKS 5" -#: ../pidgin/gtkaccount.c:967 ../pidgin/gtkprefs.c:1211 +#: ../pidgin/gtkaccount.c:970 ../pidgin/gtkprefs.c:1283 msgid "Use Environmental Settings" msgstr "Környezeti beállítások használata" @@ -13642,73 +13915,73 @@ #. A) your network is really slow and you have nothing better to do than #. look at butterflies. #. B)You are looking really closely at something that shouldn't matter. -#: ../pidgin/gtkaccount.c:1006 +#: ../pidgin/gtkaccount.c:1009 msgid "If you look real closely" msgstr "ha igazán közelről nézi" #. This is an easter egg. See the comment on the previous line in the source. -#: ../pidgin/gtkaccount.c:1009 +#: ../pidgin/gtkaccount.c:1012 msgid "you can see the butterflies mating" msgstr "láthatja a pillangók nászát" -#: ../pidgin/gtkaccount.c:1030 +#: ../pidgin/gtkaccount.c:1033 msgid "Proxy Options" msgstr "Proxy beállításai" -#: ../pidgin/gtkaccount.c:1044 ../pidgin/gtkprefs.c:1205 +#: ../pidgin/gtkaccount.c:1047 ../pidgin/gtkprefs.c:1277 msgid "Proxy _type:" msgstr "Proxy _típusa:" -#: ../pidgin/gtkaccount.c:1053 ../pidgin/gtkprefs.c:1226 +#: ../pidgin/gtkaccount.c:1056 ../pidgin/gtkprefs.c:1298 msgid "_Host:" msgstr "_Gépnév:" -#: ../pidgin/gtkaccount.c:1057 ../pidgin/gtkprefs.c:1244 +#: ../pidgin/gtkaccount.c:1060 ../pidgin/gtkprefs.c:1316 msgid "_Port:" msgstr "_Port:" -#: ../pidgin/gtkaccount.c:1065 +#: ../pidgin/gtkaccount.c:1068 msgid "_Username:" msgstr "_Felhasználó:" -#: ../pidgin/gtkaccount.c:1072 ../pidgin/gtkprefs.c:1281 +#: ../pidgin/gtkaccount.c:1075 ../pidgin/gtkprefs.c:1353 msgid "Pa_ssword:" msgstr "Jel_szó:" -#: ../pidgin/gtkaccount.c:1195 +#: ../pidgin/gtkaccount.c:1199 msgid "Unable to save new account" msgstr "Nem menthető az új fiók" -#: ../pidgin/gtkaccount.c:1196 +#: ../pidgin/gtkaccount.c:1200 msgid "An account already exists with the specified criteria." msgstr "Már létezik fiók a megadott feltételekkel." -#: ../pidgin/gtkaccount.c:1473 +#: ../pidgin/gtkaccount.c:1478 msgid "Add Account" msgstr "Fiók hozzáadása" -#: ../pidgin/gtkaccount.c:1492 +#: ../pidgin/gtkaccount.c:1497 msgid "_Basic" msgstr "_Alap" -#: ../pidgin/gtkaccount.c:1499 +#: ../pidgin/gtkaccount.c:1504 msgid "Create this new account on the server" msgstr "Ezen új fiók létrehozása a kiszolgálón" -#: ../pidgin/gtkaccount.c:1515 +#: ../pidgin/gtkaccount.c:1520 msgid "_Advanced" msgstr "_Haladó" -#: ../pidgin/gtkaccount.c:1973 ../pidgin/gtkplugin.c:569 +#: ../pidgin/gtkaccount.c:1978 ../pidgin/gtkplugin.c:595 msgid "Enabled" msgstr "Engedélyezve" -#: ../pidgin/gtkaccount.c:2001 +#: ../pidgin/gtkaccount.c:2006 msgid "Protocol" msgstr "Protokoll" # fixme: üdvözli a %s az {pidgin | finch} lehet, nemde? -#: ../pidgin/gtkaccount.c:2201 +#: ../pidgin/gtkaccount.c:2207 #, c-format msgid "" "<span size='larger' weight='bold'>Welcome to %s!</span>\n" @@ -13732,246 +14005,272 @@ "segítségével visszatérhet ehhez az ablakhoz fiókok hozzáadásához, " "szerkesztéséhez vagy eltávolításához." -#: ../pidgin/gtkblist.c:767 -msgid "Join a Chat" -msgstr "Csatlakozás egy csevegéshez" - -#: ../pidgin/gtkblist.c:788 +#: ../pidgin/gtkblist.c:527 +#, c-format +msgid "You have %d contact named %s. Would you like to merge them?" +msgid_plural "You currently have %d contacts named %s. Would you like to merge them?" +msgstr[0] "Jelenleg %d %s nevű partnere van. Össze kívánja vonni ezeket?" +msgstr[1] "Jelenleg %d %s nevű partnere van. Össze kívánja vonni ezeket?" + +#: ../pidgin/gtkblist.c:528 +msgid "" +"Merging these contacts will cause them to share a single entry on the buddy " +"list and use a single conversation window. You can separate them again by " +"choosing 'Expand' from the contact's context menu" +msgstr "Ezen partnerek összevonásuk után a partnerlistán egyetlen bejegyzést és egy csevegőablakot fognak használni. A partnerlista felbukkanó menüjének \"Kibontás\" pontjával újra szétválaszthatja őket." + +#: ../pidgin/gtkblist.c:530 +msgid "_Merge" +msgstr "Össz_evonás" + +#: ../pidgin/gtkblist.c:945 msgid "" "Please enter the appropriate information about the chat you would like to " "join.\n" msgstr "" -"Kérem adja meg a megfelelő információt arról a csevegésről, amelyhez " -"csatlakozni kíván.\n" - -#. Set up stuff for the account box -#: ../pidgin/gtkblist.c:799 ../pidgin/gtkblist.c:5530 -#: ../pidgin/gtkblist.c:5893 ../pidgin/gtkpounce.c:539 -#: ../pidgin/gtkroomlist.c:396 +"Adja meg a megfelelő információt arról a csevegésről, amelyhez csatlakozni " +"kíván.\n" + +#: ../pidgin/gtkblist.c:956 ../pidgin/gtkblist.c:6267 +#: ../pidgin/gtkpounce.c:554 ../pidgin/gtkroomlist.c:396 msgid "_Account:" msgstr "F_iók:" -#: ../pidgin/gtkblist.c:1088 ../pidgin/gtkprivacy.c:603 -#: ../pidgin/gtkprivacy.c:617 +#: ../pidgin/gtkblist.c:1245 ../pidgin/gtkprivacy.c:605 +#: ../pidgin/gtkprivacy.c:619 msgid "_Block" msgstr "_Tiltás" -#: ../pidgin/gtkblist.c:1088 +#: ../pidgin/gtkblist.c:1245 msgid "Un_block" msgstr "_Tiltás feloldása" -#: ../pidgin/gtkblist.c:1139 +#: ../pidgin/gtkblist.c:1288 +msgid "Move to" +msgstr "Áthelyezés" + +#: ../pidgin/gtkblist.c:1328 msgid "Get _Info" msgstr "_Info" -#: ../pidgin/gtkblist.c:1142 ../pidgin/pidginstock.c:90 +#: ../pidgin/gtkblist.c:1331 ../pidgin/pidginstock.c:90 msgid "I_M" msgstr "Ü_zenet" -#: ../pidgin/gtkblist.c:1148 -#, fuzzy -msgid "_Send File" -msgstr "Fájl küldése" - -#: ../pidgin/gtkblist.c:1155 -msgid "Add Buddy _Pounce" -msgstr "_Partnerfigyelmeztetés felvétele" - -#: ../pidgin/gtkblist.c:1160 ../pidgin/gtkblist.c:1164 -#: ../pidgin/gtkblist.c:1269 ../pidgin/gtkblist.c:1292 +#: ../pidgin/gtkblist.c:1337 +msgid "_Send File..." +msgstr "_Fájl küldése..." + +#: ../pidgin/gtkblist.c:1344 +msgid "Add Buddy _Pounce..." +msgstr "_Partnerfigyelmeztetés felvétele..." + +#: ../pidgin/gtkblist.c:1349 ../pidgin/gtkblist.c:1353 +#: ../pidgin/gtkblist.c:1468 ../pidgin/gtkblist.c:1491 msgid "View _Log" msgstr "Nap_ló megtekintése" -#: ../pidgin/gtkblist.c:1177 ../pidgin/gtkblist.c:1186 -#: ../pidgin/gtkblist.c:1277 ../pidgin/gtkblist.c:1298 +#: ../pidgin/gtkblist.c:1359 +msgid "Hide when offline" +msgstr "Elrejtés, ha nem érhető el" + +#: ../pidgin/gtkblist.c:1359 +msgid "Show when offline" +msgstr "Megjelenítés, ha elérhető" + +#: ../pidgin/gtkblist.c:1373 ../pidgin/gtkblist.c:1382 +#: ../pidgin/gtkblist.c:1476 ../pidgin/gtkblist.c:1497 msgid "_Alias..." msgstr "Ál_név..." -#: ../pidgin/gtkblist.c:1180 ../pidgin/gtkblist.c:1188 -#: ../pidgin/gtkblist.c:1279 ../pidgin/gtkblist.c:1300 +#: ../pidgin/gtkblist.c:1376 ../pidgin/gtkblist.c:1384 +#: ../pidgin/gtkblist.c:1478 ../pidgin/gtkblist.c:1499 msgid "_Remove" msgstr "_Eltávolítás" -#: ../pidgin/gtkblist.c:1238 -msgid "Add a _Buddy" -msgstr "P_artner felvétele" - -#: ../pidgin/gtkblist.c:1241 -msgid "Add a C_hat" -msgstr "_Csevegés felvétele" - -#: ../pidgin/gtkblist.c:1244 +#: ../pidgin/gtkblist.c:1434 +msgid "Add _Buddy..." +msgstr "P_artner felvétele..." + +#: ../pidgin/gtkblist.c:1437 +msgid "Add C_hat..." +msgstr "Cse_vegés felvétele..." + +#: ../pidgin/gtkblist.c:1440 msgid "_Delete Group" msgstr "_Csoport törlése" -#: ../pidgin/gtkblist.c:1246 +#: ../pidgin/gtkblist.c:1442 msgid "_Rename" msgstr "Á_tnevezés" #. join button -#: ../pidgin/gtkblist.c:1265 ../pidgin/gtkroomlist.c:307 +#: ../pidgin/gtkblist.c:1462 ../pidgin/gtkroomlist.c:307 #: ../pidgin/gtkroomlist.c:460 ../pidgin/pidginstock.c:88 msgid "_Join" msgstr "_Csatlakozás" -#: ../pidgin/gtkblist.c:1267 +#: ../pidgin/gtkblist.c:1464 msgid "Auto-Join" msgstr "Automatikus csatlakozás" -#: ../pidgin/gtkblist.c:1305 ../pidgin/gtkblist.c:1329 +#: ../pidgin/gtkblist.c:1466 +msgid "Persistent" +msgstr "Állandó" + +#: ../pidgin/gtkblist.c:1504 ../pidgin/gtkblist.c:1527 msgid "_Collapse" msgstr "Összecs_ukás" -#: ../pidgin/gtkblist.c:1334 +#: ../pidgin/gtkblist.c:1532 msgid "_Expand" msgstr "_Kibontás" -#: ../pidgin/gtkblist.c:1585 ../pidgin/gtkblist.c:1597 -#: ../pidgin/gtkblist.c:4603 ../pidgin/gtkblist.c:4616 +#: ../pidgin/gtkblist.c:1783 ../pidgin/gtkblist.c:1795 +#: ../pidgin/gtkblist.c:4950 ../pidgin/gtkblist.c:4963 msgid "/Tools/Mute Sounds" msgstr "/Eszközök/Hangok némítása" -#: ../pidgin/gtkblist.c:2057 ../pidgin/gtkconv.c:4840 -#: ../pidgin/gtkpounce.c:430 -msgid "" -"You are not currently signed on with an account that can add that buddy." +#: ../pidgin/gtkblist.c:2255 ../pidgin/gtkconv.c:4922 +#: ../pidgin/gtkpounce.c:437 +msgid "You are not currently signed on with an account that can add that buddy." msgstr "" "Jelenleg nincs bejelentkezve olyan hálózatra, amelyen felvehetné ezt a " "partnert." #. Buddies menu -#: ../pidgin/gtkblist.c:2869 +#: ../pidgin/gtkblist.c:3087 msgid "/_Buddies" msgstr "/_Partnerek" -#: ../pidgin/gtkblist.c:2870 +#: ../pidgin/gtkblist.c:3088 msgid "/Buddies/New Instant _Message..." msgstr "/Partnerek/Új azonnal_i üzenet..." -#: ../pidgin/gtkblist.c:2871 +#: ../pidgin/gtkblist.c:3089 msgid "/Buddies/Join a _Chat..." msgstr "/Partnerek/_Csatlakozás csevegéshez..." -#: ../pidgin/gtkblist.c:2872 +#: ../pidgin/gtkblist.c:3090 msgid "/Buddies/Get User _Info..." msgstr "/Partnerek/_Felhasználó adatainak lekérése..." -#: ../pidgin/gtkblist.c:2873 +#: ../pidgin/gtkblist.c:3091 msgid "/Buddies/View User _Log..." msgstr "/Partnerek/Felhasználó _naplójának lekérése..." -#: ../pidgin/gtkblist.c:2875 -msgid "/Buddies/Show" -msgstr "/Partnerek/Megjelenítés" - -#: ../pidgin/gtkblist.c:2876 +#: ../pidgin/gtkblist.c:3093 +msgid "/Buddies/Sh_ow" +msgstr "/Partnerek/Me_gjelenítés" + +#: ../pidgin/gtkblist.c:3094 msgid "/Buddies/Show/_Offline Buddies" msgstr "/Partnerek/Megjelenítés/Ki_lépett partnerek" -#: ../pidgin/gtkblist.c:2877 +#: ../pidgin/gtkblist.c:3095 msgid "/Buddies/Show/_Empty Groups" msgstr "/Partnerek/Megjelenítés/Ür_es csoportok" -#: ../pidgin/gtkblist.c:2878 +#: ../pidgin/gtkblist.c:3096 msgid "/Buddies/Show/Buddy _Details" msgstr "/Partnerek/Megjelenítés/_Partner részletei" -#: ../pidgin/gtkblist.c:2879 +#: ../pidgin/gtkblist.c:3097 msgid "/Buddies/Show/Idle _Times" msgstr "/Partnerek/Megjelenítés/Inaktív i_dők" -#: ../pidgin/gtkblist.c:2880 +#: ../pidgin/gtkblist.c:3098 msgid "/Buddies/Show/_Protocol Icons" msgstr "/Partnerek/Megjelenítés/Protokolli_konok" -#: ../pidgin/gtkblist.c:2881 +#: ../pidgin/gtkblist.c:3099 msgid "/Buddies/_Sort Buddies" msgstr "/Partnerek/Part_nerek rendezése" -#: ../pidgin/gtkblist.c:2883 +#: ../pidgin/gtkblist.c:3101 msgid "/Buddies/_Add Buddy..." msgstr "/Partnerek/_Partner felvétele..." -#: ../pidgin/gtkblist.c:2884 +#: ../pidgin/gtkblist.c:3102 msgid "/Buddies/Add C_hat..." msgstr "/Partnerek/Cse_vegés felvétele..." -#: ../pidgin/gtkblist.c:2885 +#: ../pidgin/gtkblist.c:3103 msgid "/Buddies/Add _Group..." msgstr "/Partnerek/C_soport felvétele..." -#: ../pidgin/gtkblist.c:2887 +#: ../pidgin/gtkblist.c:3105 msgid "/Buddies/_Quit" msgstr "/Partnerek/_Kilépés" #. Accounts menu -#: ../pidgin/gtkblist.c:2890 +#: ../pidgin/gtkblist.c:3108 msgid "/_Accounts" msgstr "/_Fiókok" -#: ../pidgin/gtkblist.c:2891 ../pidgin/gtkblist.c:6589 -msgid "/Accounts/Add\\/Edit" -msgstr "/Fiókok/Hozzáadás\\/Szerkesztés" +#: ../pidgin/gtkblist.c:3109 ../pidgin/gtkblist.c:6969 +msgid "/Accounts/Manage" +msgstr "/Fiókok/Kezelés" #. Tools -#: ../pidgin/gtkblist.c:2894 +#: ../pidgin/gtkblist.c:3112 msgid "/_Tools" msgstr "/_Eszközök" -#: ../pidgin/gtkblist.c:2895 +#: ../pidgin/gtkblist.c:3113 msgid "/Tools/Buddy _Pounces" msgstr "/Eszközök/_Partnerfigyelmeztetések" -#: ../pidgin/gtkblist.c:2896 +#: ../pidgin/gtkblist.c:3114 msgid "/Tools/_Certificates" msgstr "/Eszközök/_Tanúsítványok" -#: ../pidgin/gtkblist.c:2897 +#: ../pidgin/gtkblist.c:3115 msgid "/Tools/Plu_gins" msgstr "/Eszközök/Bő_vítmények" -#: ../pidgin/gtkblist.c:2898 +#: ../pidgin/gtkblist.c:3116 msgid "/Tools/Pr_eferences" msgstr "/Eszközök/_Beállítások" -#: ../pidgin/gtkblist.c:2899 +#: ../pidgin/gtkblist.c:3117 msgid "/Tools/Pr_ivacy" msgstr "/Eszközök/Ma_gánszféra" -#: ../pidgin/gtkblist.c:2901 +#: ../pidgin/gtkblist.c:3119 msgid "/Tools/_File Transfers" msgstr "/Eszközök/_Fájlátvitelek" -#: ../pidgin/gtkblist.c:2902 +#: ../pidgin/gtkblist.c:3120 msgid "/Tools/R_oom List" msgstr "/Eszközök/_Szobalista" -#: ../pidgin/gtkblist.c:2903 +#: ../pidgin/gtkblist.c:3121 msgid "/Tools/System _Log" msgstr "/Eszközök/_Rendszernapló" -#: ../pidgin/gtkblist.c:2905 +#: ../pidgin/gtkblist.c:3123 msgid "/Tools/Mute _Sounds" msgstr "/Eszközök/_Hangok némítása" #. Help -#: ../pidgin/gtkblist.c:2907 +#: ../pidgin/gtkblist.c:3125 msgid "/_Help" msgstr "/_Súgó" -#: ../pidgin/gtkblist.c:2908 +#: ../pidgin/gtkblist.c:3126 msgid "/Help/Online _Help" msgstr "/Súgó/Online _súgó" -#: ../pidgin/gtkblist.c:2909 +#: ../pidgin/gtkblist.c:3127 msgid "/Help/_Debug Window" msgstr "/Súgó/_Hibakereső ablak" -#: ../pidgin/gtkblist.c:2911 ../pidgin/gtkblist.c:2913 +#: ../pidgin/gtkblist.c:3129 ../pidgin/gtkblist.c:3131 msgid "/Help/_About" msgstr "/Súgó/_Névjegy" -#: ../pidgin/gtkblist.c:2942 +#: ../pidgin/gtkblist.c:3160 #, c-format msgid "" "\n" @@ -13980,167 +14279,161 @@ "\n" "<b>Fiók:</b> %s" -#: ../pidgin/gtkblist.c:3020 +#: ../pidgin/gtkblist.c:3238 msgid "Buddy Alias" msgstr "Partnerálnév" -#: ../pidgin/gtkblist.c:3049 +#: ../pidgin/gtkblist.c:3267 msgid "Logged In" msgstr "Bejelentkezve" -#: ../pidgin/gtkblist.c:3095 +#: ../pidgin/gtkblist.c:3313 msgid "Last Seen" msgstr "Utoljára látszott" -#: ../pidgin/gtkblist.c:3116 +#: ../pidgin/gtkblist.c:3334 msgid "Spooky" msgstr "Idegroncs" -#: ../pidgin/gtkblist.c:3118 +#: ../pidgin/gtkblist.c:3336 msgid "Awesome" msgstr "Szuper" -#: ../pidgin/gtkblist.c:3120 +#: ../pidgin/gtkblist.c:3338 msgid "Rockin'" msgstr "Király" -#: ../pidgin/gtkblist.c:3453 +#: ../pidgin/gtkblist.c:3677 #, c-format msgid "Idle %dd %dh %02dm" msgstr "Inaktív (%d n %d ó %02d p)" -#: ../pidgin/gtkblist.c:3455 +#: ../pidgin/gtkblist.c:3679 #, c-format msgid "Idle %dh %02dm" msgstr "Inaktív (%d ó %02d p)" -#: ../pidgin/gtkblist.c:3457 +#: ../pidgin/gtkblist.c:3681 #, c-format msgid "Idle %dm" msgstr "Inaktív (%d p)" -#: ../pidgin/gtkblist.c:3602 +#: ../pidgin/gtkblist.c:3835 msgid "/Buddies/New Instant Message..." msgstr "/Partnerek/Új azonnali üzenet..." -#: ../pidgin/gtkblist.c:3603 ../pidgin/gtkblist.c:3636 +#: ../pidgin/gtkblist.c:3836 ../pidgin/gtkblist.c:3869 msgid "/Buddies/Join a Chat..." msgstr "/Partnerek/Csatlakozás csevegéshez..." -#: ../pidgin/gtkblist.c:3604 +#: ../pidgin/gtkblist.c:3837 msgid "/Buddies/Get User Info..." msgstr "/Partnerek/Felhasználó adatainak lekérése..." -#: ../pidgin/gtkblist.c:3605 +#: ../pidgin/gtkblist.c:3838 msgid "/Buddies/Add Buddy..." msgstr "/Partnerek/Partner felvétele..." -#: ../pidgin/gtkblist.c:3606 ../pidgin/gtkblist.c:3639 +#: ../pidgin/gtkblist.c:3839 ../pidgin/gtkblist.c:3872 msgid "/Buddies/Add Chat..." msgstr "/Partnerek/Csevegés felvétele..." -#: ../pidgin/gtkblist.c:3607 +#: ../pidgin/gtkblist.c:3840 msgid "/Buddies/Add Group..." msgstr "/Partnerek/Csoport felvétele..." -#: ../pidgin/gtkblist.c:3642 +#: ../pidgin/gtkblist.c:3875 msgid "/Tools/Privacy" msgstr "/Eszközök/Magánszféra" -#: ../pidgin/gtkblist.c:3645 +#: ../pidgin/gtkblist.c:3878 msgid "/Tools/Room List" msgstr "/Eszközök/Szobalista" -#: ../pidgin/gtkblist.c:3742 ../pidgin/gtkdocklet.c:153 +#: ../pidgin/gtkblist.c:4010 ../pidgin/gtkdocklet.c:155 +#: ../pidgin/gtkdocklet.c:160 #, c-format msgid "%d unread message from %s\n" msgid_plural "%d unread messages from %s\n" msgstr[0] "%d olvasatlan üzenet %s partnertől\n" msgstr[1] "%d olvasatlan üzenet %s partnertől\n" -#: ../pidgin/gtkblist.c:3822 +#: ../pidgin/gtkblist.c:4170 msgid "Manually" msgstr "Kézi" -#: ../pidgin/gtkblist.c:3824 -msgid "Alphabetically" -msgstr "ABC sorrend" - -#: ../pidgin/gtkblist.c:3825 +#: ../pidgin/gtkblist.c:4173 msgid "By status" msgstr "Állapot szerint" -#: ../pidgin/gtkblist.c:3826 +#: ../pidgin/gtkblist.c:4174 msgid "By log size" msgstr "Napló mérete szerint" -#: ../pidgin/gtkblist.c:4031 ../pidgin/gtkconn.c:179 +#: ../pidgin/gtkblist.c:4379 ../pidgin/gtkconn.c:180 #, c-format msgid "%s disconnected" msgstr "%s bontotta a kapcsolatot" -#: ../pidgin/gtkblist.c:4067 +#: ../pidgin/gtkblist.c:4414 #, c-format msgid "<span color=\"red\">%s disconnected: %s</span>" msgstr "<span color=\"red\">%s bontotta a kapcsolatot: %s</span>" -#: ../pidgin/gtkblist.c:4219 +#: ../pidgin/gtkblist.c:4566 msgid "<b>Username:</b>" msgstr "<b>Felhasználónév:</b>" -#: ../pidgin/gtkblist.c:4226 +#: ../pidgin/gtkblist.c:4573 msgid "<b>Password:</b>" msgstr "<b>Jelszó:</b>" -#: ../pidgin/gtkblist.c:4237 +#: ../pidgin/gtkblist.c:4584 msgid "_Login" msgstr "_Bejelentkezés" -#: ../pidgin/gtkblist.c:4320 +#: ../pidgin/gtkblist.c:4667 msgid "/Accounts" msgstr "/Fiókok" #. Translators: Please maintain the use of -> and <- to refer to menu heirarchy -#: ../pidgin/gtkblist.c:4334 -#, fuzzy, c-format +#: ../pidgin/gtkblist.c:4681 +#, c-format msgid "" "<span weight='bold' size='larger'>Welcome to %s!</span>\n" "\n" "You have no accounts enabled. Enable your IM accounts from the <b>Accounts</" -"b> window at <b>Accounts->Add/Edit</b>. Once you enable accounts, you'll be " +"b> window at <b>Accounts->Manage</b>. Once you enable accounts, you'll be " "able to sign on, set your status, and talk to your friends." msgstr "" -"<span size='larger' weight='bold'>Üdvözli a %s!</span>\n" -"\n" -"Nincsenek engedélyezve fiókjai. A <b>Fiókok</b> ablak <b>Fiókok -> Hozzáadás/" -"Szerkesztés</b> menüpontja segítségével engedélyezze azonnali üzenő " -"fiókjait. A fiókok engedélyezése után bejelentkezhet, beállíthatja állapotát " -"és cseveghet barátaival." +"<span weight='bold' size='larger'></span>Üdvözli a %s!</span>\n" +"\n" +"Nincsenek engedélyezve fiókjai. A <b>Fiókok</b> ablak <b>Fiókok -> Kezelés</b> menüpontja segítségével engedélyezze azonnali üzenő fiókjait. A fiókok engedélyezése után bejelentkezhet, beállíthatja állapotát és cseveghet barátaival." #. set the Show Offline Buddies option. must be done #. * after the treeview or faceprint gets mad. -Robot101 #. -#: ../pidgin/gtkblist.c:4597 +#: ../pidgin/gtkblist.c:4944 msgid "/Buddies/Show/Offline Buddies" msgstr "/Partnerek/Megjelenítés/Kilépett partnerek" -#: ../pidgin/gtkblist.c:4600 +#: ../pidgin/gtkblist.c:4947 msgid "/Buddies/Show/Empty Groups" msgstr "/Partnerek/Megjelenítés/Üres csoportok" -#: ../pidgin/gtkblist.c:4606 +#: ../pidgin/gtkblist.c:4953 msgid "/Buddies/Show/Buddy Details" msgstr "/Partnerek/Megjelenítés/Partner részletei" -#: ../pidgin/gtkblist.c:4609 +#: ../pidgin/gtkblist.c:4956 msgid "/Buddies/Show/Idle Times" msgstr "/Partnerek/Megjelenítés/Inaktív idők" -#: ../pidgin/gtkblist.c:4612 +#: ../pidgin/gtkblist.c:4959 msgid "/Buddies/Show/Protocol Icons" msgstr "/Partnerek/Megjelenítés/Protokollikonok" -#: ../pidgin/gtkblist.c:5507 +#: ../pidgin/gtkblist.c:5873 msgid "" "Please enter the screen name of the person you would like to add to your " "buddy list. You may optionally enter an alias, or nickname, for the buddy. " @@ -14150,20 +14443,25 @@ "egy álnevet vagy becenevet a partnerhez. Az álnév a felhasználónév helyett " "kerül megjelenítésre, amennyiben az lehetséges.\n" +#. Set up stuff for the account box +#: ../pidgin/gtkblist.c:5896 +msgid "A_ccount:" +msgstr "_Fiók:" + #. End of account box -#: ../pidgin/gtkblist.c:5542 +#: ../pidgin/gtkblist.c:5908 msgid "_Screen name:" msgstr "_Felhasználónév:" -#: ../pidgin/gtkblist.c:5564 ../pidgin/gtkblist.c:5914 +#: ../pidgin/gtkblist.c:5930 ../pidgin/gtkblist.c:6288 msgid "A_lias:" msgstr "Ál_név:" -#: ../pidgin/gtkblist.c:5826 +#: ../pidgin/gtkblist.c:6198 msgid "This protocol does not support chat rooms." msgstr "Ez a protokoll nem támogatja a csevegőszobákat." -#: ../pidgin/gtkblist.c:5842 +#: ../pidgin/gtkblist.c:6214 msgid "" "You are not currently signed on with any protocols that have the ability to " "chat." @@ -14171,7 +14469,7 @@ "Jelenleg nincs bejelentkezve olyan protokollal, ami csevegésre alkalmas " "lenne." -#: ../pidgin/gtkblist.c:5883 +#: ../pidgin/gtkblist.c:6257 msgid "" "Please enter an alias, and the appropriate information about the chat you " "would like to add to your buddy list.\n" @@ -14179,49 +14477,56 @@ "Adjon meg egy álnevet és a megfelelő információt a partnerlistára felvenni " "kívánt csevegésről.\n" -#: ../pidgin/gtkblist.c:5964 +#: ../pidgin/gtkblist.c:6316 +msgid "Autojoin when account becomes online." +msgstr "Automatikus csatlakozás a fiók elérhetővé válásakor." + +#: ../pidgin/gtkblist.c:6317 +msgid "Hide chat when the window is closed." +msgstr "Csevegés elrejtése az ablak bezárásakor." + +#: ../pidgin/gtkblist.c:6343 msgid "Please enter the name of the group to be added." -msgstr "Kérem adja meg a felvenni kívánt csoport nevét." - -#: ../pidgin/gtkblist.c:6609 +msgstr "Adja meg a felvenni kívánt csoport nevét." + +#: ../pidgin/gtkblist.c:6989 msgid "<PurpleMain>/Accounts/" msgstr "<PurpleMain>/Fiókok/" -#: ../pidgin/gtkblist.c:6633 +#: ../pidgin/gtkblist.c:7013 msgid "_Edit Account" msgstr "_Fiók szerkesztése" -#: ../pidgin/gtkblist.c:6646 ../pidgin/gtkconv.c:3073 +#: ../pidgin/gtkblist.c:7026 ../pidgin/gtkconv.c:3146 msgid "No actions available" msgstr "Nem állnak rendelkezésre műveletek" -#: ../pidgin/gtkblist.c:6654 +#: ../pidgin/gtkblist.c:7034 msgid "_Disable" msgstr "_Tiltás" -#: ../pidgin/gtkblist.c:6666 +#: ../pidgin/gtkblist.c:7046 msgid "Enable Account" msgstr "Fiók engedélyezése" -#: ../pidgin/gtkblist.c:6672 +#: ../pidgin/gtkblist.c:7052 msgid "<PurpleMain>/Accounts/Enable Account" msgstr "<PurpleMain>/Fiókok/Fiók engedélyezése" -#: ../pidgin/gtkblist.c:6721 +#: ../pidgin/gtkblist.c:7101 msgid "/Tools" msgstr "/Eszközök" -#: ../pidgin/gtkblist.c:6791 +#: ../pidgin/gtkblist.c:7171 msgid "/Buddies/Sort Buddies" msgstr "/Partnerek/Partnerek rendezése" #. Widget creation function -#: ../pidgin/gtkcertmgr.c:530 -#, fuzzy +#: ../pidgin/gtkcertmgr.c:531 msgid "SSL Servers" -msgstr "Kiszolgáló" - -#: ../pidgin/gtkconn.c:180 +msgstr "SSL kiszolgálók" + +#: ../pidgin/gtkconn.c:181 #, c-format msgid "" "%s\n" @@ -14234,27 +14539,26 @@ "A %s nem próbálja meg újra csatlakoztatni a fiókot, amíg nem javítja a hibát " "és nem engedélyezi újra a fiókot." -#: ../pidgin/gtkconv.c:482 +#: ../pidgin/gtkconv.c:524 msgid "Unknown command." msgstr "Ismeretlen parancs." -#: ../pidgin/gtkconv.c:754 ../pidgin/gtkconv.c:780 +#: ../pidgin/gtkconv.c:796 ../pidgin/gtkconv.c:822 msgid "That buddy is not on the same protocol as this chat." msgstr "A partner nem ugyanazt a protokollt használja, mint ez a csevegés" -#: ../pidgin/gtkconv.c:774 -msgid "" -"You are not currently signed on with an account that can invite that buddy." +#: ../pidgin/gtkconv.c:816 +msgid "You are not currently signed on with an account that can invite that buddy." msgstr "" "Jelenleg nincs bejelentkezve olyan fiókkal, mellyel meghívhatná ezt a " "partnert." -#: ../pidgin/gtkconv.c:827 +#: ../pidgin/gtkconv.c:869 msgid "Invite Buddy Into Chat Room" msgstr "Partner meghívása a csevegőszobába" #. Put our happy label in it. -#: ../pidgin/gtkconv.c:857 +#: ../pidgin/gtkconv.c:899 msgid "" "Please enter the name of the user you wish to invite, along with an optional " "invite message." @@ -14262,188 +14566,183 @@ "Adja meg annak a partnernek a nevét, akit meg szeretne hívni, egy " "tetszőleges meghívóüzenettel együtt." -#: ../pidgin/gtkconv.c:878 +#: ../pidgin/gtkconv.c:920 msgid "_Buddy:" msgstr "_Partner:" -#: ../pidgin/gtkconv.c:889 ../pidgin/gtksavedstatuses.c:1194 -#: ../pidgin/gtksavedstatuses.c:1528 +#: ../pidgin/gtkconv.c:931 ../pidgin/gtksavedstatuses.c:1200 +#: ../pidgin/gtksavedstatuses.c:1536 msgid "_Message:" msgstr "Ü_zenet:" -#: ../pidgin/gtkconv.c:947 ../pidgin/gtkconv.c:2598 ../pidgin/gtkdebug.c:219 -#: ../pidgin/gtkft.c:543 -msgid "Unable to open file." -msgstr "Nem lehet megnyitni a fájlt." - -#: ../pidgin/gtkconv.c:953 +#: ../pidgin/gtkconv.c:995 #, c-format msgid "<h1>Conversation with %s</h1>\n" msgstr "<h1>Társalgás %s partnerrel</h1>\n" -#: ../pidgin/gtkconv.c:991 +#: ../pidgin/gtkconv.c:1033 msgid "Save Conversation" msgstr "Társalgás mentése" -#: ../pidgin/gtkconv.c:1140 ../pidgin/gtkdebug.c:167 ../pidgin/gtkdebug.c:743 +#: ../pidgin/gtkconv.c:1179 ../pidgin/gtkdebug.c:168 ../pidgin/gtkdebug.c:748 msgid "Find" msgstr "Keresés" -#: ../pidgin/gtkconv.c:1166 ../pidgin/gtkdebug.c:195 +#: ../pidgin/gtkconv.c:1205 ../pidgin/gtkdebug.c:196 msgid "_Search for:" msgstr "Kere_sés:" -#: ../pidgin/gtkconv.c:1622 +#: ../pidgin/gtkconv.c:1676 msgid "Un-Ignore" msgstr "Mellőzés visszavonása" -#: ../pidgin/gtkconv.c:1625 +#: ../pidgin/gtkconv.c:1679 msgid "Ignore" msgstr "Mellőzés" -#: ../pidgin/gtkconv.c:1645 +#: ../pidgin/gtkconv.c:1699 msgid "Get Away Message" msgstr "Távollét üzenet lekérdezése" -#: ../pidgin/gtkconv.c:1668 +#: ../pidgin/gtkconv.c:1722 msgid "Last said" msgstr "Utoljára ezt mondta" -#: ../pidgin/gtkconv.c:2606 +#: ../pidgin/gtkconv.c:2671 msgid "Unable to save icon file to disk." msgstr "Nem menthető lemezre az ikonfájl." -#: ../pidgin/gtkconv.c:2657 +#: ../pidgin/gtkconv.c:2722 msgid "Save Icon" msgstr "Ikon mentése" -#: ../pidgin/gtkconv.c:2709 +#: ../pidgin/gtkconv.c:2774 msgid "Animate" msgstr "Animálás" -#: ../pidgin/gtkconv.c:2714 +#: ../pidgin/gtkconv.c:2779 msgid "Hide Icon" msgstr "Ikon elrejtése" -#: ../pidgin/gtkconv.c:2717 +#: ../pidgin/gtkconv.c:2782 msgid "Save Icon As..." msgstr "Ikon mentése másként..." -#: ../pidgin/gtkconv.c:2721 +#: ../pidgin/gtkconv.c:2786 msgid "Set Custom Icon..." msgstr "Egyéni ikon beállítása..." -#: ../pidgin/gtkconv.c:2734 +#: ../pidgin/gtkconv.c:2799 msgid "Remove Custom Icon" msgstr "Egyéni ikon eltávolítása" -#: ../pidgin/gtkconv.c:2861 +#: ../pidgin/gtkconv.c:2931 msgid "Show All" msgstr "Összes megjelenítése" #. Conversation menu -#: ../pidgin/gtkconv.c:2880 +#: ../pidgin/gtkconv.c:2950 msgid "/_Conversation" msgstr "/_Társalgás" -#: ../pidgin/gtkconv.c:2882 +#: ../pidgin/gtkconv.c:2952 msgid "/Conversation/New Instant _Message..." msgstr "/Társalgás/Új azonnali ü_zenet..." -#: ../pidgin/gtkconv.c:2887 +#: ../pidgin/gtkconv.c:2957 msgid "/Conversation/_Find..." msgstr "/Társalgás/Ker_esés..." -#: ../pidgin/gtkconv.c:2889 +#: ../pidgin/gtkconv.c:2959 msgid "/Conversation/View _Log" msgstr "/Társalgás/Nap_ló megtekintése" -#: ../pidgin/gtkconv.c:2890 +#: ../pidgin/gtkconv.c:2960 msgid "/Conversation/_Save As..." msgstr "/Társalgás/_Mentés másként..." -#: ../pidgin/gtkconv.c:2892 +#: ../pidgin/gtkconv.c:2962 msgid "/Conversation/Clea_r Scrollback" msgstr "/Társalgás/Elő_zmények törlése" -#: ../pidgin/gtkconv.c:2896 +#: ../pidgin/gtkconv.c:2966 msgid "/Conversation/Se_nd File..." msgstr "/Társalgás/Fájl kül_dése..." -#: ../pidgin/gtkconv.c:2897 +#: ../pidgin/gtkconv.c:2967 msgid "/Conversation/Add Buddy _Pounce..." msgstr "/Társalgás/_Partnerfigyelmeztetés felvétele..." -#: ../pidgin/gtkconv.c:2899 +#: ../pidgin/gtkconv.c:2969 msgid "/Conversation/_Get Info" msgstr "/Társalgás/_Információ lekérése" -#: ../pidgin/gtkconv.c:2901 +#: ../pidgin/gtkconv.c:2971 msgid "/Conversation/In_vite..." msgstr "/Társalgás/Me_ghívás..." -#: ../pidgin/gtkconv.c:2903 +#: ../pidgin/gtkconv.c:2973 msgid "/Conversation/M_ore" msgstr "/Társalgás/_Több" -#: ../pidgin/gtkconv.c:2907 +#: ../pidgin/gtkconv.c:2977 msgid "/Conversation/Al_ias..." msgstr "/Társalgás/Ál_név..." -#: ../pidgin/gtkconv.c:2909 +#: ../pidgin/gtkconv.c:2979 msgid "/Conversation/_Block..." msgstr "/Társalgás/_Tiltás..." -#: ../pidgin/gtkconv.c:2911 +#: ../pidgin/gtkconv.c:2981 msgid "/Conversation/_Unblock..." msgstr "/Társalgás/_Tiltás feloldása..." -#: ../pidgin/gtkconv.c:2913 +#: ../pidgin/gtkconv.c:2983 msgid "/Conversation/_Add..." msgstr "/Társalgás/_Hozzáadás..." -#: ../pidgin/gtkconv.c:2915 +#: ../pidgin/gtkconv.c:2985 msgid "/Conversation/_Remove..." msgstr "/Társalgás/_Eltávolítás..." -#: ../pidgin/gtkconv.c:2920 +#: ../pidgin/gtkconv.c:2990 msgid "/Conversation/Insert Lin_k..." msgstr "/Társalgás/_Hivatkozás beszúrása..." -#: ../pidgin/gtkconv.c:2922 +#: ../pidgin/gtkconv.c:2992 msgid "/Conversation/Insert Imag_e..." msgstr "/Társalgás/Ké_p beszúrása..." -#: ../pidgin/gtkconv.c:2928 +#: ../pidgin/gtkconv.c:2998 msgid "/Conversation/_Close" msgstr "/Társalgás/_Bezárás" #. Options -#: ../pidgin/gtkconv.c:2932 +#: ../pidgin/gtkconv.c:3002 msgid "/_Options" msgstr "/_Beállítások" -#: ../pidgin/gtkconv.c:2933 +#: ../pidgin/gtkconv.c:3003 msgid "/Options/Enable _Logging" msgstr "/Beállítások/_Naplózás engedélyezése" -#: ../pidgin/gtkconv.c:2934 +#: ../pidgin/gtkconv.c:3004 msgid "/Options/Enable _Sounds" msgstr "/Beállítások/_Hangok engedélyezése" -#: ../pidgin/gtkconv.c:2936 +#: ../pidgin/gtkconv.c:3006 msgid "/Options/Show Formatting _Toolbars" msgstr "/Beállítások/_Formázás eszköztárak mutatása" -#: ../pidgin/gtkconv.c:2937 +#: ../pidgin/gtkconv.c:3007 msgid "/Options/Show Ti_mestamps" msgstr "/Beállítások/I_dőbélyegek mutatása" -#: ../pidgin/gtkconv.c:3061 +#: ../pidgin/gtkconv.c:3134 msgid "/Conversation/More" msgstr "/Társalgás/Több" -#: ../pidgin/gtkconv.c:3117 +#: ../pidgin/gtkconv.c:3190 msgid "/Options" msgstr "/Beállítások" @@ -14452,232 +14751,232 @@ #. Make sure the 'Conversation -> More' menuitems are regenerated whenever #. * the 'Conversation' menu pops up because the entries can change after the #. * conversation is created. -#: ../pidgin/gtkconv.c:3152 ../pidgin/gtkconv.c:3184 +#: ../pidgin/gtkconv.c:3225 ../pidgin/gtkconv.c:3257 msgid "/Conversation" msgstr "/Társalgás" -#: ../pidgin/gtkconv.c:3192 +#: ../pidgin/gtkconv.c:3265 msgid "/Conversation/View Log" msgstr "/Társalgás/Napló megtekintése" -#: ../pidgin/gtkconv.c:3198 +#: ../pidgin/gtkconv.c:3271 msgid "/Conversation/Send File..." msgstr "/Társalgás/Fájl küldése..." -#: ../pidgin/gtkconv.c:3202 +#: ../pidgin/gtkconv.c:3275 msgid "/Conversation/Add Buddy Pounce..." msgstr "/Társalgás/Partnerfigyelmeztetés felvétele..." -#: ../pidgin/gtkconv.c:3208 +#: ../pidgin/gtkconv.c:3281 msgid "/Conversation/Get Info" msgstr "/Társalgás/Információ lekérése" -#: ../pidgin/gtkconv.c:3212 +#: ../pidgin/gtkconv.c:3285 msgid "/Conversation/Invite..." msgstr "/Társalgás/Meghívás..." -#: ../pidgin/gtkconv.c:3218 +#: ../pidgin/gtkconv.c:3291 msgid "/Conversation/Alias..." msgstr "/Társalgás/Álnév..." -#: ../pidgin/gtkconv.c:3222 +#: ../pidgin/gtkconv.c:3295 msgid "/Conversation/Block..." msgstr "/Társalgás/Tiltás..." -#: ../pidgin/gtkconv.c:3226 +#: ../pidgin/gtkconv.c:3299 msgid "/Conversation/Unblock..." msgstr "/Társalgás/Tiltás feloldása..." -#: ../pidgin/gtkconv.c:3230 +#: ../pidgin/gtkconv.c:3303 msgid "/Conversation/Add..." msgstr "/Társalgás/Hozzáadás..." -#: ../pidgin/gtkconv.c:3234 +#: ../pidgin/gtkconv.c:3307 msgid "/Conversation/Remove..." msgstr "/Társalgás/Eltávolítás..." -#: ../pidgin/gtkconv.c:3240 +#: ../pidgin/gtkconv.c:3313 msgid "/Conversation/Insert Link..." msgstr "/Társalgás/Hivatkozás beszúrása..." -#: ../pidgin/gtkconv.c:3244 +#: ../pidgin/gtkconv.c:3317 msgid "/Conversation/Insert Image..." msgstr "/Társalgás/Kép beszúrása..." -#: ../pidgin/gtkconv.c:3250 +#: ../pidgin/gtkconv.c:3323 msgid "/Options/Enable Logging" msgstr "/Beállítások/Naplózás engedélyezése" -#: ../pidgin/gtkconv.c:3253 +#: ../pidgin/gtkconv.c:3326 msgid "/Options/Enable Sounds" msgstr "/Beállítások/Hangok engedélyezése" -#: ../pidgin/gtkconv.c:3266 +#: ../pidgin/gtkconv.c:3339 msgid "/Options/Show Formatting Toolbars" msgstr "/Beállítások/Formázás eszköztárak mutatása" -#: ../pidgin/gtkconv.c:3269 +#: ../pidgin/gtkconv.c:3342 msgid "/Options/Show Timestamps" msgstr "/Beállítások/Időbélyegek mutatása" -#: ../pidgin/gtkconv.c:3346 ../pidgin/gtkconv.c:3388 +#: ../pidgin/gtkconv.c:3419 ../pidgin/gtkconv.c:3461 msgid "User is typing..." msgstr "A felhasználó gépel..." -#: ../pidgin/gtkconv.c:3391 +#: ../pidgin/gtkconv.c:3464 msgid "User has typed something and stopped" msgstr "A felhasználó gépelt valamit és megállt" #. Build the Send To menu -#: ../pidgin/gtkconv.c:3574 ../pidgin/gtkconv.c:8022 -msgid "_Send To" -msgstr "_Küldés mint" - -#: ../pidgin/gtkconv.c:4286 +#: ../pidgin/gtkconv.c:3648 ../pidgin/gtkconv.c:8248 +msgid "S_end To" +msgstr "Kül_dés ennek" + +#: ../pidgin/gtkconv.c:4360 msgid "_Send" msgstr "_Küldés" #. Setup the label telling how many people are in the room. -#: ../pidgin/gtkconv.c:4390 +#: ../pidgin/gtkconv.c:4473 msgid "0 people in room" msgstr "0 személy tartózkodik a szobában" -#: ../pidgin/gtkconv.c:5759 ../pidgin/gtkconv.c:5880 +#: ../pidgin/gtkconv.c:5846 ../pidgin/gtkconv.c:5967 #, c-format msgid "%d person in room" msgid_plural "%d people in room" msgstr[0] "%d személy van a szobában" msgstr[1] "%d személy van a szobában" -#: ../pidgin/gtkconv.c:6486 ../pidgin/gtkstatusbox.c:660 +#: ../pidgin/gtkconv.c:6574 ../pidgin/gtkstatusbox.c:660 msgid "Typing" msgstr "Gépel" -#: ../pidgin/gtkconv.c:6490 +#: ../pidgin/gtkconv.c:6578 msgid "Stopped Typing" msgstr "Abbahagyta a gépelést" -#: ../pidgin/gtkconv.c:6493 +#: ../pidgin/gtkconv.c:6581 msgid "Nick Said" msgstr "Becenév kimondva" -#: ../pidgin/gtkconv.c:6496 ../pidgin/gtkdocklet.c:492 +#: ../pidgin/gtkconv.c:6584 ../pidgin/gtkdocklet.c:685 msgid "Unread Messages" msgstr "Olvasatlan üzenetek" -#: ../pidgin/gtkconv.c:6499 +#: ../pidgin/gtkconv.c:6590 msgid "New Event" msgstr "Új esemény" -#: ../pidgin/gtkconv.c:7572 +#: ../pidgin/gtkconv.c:7767 msgid "clear: Clears all conversation scrollbacks." msgstr "clear: Törli a társalgás előzményeit." -#: ../pidgin/gtkconv.c:7736 +#: ../pidgin/gtkconv.c:7930 msgid "Confirm close" msgstr "Bezárás jóváhagyása" -#: ../pidgin/gtkconv.c:7768 +#: ../pidgin/gtkconv.c:7962 msgid "You have unread messages. Are you sure you want to close the window?" msgstr "Olvasatlan üzenetei vannak. Biztos, hogy bezárja az ablakot?" -#: ../pidgin/gtkconv.c:8355 +#: ../pidgin/gtkconv.c:8581 msgid "Close other tabs" msgstr "Más lapok bezárása" -#: ../pidgin/gtkconv.c:8361 +#: ../pidgin/gtkconv.c:8587 msgid "Close all tabs" msgstr "Minden lap bezárása" -#: ../pidgin/gtkconv.c:8369 +#: ../pidgin/gtkconv.c:8595 msgid "Detach this tab" msgstr "Ezen lap leválasztása" -#: ../pidgin/gtkconv.c:8375 +#: ../pidgin/gtkconv.c:8601 msgid "Close this tab" msgstr "Ezen lap bezárása" -#: ../pidgin/gtkconv.c:8875 +#: ../pidgin/gtkconv.c:9106 msgid "Close conversation" msgstr "Társalgás bezárása" -#: ../pidgin/gtkconv.c:9477 +#: ../pidgin/gtkconv.c:9708 msgid "Last created window" msgstr "Utoljára létrehozott ablak" -#: ../pidgin/gtkconv.c:9479 +#: ../pidgin/gtkconv.c:9710 msgid "Separate IM and Chat windows" msgstr "Üzenő- és csevegőablakok elkülönítése" -#: ../pidgin/gtkconv.c:9481 ../pidgin/gtkprefs.c:1415 +#: ../pidgin/gtkconv.c:9712 ../pidgin/gtkprefs.c:1510 msgid "New window" msgstr "Új ablak" -#: ../pidgin/gtkconv.c:9483 +#: ../pidgin/gtkconv.c:9714 msgid "By group" msgstr "Csoport szerint" -#: ../pidgin/gtkconv.c:9485 +#: ../pidgin/gtkconv.c:9716 msgid "By account" msgstr "Fiók szerint" -#: ../pidgin/gtkdebug.c:234 +#: ../pidgin/gtkdebug.c:235 msgid "Save Debug Log" msgstr "Hibakereső napló mentése" -#: ../pidgin/gtkdebug.c:582 +#: ../pidgin/gtkdebug.c:583 msgid "Invert" msgstr "Invertálás" -#: ../pidgin/gtkdebug.c:585 +#: ../pidgin/gtkdebug.c:586 msgid "Highlight matches" msgstr "Találatok kiemelése" -#: ../pidgin/gtkdebug.c:652 +#: ../pidgin/gtkdebug.c:653 msgid "_Icon Only" msgstr "Csak i_kon" -#: ../pidgin/gtkdebug.c:653 +#: ../pidgin/gtkdebug.c:654 msgid "_Text Only" msgstr "Csak s_zöveg" -#: ../pidgin/gtkdebug.c:654 +#: ../pidgin/gtkdebug.c:655 msgid "_Both Icon & Text" msgstr "Ik_on és szöveg" -#: ../pidgin/gtkdebug.c:775 +#: ../pidgin/gtkdebug.c:780 msgid "Filter" msgstr "Szűrő" -#: ../pidgin/gtkdebug.c:794 +#: ../pidgin/gtkdebug.c:799 msgid "Right click for more options." msgstr "Kattintson a jobb egérgombbal további beállításokért." -#: ../pidgin/gtkdebug.c:824 +#: ../pidgin/gtkdebug.c:829 msgid "Level " msgstr "Szint: " -#: ../pidgin/gtkdebug.c:825 ../pidgin/gtkdebug.c:831 +#: ../pidgin/gtkdebug.c:830 ../pidgin/gtkdebug.c:836 msgid "Select the debug filter level." msgstr "Válassza ki a hibakeresési szűrő szintjét." -#: ../pidgin/gtkdebug.c:833 +#: ../pidgin/gtkdebug.c:838 msgid "All" msgstr "Minden" -#: ../pidgin/gtkdebug.c:834 +#: ../pidgin/gtkdebug.c:839 msgid "Misc" msgstr "Egyéb" -#: ../pidgin/gtkdebug.c:836 +#: ../pidgin/gtkdebug.c:841 msgid "Warning" msgstr "Figyelmeztetés" -#: ../pidgin/gtkdebug.c:837 +#: ../pidgin/gtkdebug.c:842 msgid "Error " msgstr "Hiba " -#: ../pidgin/gtkdebug.c:838 +#: ../pidgin/gtkdebug.c:843 msgid "Fatal Error" msgstr "Végzetes hiba" @@ -14692,20 +14991,20 @@ #: ../pidgin/gtkdialogs.c:81 ../pidgin/gtkdialogs.c:82 #: ../pidgin/gtkdialogs.c:83 ../pidgin/gtkdialogs.c:84 #: ../pidgin/gtkdialogs.c:85 ../pidgin/gtkdialogs.c:86 -#: ../pidgin/gtkdialogs.c:89 ../pidgin/gtkdialogs.c:91 -#: ../pidgin/gtkdialogs.c:92 +#: ../pidgin/gtkdialogs.c:87 ../pidgin/gtkdialogs.c:90 +#: ../pidgin/gtkdialogs.c:92 ../pidgin/gtkdialogs.c:93 msgid "developer" msgstr "fejlesztő" -#: ../pidgin/gtkdialogs.c:87 +#: ../pidgin/gtkdialogs.c:88 msgid "support" msgstr "támogató" -#: ../pidgin/gtkdialogs.c:88 +#: ../pidgin/gtkdialogs.c:89 msgid "support/QA" msgstr "támogató/QA" -#: ../pidgin/gtkdialogs.c:90 ../pidgin/gtkdialogs.c:112 +#: ../pidgin/gtkdialogs.c:91 ../pidgin/gtkdialogs.c:112 msgid "developer & webmaster" msgstr "fejlesztő és webmester" @@ -14748,7 +15047,7 @@ #: ../pidgin/gtkdialogs.c:135 msgid "Belarusian Latin" -msgstr "" +msgstr "Fehérorosz latin" #: ../pidgin/gtkdialogs.c:136 ../pidgin/gtkdialogs.c:137 #: ../pidgin/gtkdialogs.c:227 @@ -14906,9 +15205,8 @@ msgstr "Kurd" #: ../pidgin/gtkdialogs.c:185 -#, fuzzy msgid "Lao" -msgstr "Oroszlán" +msgstr "Lao" #: ../pidgin/gtkdialogs.c:186 ../pidgin/gtkdialogs.c:252 #: ../pidgin/gtkdialogs.c:253 @@ -15029,12 +15327,12 @@ msgid "Amharic" msgstr "Amhara" -#: ../pidgin/gtkdialogs.c:357 +#: ../pidgin/gtkdialogs.c:368 #, c-format msgid "About %s" msgstr "A %s névjegye" -#: ../pidgin/gtkdialogs.c:400 +#: ../pidgin/gtkdialogs.c:411 #, c-format msgid "" "%s is a graphical modular messaging client based on libpurple which is " @@ -15057,49 +15355,62 @@ "közreműködők birtokolják, ezek teljes listája megtalálható a COPYRIGHT " "fájlban. A programra nem biztosítunk garanciát.<BR><BR>" -#: ../pidgin/gtkdialogs.c:418 +#: ../pidgin/gtkdialogs.c:429 #, c-format msgid "<FONT SIZE=\"4\">IRC:</FONT> #pidgin on irc.freenode.net<BR><BR>" -msgstr "" -"<FONT SIZE=\"4\">IRC:</FONT> #pidgin az irc.freenode.net hálózaton<BR><BR>" - -#: ../pidgin/gtkdialogs.c:423 +msgstr "<FONT SIZE=\"4\">IRC:</FONT> #pidgin az irc.freenode.net hálózaton<BR><BR>" + +#: ../pidgin/gtkdialogs.c:434 msgid "Current Developers" msgstr "Jelenlegi fejlesztők" -#: ../pidgin/gtkdialogs.c:438 +#: ../pidgin/gtkdialogs.c:449 msgid "Crazy Patch Writers" msgstr "Őrült patch szerzők" -#: ../pidgin/gtkdialogs.c:453 +#: ../pidgin/gtkdialogs.c:464 msgid "Retired Developers" msgstr "Visszavonult fejlesztők" -#: ../pidgin/gtkdialogs.c:468 +#: ../pidgin/gtkdialogs.c:479 msgid "Retired Crazy Patch Writers" msgstr "Visszavonult őrült patch szerzők" -#: ../pidgin/gtkdialogs.c:483 +#: ../pidgin/gtkdialogs.c:494 msgid "Artists" msgstr "Grafikusok" -#: ../pidgin/gtkdialogs.c:498 +#: ../pidgin/gtkdialogs.c:509 msgid "Current Translators" msgstr "Jelenlegi fordítók" -#: ../pidgin/gtkdialogs.c:518 +#: ../pidgin/gtkdialogs.c:529 msgid "Past Translators" msgstr "Korábbi fordítók" -#: ../pidgin/gtkdialogs.c:536 +#: ../pidgin/gtkdialogs.c:547 msgid "Debugging Information" msgstr "Hibakeresési információk" -#: ../pidgin/gtkdialogs.c:906 +#: ../pidgin/gtkdialogs.c:764 ../pidgin/gtkdialogs.c:907 +#: ../pidgin/gtkdialogs.c:988 +msgid "_Name" +msgstr "_Név" + +#: ../pidgin/gtkdialogs.c:769 +msgid "Buddy" +msgstr "Partner" + +#: ../pidgin/gtkdialogs.c:773 ../pidgin/gtkdialogs.c:912 +#: ../pidgin/gtkdialogs.c:993 +msgid "_Account" +msgstr "_Fiók" + +#: ../pidgin/gtkdialogs.c:920 msgid "Get User Info" msgstr "Felhasználó adatainak lekérése" -#: ../pidgin/gtkdialogs.c:908 +#: ../pidgin/gtkdialogs.c:922 msgid "" "Please enter the screen name or alias of the person whose info you would " "like to view." @@ -15107,11 +15418,11 @@ "Adja meg azon partner felhasználónevét vagy álnevét, akinek az adatait meg " "szeretné tekinteni." -#: ../pidgin/gtkdialogs.c:998 +#: ../pidgin/gtkdialogs.c:1012 msgid "View User Log" msgstr "Felhasználó naplójának lekérése" -#: ../pidgin/gtkdialogs.c:1000 +#: ../pidgin/gtkdialogs.c:1014 msgid "" "Please enter the screen name or alias of the person whose log you would like " "to view." @@ -15119,32 +15430,32 @@ "Adja meg azon partner felhasználónevét vagy álnevét, akinek a naplóját meg " "szeretné tekinteni." -#: ../pidgin/gtkdialogs.c:1020 +#: ../pidgin/gtkdialogs.c:1034 msgid "Alias Contact" msgstr "Kapcsolat álneve" -#: ../pidgin/gtkdialogs.c:1021 +#: ../pidgin/gtkdialogs.c:1035 msgid "Enter an alias for this contact." msgstr "Adjon meg egy álnevet ehhez a kapcsolathoz." -#: ../pidgin/gtkdialogs.c:1043 +#: ../pidgin/gtkdialogs.c:1057 #, c-format msgid "Enter an alias for %s." msgstr "Adjon meg egy álnevet %s számára." -#: ../pidgin/gtkdialogs.c:1045 +#: ../pidgin/gtkdialogs.c:1059 msgid "Alias Buddy" msgstr "Partner álneve" -#: ../pidgin/gtkdialogs.c:1066 +#: ../pidgin/gtkdialogs.c:1080 msgid "Alias Chat" msgstr "Csevegés álneve" -#: ../pidgin/gtkdialogs.c:1067 +#: ../pidgin/gtkdialogs.c:1081 msgid "Enter an alias for this chat." msgstr "Adjon meg egy álnevet ehhez a csevegéshez." -#: ../pidgin/gtkdialogs.c:1106 +#: ../pidgin/gtkdialogs.c:1120 #, c-format msgid "" "You are about to remove the contact containing %s and %d other buddy from " @@ -15159,15 +15470,15 @@ "%s és %d más partnert tartalmazó kapcsolat eltávolítására készül a " "partnerlistájáról. Folytatni akarja?" -#: ../pidgin/gtkdialogs.c:1114 +#: ../pidgin/gtkdialogs.c:1128 msgid "Remove Contact" msgstr "Kapcsolat eltávolítása" -#: ../pidgin/gtkdialogs.c:1117 +#: ../pidgin/gtkdialogs.c:1131 msgid "_Remove Contact" msgstr "_Kapcsolat eltávolítása" -#: ../pidgin/gtkdialogs.c:1148 +#: ../pidgin/gtkdialogs.c:1162 #, c-format msgid "" "You are about to merge the group called %s into the group called %s. Do you " @@ -15176,15 +15487,15 @@ "A(z) %s csoport összes tagjának a(z) %s csoportba fésülésére készül. " "Folytatni akarja?" -#: ../pidgin/gtkdialogs.c:1155 +#: ../pidgin/gtkdialogs.c:1169 msgid "Merge Groups" msgstr "Csoportok összefésülése" -#: ../pidgin/gtkdialogs.c:1158 +#: ../pidgin/gtkdialogs.c:1172 msgid "_Merge Groups" msgstr "_Csoportok összefésülése" -#: ../pidgin/gtkdialogs.c:1208 +#: ../pidgin/gtkdialogs.c:1222 #, c-format msgid "" "You are about to remove the group %s and all its members from your buddy " @@ -15193,70 +15504,67 @@ "A(z) %s csoport és annak összes tagja eltávolítására készül a " "partnerlistájáról. Folytatni akarja?" -#: ../pidgin/gtkdialogs.c:1211 +#: ../pidgin/gtkdialogs.c:1225 msgid "Remove Group" msgstr "Csoport törlése" -#: ../pidgin/gtkdialogs.c:1214 +#: ../pidgin/gtkdialogs.c:1228 msgid "_Remove Group" msgstr "_Csoport eltávolítása" -#: ../pidgin/gtkdialogs.c:1247 -#, c-format -msgid "" -"You are about to remove %s from your buddy list. Do you want to continue?" +#: ../pidgin/gtkdialogs.c:1261 +#, c-format +msgid "You are about to remove %s from your buddy list. Do you want to continue?" msgstr "%s eltávolítására készül a partnerlistájáról. Folytatni akarja?" -#: ../pidgin/gtkdialogs.c:1250 +#: ../pidgin/gtkdialogs.c:1264 msgid "Remove Buddy" msgstr "Partner törlése" -#: ../pidgin/gtkdialogs.c:1253 +#: ../pidgin/gtkdialogs.c:1267 msgid "_Remove Buddy" msgstr "Partner _törlése" -#: ../pidgin/gtkdialogs.c:1274 +#: ../pidgin/gtkdialogs.c:1288 #, c-format msgid "" "You are about to remove the chat %s from your buddy list. Do you want to " "continue?" -msgstr "" -"%s csevegés eltávolítására készül a partnerlistájáról. Folytatni akarja?" - -#: ../pidgin/gtkdialogs.c:1277 +msgstr "%s csevegés eltávolítására készül a partnerlistájáról. Folytatni akarja?" + +#: ../pidgin/gtkdialogs.c:1291 msgid "Remove Chat" msgstr "Csevegés eltávolítása" -#: ../pidgin/gtkdialogs.c:1280 +#: ../pidgin/gtkdialogs.c:1294 msgid "_Remove Chat" msgstr "_Csevegés eltávolítása" -#: ../pidgin/gtkdocklet.c:150 +#: ../pidgin/gtkdocklet.c:152 msgid "Right-click for more unread messages...\n" msgstr "További olvasatlan üzenetekért kattintson a jobb egérgombbal...\n" -#: ../pidgin/gtkdocklet.c:435 +#: ../pidgin/gtkdocklet.c:533 msgid "Change Status" msgstr "Állapot megváltoztatása" -#: ../pidgin/gtkdocklet.c:487 +#: ../pidgin/gtkdocklet.c:680 msgid "Show Buddy List" msgstr "Partnerlista mutatása" -#: ../pidgin/gtkdocklet.c:513 +#: ../pidgin/gtkdocklet.c:706 msgid "New Message..." msgstr "Új üzenet..." -#: ../pidgin/gtkdocklet.c:528 +#: ../pidgin/gtkdocklet.c:721 msgid "Mute Sounds" msgstr "Hangok némítása" -#: ../pidgin/gtkdocklet.c:535 -#, fuzzy -msgid "Blink on new message" +#: ../pidgin/gtkdocklet.c:728 +msgid "Blink on New Message" msgstr "Villogjon új üzenetkor" -#: ../pidgin/gtkdocklet.c:542 +#: ../pidgin/gtkdocklet.c:738 msgid "Quit" msgstr "Kilépés" @@ -15346,44 +15654,43 @@ msgid "_Resume" msgstr "_Folytatás" -#: ../pidgin/gtkimhtml.c:816 +#: ../pidgin/gtkimhtml.c:815 msgid "Paste as Plain _Text" msgstr "Beillesztés egyszerű szö_vegként" -#: ../pidgin/gtkimhtml.c:833 ../pidgin/gtkimhtmltoolbar.c:1194 +#: ../pidgin/gtkimhtml.c:832 ../pidgin/gtkimhtmltoolbar.c:1199 msgid "_Reset formatting" msgstr "F_ormázás törlése" -#: ../pidgin/gtkimhtml.c:1373 +#: ../pidgin/gtkimhtml.c:1359 msgid "Hyperlink color" msgstr "Hiperhivatkozás színe" -#: ../pidgin/gtkimhtml.c:1374 +#: ../pidgin/gtkimhtml.c:1360 msgid "Color to draw hyperlinks." msgstr "Hiperhivatkozások rajzolásához használt szín." -#: ../pidgin/gtkimhtml.c:1377 +#: ../pidgin/gtkimhtml.c:1363 msgid "Hyperlink prelight color" msgstr "Hiperhivatkozás előfényszíne" -#: ../pidgin/gtkimhtml.c:1378 +#: ../pidgin/gtkimhtml.c:1364 msgid "Color to draw hyperlinks when mouse is over them." -msgstr "" -"Hiperhivatkozások rajzolásához használt szín, amikor az egér rájuk mutat." - -#: ../pidgin/gtkimhtml.c:1598 +msgstr "Hiperhivatkozások rajzolásához használt szín, amikor az egér rájuk mutat." + +#: ../pidgin/gtkimhtml.c:1581 msgid "_Copy E-Mail Address" msgstr "E-mail cím _másolása" -#: ../pidgin/gtkimhtml.c:1610 +#: ../pidgin/gtkimhtml.c:1593 msgid "_Open Link in Browser" msgstr "Hivatk_ozás megnyitása böngészőben" -#: ../pidgin/gtkimhtml.c:1620 +#: ../pidgin/gtkimhtml.c:1603 msgid "_Copy Link Location" msgstr "_Hivatkozás helyének másolása" -#: ../pidgin/gtkimhtml.c:3369 +#: ../pidgin/gtkimhtml.c:3353 msgid "" "<span size='larger' weight='bold'>Unrecognized file type</span>\n" "\n" @@ -15393,7 +15700,7 @@ "\n" "Alapértelmezett PNG használata." -#: ../pidgin/gtkimhtml.c:3372 +#: ../pidgin/gtkimhtml.c:3356 msgid "" "Unrecognized file type\n" "\n" @@ -15403,7 +15710,7 @@ "\n" "Alapértelmezett PNG használata." -#: ../pidgin/gtkimhtml.c:3401 +#: ../pidgin/gtkimhtml.c:3385 #, c-format msgid "" "<span size='larger' weight='bold'>Error saving image</span>\n" @@ -15414,7 +15721,7 @@ "\n" "%s" -#: ../pidgin/gtkimhtml.c:3404 +#: ../pidgin/gtkimhtml.c:3388 #, c-format msgid "" "Error saving image\n" @@ -15425,11 +15732,11 @@ "\n" "%s" -#: ../pidgin/gtkimhtml.c:3482 ../pidgin/gtkimhtml.c:3494 +#: ../pidgin/gtkimhtml.c:3466 ../pidgin/gtkimhtml.c:3478 msgid "Save Image" msgstr "Kép mentése" -#: ../pidgin/gtkimhtml.c:3522 +#: ../pidgin/gtkimhtml.c:3506 #, c-format msgid "_Save Image..." msgstr "Kép menté_se..." @@ -15438,178 +15745,176 @@ msgid "Select Font" msgstr "Betűkészlet kiválasztása" -#: ../pidgin/gtkimhtmltoolbar.c:242 +#: ../pidgin/gtkimhtmltoolbar.c:244 msgid "Select Text Color" msgstr "Szöveg színének kiválasztása" -#: ../pidgin/gtkimhtmltoolbar.c:321 +#: ../pidgin/gtkimhtmltoolbar.c:323 msgid "Select Background Color" msgstr "Háttérszín kiválasztása" -#: ../pidgin/gtkimhtmltoolbar.c:410 +#: ../pidgin/gtkimhtmltoolbar.c:412 msgid "_URL" msgstr "_URL" -#: ../pidgin/gtkimhtmltoolbar.c:418 +#: ../pidgin/gtkimhtmltoolbar.c:420 msgid "_Description" msgstr "_Leírás" -#: ../pidgin/gtkimhtmltoolbar.c:421 +#: ../pidgin/gtkimhtmltoolbar.c:423 msgid "" "Please enter the URL and description of the link that you want to insert. " "The description is optional." -msgstr "" -"Kérem adja meg a beszúrandó hivatkozás URL-jét és leírását. A leírás " -"opcionális." - -#: ../pidgin/gtkimhtmltoolbar.c:425 +msgstr "Adja meg a beszúrandó hivatkozás URL címét és leírását. A leírás opcionális." + +#: ../pidgin/gtkimhtmltoolbar.c:427 msgid "Please enter the URL of the link that you want to insert." -msgstr "Kérem adja meg a beszúrandó hivatkozás URL-jét." - -#: ../pidgin/gtkimhtmltoolbar.c:430 ../pidgin/gtkimhtmltoolbar.c:1102 +msgstr "Adja meg a beszúrandó hivatkozás URL címét." + +#: ../pidgin/gtkimhtmltoolbar.c:432 ../pidgin/gtkimhtmltoolbar.c:1106 msgid "Insert Link" msgstr "Hivatkozás beszúrása" -#: ../pidgin/gtkimhtmltoolbar.c:434 ../pidgin/gtkimhtmltoolbar.c:1262 +#: ../pidgin/gtkimhtmltoolbar.c:436 ../pidgin/gtkimhtmltoolbar.c:1267 msgid "_Insert" msgstr "_Beszúrás" -#: ../pidgin/gtkimhtmltoolbar.c:514 +#: ../pidgin/gtkimhtmltoolbar.c:516 #, c-format msgid "Failed to store image: %s\n" msgstr "A kép tárolása nem sikerült: %s\n" -#: ../pidgin/gtkimhtmltoolbar.c:540 ../pidgin/gtkimhtmltoolbar.c:550 +#: ../pidgin/gtkimhtmltoolbar.c:542 ../pidgin/gtkimhtmltoolbar.c:552 msgid "Insert Image" msgstr "Kép beszúrása" -#: ../pidgin/gtkimhtmltoolbar.c:761 +#: ../pidgin/gtkimhtmltoolbar.c:765 msgid "This theme has no available smileys." msgstr "Ehhez a témához nem állnak rendelkezésre hangulatjelek." #. show everything -#: ../pidgin/gtkimhtmltoolbar.c:778 +#: ../pidgin/gtkimhtmltoolbar.c:782 msgid "Smile!" msgstr "Hangulatjel választása" -#: ../pidgin/gtkimhtmltoolbar.c:846 ../pidgin/gtkimhtmltoolbar.c:1219 +#: ../pidgin/gtkimhtmltoolbar.c:850 ../pidgin/gtkimhtmltoolbar.c:1224 msgid "_Font" msgstr "_Betű" -#: ../pidgin/gtkimhtmltoolbar.c:1054 +#: ../pidgin/gtkimhtmltoolbar.c:1058 msgid "Group Items" msgstr "Elemek csoportosítása" -#: ../pidgin/gtkimhtmltoolbar.c:1054 +#: ../pidgin/gtkimhtmltoolbar.c:1058 msgid "Ungroup Items" msgstr "Csoportosítás megszüntetése" -#: ../pidgin/gtkimhtmltoolbar.c:1088 ../pidgin/plugins/convcolors.c:287 +#: ../pidgin/gtkimhtmltoolbar.c:1092 ../pidgin/plugins/convcolors.c:287 msgid "Bold" msgstr "Félkövér" -#: ../pidgin/gtkimhtmltoolbar.c:1089 ../pidgin/plugins/convcolors.c:294 +#: ../pidgin/gtkimhtmltoolbar.c:1093 ../pidgin/plugins/convcolors.c:294 msgid "Italic" msgstr "Dőlt" -#: ../pidgin/gtkimhtmltoolbar.c:1090 ../pidgin/plugins/convcolors.c:301 +#: ../pidgin/gtkimhtmltoolbar.c:1094 ../pidgin/plugins/convcolors.c:301 msgid "Underline" msgstr "Aláhúzott" -#: ../pidgin/gtkimhtmltoolbar.c:1091 +#: ../pidgin/gtkimhtmltoolbar.c:1095 msgid "Strikethrough" msgstr "Áthúzott" -#: ../pidgin/gtkimhtmltoolbar.c:1093 -msgid "Increase Font Size" -msgstr "Betűméret növelése" - -#: ../pidgin/gtkimhtmltoolbar.c:1094 -msgid "Decrease Font Size" -msgstr "Betűméret csökkentése" - -#: ../pidgin/gtkimhtmltoolbar.c:1096 -msgid "Font Face" -msgstr "Betűkészlet" - #: ../pidgin/gtkimhtmltoolbar.c:1097 -msgid "Background Color" -msgstr "Háttérszín" +msgid "Increase Font Size" +msgstr "Betűméret növelése" #: ../pidgin/gtkimhtmltoolbar.c:1098 +msgid "Decrease Font Size" +msgstr "Betűméret csökkentése" + +#: ../pidgin/gtkimhtmltoolbar.c:1100 +msgid "Font Face" +msgstr "Betűkészlet" + +#: ../pidgin/gtkimhtmltoolbar.c:1101 +msgid "Background Color" +msgstr "Háttérszín" + +#: ../pidgin/gtkimhtmltoolbar.c:1102 msgid "Foreground Color" msgstr "Előtérszín" -#: ../pidgin/gtkimhtmltoolbar.c:1100 +#: ../pidgin/gtkimhtmltoolbar.c:1104 msgid "Reset Formatting" msgstr "Formázás törlése" -#: ../pidgin/gtkimhtmltoolbar.c:1103 +#: ../pidgin/gtkimhtmltoolbar.c:1107 msgid "Insert IM Image" msgstr "Kép beszúrása" -#: ../pidgin/gtkimhtmltoolbar.c:1104 +#: ../pidgin/gtkimhtmltoolbar.c:1108 msgid "Insert Smiley" msgstr "Hangulatjel beszúrása" -#: ../pidgin/gtkimhtmltoolbar.c:1179 +#: ../pidgin/gtkimhtmltoolbar.c:1184 msgid "<b>_Bold</b>" msgstr "<b>_Félkövér</b>" -#: ../pidgin/gtkimhtmltoolbar.c:1180 +#: ../pidgin/gtkimhtmltoolbar.c:1185 msgid "<i>_Italic</i>" msgstr "<i>_Dőlt</i>" -#: ../pidgin/gtkimhtmltoolbar.c:1181 +#: ../pidgin/gtkimhtmltoolbar.c:1186 msgid "<u>_Underline</u>" msgstr "<u>_Aláhúzott</u>" -#: ../pidgin/gtkimhtmltoolbar.c:1182 +#: ../pidgin/gtkimhtmltoolbar.c:1187 msgid "<span strikethrough='true'>Strikethrough</span>" msgstr "<span size='larger'>Áthúzott</span>" -#: ../pidgin/gtkimhtmltoolbar.c:1183 +#: ../pidgin/gtkimhtmltoolbar.c:1188 msgid "<span size='larger'>_Larger</span>" msgstr "<span size='larger'>_Nagyobb</span>" -#: ../pidgin/gtkimhtmltoolbar.c:1185 +#: ../pidgin/gtkimhtmltoolbar.c:1190 msgid "_Normal" msgstr "N_ormál" -#: ../pidgin/gtkimhtmltoolbar.c:1187 +#: ../pidgin/gtkimhtmltoolbar.c:1192 msgid "<span size='smaller'>_Smaller</span>" msgstr "<span size='smaller'>_Kisebb</span>" #. If we want to show the formatting for the following items, we would #. * need to update them when formatting changes. The above items don't need #. * no updating nor nothin' -#: ../pidgin/gtkimhtmltoolbar.c:1191 +#: ../pidgin/gtkimhtmltoolbar.c:1196 msgid "_Font face" msgstr "_Betűkészlet" -#: ../pidgin/gtkimhtmltoolbar.c:1192 +#: ../pidgin/gtkimhtmltoolbar.c:1197 msgid "Foreground _color" msgstr "_Előtérszín" -#: ../pidgin/gtkimhtmltoolbar.c:1193 +#: ../pidgin/gtkimhtmltoolbar.c:1198 msgid "Bac_kground color" msgstr "_Háttérszín" -#: ../pidgin/gtkimhtmltoolbar.c:1270 -msgid "_Smiley" -msgstr "Hang_ulatjel" - -#: ../pidgin/gtkimhtmltoolbar.c:1276 +#: ../pidgin/gtkimhtmltoolbar.c:1275 msgid "_Image" msgstr "Ké_p" -#: ../pidgin/gtkimhtmltoolbar.c:1282 +#: ../pidgin/gtkimhtmltoolbar.c:1281 msgid "_Link" msgstr "_Hivatkozás" -#: ../pidgin/gtkimhtmltoolbar.c:1288 +#: ../pidgin/gtkimhtmltoolbar.c:1287 msgid "_Horizontal rule" -msgstr "_Vízszintes szabály" +msgstr "_Vízszintes elválasztó" + +#: ../pidgin/gtkimhtmltoolbar.c:1309 +msgid "_Smile!" +msgstr "Hang_ulatjel" #: ../pidgin/gtklog.c:293 #, c-format @@ -15634,8 +15939,7 @@ msgid "" "Are you sure you want to permanently delete the system log which started at %" "s?" -msgstr "" -"Biztos, hogy törölni akarja a(z) %s időpontban kezdődött rendszernaplót?" +msgstr "Biztos, hogy törölni akarja a(z) %s időpontban kezdődött rendszernaplót?" #: ../pidgin/gtklog.c:453 #, c-format @@ -15645,8 +15949,7 @@ #: ../pidgin/gtklog.c:456 #, c-format msgid "<span size='larger' weight='bold'>Conversation with %s on %s</span>" -msgstr "" -"<span size='larger' weight='bold'>Társalgás ezzel: %s, ekkor: %s</span>" +msgstr "<span size='larger' weight='bold'>Társalgás ezzel: %s, ekkor: %s</span>" #: ../pidgin/gtklog.c:503 msgid "%B %Y" @@ -15669,8 +15972,7 @@ "üzenet naplózása\" tulajdonság be van állítva." #: ../pidgin/gtklog.c:557 -msgid "" -"Chats will only be logged if the \"Log all chats\" preference is enabled." +msgid "Chats will only be logged if the \"Log all chats\" preference is enabled." msgstr "" "A csevegések csak akkor lesznek naplózva, ha az \"Összes csevegés naplózása" "\" tulajdonság be van állítva." @@ -15688,17 +15990,17 @@ msgid "Total log size:" msgstr "Teljes naplóméret:" -#: ../pidgin/gtklog.c:709 +#: ../pidgin/gtklog.c:714 #, c-format msgid "Conversations in %s" msgstr "Társalgások ezen: %s" -#: ../pidgin/gtklog.c:717 ../pidgin/gtklog.c:779 +#: ../pidgin/gtklog.c:722 ../pidgin/gtklog.c:793 #, c-format msgid "Conversations with %s" msgstr "Társalgások a következővel: %s" -#: ../pidgin/gtklog.c:804 +#: ../pidgin/gtklog.c:823 msgid "System Log" msgstr "Rendszernapló" @@ -15708,7 +16010,7 @@ msgstr "%s %s. Próbálja a \"%s -h\" parancsot további információkért.\n" #: ../pidgin/gtkmain.c:388 -#, fuzzy, c-format +#, c-format msgid "" "%s %s\n" "Usage: %s [OPTION]...\n" @@ -15720,6 +16022,7 @@ " -n, --nologin don't automatically login\n" " -l, --login[=NAME] automatically login (optional argument NAME specifies\n" " account(s) to use, separated by commas)\n" +" --display=DISPLAY X display to use\n" " -v, --version display the current version and exit\n" msgstr "" "%s %s\n" @@ -15732,12 +16035,13 @@ " -n, --nologin ne jelentkezzen be automatikusan\n" " -l, --login[=NÉV] automatikus bejelentkezés (a NÉV paraméter megadja a\n" " használandó fiókok vesszőkkel tagolt listáját)\n" +" --display=KÉPERNYŐ a használandó X megjelenítő\n" " -v, --version az aktuális verzió megjelenítése és kilépés\n" -#: ../pidgin/gtkmain.c:512 -#, fuzzy, c-format -msgid "" -"%s has segfaulted and attempted to dump a core file.\n" +#: ../pidgin/gtkmain.c:516 +#, c-format +msgid "" +"%s %s has segfaulted and attempted to dump a core file.\n" "This is a bug in the software and has happened through\n" "no fault of your own.\n" "\n" @@ -15755,7 +16059,7 @@ "on other protocols is at\n" "%swiki/DeveloperPages\n" msgstr "" -"A %s összeomlott és megpróbált kiírni egy magfájlt.\n" +"A %s %s összeomlott és megpróbált kiírni egy magfájlt.\n" "Ez a szoftver és nem az Ön hibája miatt történt.\n" "\n" "Ha ismételten elő tudja állítani az összeomlást, akkor\n" @@ -15776,50 +16080,49 @@ #. Translators may want to transliterate the name. #. It is not to be translated. -#: ../pidgin/gtkmain.c:699 ../pidgin/pidgin.h:51 +#: ../pidgin/gtkmain.c:706 ../pidgin/pidgin.h:51 msgid "Pidgin" msgstr "Pidgin" -#: ../pidgin/gtknotify.c:349 +#: ../pidgin/gtknotify.c:350 msgid "Open All Messages" msgstr "Összes üzenet megnyitása" -#: ../pidgin/gtknotify.c:402 +#: ../pidgin/gtknotify.c:403 msgid "<span weight=\"bold\" size=\"larger\">You have mail!</span>" msgstr "<span weight=\"bold\" size=\"larger\">Levele érkezett!</span>" -#: ../pidgin/gtknotify.c:540 +#: ../pidgin/gtknotify.c:546 #, c-format msgid "%s has %d new message." msgid_plural "%s has %d new messages." msgstr[0] "%s %d új üzenetet kapott." msgstr[1] "%s %d új üzenetet kapott." -#: ../pidgin/gtknotify.c:564 -#, fuzzy, c-format -msgid "<b>You have %d new e-mail.</b>" -msgid_plural "<b>You have %d new e-mails.</b>" -msgstr[0] "<b>%d új e-mailje érkezett.</b>" -msgstr[1] "<b>%d új e-mailje érkezett.</b>" - -#: ../pidgin/gtknotify.c:989 +#: ../pidgin/gtknotify.c:570 +#, c-format +msgid "<b>%d new e-mail.</b>" +msgid_plural "<b>%d new e-mails.</b>" +msgstr[0] "<b>%d új e-mail.</b>" +msgstr[1] "<b>%d új e-mail.</b>" + +#: ../pidgin/gtknotify.c:998 #, c-format msgid "The browser command \"%s\" is invalid." msgstr "A(z) \"%s\" böngészőparancs érvénytelen." -#: ../pidgin/gtknotify.c:991 ../pidgin/gtknotify.c:1003 -#: ../pidgin/gtknotify.c:1016 ../pidgin/gtknotify.c:1144 +#: ../pidgin/gtknotify.c:1000 ../pidgin/gtknotify.c:1012 +#: ../pidgin/gtknotify.c:1025 ../pidgin/gtknotify.c:1153 msgid "Unable to open URL" msgstr "Az URL megnyitása sikertelen" -#: ../pidgin/gtknotify.c:1001 ../pidgin/gtknotify.c:1014 +#: ../pidgin/gtknotify.c:1010 ../pidgin/gtknotify.c:1023 #, c-format msgid "Error launching \"%s\": %s" msgstr "Hiba \"%s\" indításakor: %s" -#: ../pidgin/gtknotify.c:1145 -msgid "" -"The 'Manual' browser command has been chosen, but no command has been set." +#: ../pidgin/gtknotify.c:1154 +msgid "The 'Manual' browser command has been chosen, but no command has been set." msgstr "A \"Kézi\" böngészőparancsot választotta, de nem adott meg parancsot." #: ../pidgin/gtkplugin.c:265 @@ -15834,7 +16137,17 @@ msgid "Unload Plugins" msgstr "Bővítmények eltávolítása" -#: ../pidgin/gtkplugin.c:400 +#: ../pidgin/gtkplugin.c:308 +msgid "Could not unload plugin" +msgstr "Nem sikerült eltávolítani a bővítményt" + +#: ../pidgin/gtkplugin.c:309 +msgid "" +"The plugin could not be unloaded now, but will be disabled at the next " +"startup." +msgstr "A bővítmény most nem távolítható el, de a következő indítás után letiltásra kerül." + +#: ../pidgin/gtkplugin.c:417 #, c-format msgid "" "%s%s<span weight=\"bold\">Written by:</span>\t%s\n" @@ -15845,7 +16158,7 @@ "<span weight=\"bold\">Webcím:</span>\t\t%s\n" "<span weight=\"bold\">Fájlnév:</span>\t\t%s" -#: ../pidgin/gtkplugin.c:410 +#: ../pidgin/gtkplugin.c:427 #, c-format msgid "" "%s\n" @@ -15856,11 +16169,11 @@ "<span foreground=\"#ff0000\" weight=\"bold\">Hiba: %s\n" "Keressen frissítést a bővítmény webhelyén.</span>" -#: ../pidgin/gtkplugin.c:536 +#: ../pidgin/gtkplugin.c:562 msgid "Configure Pl_ugin" msgstr "Bő_vítmény beállítása" -#: ../pidgin/gtkplugin.c:599 +#: ../pidgin/gtkplugin.c:625 msgid "<b>Plugin Details</b>" msgstr "<b>Bővítmény részletei</b>" @@ -15869,95 +16182,95 @@ msgstr "Fájl kiválasztása" #. Create the "Pounce on Whom" frame. -#: ../pidgin/gtkpounce.c:532 +#: ../pidgin/gtkpounce.c:547 msgid "Pounce on Whom" msgstr "Kinél figyelmeztet" -#: ../pidgin/gtkpounce.c:559 +#: ../pidgin/gtkpounce.c:574 msgid "_Buddy name:" msgstr "_Partner neve:" -#: ../pidgin/gtkpounce.c:593 +#: ../pidgin/gtkpounce.c:608 msgid "Si_gns on" msgstr "Be_jelentkezik" -#: ../pidgin/gtkpounce.c:595 +#: ../pidgin/gtkpounce.c:610 msgid "Signs o_ff" msgstr "_Kijelentkezik" -#: ../pidgin/gtkpounce.c:597 +#: ../pidgin/gtkpounce.c:612 msgid "Goes a_way" msgstr "A partner _elmegy" -#: ../pidgin/gtkpounce.c:599 +#: ../pidgin/gtkpounce.c:614 msgid "Ret_urns from away" msgstr "Visszaté_r távollétből" -#: ../pidgin/gtkpounce.c:601 +#: ../pidgin/gtkpounce.c:616 msgid "Becomes _idle" msgstr "_Inaktív lesz" -#: ../pidgin/gtkpounce.c:603 +#: ../pidgin/gtkpounce.c:618 msgid "Is no longer i_dle" msgstr "_Már nem inaktív" -#: ../pidgin/gtkpounce.c:605 +#: ../pidgin/gtkpounce.c:620 msgid "Starts _typing" msgstr "Elkez_d gépelni" -#: ../pidgin/gtkpounce.c:607 +#: ../pidgin/gtkpounce.c:622 msgid "P_auses while typing" msgstr "_Felfüggeszti a gépelést" -#: ../pidgin/gtkpounce.c:609 +#: ../pidgin/gtkpounce.c:624 msgid "Stops t_yping" msgstr "_Abbahagyja a gépelést" -#: ../pidgin/gtkpounce.c:611 +#: ../pidgin/gtkpounce.c:626 msgid "Sends a _message" msgstr "Ü_zenetet küld" -#: ../pidgin/gtkpounce.c:654 +#: ../pidgin/gtkpounce.c:669 msgid "Ope_n an IM window" msgstr "Azonnali üzenőablak _megnyitása" -#: ../pidgin/gtkpounce.c:656 +#: ../pidgin/gtkpounce.c:671 msgid "_Pop up a notification" msgstr "Értesítés _megjelenítése" -#: ../pidgin/gtkpounce.c:658 +#: ../pidgin/gtkpounce.c:673 msgid "Send a _message" msgstr "Ü_zenet küldése" -#: ../pidgin/gtkpounce.c:660 +#: ../pidgin/gtkpounce.c:675 msgid "E_xecute a command" msgstr "Paran_cs végrehajtása" -#: ../pidgin/gtkpounce.c:662 +#: ../pidgin/gtkpounce.c:677 msgid "P_lay a sound" msgstr "Hang _lejátszása" -#: ../pidgin/gtkpounce.c:668 +#: ../pidgin/gtkpounce.c:683 msgid "Brows_e..." msgstr "_Tallózás..." -#: ../pidgin/gtkpounce.c:670 +#: ../pidgin/gtkpounce.c:685 msgid "Br_owse..." msgstr "_Tallózás..." -#: ../pidgin/gtkpounce.c:671 +#: ../pidgin/gtkpounce.c:686 msgid "Pre_view" msgstr "_Előnézet" -#: ../pidgin/gtkpounce.c:798 +#: ../pidgin/gtkpounce.c:818 msgid "P_ounce only when my status is not Available" msgstr "_Csak akkor figyelmeztet, ha az állapotom nem \"Elérhető\"" -#: ../pidgin/gtkpounce.c:803 +#: ../pidgin/gtkpounce.c:823 msgid "_Recurring" msgstr "_Ismétlődő" -#: ../pidgin/gtkpounce.c:1246 +#: ../pidgin/gtkpounce.c:1266 msgid "Pounce Target" msgstr "Figyelmeztetés címzettje" @@ -15974,7 +16287,7 @@ msgid "Install Theme" msgstr "Téma telepítése" -#: ../pidgin/gtkprefs.c:697 +#: ../pidgin/gtkprefs.c:698 msgid "" "Select a smiley theme that you would like to use from the list below. New " "themes can be installed by dragging and dropping them onto the theme list." @@ -15982,15 +16295,15 @@ "Válassza ki a használni kívánt hangulatjel-témát az alábbi listából. Új " "témák a témalistába dobással telepíthetők." -#: ../pidgin/gtkprefs.c:732 +#: ../pidgin/gtkprefs.c:733 msgid "Icon" msgstr "Ikon" -#: ../pidgin/gtkprefs.c:894 +#: ../pidgin/gtkprefs.c:895 msgid "System Tray Icon" msgstr "Rendszertálca-ikon" -#: ../pidgin/gtkprefs.c:895 +#: ../pidgin/gtkprefs.c:896 msgid "_Show system tray icon:" msgstr "_Rendszertálca-ikon megjelenítése:" @@ -15998,116 +16311,120 @@ msgid "On unread messages" msgstr "Olvasatlan üzenetek esetén" -#: ../pidgin/gtkprefs.c:904 +#: ../pidgin/gtkprefs.c:905 msgid "Conversation Window Hiding" msgstr "Társalgási ablak elrejtése" -#: ../pidgin/gtkprefs.c:905 +#: ../pidgin/gtkprefs.c:906 msgid "_Hide new IM conversations:" msgstr "Új társal_gások elrejtése:" -#: ../pidgin/gtkprefs.c:908 ../pidgin/gtkprefs.c:1944 +#: ../pidgin/gtkprefs.c:909 ../pidgin/gtkprefs.c:2045 msgid "When away" msgstr "Ha távol vagyok" #. All the tab options! -#: ../pidgin/gtkprefs.c:916 +#: ../pidgin/gtkprefs.c:917 msgid "Tabs" msgstr "Lapok" -#: ../pidgin/gtkprefs.c:918 +#: ../pidgin/gtkprefs.c:919 msgid "Show IMs and chats in _tabbed windows" msgstr "Üzenetek és csevegések megjelenítése _lapokkal ellátott ablakokban" -#: ../pidgin/gtkprefs.c:932 +#: ../pidgin/gtkprefs.c:933 msgid "Show close b_utton on tabs" msgstr "_Bezárás gomb megjelenítése a lapokon" -#: ../pidgin/gtkprefs.c:935 +#: ../pidgin/gtkprefs.c:936 msgid "_Placement:" msgstr "_Elhelyezés:" -#: ../pidgin/gtkprefs.c:937 +#: ../pidgin/gtkprefs.c:938 msgid "Top" msgstr "Felül" -#: ../pidgin/gtkprefs.c:938 +#: ../pidgin/gtkprefs.c:939 msgid "Bottom" msgstr "Alul" -#: ../pidgin/gtkprefs.c:939 +#: ../pidgin/gtkprefs.c:940 msgid "Left" msgstr "Bal oldalon" -#: ../pidgin/gtkprefs.c:940 +#: ../pidgin/gtkprefs.c:941 msgid "Right" msgstr "Jobb oldalon" -#: ../pidgin/gtkprefs.c:942 +#: ../pidgin/gtkprefs.c:943 msgid "Left Vertical" msgstr "Balra függőlegesen" -#: ../pidgin/gtkprefs.c:943 +#: ../pidgin/gtkprefs.c:944 msgid "Right Vertical" msgstr "Jobbra függőlegesen" -#: ../pidgin/gtkprefs.c:950 +#: ../pidgin/gtkprefs.c:951 msgid "N_ew conversations:" msgstr "Új _társalgások:" -#: ../pidgin/gtkprefs.c:995 +#: ../pidgin/gtkprefs.c:997 msgid "Show _formatting on incoming messages" msgstr "_Formázás mutatása bejövő üzeneteknél" -#: ../pidgin/gtkprefs.c:998 +#: ../pidgin/gtkprefs.c:999 +msgid "Close IMs immediately when the tab is closed" +msgstr "Üzenetváltások bezárása a lap bezárása után azonnal" + +#: ../pidgin/gtkprefs.c:1002 msgid "Show _detailed information" msgstr "_Részletes információk megjelenítése" -#: ../pidgin/gtkprefs.c:1000 +#: ../pidgin/gtkprefs.c:1004 msgid "Enable buddy ic_on animation" msgstr "Partnerikon-a_nimáció engedélyezése" -#: ../pidgin/gtkprefs.c:1007 +#: ../pidgin/gtkprefs.c:1011 msgid "_Notify buddies that you are typing to them" msgstr "Partnerek figyelmez_tetése, ha nekik gépel" -#: ../pidgin/gtkprefs.c:1010 +#: ../pidgin/gtkprefs.c:1014 msgid "Highlight _misspelled words" msgstr "_Helytelenül írt szavak kiemelése" -#: ../pidgin/gtkprefs.c:1014 +#: ../pidgin/gtkprefs.c:1018 msgid "Use smooth-scrolling" msgstr "Finom görgetés használata" -#: ../pidgin/gtkprefs.c:1017 +#: ../pidgin/gtkprefs.c:1021 msgid "F_lash window when IMs are received" msgstr "_Villanjon az ablak új üzenetek fogadásakor" -#: ../pidgin/gtkprefs.c:1019 +#: ../pidgin/gtkprefs.c:1023 msgid "Minimi_ze new conversation windows" msgstr "Új társalgási ablakok _minimalizálása" -#: ../pidgin/gtkprefs.c:1023 -msgid "Font" -msgstr "Betűkészlet" - -#: ../pidgin/gtkprefs.c:1025 -msgid "Use document font from _theme" -msgstr "A _téma dokumentum-betűkészletének használata" - #: ../pidgin/gtkprefs.c:1027 +msgid "Font" +msgstr "Betűkészlet" + +#: ../pidgin/gtkprefs.c:1029 +msgid "Use document font from _theme" +msgstr "A _téma dokumentum-betűkészletének használata" + +#: ../pidgin/gtkprefs.c:1031 msgid "Use font from _theme" msgstr "A téma _betűkészletének használata" -#: ../pidgin/gtkprefs.c:1029 +#: ../pidgin/gtkprefs.c:1033 msgid "Conversation _font:" msgstr "_Társalgás betűkészlete:" -#: ../pidgin/gtkprefs.c:1043 +#: ../pidgin/gtkprefs.c:1047 msgid "Default Formatting" msgstr "Alapértelmezett formázás" -#: ../pidgin/gtkprefs.c:1062 +#: ../pidgin/gtkprefs.c:1066 msgid "" "This is how your outgoing message text will appear when you use protocols " "that support formatting." @@ -16115,119 +16432,155 @@ "Így fog kinézni a kimenő üzenet szövege, ha olyan protokollokat használ, " "amelyek támogatják a formázást." -#: ../pidgin/gtkprefs.c:1128 +#: ../pidgin/gtkprefs.c:1126 +msgid "Cannot start proxy configuration program." +msgstr "Nem indítható a proxykonfigurációs program." + +#: ../pidgin/gtkprefs.c:1138 +msgid "Cannot start browser configuration program." +msgstr "Nem indítható a böngészőkonfigurációs program." + +#: ../pidgin/gtkprefs.c:1158 msgid "ST_UN server:" msgstr "ST_UN kiszolgáló:" -#: ../pidgin/gtkprefs.c:1140 +#: ../pidgin/gtkprefs.c:1170 msgid "<span style=\"italic\">Example: stunserver.org</span>" msgstr "<span style=\"italic\">Például: stunserver.org</span>" -#: ../pidgin/gtkprefs.c:1144 +#: ../pidgin/gtkprefs.c:1174 msgid "_Autodetect IP address" msgstr "_IP cím automatikus felismerése" -#: ../pidgin/gtkprefs.c:1153 +#: ../pidgin/gtkprefs.c:1183 msgid "Public _IP:" msgstr "_Nyilvános IP:" -#: ../pidgin/gtkprefs.c:1182 +#: ../pidgin/gtkprefs.c:1214 msgid "Ports" msgstr "Portok" -#: ../pidgin/gtkprefs.c:1185 +#: ../pidgin/gtkprefs.c:1217 msgid "_Manually specify range of ports to listen on" msgstr "A figyelendő porttartomány _kézi megadása" -#: ../pidgin/gtkprefs.c:1188 +#: ../pidgin/gtkprefs.c:1220 msgid "_Start port:" msgstr "_Első port:" -#: ../pidgin/gtkprefs.c:1195 +#: ../pidgin/gtkprefs.c:1227 msgid "_End port:" msgstr "_Utolsó port:" -#: ../pidgin/gtkprefs.c:1203 -msgid "Proxy Server" -msgstr "Proxy-kiszolgáló" - -#: ../pidgin/gtkprefs.c:1207 -msgid "No proxy" -msgstr "Nincs Proxy" +#: ../pidgin/gtkprefs.c:1235 +msgid "Proxy Server & Browser" +msgstr "Proxy-kiszolgáló és böngésző" + +#: ../pidgin/gtkprefs.c:1243 +msgid "<b>Proxy configuration program was not found.</b>" +msgstr "<b>A proxykonfigurációs program nem található.</b>" + +#: ../pidgin/gtkprefs.c:1251 +msgid "<b>Browser configuration program was not found.</b>" +msgstr "<b>A böngészőkonfigurációs program nem található.</b>" + +#: ../pidgin/gtkprefs.c:1256 +msgid "" +"Proxy & Browser preferences are configured\n" +"in GNOME Preferences" +msgstr "" +"A proxy és böngésző a GNOME beállításaiban\n" +"vannak konfigurálva" #: ../pidgin/gtkprefs.c:1263 +msgid "Configure _Proxy" +msgstr "_Proxy beállítása" + +#: ../pidgin/gtkprefs.c:1268 +msgid "Configure _Browser" +msgstr "Bö_ngésző beállítása" + +#: ../pidgin/gtkprefs.c:1274 +msgid "Proxy Server" +msgstr "Proxy-kiszolgáló" + +#: ../pidgin/gtkprefs.c:1279 +msgid "No proxy" +msgstr "Nincs Proxy" + +#: ../pidgin/gtkprefs.c:1335 msgid "_User:" msgstr "_Felhasználó:" -#: ../pidgin/gtkprefs.c:1328 +#: ../pidgin/gtkprefs.c:1423 msgid "Seamonkey" msgstr "Seamonkey" -#: ../pidgin/gtkprefs.c:1329 +#: ../pidgin/gtkprefs.c:1424 msgid "Opera" msgstr "Opera" -#: ../pidgin/gtkprefs.c:1330 +#: ../pidgin/gtkprefs.c:1425 msgid "Netscape" msgstr "Netscape" -#: ../pidgin/gtkprefs.c:1331 +#: ../pidgin/gtkprefs.c:1426 msgid "Mozilla" msgstr "Mozilla" -#: ../pidgin/gtkprefs.c:1332 +#: ../pidgin/gtkprefs.c:1427 msgid "Konqueror" msgstr "Konqueror" -#: ../pidgin/gtkprefs.c:1333 +#: ../pidgin/gtkprefs.c:1428 msgid "GNOME Default" msgstr "GNOME alapértelmezés" -#: ../pidgin/gtkprefs.c:1334 +#: ../pidgin/gtkprefs.c:1429 msgid "Galeon" msgstr "Galeon" -#: ../pidgin/gtkprefs.c:1335 +#: ../pidgin/gtkprefs.c:1430 msgid "Firefox" msgstr "Firefox" -#: ../pidgin/gtkprefs.c:1336 +#: ../pidgin/gtkprefs.c:1431 msgid "Firebird" msgstr "Firebird" -#: ../pidgin/gtkprefs.c:1337 +#: ../pidgin/gtkprefs.c:1432 msgid "Epiphany" msgstr "Epiphany" -#: ../pidgin/gtkprefs.c:1346 +#: ../pidgin/gtkprefs.c:1441 msgid "Manual" msgstr "Egyéni" -#: ../pidgin/gtkprefs.c:1399 +#: ../pidgin/gtkprefs.c:1494 msgid "Browser Selection" msgstr "Böngészőválasztás" -#: ../pidgin/gtkprefs.c:1403 +#: ../pidgin/gtkprefs.c:1498 msgid "_Browser:" msgstr "_Böngésző:" -#: ../pidgin/gtkprefs.c:1411 +#: ../pidgin/gtkprefs.c:1506 msgid "_Open link in:" msgstr "Hivatk_ozás megnyitása:" -#: ../pidgin/gtkprefs.c:1413 +#: ../pidgin/gtkprefs.c:1508 msgid "Browser default" msgstr "Alapértelmezett böngésző" -#: ../pidgin/gtkprefs.c:1414 +#: ../pidgin/gtkprefs.c:1509 msgid "Existing window" msgstr "Létező ablak" -#: ../pidgin/gtkprefs.c:1416 +#: ../pidgin/gtkprefs.c:1511 msgid "New tab" msgstr "Új lap" -#: ../pidgin/gtkprefs.c:1430 +#: ../pidgin/gtkprefs.c:1525 #, c-format msgid "" "_Manual:\n" @@ -16236,69 +16589,69 @@ "_Kézi:\n" "(%s az URL-hez)" -#: ../pidgin/gtkprefs.c:1470 +#: ../pidgin/gtkprefs.c:1566 msgid "Log _format:" msgstr "Napló_formátum:" -#: ../pidgin/gtkprefs.c:1475 +#: ../pidgin/gtkprefs.c:1571 msgid "Log all _instant messages" msgstr "Összes azonnali üzenet na_plózása" -#: ../pidgin/gtkprefs.c:1477 +#: ../pidgin/gtkprefs.c:1573 msgid "Log all c_hats" msgstr "Összes _csevegés naplózása" -#: ../pidgin/gtkprefs.c:1479 +#: ../pidgin/gtkprefs.c:1575 msgid "Log all _status changes to system log" msgstr "Összes állapot_változás naplózása a rendszernaplóba" -#: ../pidgin/gtkprefs.c:1625 +#: ../pidgin/gtkprefs.c:1725 msgid "Sound Selection" msgstr "Hang kiválasztása" -#: ../pidgin/gtkprefs.c:1635 +#: ../pidgin/gtkprefs.c:1735 #, c-format msgid "Quietest" msgstr "Leghalkabb" -#: ../pidgin/gtkprefs.c:1637 +#: ../pidgin/gtkprefs.c:1737 #, c-format msgid "Quieter" msgstr "Halkabb" -#: ../pidgin/gtkprefs.c:1639 +#: ../pidgin/gtkprefs.c:1739 #, c-format msgid "Quiet" msgstr "Halk" -#: ../pidgin/gtkprefs.c:1643 +#: ../pidgin/gtkprefs.c:1743 #, c-format msgid "Loud" msgstr "Hangos" -#: ../pidgin/gtkprefs.c:1645 +#: ../pidgin/gtkprefs.c:1745 #, c-format msgid "Louder" msgstr "Hangosabb" -#: ../pidgin/gtkprefs.c:1647 +#: ../pidgin/gtkprefs.c:1747 #, c-format msgid "Loudest" msgstr "Leghangosabb" -#: ../pidgin/gtkprefs.c:1713 +#: ../pidgin/gtkprefs.c:1813 msgid "_Method:" msgstr "Hang_rendszer kiválasztása:" -#: ../pidgin/gtkprefs.c:1715 +#: ../pidgin/gtkprefs.c:1815 msgid "Console beep" msgstr "Rendszer-hangszóró" -#: ../pidgin/gtkprefs.c:1722 +#: ../pidgin/gtkprefs.c:1822 msgid "No sounds" msgstr "Nincsenek hangok" -#: ../pidgin/gtkprefs.c:1730 +#: ../pidgin/gtkprefs.c:1830 #, c-format msgid "" "Sound c_ommand:\n" @@ -16307,81 +16660,81 @@ "Hanglejátszó _parancs:\n" "(%s fájlnév megadásához)" -#: ../pidgin/gtkprefs.c:1757 +#: ../pidgin/gtkprefs.c:1857 msgid "Sounds when conversation has _focus" msgstr "Hangok lejátszása, ha a társalgás ablaka a_ktív" -#: ../pidgin/gtkprefs.c:1759 +#: ../pidgin/gtkprefs.c:1859 msgid "Enable sounds:" msgstr "Hangok engedélyezése:" -#: ../pidgin/gtkprefs.c:1770 +#: ../pidgin/gtkprefs.c:1870 msgid "Volume:" msgstr "Hangerő:" -#: ../pidgin/gtkprefs.c:1850 +#: ../pidgin/gtkprefs.c:1950 msgid "Play" msgstr "Lejátszás" -#: ../pidgin/gtkprefs.c:1927 +#: ../pidgin/gtkprefs.c:2028 msgid "_Report idle time:" msgstr "_Inaktivitás idejének jelentése:" -#: ../pidgin/gtkprefs.c:1932 +#: ../pidgin/gtkprefs.c:2033 msgid "Based on keyboard or mouse use" msgstr "Billentyűzet vagy egér használata alapján" -#: ../pidgin/gtkprefs.c:1941 +#: ../pidgin/gtkprefs.c:2042 msgid "_Auto-reply:" msgstr "_Automatikus válasz:" -#: ../pidgin/gtkprefs.c:1945 +#: ../pidgin/gtkprefs.c:2046 msgid "When both away and idle" msgstr "Ha távol van és inaktív" #. Auto-away stuff -#: ../pidgin/gtkprefs.c:1951 +#: ../pidgin/gtkprefs.c:2052 msgid "Auto-away" msgstr "Automatikus távollét" -#: ../pidgin/gtkprefs.c:1953 +#: ../pidgin/gtkprefs.c:2054 msgid "Change status when _idle" msgstr "Állapot módosítása, _ha inaktív" -#: ../pidgin/gtkprefs.c:1957 +#: ../pidgin/gtkprefs.c:2058 msgid "_Minutes before becoming idle:" msgstr "Üresjárat ennyi _perc után:" -#: ../pidgin/gtkprefs.c:1965 +#: ../pidgin/gtkprefs.c:2066 msgid "Change _status to:" msgstr "Állap_ot megváltoztatása a következőre:" #. Signon status stuff -#: ../pidgin/gtkprefs.c:1986 +#: ../pidgin/gtkprefs.c:2087 msgid "Status at Startup" msgstr "Állapot induláskor" -#: ../pidgin/gtkprefs.c:1988 +#: ../pidgin/gtkprefs.c:2089 msgid "Use status from last _exit at startup" msgstr "Az utolsó kilé_péskor érvényes állapot használata induláskor" -#: ../pidgin/gtkprefs.c:1994 +#: ../pidgin/gtkprefs.c:2095 msgid "Status to a_pply at startup:" msgstr "In_dításkor alkalmazandó állapot:" -#: ../pidgin/gtkprefs.c:2032 +#: ../pidgin/gtkprefs.c:2134 msgid "Interface" msgstr "Felület" -#: ../pidgin/gtkprefs.c:2034 +#: ../pidgin/gtkprefs.c:2136 msgid "Smiley Themes" msgstr "Hangulatjel-témák" -#: ../pidgin/gtkprefs.c:2041 +#: ../pidgin/gtkprefs.c:2143 msgid "Browser" msgstr "Böngésző" -#: ../pidgin/gtkprefs.c:2045 +#: ../pidgin/gtkprefs.c:2147 msgid "Status / Idle" msgstr "Állapot / Inaktív" @@ -16405,90 +16758,90 @@ msgid "Block only the users below" msgstr "Csak a következő felhasználók letiltása:" -#: ../pidgin/gtkprivacy.c:370 +#: ../pidgin/gtkprivacy.c:372 msgid "Privacy" msgstr "Magánszféra" -#: ../pidgin/gtkprivacy.c:382 +#: ../pidgin/gtkprivacy.c:384 msgid "Changes to privacy settings take effect immediately." msgstr "A magánszféra beállításainak módosításai azonnal életbe lépnek." #. "Set privacy for:" label -#: ../pidgin/gtkprivacy.c:394 +#: ../pidgin/gtkprivacy.c:396 msgid "Set privacy for:" msgstr "Magánszféra beállításai ehhez:" -#: ../pidgin/gtkprivacy.c:557 ../pidgin/gtkprivacy.c:574 +#: ../pidgin/gtkprivacy.c:559 ../pidgin/gtkprivacy.c:576 msgid "Permit User" msgstr "Felhasználó engedélyezése" -#: ../pidgin/gtkprivacy.c:558 +#: ../pidgin/gtkprivacy.c:560 msgid "Type a user you permit to contact you." msgstr "Adjon meg egy felhasználót, aki kapcsolatba léphet Önnel." -#: ../pidgin/gtkprivacy.c:559 +#: ../pidgin/gtkprivacy.c:561 msgid "Please enter the name of the user you wish to be able to contact you." msgstr "" "Adja meg egy felhasználó nevét, akinek meg szeretné engedni, hogy " "kapcsolatba lépjen Önnel." -#: ../pidgin/gtkprivacy.c:562 ../pidgin/gtkprivacy.c:578 +#: ../pidgin/gtkprivacy.c:564 ../pidgin/gtkprivacy.c:580 msgid "_Permit" msgstr "_Engedélyezés" -#: ../pidgin/gtkprivacy.c:568 +#: ../pidgin/gtkprivacy.c:570 #, c-format msgid "Allow %s to contact you?" msgstr "Megengedi, hogy %s kapcsolatba lépjen Önnel?" -#: ../pidgin/gtkprivacy.c:570 +#: ../pidgin/gtkprivacy.c:572 #, c-format msgid "Are you sure you wish to allow %s to contact you?" msgstr "Biztosan megengedi, hogy %s kapcsolatba lépjen Önnel?" -#: ../pidgin/gtkprivacy.c:599 ../pidgin/gtkprivacy.c:613 +#: ../pidgin/gtkprivacy.c:601 ../pidgin/gtkprivacy.c:615 msgid "Block User" msgstr "Felhasználó tiltása" -#: ../pidgin/gtkprivacy.c:600 +#: ../pidgin/gtkprivacy.c:602 msgid "Type a user to block." msgstr "Adjon meg egy letiltandó felhasználót." -#: ../pidgin/gtkprivacy.c:601 +#: ../pidgin/gtkprivacy.c:603 msgid "Please enter the name of the user you wish to block." msgstr "Adja meg a letiltani kívánt felhasználó nevét." -#: ../pidgin/gtkprivacy.c:609 +#: ../pidgin/gtkprivacy.c:611 #, c-format msgid "Block %s?" msgstr "Letiltja a következőt: %s?" -#: ../pidgin/gtkprivacy.c:611 +#: ../pidgin/gtkprivacy.c:613 #, c-format msgid "Are you sure you want to block %s?" msgstr "Biztosan le akarja tiltani %s felhasználót?" -#: ../pidgin/gtkrequest.c:272 +#: ../pidgin/gtkrequest.c:322 msgid "Apply" msgstr "Alkalmazás" -#: ../pidgin/gtkrequest.c:1507 +#: ../pidgin/gtkrequest.c:1651 msgid "That file already exists" msgstr "Ez a fájl már létezik" -#: ../pidgin/gtkrequest.c:1508 +#: ../pidgin/gtkrequest.c:1652 msgid "Would you like to overwrite it?" msgstr "Szeretné felülírni?" -#: ../pidgin/gtkrequest.c:1511 +#: ../pidgin/gtkrequest.c:1655 msgid "Overwrite" msgstr "Felülírás" -#: ../pidgin/gtkrequest.c:1512 +#: ../pidgin/gtkrequest.c:1656 msgid "Choose New Name" msgstr "Új név választása" -#: ../pidgin/gtkrequest.c:1650 ../pidgin/gtkrequest.c:1664 +#: ../pidgin/gtkrequest.c:1797 ../pidgin/gtkrequest.c:1811 msgid "Select Folder..." msgstr "Válasszon mappát..." @@ -16512,7 +16865,7 @@ msgstr "Biztos, hogy törölni akarja a kijelölt mentett állapotokat?" #. Use button -#: ../pidgin/gtksavedstatuses.c:620 ../pidgin/gtksavedstatuses.c:1266 +#: ../pidgin/gtksavedstatuses.c:620 ../pidgin/gtksavedstatuses.c:1273 msgid "_Use" msgstr "_Használat" @@ -16520,29 +16873,29 @@ msgid "Title already in use. You must choose a unique title." msgstr "A cím már használatban van. Használjon egyedi címet." -#: ../pidgin/gtksavedstatuses.c:970 +#: ../pidgin/gtksavedstatuses.c:976 msgid "Different" msgstr "Eltérő" -#: ../pidgin/gtksavedstatuses.c:1159 +#: ../pidgin/gtksavedstatuses.c:1165 msgid "_Title:" msgstr "_Cím:" -#: ../pidgin/gtksavedstatuses.c:1178 ../pidgin/gtksavedstatuses.c:1497 +#: ../pidgin/gtksavedstatuses.c:1184 ../pidgin/gtksavedstatuses.c:1505 msgid "_Status:" msgstr "Áll_apot:" #. Different status message expander -#: ../pidgin/gtksavedstatuses.c:1210 +#: ../pidgin/gtksavedstatuses.c:1217 msgid "Use a _different status for some accounts" msgstr "_Eltérő állapot használata egyes fiókokhoz" #. Save & Use button -#: ../pidgin/gtksavedstatuses.c:1274 +#: ../pidgin/gtksavedstatuses.c:1281 msgid "Sa_ve & Use" msgstr "Menté_s és használat" -#: ../pidgin/gtksavedstatuses.c:1480 +#: ../pidgin/gtksavedstatuses.c:1488 #, c-format msgid "Status for %s" msgstr "%s állapota" @@ -16551,25 +16904,33 @@ msgid "Waiting for network connection" msgstr "Várakozás a hálózati kapcsolatra" -#: ../pidgin/gtkutils.c:632 +#: ../pidgin/gtkstatusbox.c:1072 +msgid "New status..." +msgstr "Új állapot..." + +#: ../pidgin/gtkstatusbox.c:1073 +msgid "Saved statuses..." +msgstr "Mentett állapotok..." + +#: ../pidgin/gtkutils.c:633 msgid "Google Talk" msgstr "Google Talk" -#: ../pidgin/gtkutils.c:1399 ../pidgin/gtkutils.c:1422 +#: ../pidgin/gtkutils.c:1400 ../pidgin/gtkutils.c:1423 #, c-format msgid "The following error has occurred loading %s: %s" msgstr "A következő hiba történt %s betöltése közben: %s" -#: ../pidgin/gtkutils.c:1402 ../pidgin/gtkutils.c:1424 +#: ../pidgin/gtkutils.c:1403 ../pidgin/gtkutils.c:1425 msgid "Failed to load image" msgstr "A kép betöltése meghiúsult" -#: ../pidgin/gtkutils.c:1498 +#: ../pidgin/gtkutils.c:1499 #, c-format msgid "Cannot send folder %s." msgstr "A(z) %s mappa nem küldhető el." -#: ../pidgin/gtkutils.c:1499 +#: ../pidgin/gtkutils.c:1500 #, c-format msgid "" "%s cannot transfer a folder. You will need to send the files within " @@ -16578,12 +16939,12 @@ "A(z) %s nem képes átvinni egy mappát. Az általa tartalmazott fájlokat " "egyenként kell elküldenie." -#: ../pidgin/gtkutils.c:1531 ../pidgin/gtkutils.c:1543 -#: ../pidgin/gtkutils.c:1550 +#: ../pidgin/gtkutils.c:1534 ../pidgin/gtkutils.c:1546 +#: ../pidgin/gtkutils.c:1553 msgid "You have dragged an image" msgstr "Egy képet húzott be" -#: ../pidgin/gtkutils.c:1532 +#: ../pidgin/gtkutils.c:1535 msgid "" "You can send this image as a file transfer, embed it into this message, or " "use it as the buddy icon for this user." @@ -16591,23 +16952,23 @@ "Elküldheti ezt a képet fájlátvitelként, beágyazhatja az üzenetbe, vagy " "használhatja ezen felhasználó partnerikonjaként." -#: ../pidgin/gtkutils.c:1538 ../pidgin/gtkutils.c:1558 +#: ../pidgin/gtkutils.c:1541 ../pidgin/gtkutils.c:1561 msgid "Set as buddy icon" msgstr "Beállítás partnerikonként" -#: ../pidgin/gtkutils.c:1539 ../pidgin/gtkutils.c:1559 +#: ../pidgin/gtkutils.c:1542 ../pidgin/gtkutils.c:1562 msgid "Send image file" msgstr "Képfájl küldése" -#: ../pidgin/gtkutils.c:1540 ../pidgin/gtkutils.c:1559 +#: ../pidgin/gtkutils.c:1543 ../pidgin/gtkutils.c:1562 msgid "Insert in message" msgstr "Beszúrás az üzenetbe" -#: ../pidgin/gtkutils.c:1544 +#: ../pidgin/gtkutils.c:1547 msgid "Would you like to set it as the buddy icon for this user?" msgstr "Be kívánja állítani partnerikonként ehhez a felhasználóhoz?" -#: ../pidgin/gtkutils.c:1551 +#: ../pidgin/gtkutils.c:1554 msgid "" "You can send this image as a file transfer, or use it as the buddy icon for " "this user." @@ -16615,7 +16976,7 @@ "Elküldheti ezt a képet fájlátvitelként vagy használhatja ezen felhasználó " "partnerikonjaként." -#: ../pidgin/gtkutils.c:1552 +#: ../pidgin/gtkutils.c:1555 msgid "" "You can insert this image into this message, or use it as the buddy icon for " "this user" @@ -16628,11 +16989,11 @@ #. * send. The only logical one is "Application," but do we really want to send a binary and nothing else? #. * Probably not. I'll just give an error and return. #. The original patch sent the icon used by the launcher. That's probably wrong -#: ../pidgin/gtkutils.c:1610 +#: ../pidgin/gtkutils.c:1614 msgid "Cannot send launcher" msgstr "Az indítóikon nem küldhető el" -#: ../pidgin/gtkutils.c:1610 +#: ../pidgin/gtkutils.c:1614 msgid "" "You dragged a desktop launcher. Most likely you wanted to send whatever this " "launcher points to instead of this launcher itself." @@ -16640,7 +17001,7 @@ "Egy asztali indítóikont húzott be. Valószínűleg az indítóikon által mutatott " "objektumot akarta elküldeni az indítóikon helyett." -#: ../pidgin/gtkutils.c:2345 +#: ../pidgin/gtkutils.c:2349 #, c-format msgid "" "<b>File:</b> %s\n" @@ -16651,29 +17012,27 @@ "<b>Fájlméret:</b> %s\n" "<b>Képméret:</b> %dx%d" -#: ../pidgin/gtkutils.c:2641 +#: ../pidgin/gtkutils.c:2645 #, c-format msgid "The file '%s' is too large for %s. Please try a smaller image.\n" -msgstr "" -"A(z) \"%s\" fájl túl nagy a következőhöz: %s. Próbálkozzon kisebb képpel.\n" - -#: ../pidgin/gtkutils.c:2643 +msgstr "A(z) \"%s\" fájl túl nagy a következőhöz: %s. Próbálkozzon kisebb képpel.\n" + +#: ../pidgin/gtkutils.c:2647 msgid "Icon Error" msgstr "Ikonhiba" -#: ../pidgin/gtkutils.c:2644 +#: ../pidgin/gtkutils.c:2648 msgid "Could not set icon" msgstr "Az ikon beállítása meghiúsult" -#: ../pidgin/gtkutils.c:2744 +#: ../pidgin/gtkutils.c:2748 #, c-format msgid "Failed to open file '%s': %s" msgstr "Nem sikerült megnyitni a(z) \"%s\" fájlt: %s" -#: ../pidgin/gtkutils.c:2793 -#, c-format -msgid "" -"Failed to load image '%s': reason not known, probably a corrupt image file" +#: ../pidgin/gtkutils.c:2797 +#, c-format +msgid "Failed to load image '%s': reason not known, probably a corrupt image file" msgstr "" "A(z) \"%s\" kép betöltése sikertelen: az ok nem ismert, valószínűleg sérült " "a képfájl" @@ -16830,22 +17189,21 @@ #. *< dependencies #. *< priority #. *< id -#: ../pidgin/plugins/contact_priority.c:187 +#: ../pidgin/plugins/contact_priority.c:188 msgid "Contact Priority" msgstr "Kapcsolat prioritása" #. *< name #. *< version #. *< summary -#: ../pidgin/plugins/contact_priority.c:190 -msgid "" -"Allows for controlling the values associated with different buddy states." +#: ../pidgin/plugins/contact_priority.c:191 +msgid "Allows for controlling the values associated with different buddy states." msgstr "" "Lehetővé teszi a partnerek különböző állapotaihoz rendelt értékek " "beállítását." #. *< description -#: ../pidgin/plugins/contact_priority.c:192 +#: ../pidgin/plugins/contact_priority.c:193 msgid "" "Allows for changing the point values of idle/away/offline states for buddies " "in contact priority computations." @@ -16881,7 +17239,7 @@ msgid "Received Messages" msgstr "Fogadott üzenetek" -#: ../pidgin/plugins/convcolors.c:210 ../pidgin/plugins/pidginrc.c:251 +#: ../pidgin/plugins/convcolors.c:210 ../pidgin/plugins/pidginrc.c:245 #, c-format msgid "Select Color for %s" msgstr "Válassza ki %s színét" @@ -16921,8 +17279,7 @@ #: ../pidgin/plugins/extplacement.c:117 msgid "Separate IM and Chat windows when placing by number" -msgstr "" -"Azonnali üzenő- és csevegőablakok elkülönítése szám szerinti elhelyezésnél" +msgstr "Azonnali üzenő- és csevegőablakok elkülönítése szám szerinti elhelyezésnél" #. *< type #. *< ui_requirement @@ -17103,11 +17460,11 @@ #: ../pidgin/plugins/gevolution/new_person_dialog.c:262 msgid "Please enter the person's information below." -msgstr "Kérem adja meg alább a személy adatait." +msgstr "Adja meg alább a személy adatait." #: ../pidgin/plugins/gevolution/new_person_dialog.c:266 msgid "Please enter the buddy's screen name and account type below." -msgstr "Kérem adja meg a partner felhasználónevét és fiókjának típusát." +msgstr "Adja meg a partner felhasználónevét és fiókjának típusát." #: ../pidgin/plugins/gevolution/new_person_dialog.c:286 msgid "Account type:" @@ -17158,7 +17515,7 @@ "\n" "<b>Partnerjegyzet</b>: %s" -#: ../pidgin/plugins/history.c:188 +#: ../pidgin/plugins/history.c:195 msgid "History" msgstr "Előzmények" @@ -17178,8 +17535,7 @@ #. * description #: ../pidgin/plugins/iconaway.c:85 ../pidgin/plugins/iconaway.c:87 msgid "Iconifies the buddy list and your conversations when you go away." -msgstr "" -"Ikonállapotba helyezi a partnerlistát és a társalgásokat, amikor távol van." +msgstr "Ikonállapotba helyezi a partnerlistát és a társalgásokat, amikor távol van." #: ../pidgin/plugins/mailchk.c:160 msgid "Mail Checker" @@ -17191,8 +17547,7 @@ #: ../pidgin/plugins/mailchk.c:163 msgid "Adds a small box to the buddy list that shows if you have new mail." -msgstr "" -"Kis dobozt ad a partnerlistához, amely megjelenik új levél érkezésekor." +msgstr "Kis dobozt ad a partnerlistához, amely megjelenik új levél érkezésekor." #: ../pidgin/plugins/markerline.c:23 msgid "Markerline" @@ -17364,8 +17719,7 @@ #. * description #: ../pidgin/plugins/notify.c:910 ../pidgin/plugins/notify.c:912 msgid "Provides a variety of ways of notifying you of unread messages." -msgstr "" -"Különböző lehetőségeket nyújt az olvasatlan üzenetekre figyelmeztetésre." +msgstr "Különböző lehetőségeket nyújt az olvasatlan üzenetekre figyelmeztetésre." #. *< type #. *< ui_requirement @@ -17413,45 +17767,37 @@ msgid "GtkTreeView Horizontal Separation" msgstr "GtkTreeView vízszintes elválasztás" -#: ../pidgin/plugins/pidginrc.c:73 +#: ../pidgin/plugins/pidginrc.c:69 msgid "Conversation Entry" msgstr "Társalgás beviteli mező" -#: ../pidgin/plugins/pidginrc.c:74 -msgid "Conversation History" -msgstr "Társalgások előzményei" - -#: ../pidgin/plugins/pidginrc.c:75 -msgid "Log Viewer" -msgstr "Naplómegjelenítő" - -#: ../pidgin/plugins/pidginrc.c:76 +#: ../pidgin/plugins/pidginrc.c:70 msgid "Request Dialog" msgstr "Kérdés párbeszédablak" -#: ../pidgin/plugins/pidginrc.c:77 +#: ../pidgin/plugins/pidginrc.c:71 msgid "Notify Dialog" msgstr "Figyelmeztetés párbeszédablak" -#: ../pidgin/plugins/pidginrc.c:253 +#: ../pidgin/plugins/pidginrc.c:247 msgid "Select Color" msgstr "Válasszon színt" -#: ../pidgin/plugins/pidginrc.c:300 +#: ../pidgin/plugins/pidginrc.c:294 #, c-format msgid "Select Interface Font" msgstr "Válassza ki a felület betűkészletét" -#: ../pidgin/plugins/pidginrc.c:303 +#: ../pidgin/plugins/pidginrc.c:297 #, c-format msgid "Select Font for %s" msgstr "Válassza ki %s betűkészletét" -#: ../pidgin/plugins/pidginrc.c:371 +#: ../pidgin/plugins/pidginrc.c:365 msgid "GTK+ Interface Font" msgstr "GTK+ felület betűkészlete" -#: ../pidgin/plugins/pidginrc.c:391 +#: ../pidgin/plugins/pidginrc.c:385 msgid "GTK+ Text Shortcut Theme" msgstr "GTK+ szöveges gyorsbillentyű téma" @@ -17475,36 +17821,36 @@ #. widget_bool_widgets[i]); #. } #. -#: ../pidgin/plugins/pidginrc.c:428 +#: ../pidgin/plugins/pidginrc.c:422 msgid "Interface colors" msgstr "Felület színei" -#: ../pidgin/plugins/pidginrc.c:452 +#: ../pidgin/plugins/pidginrc.c:446 msgid "Widget Sizes" msgstr "Felületi elemek méretei" -#: ../pidgin/plugins/pidginrc.c:473 +#: ../pidgin/plugins/pidginrc.c:467 msgid "Fonts" msgstr "Betűkészletek" -#: ../pidgin/plugins/pidginrc.c:497 +#: ../pidgin/plugins/pidginrc.c:491 msgid "Gtkrc File Tools" msgstr "Gtkrc fájleszközök" -#: ../pidgin/plugins/pidginrc.c:502 +#: ../pidgin/plugins/pidginrc.c:496 #, c-format msgid "Write settings to %s%sgtkrc-2.0" msgstr "Beállítások kiírása ide: %s%sgtkrc-2.0" -#: ../pidgin/plugins/pidginrc.c:511 +#: ../pidgin/plugins/pidginrc.c:505 msgid "Re-read gtkrc files" msgstr "A gtkrc fájlok újraolvasása" -#: ../pidgin/plugins/pidginrc.c:544 +#: ../pidgin/plugins/pidginrc.c:543 msgid "Pidgin GTK+ Theme Control" msgstr "Pidgin GTK+ témavezérlés" -#: ../pidgin/plugins/pidginrc.c:546 ../pidgin/plugins/pidginrc.c:547 +#: ../pidgin/plugins/pidginrc.c:545 ../pidgin/plugins/pidginrc.c:546 msgid "Provides access to commonly used gtkrc settings." msgstr "Hozzáférést biztosít az általánosan használt gtkrc beállításokhoz." @@ -17628,11 +17974,11 @@ msgid "Enable replacement of last word on send" msgstr "Az utolsó szó helyettesítésének engedélyezése küldéskor" -#: ../pidgin/plugins/spellchk.c:2370 +#: ../pidgin/plugins/spellchk.c:2372 msgid "Text replacement" msgstr "Szöveg cseréje" -#: ../pidgin/plugins/spellchk.c:2372 ../pidgin/plugins/spellchk.c:2373 +#: ../pidgin/plugins/spellchk.c:2374 ../pidgin/plugins/spellchk.c:2375 msgid "Replaces text in outgoing messages according to user-defined rules." msgstr "" "A felhasználó által megadott szabályoknak megfelelően cseréli a szöveget a " @@ -17644,7 +17990,7 @@ #. *< dependencies #. *< priority #. *< id -#: ../pidgin/plugins/ticker/ticker.c:74 ../pidgin/plugins/ticker/ticker.c:354 +#: ../pidgin/plugins/ticker/ticker.c:74 ../pidgin/plugins/ticker/ticker.c:356 msgid "Buddy Ticker" msgstr "Partnerfigyelő" @@ -17652,7 +17998,7 @@ #. *< version #. * summary #. * description -#: ../pidgin/plugins/ticker/ticker.c:357 ../pidgin/plugins/ticker/ticker.c:359 +#: ../pidgin/plugins/ticker/ticker.c:359 ../pidgin/plugins/ticker/ticker.c:361 msgid "A horizontal scrolling version of the buddy list." msgstr "Vízszintesen gördülő partnerlista." @@ -17851,13 +18197,12 @@ msgstr "A windowsos Pidginre jellemző beállítások." #: ../pidgin/plugins/win32/winprefs/winprefs.c:374 -msgid "" -"Provides options specific to Pidgin for Windows , such as buddy list docking." +msgid "Provides options specific to Pidgin for Windows , such as buddy list docking." msgstr "" "A windowsos Pidginre jellemző beállításokat biztosít, mint például a " "partnerlista dokkolása." -#: ../pidgin/plugins/xmppconsole.c:667 +#: ../pidgin/plugins/xmppconsole.c:670 msgid "<font color='#777777'>Logged out.</font>" msgstr "<font color='#777777'>Kijelentkezve.</font>" @@ -17867,176 +18212,42 @@ #. *< dependencies #. *< priority #. *< id -#: ../pidgin/plugins/xmppconsole.c:746 ../pidgin/plugins/xmppconsole.c:841 -#: ../pidgin/plugins/xmppconsole.c:860 +#: ../pidgin/plugins/xmppconsole.c:749 ../pidgin/plugins/xmppconsole.c:844 +#: ../pidgin/plugins/xmppconsole.c:863 msgid "XMPP Console" msgstr "XMPP konzol" -#: ../pidgin/plugins/xmppconsole.c:753 +#: ../pidgin/plugins/xmppconsole.c:756 msgid "Account: " msgstr "Fiók: " -#: ../pidgin/plugins/xmppconsole.c:780 +#: ../pidgin/plugins/xmppconsole.c:783 msgid "<font color='#777777'>Not connected to XMPP</font>" msgstr "<font color='#777777'>Nincs csatlakoztatva az XMPP-hez</font>" -#: ../pidgin/plugins/xmppconsole.c:790 +#: ../pidgin/plugins/xmppconsole.c:793 msgid "Insert an <iq/> stanza." msgstr "<iq/> mondat beszúrása." -#: ../pidgin/plugins/xmppconsole.c:799 +#: ../pidgin/plugins/xmppconsole.c:802 msgid "Insert a <presence/> stanza." msgstr "<presence/> mondat beszúrása." -#: ../pidgin/plugins/xmppconsole.c:808 +#: ../pidgin/plugins/xmppconsole.c:811 msgid "Insert a <message/> stanza." msgstr "<message/> mondat beszúrása." #. *< name #. *< version #. * summary -#: ../pidgin/plugins/xmppconsole.c:863 +#: ../pidgin/plugins/xmppconsole.c:866 msgid "Send and receive raw XMPP stanzas." msgstr "Nyers XMPP mondatok küldése és fogadása." #. * description -#: ../pidgin/plugins/xmppconsole.c:865 +#: ../pidgin/plugins/xmppconsole.c:868 msgid "This plugin is useful for debbuging XMPP servers or clients." msgstr "" "Ez a bővítmény XMPP kiszolgálókban vagy kliensekben végzett hibakereséshez " "hasznos." -#, fuzzy -#~ msgid "Show" -#~ msgstr "Összes megjelenítése" - -#, fuzzy -#~ msgid "Offline buddies" -#~ msgstr "Kilépett partnerek megjelenítése" - -#, fuzzy -#~ msgid "Sort" -#~ msgstr "Port" - -#, fuzzy -#~ msgid "By Status" -#~ msgstr "Állapot szerint" - -#, fuzzy -#~ msgid "By Log Size" -#~ msgstr "Napló mérete szerint" - -#, fuzzy -#~ msgid "Unable to connect to contact server" -#~ msgstr "Nem lehet a kiszolgálóhoz kapcsolódni." - -#, fuzzy -#~ msgid "Unable to retrieve MSN Address Book" -#~ msgstr "Válasszon Notes címjegyzéket" - -#, fuzzy -#~ msgid "Current media" -#~ msgstr "Aktuális jelsor" - -#, fuzzy -#~ msgid "Windows Live Messenger Protocol Plugin" -#~ msgstr "Novell GroupWise Messenger protokollbővítmény" - -#, fuzzy -#~ msgid "Windows Live ID authentication Failed" -#~ msgstr "Hiba: Hitelesítés sikertelen" - -#~ msgid "%s just sent you a Nudge!" -#~ msgstr "%s egy bökést küldött Önnek!" - -#, fuzzy -#~ msgid "Unknown error (%d)" -#~ msgstr "Ismeretlen hiba" - -#, fuzzy -#~ msgid "Unable to connect to OIM server" -#~ msgstr "Nem lehet a kiszolgálóhoz kapcsolódni." - -#, fuzzy -#~ msgid "%s (%s) changed status from %s to %s" -#~ msgstr "%s megváltoztatta az állapotát (%s -> %s)" - -#, fuzzy -#~ msgid "%s (%s) is now %s" -#~ msgstr "%s ezentúl %s" - -#, fuzzy -#~ msgid "%s (%s) is no longer %s" -#~ msgstr "%s már nem %s" - -#, fuzzy -#~ msgid "_Merge" -#~ msgstr "Ü_zenet:" - -#, fuzzy -#~ msgid "_Send File..." -#~ msgstr "_Fájl küldése" - -#, fuzzy -#~ msgid "Add Buddy _Pounce..." -#~ msgstr "Partnerfigyelmeztetés felvétele..." - -#, fuzzy -#~ msgid "Hide when offline" -#~ msgstr "Nem engedélyezett kijelentkezett állapotban" - -#, fuzzy -#~ msgid "Show when offline" -#~ msgstr "Nem engedélyezett kijelentkezett állapotban" - -#, fuzzy -#~ msgid "Add _Buddy..." -#~ msgstr "Partner felvétele" - -#, fuzzy -#~ msgid "Add C_hat..." -#~ msgstr "Csevegés hozzáadása" - -#, fuzzy -#~ msgid "Persistent" -#~ msgstr "Perzsa" - -#, fuzzy -#~ msgid "/Accounts/Manage" -#~ msgstr "/Fiókok" - -#, fuzzy -#~ msgid "A_ccount:" -#~ msgstr "Fiók:" - -#, fuzzy -#~ msgid "S_end To" -#~ msgstr "Küldés ennek" - -#, fuzzy -#~ msgid "_Smile!" -#~ msgstr "Hangulatjel választása" - -#~ msgid "nudged" -#~ msgstr "megbökve" - -#~ msgid "You have just sent a Nudge!" -#~ msgstr "Elküldött egy bökést!" - -#~ msgid "%s just sent you a Buzz!" -#~ msgstr "%s egy bökést küldött!" - -#~ msgid "You have just sent a Buzz!" -#~ msgstr "Elküldött egy bökést!" - -#~ msgid "buzzed" -#~ msgstr "megcsörgetve" - -#~ msgid "Attention! %s %s." -#~ msgstr "Figyelem! %s %s." - -#~ msgid "Attention!" -#~ msgstr "Figyelem!" - -#~ msgid "Attention! You have been %s." -#~ msgstr "Figyelem! %s érkezett."
--- a/share/Makefile.am Mon Nov 12 16:15:53 2007 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,4 +0,0 @@ - -SUBDIRS = sounds ca-certs - -EXTRA_DIST = Makefile.mingw
--- a/share/Makefile.mingw Mon Nov 12 16:15:53 2007 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,19 +0,0 @@ -# -# Makefile.mingw -# -# Description: Makefile for win32 (mingw) version -# - -PIDGIN_TREE_TOP := .. -include $(PIDGIN_TREE_TOP)/libpurple/win32/global.mak - -include ./Makefile.am - -.PHONY: install clean - -install: - if test '$(SUBDIRS)'; then \ - list='$(SUBDIRS)'; for subdir in $$list; do \ - $(MAKE) -C $$subdir -f $(MINGW_MAKEFILE) install || exit 1 ;\ - done; \ - fi;