aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.gitignore2
-rw-r--r--CONTRIBUTORS1
-rw-r--r--HACKING2
-rw-r--r--Makefile.am4
-rw-r--r--NEWS89
-rwxr-xr-xautogen.sh8
-rw-r--r--configure.ac108
-rw-r--r--data/empathy.schemas.in70
-rw-r--r--docs/libempathy-gtk/libempathy-gtk-docs.sgml4
-rw-r--r--docs/libempathy-gtk/libempathy-gtk.types1
-rw-r--r--docs/libempathy/libempathy-docs.sgml5
-rw-r--r--docs/libempathy/libempathy.types3
-rw-r--r--empathy.doap2
-rw-r--r--extensions/Channel_Interface_Tube.xml148
-rw-r--r--extensions/Channel_Type_DBus_Tube.xml163
-rw-r--r--extensions/Channel_Type_Stream_Tube.xml206
-rw-r--r--extensions/Connection_Interface_Location.xml330
-rw-r--r--extensions/Makefile.am30
-rw-r--r--extensions/all.xml12
-rw-r--r--extensions/misc.xml4
-rw-r--r--help/C/empathy.xml108
-rw-r--r--help/ca/ca.po1439
-rw-r--r--help/el/el.po924
-rw-r--r--help/es/es.po441
-rw-r--r--libempathy-gtk/Makefile.am42
-rw-r--r--libempathy-gtk/empathy-account-chooser.c20
-rw-r--r--libempathy-gtk/empathy-account-chooser.h8
-rw-r--r--libempathy-gtk/empathy-account-widget-irc.c4
-rw-r--r--libempathy-gtk/empathy-account-widget-sip.c6
-rw-r--r--libempathy-gtk/empathy-account-widget.c49
-rw-r--r--libempathy-gtk/empathy-account-widget.h8
-rw-r--r--libempathy-gtk/empathy-audio-sink.h2
-rw-r--r--libempathy-gtk/empathy-audio-src.h2
-rw-r--r--libempathy-gtk/empathy-avatar-chooser.c8
-rw-r--r--libempathy-gtk/empathy-avatar-chooser.h4
-rw-r--r--libempathy-gtk/empathy-avatar-image.c4
-rw-r--r--libempathy-gtk/empathy-avatar-image.h4
-rw-r--r--libempathy-gtk/empathy-cell-renderer-activatable.c2
-rw-r--r--libempathy-gtk/empathy-cell-renderer-expander.c10
-rw-r--r--libempathy-gtk/empathy-cell-renderer-expander.h6
-rw-r--r--libempathy-gtk/empathy-cell-renderer-text.c6
-rw-r--r--libempathy-gtk/empathy-cell-renderer-text.h6
-rw-r--r--libempathy-gtk/empathy-chat-text-view.c18
-rw-r--r--libempathy-gtk/empathy-chat-text-view.h6
-rw-r--r--libempathy-gtk/empathy-chat-view.c24
-rw-r--r--libempathy-gtk/empathy-chat-view.h6
-rw-r--r--libempathy-gtk/empathy-chat.c85
-rw-r--r--libempathy-gtk/empathy-chat.h4
-rw-r--r--libempathy-gtk/empathy-conf.c4
-rw-r--r--libempathy-gtk/empathy-conf.h11
-rw-r--r--libempathy-gtk/empathy-contact-dialogs.c4
-rw-r--r--libempathy-gtk/empathy-contact-list-store.c72
-rw-r--r--libempathy-gtk/empathy-contact-list-store.h7
-rw-r--r--libempathy-gtk/empathy-contact-list-view.c108
-rw-r--r--libempathy-gtk/empathy-contact-list-view.h4
-rw-r--r--libempathy-gtk/empathy-contact-menu.c58
-rw-r--r--libempathy-gtk/empathy-contact-menu.h5
-rw-r--r--libempathy-gtk/empathy-contact-selector.c4
-rw-r--r--libempathy-gtk/empathy-contact-widget.c252
-rw-r--r--libempathy-gtk/empathy-contact-widget.h1
-rw-r--r--libempathy-gtk/empathy-contact-widget.ui62
-rw-r--r--libempathy-gtk/empathy-geometry.c4
-rw-r--r--libempathy-gtk/empathy-geometry.h4
-rw-r--r--libempathy-gtk/empathy-images.h3
-rw-r--r--libempathy-gtk/empathy-irc-network-dialog.c4
-rw-r--r--libempathy-gtk/empathy-location-manager.c662
-rw-r--r--libempathy-gtk/empathy-location-manager.h57
-rw-r--r--libempathy-gtk/empathy-log-window.c10
-rw-r--r--libempathy-gtk/empathy-log-window.h6
-rw-r--r--libempathy-gtk/empathy-new-message-dialog.c10
-rw-r--r--libempathy-gtk/empathy-presence-chooser.c110
-rw-r--r--libempathy-gtk/empathy-presence-chooser.h4
-rw-r--r--libempathy-gtk/empathy-profile-chooser.c4
-rw-r--r--libempathy-gtk/empathy-smiley-manager.c11
-rw-r--r--libempathy-gtk/empathy-smiley-manager.h2
-rw-r--r--libempathy-gtk/empathy-spell-dialog.c264
-rw-r--r--libempathy-gtk/empathy-spell-dialog.h39
-rw-r--r--libempathy-gtk/empathy-spell-dialog.ui131
-rw-r--r--libempathy-gtk/empathy-spell.c4
-rw-r--r--libempathy-gtk/empathy-spell.h4
-rw-r--r--libempathy-gtk/empathy-status-preset-dialog.c69
-rw-r--r--libempathy-gtk/empathy-status-preset-dialog.h4
-rw-r--r--libempathy-gtk/empathy-theme-boxes.c8
-rw-r--r--libempathy-gtk/empathy-theme-boxes.h4
-rw-r--r--libempathy-gtk/empathy-theme-irc.c6
-rw-r--r--libempathy-gtk/empathy-theme-irc.h4
-rw-r--r--libempathy-gtk/empathy-theme-manager.c8
-rw-r--r--libempathy-gtk/empathy-theme-manager.h4
-rw-r--r--libempathy-gtk/empathy-ui-utils.c187
-rw-r--r--libempathy-gtk/empathy-ui-utils.h13
-rw-r--r--libempathy-gtk/empathy-video-src.c6
-rw-r--r--libempathy-gtk/empathy-video-src.h2
-rw-r--r--libempathy-gtk/empathy-video-widget.c4
-rw-r--r--libempathy-gtk/empathy-video-widget.h5
-rw-r--r--libempathy/Makefile.am29
-rw-r--r--libempathy/empathy-account-manager.c39
-rw-r--r--libempathy/empathy-account-manager.h2
-rw-r--r--libempathy/empathy-call-factory.c35
-rw-r--r--libempathy/empathy-call-factory.h5
-rw-r--r--libempathy/empathy-call-handler.c140
-rw-r--r--libempathy/empathy-call-handler.h5
-rw-r--r--libempathy/empathy-chatroom-manager.c8
-rw-r--r--libempathy/empathy-chatroom-manager.h4
-rw-r--r--libempathy/empathy-contact-groups.c8
-rw-r--r--libempathy/empathy-contact-groups.h4
-rw-r--r--libempathy/empathy-contact-manager.c2
-rw-r--r--libempathy/empathy-contact-monitor.c15
-rw-r--r--libempathy/empathy-contact-monitor.h6
-rw-r--r--libempathy/empathy-contact.c158
-rw-r--r--libempathy/empathy-contact.h10
-rw-r--r--libempathy/empathy-debug.c1
-rw-r--r--libempathy/empathy-debug.h3
-rw-r--r--libempathy/empathy-dispatch-operation.c28
-rw-r--r--libempathy/empathy-dispatch-operation.h2
-rw-r--r--libempathy/empathy-dispatcher.c509
-rw-r--r--libempathy/empathy-dispatcher.h14
-rw-r--r--libempathy/empathy-ft-factory.c242
-rw-r--r--libempathy/empathy-ft-factory.h77
-rw-r--r--libempathy/empathy-ft-handler.c1642
-rw-r--r--libempathy/empathy-ft-handler.h100
-rw-r--r--libempathy/empathy-idle.c141
-rw-r--r--libempathy/empathy-idle.h10
-rw-r--r--libempathy/empathy-irc-network-manager.c2
-rw-r--r--libempathy/empathy-irc-network.c4
-rw-r--r--libempathy/empathy-location.h57
-rw-r--r--libempathy/empathy-log-manager.c4
-rw-r--r--libempathy/empathy-log-manager.h4
-rw-r--r--libempathy/empathy-log-store-empathy.c4
-rw-r--r--libempathy/empathy-log-store-empathy.h4
-rw-r--r--libempathy/empathy-log-store.c4
-rw-r--r--libempathy/empathy-log-store.h4
-rw-r--r--libempathy/empathy-message.c4
-rw-r--r--libempathy/empathy-message.h4
-rw-r--r--libempathy/empathy-status-presets.c44
-rw-r--r--libempathy/empathy-status-presets.h16
-rw-r--r--libempathy/empathy-time.c44
-rw-r--r--libempathy/empathy-time.h5
-rw-r--r--libempathy/empathy-tp-call.c16
-rw-r--r--libempathy/empathy-tp-call.h3
-rw-r--r--libempathy/empathy-tp-chat.c24
-rw-r--r--libempathy/empathy-tp-chat.h2
-rw-r--r--libempathy/empathy-tp-contact-factory.c306
-rw-r--r--libempathy/empathy-tp-contact-factory.h3
-rw-r--r--libempathy/empathy-tp-contact-list.c14
-rw-r--r--libempathy/empathy-tp-contact-list.h2
-rw-r--r--libempathy/empathy-tp-file.c1397
-rw-r--r--libempathy/empathy-tp-file.h109
-rw-r--r--libempathy/empathy-tp-roomlist.c99
-rw-r--r--libempathy/empathy-tp-tube.c345
-rw-r--r--libempathy/empathy-tp-tube.h27
-rw-r--r--libempathy/empathy-tube-handler.c107
-rw-r--r--libempathy/empathy-types.h2
-rw-r--r--libempathy/empathy-utils.c118
-rw-r--r--libempathy/empathy-utils.h14
-rw-r--r--libempathy/irc-networks.xml1
-rw-r--r--m4/shave.m477
-rw-r--r--megaphone/data/Makefile.am4
-rw-r--r--nothere/data/Makefile.am4
-rw-r--r--po/LINGUAS1
-rw-r--r--po/POTFILES.in9
-rw-r--r--po/es.po1181
-rw-r--r--po/hu.po10
-rw-r--r--po/it.po1209
-rw-r--r--po/pa.po1458
-rw-r--r--po/ta.po2122
-rwxr-xr-xpython/example.py3
-rw-r--r--python/pyempathy/Makefile.am4
-rw-r--r--python/pyempathy/pyempathy.defs467
-rw-r--r--python/pyempathy/pyempathy.override2
-rw-r--r--python/pyempathygtk/Makefile.am4
-rw-r--r--python/pyempathygtk/pyempathygtk.defs60
-rw-r--r--python/pyempathygtk/pyempathygtk.override5
-rwxr-xr-xpython/update-binding.sh3
-rwxr-xr-xrelease.py182
-rw-r--r--shave-libtool.in69
-rw-r--r--shave.in79
-rw-r--r--src/Makefile.am37
-rw-r--r--src/empathy-about-dialog.c7
-rw-r--r--src/empathy-about-dialog.h6
-rw-r--r--src/empathy-accounts-dialog.c24
-rw-r--r--src/empathy-accounts-dialog.h6
-rw-r--r--src/empathy-call-window-fullscreen.c294
-rw-r--r--src/empathy-call-window-fullscreen.h77
-rw-r--r--src/empathy-call-window-fullscreen.ui23
-rw-r--r--src/empathy-call-window.c491
-rw-r--r--src/empathy-call-window.h7
-rw-r--r--src/empathy-call-window.ui11
-rw-r--r--src/empathy-chat-window.c175
-rw-r--r--src/empathy-chat-window.h6
-rw-r--r--src/empathy-chat-window.ui14
-rw-r--r--src/empathy-chatrooms-window.c16
-rw-r--r--src/empathy-chatrooms-window.h4
-rw-r--r--src/empathy-event-manager.c68
-rw-r--r--src/empathy-ft-manager.c1388
-rw-r--r--src/empathy-ft-manager.h46
-rw-r--r--src/empathy-import-dialog.c8
-rw-r--r--src/empathy-import-dialog.h4
-rw-r--r--src/empathy-import-pidgin.c6
-rw-r--r--src/empathy-import-pidgin.h4
-rw-r--r--src/empathy-logs.c6
-rw-r--r--src/empathy-main-window.c89
-rw-r--r--src/empathy-main-window.h6
-rw-r--r--src/empathy-main-window.ui41
-rw-r--r--src/empathy-map-view.c296
-rw-r--r--src/empathy-map-view.h32
-rw-r--r--src/empathy-map-view.ui59
-rw-r--r--src/empathy-misc.c6
-rw-r--r--src/empathy-misc.h6
-rw-r--r--src/empathy-new-chatroom-dialog.c76
-rw-r--r--src/empathy-new-chatroom-dialog.h6
-rw-r--r--src/empathy-new-chatroom-dialog.ui134
-rw-r--r--src/empathy-preferences.c64
-rw-r--r--src/empathy-preferences.h4
-rw-r--r--src/empathy-preferences.ui206
-rw-r--r--src/empathy-sidebar.c16
-rw-r--r--src/empathy-sidebar.h8
-rw-r--r--src/empathy-status-icon.c7
-rw-r--r--src/empathy-tube-dispatch.c10
-rw-r--r--src/empathy-tube-dispatch.h4
-rw-r--r--src/empathy.c106
-rw-r--r--src/ephy-spinner.c6
-rw-r--r--tools/Makefile.am20
-rw-r--r--tools/check-whitespace.sh11
-rw-r--r--tools/shave.mk1
224 files changed, 17225 insertions, 6389 deletions
diff --git a/.gitignore b/.gitignore
index 6f644672c..e67be83e0 100644
--- a/.gitignore
+++ b/.gitignore
@@ -44,3 +44,5 @@ cscope.out
tags
TAGS
gnome-doc-utils.make
+shave
+shave-libtool
diff --git a/CONTRIBUTORS b/CONTRIBUTORS
index 7dce124e7..f2abcb6c8 100644
--- a/CONTRIBUTORS
+++ b/CONTRIBUTORS
@@ -3,6 +3,7 @@ Andreas Lööw
Aurelien Naldi
Bastien Nocera
Christoffer Olsen
+Cosimo Cecchi
Elliot Fairweather
Frederic Crozat
Frederic Peters
diff --git a/HACKING b/HACKING
new file mode 100644
index 000000000..778244f11
--- /dev/null
+++ b/HACKING
@@ -0,0 +1,2 @@
+See http://live.gnome.org/Empathy/ about coding style conventions.
+See also http://live.gnome.org/Empathy/Git to read about our git workflow.
diff --git a/Makefile.am b/Makefile.am
index 20e196234..d8cebf0c9 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -38,14 +38,14 @@ DISTCLEANFILES = \
distuninstallcheck_listfiles = find . -type f -print | grep -v '^\./var/scrollkeeper'
distclean-local:
- if test $(srdcir) = .; then :; else \
+ if test "x$(srdcir)" = "x."; then :; else \
rm -f ChangeLog; \
fi
ChangeLog:
@echo Creating $@
@if test -d "$(srcdir)/.git"; then \
- (GIT_DIR=$(top_srcdir)/.git ./missing --run git log EMPATHY_2_24_0.. --stat) | fmt --split-only > $@.tmp \
+ (GIT_DIR=$(top_srcdir)/.git ./missing --run git log EMPATHY_2_27_1.. --stat) | fmt --split-only > $@.tmp \
&& mv -f $@.tmp $@ \
|| ($(RM) $@.tmp; \
echo Failed to generate ChangeLog, your ChangeLog may be outdated >&2; \
diff --git a/NEWS b/NEWS
index 198ea0ce0..2187b450c 100644
--- a/NEWS
+++ b/NEWS
@@ -1,3 +1,92 @@
+NEW in 2.27.2
+==============
+Bugs fixed:
+ - Fixed #569578, Lockdown patch
+ - Fixed #580922, Conversation menu is dead to me
+ - Fixed #582773, Empathy puts cheesy strings in my subscription requests
+ - Fixed #583391, Python binding for pyempathygtk are broken
+ - Fixed #583430, new editable status doesn't behave properly
+ - Fixed #583558, Rename OfferStreamTube and AcceptStreamTube to Offer and Accept
+ - Fixed #583566, Add View top level menu
+ - Fixed #583785, Display a summary at the end of configure
+ - Fixed #581871, "join chatroom" dialog doesn't report errors
+
+Translations:
+ - Updated es Translation (Jorge Gonzalez)
+ - Updated ta Translation (drtvasudevan)
+
+NEW in 2.27.1.1
+===============
+ - Fix ABI version to not conflict with 2.26 branch
+ - Fix various coding style
+
+Bugs fixed:
+ - Fixed #582589, Should allow users to initially have either audio or audio/video calls
+
+Translations:
+ - Updated es Translation (Jorge Gonzalez)
+
+Documentation translations:
+ - Updated el Documentation translation (Γιάννης Κατσαμπίρης)
+
+NEW in 2.27.1
+==============
+Bugs fixed:
+ - Fixed #582641, crash in Empathy Instant Messenger: Making a call to a googl...
+ - Fixed #501519, Empathy API need documentation
+ - Fixed #504277, Empathy won't use 2nd and further protocols a connection manager provides
+ - Fixed #530119, display remote caller in the call window
+ - Fixed #539506, First message in conversation has no timestamp
+ - Fixed #544678, Can't change account photo/avatar
+ - Fixed #548704, "Add" button requires further action but lacks an ellipsis
+ - Fixed #549366, Should use SimplePresence
+ - Fixed #549641, Should use Contacts
+ - Fixed #561033, Work on the documentation
+ - Fixed #566905, avatar button is too tiny
+ - Fixed #568403, Add header file in documentation
+ - Fixed #568562, ghelp link broken in documentation
+ - Fixed #570346, EmpathyTpChat should use the Group SelfHandle if present
+ - Fixed #570545, Huge memory leak after opening some contacts discussion windows
+ - Fixed #574626, No obvious way to display FT manager
+ - Fixed #575090, Notifications of new messages stop working after closing the chat window
+ - Fixed #575415, Should switch from libglade to GtkBuilder
+ - Fixed #575442, "Call" string needs context for translation
+ - Fixed #575817, empathy_tp_tube_new_stream_tube should allow NULL as parameters
+ - Fixed #576384, "accept incoming call" dialog brings roster to current workspace
+ - Fixed #576394, "Send Video" button and "Call -> Send video" menu entry are not synced
+ - Fixed #577026, Sending slash-prefixed messages on IRC is a security risk.
+ - Fixed #577427, Port to latest tp-glib API
+ - Fixed #578356, Asserts when reconnecting to a chat room.
+ - Fixed #578399, Change to supplying spelling suggestions in submenu
+ - Fixed #579139, memleak in log_store_empathy_get_messages_for_file
+ - Fixed #579148, Improves the Join New room UI by adding columns, changing the UI
+ - Fixed #579553, Serveral memory leaks in empathy.
+ - Fixed #579735, add empathy_tp_tube_call_when_ready ()
+ - Fixed #579780, Several functions should be _dup_foo instead of _get_foo
+ - Fixed #579800, adding or removing an IRC account causes a dialog to pop up
+ - Fixed #579971, Try to access to a NULL GtkEntry when adding a new contact
+ - Fixed #580097, Dispaly transfer speed, and make remaining time more dynamic
+ - Fixed #580203, Theoretical race connecting to Received.
+ - Fixed #580771, Video playback should have a fullscreen mode
+ - Fixed #582751, No menu icon = no smiley
+ - Fixed #563222, Wrong "time remaining" estimation when sending a file
+ - Fixed #579484, New "join chatroom" dialog doesn't get list of rooms when room list is expanded
+ - Fixed #579485, "Join Room" dialog should allow sorting the list of rooms
+ - Fixed #571664, [1/3] Empathy should support Geolocation
+
+Translations:
+Updated ar Translation (Khaled Hosny)
+Updated be Translation (Ihar Hrachyshka)
+Updated bg Translation (Alexander Shopov)
+Updated de Translation (Mario Blättermann)
+Updated es Translation (Jorge Gonzalez, Jorge Gonzalez Gonzalez)
+Updated gl Translation (Frco. Javier Rial, Ignacio Casal Quinteiro)
+Updated it Translation (Milo Casagrande)
+Updated kn Translation (Shankar Prasad)
+Updated nl Translation (Wouter Bolsterlee)
+Updated th Translation (Theppitak Karoonboonyanan)
+Updated zh_CN Translation (Aron Xu)
+
NEW in 2.26.0
==============
- Fix various VoIP bugs
diff --git a/autogen.sh b/autogen.sh
index b1a24fc3a..e1bf4d55f 100755
--- a/autogen.sh
+++ b/autogen.sh
@@ -13,6 +13,14 @@ REQUIRED_AUTOMAKE_VERSION=1.9
exit 1
}
+# Fix to make shave + libtool 1.x + gtk-doc work.
+# See http://git.lespiau.name/cgit/shave/tree/README#n83
+sed -e 's#) --mode=compile#) --tag=CC --mode=compile#' gtk-doc.make \
+ > gtk-doc.temp \
+ && mv gtk-doc.temp gtk-doc.make
+sed -e 's#) --mode=link#) --tag=CC --mode=link#' gtk-doc.make \
+ > gtk-doc.temp \
+ && mv gtk-doc.temp gtk-doc.make
which gnome-autogen.sh || {
echo "You need to install gnome-common from the GNOME CVS"
diff --git a/configure.ac b/configure.ac
index 0ff17396d..8a85a7525 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1,4 +1,4 @@
-AC_INIT(Empathy, 2.27.1, http://bugzilla.gnome.org/browse.cgi?product=empathy)
+AC_INIT(Empathy, 2.27.3, http://bugzilla.gnome.org/browse.cgi?product=empathy)
AC_PREREQ(2.59)
AC_COPYRIGHT([
Copyright (C) 2003-2007 Imendio AB
@@ -9,12 +9,12 @@ AC_COPYRIGHT([
# (Interfaces removed: CURRENT++, AGE=0, REVISION=0)
# (Interfaces added: CURRENT++, AGE++, REVISION=0)
# (No interfaces changed: REVISION++)
-LIBEMPATHY_CURRENT=22
+LIBEMPATHY_CURRENT=25
LIBEMPATHY_AGE=0
LIBEMPATHY_REVISION=0
-LIBEMPATHY_GTK_CURRENT=21
-LIBEMPATHY_GTK_AGE=2
+LIBEMPATHY_GTK_CURRENT=23
+LIBEMPATHY_GTK_AGE=0
LIBEMPATHY_GTK_REVISION=0
AC_SUBST(LIBEMPATHY_CURRENT)
@@ -29,12 +29,16 @@ GLIB_REQUIRED=2.16.0
GTK_REQUIRED=2.16.0
GCONF_REQUIRED=1.2.0
LIBPANELAPPLET_REQUIRED=2.10.0
-TELEPATHY_GLIB_REQUIRED=0.7.27
+TELEPATHY_GLIB_REQUIRED=0.7.31
MISSION_CONTROL_REQUIRED=4.61
ENCHANT_REQUIRED=1.2.0
ISO_CODES_REQUIRED=0.35
LIBNOTIFY_REQUIRED=0.4.4
LIBCANBERRA_GTK_REQUIRED=0.4
+LIBCHAMPLAIN_REQUIRED=0.3.0
+LIBCHAMPLAIN_GTK_REQUIRED=0.3.0
+CLUTTER_GTK_REQUIRED=0.8.2
+GEOCLUE_REQUIRED=0.11
# Use --enable-maintainer-mode to disabled deprecated symbols
GNOME_MAINTAINER_MODE_DEFINES
@@ -105,6 +109,7 @@ PKG_CHECK_MODULES(LIBEMPATHYGTK,
telepathy-glib >= $TELEPATHY_GLIB_REQUIRED
libmissioncontrol >= $MISSION_CONTROL_REQUIRED
telepathy-farsight
+ farsight2-0.10
gstreamer-0.10
gstreamer-interfaces-0.10
])
@@ -189,6 +194,64 @@ fi
AM_CONDITIONAL(HAVE_ENCHANT, test "x$have_enchant" = "xyes")
# -----------------------------------------------------------
+# Map view checks: libchamplain
+# -----------------------------------------------------------
+AC_ARG_ENABLE(map,
+ AS_HELP_STRING([--enable-map=@<:@no/yes/auto@:>@],
+ [Enable map view]), ,
+ enable_map=auto)
+
+if test "x$enable_map" != "xno"; then
+ PKG_CHECK_MODULES(LIBCHAMPLAIN,
+ [
+ champlain-0.3 >= $LIBCHAMPLAIN_REQUIRED,
+ champlain-gtk-0.3 >= $LIBCHAMPLAIN_GTK_REQUIRED
+ clutter-gtk-0.8 >= $CLUTTER_GTK_REQUIRED
+ ], have_libchamplain="yes", have_libchamplain="no")
+
+ if test "x$have_libchamplain" = "xyes"; then
+ AC_DEFINE(HAVE_LIBCHAMPLAIN, 1, [Define if you have libchamplain])
+ fi
+else
+ have_libchamplain=no
+fi
+
+if test "x$enable_map" = "xyes" -a "x$have_libchamplain" != "xyes"; then
+ AC_MSG_ERROR([Couldn't find map view dependencies.])
+fi
+
+AM_CONDITIONAL(HAVE_LIBCHAMPLAIN, test "x$have_libchamplain" = "xyes")
+
+# -----------------------------------------------------------
+# location checks: geoclue
+# -----------------------------------------------------------
+AC_ARG_ENABLE(location,
+ AS_HELP_STRING([--enable-location=@<:@no/yes/auto@:>@],
+ [Enable location awareness]), ,
+ enable_location=auto)
+
+if test "x$enable_location" != "xno"; then
+ PKG_CHECK_MODULES(GEOCLUE,
+ [
+ geoclue >= $GEOCLUE_REQUIRED
+ ], have_geoclue="yes", have_geoclue="no")
+
+ if test "x$have_geoclue" = "xyes"; then
+ AC_DEFINE(HAVE_GEOCLUE, 1, [Define if you have geoclue])
+ fi
+else
+ have_geoclue="no"
+fi
+
+if test "x$enable_location" = "xyes" -a "x$have_geoclue" != "xyes"; then
+ AC_MSG_ERROR([Couldn't find location dependencies.])
+fi
+
+AM_CONDITIONAL(HAVE_GEOCLUE, test "x$have_geoclue" = "xyes")
+AC_SUBST(GEOCLUE_CFLAGS)
+AC_SUBST(GEOCLUE_LIBS)
+
+# -----------------------------------------------------------
# Megaphone
# -----------------------------------------------------------
AC_ARG_ENABLE(megaphone,
@@ -302,6 +365,17 @@ fi
AM_CONDITIONAL(HAVE_PYTHON, test "x$have_python" = "xyes")
# -----------------------------------------------------------
+# Coding style checks
+# -----------------------------------------------------------
+AC_ARG_ENABLE(coding-style-checks,
+ AC_HELP_STRING([--disable-coding-style-checks],
+ [don't check coding style using grep]),
+ [ENABLE_CODING_STYLE_CHECKS=$enableval], [ENABLE_CODING_STYLE_CHECKS=yes])
+
+AC_SUBST([ENABLE_CODING_STYLE_CHECKS])
+# -----------------------------------------------------------
+
+SHAVE_INIT(.)
AC_OUTPUT([
Makefile
@@ -333,4 +407,28 @@ AC_OUTPUT([
tests/Makefile
tests/xml/Makefile
tools/Makefile
+ shave
+ shave-libtool
])
+
+echo "
+Configure summary:
+
+ Compiler....................: ${CC}
+ Compiler Flags..............: ${CFLAGS}
+ Prefix......................: ${prefix}
+ Shaved build................: ${enable_shave}
+ Tests.......................: ${have_check}
+ Coding style checks.........: ${ENABLE_CODING_STYLE_CHECKS}
+
+ Features:
+ Spell checking (enchant)....: ${have_enchant}
+ Display maps (libchamplain).: ${have_libchamplain}
+ Location awareness (Geoclue): ${have_geoclue}
+
+ Extras:
+ Documentation...............: ${enable_gtk_doc}
+ Python bindings.............: ${have_python}
+ Megaphone applet............: ${have_megaphone}
+ Nothere applet..............: ${have_nothere}
+"
diff --git a/data/empathy.schemas.in b/data/empathy.schemas.in
index 62b462fb2..572eb8871 100644
--- a/data/empathy.schemas.in
+++ b/data/empathy.schemas.in
@@ -463,5 +463,75 @@
</locale>
</schema>
+ <schema>
+ <key>/schemas/apps/empathy/location/publish</key>
+ <applyto>/apps/empathy/location/publish</applyto>
+ <owner>empathy</owner>
+ <type>bool</type>
+ <default>false</default>
+ <locale name="C">
+ <short>Empathy can publish the user's location</short>
+ <long>
+ Whether or not Empathy can publish the user's location to his contacts.
+ </long>
+ </locale>
+ </schema>
+
+ <schema>
+ <key>/schemas/apps/empathy/location/resource_network</key>
+ <applyto>/apps/empathy/location/resource_network</applyto>
+ <owner>empathy</owner>
+ <type>bool</type>
+ <default>true</default>
+ <locale name="C">
+ <short>Empathy can use the network to guess the location</short>
+ <long>
+ Whether or not Empathy can use the network to guess the location.
+ </long>
+ </locale>
+ </schema>
+
+ <schema>
+ <key>/schemas/apps/empathy/location/resource_cell</key>
+ <applyto>/apps/empathy/location/resource_cell</applyto>
+ <owner>empathy</owner>
+ <type>bool</type>
+ <default>true</default>
+ <locale name="C">
+ <short>Empathy can use the cellular network to guess the location</short>
+ <long>
+ Whether or not Empathy can use the cellular network to guess the location.
+ </long>
+ </locale>
+ </schema>
+
+ <schema>
+ <key>/schemas/apps/empathy/location/resource_gps</key>
+ <applyto>/apps/empathy/location/resource_gps</applyto>
+ <owner>empathy</owner>
+ <type>bool</type>
+ <default>false</default>
+ <locale name="C">
+ <short>Empathy can use the GPS to guess the location</short>
+ <long>
+ Whether or not Empathy can use the GPS to guess the location.
+ </long>
+ </locale>
+ </schema>
+
+ <schema>
+ <key>/schemas/apps/empathy/location/reduce_accuracy</key>
+ <applyto>/apps/empathy/location/reduce_accuracy</applyto>
+ <owner>empathy</owner>
+ <type>bool</type>
+ <default>false</default>
+ <locale name="C">
+ <short>Empathy should reduce the location's accuracy</short>
+ <long>
+ Whether or not Empathy should reduce the location's accuracy for privacy reasons.
+ </long>
+ </locale>
+ </schema>
+
</schemalist>
</gconfschemafile>
diff --git a/docs/libempathy-gtk/libempathy-gtk-docs.sgml b/docs/libempathy-gtk/libempathy-gtk-docs.sgml
index 033ebf018..c7b630b14 100644
--- a/docs/libempathy-gtk/libempathy-gtk-docs.sgml
+++ b/docs/libempathy-gtk/libempathy-gtk-docs.sgml
@@ -16,6 +16,8 @@
<title>API Reference</title>
<chapter id="libempathy_api">
<title>libempathy-gtk API reference</title>
+ <xi:include href="xml/api-index-deprecated.xml"/>
+ <xi:include href="xml/api-index-full.xml"/>
<xi:include href="xml/empathy-account-chooser.xml"/>
<xi:include href="xml/empathy-account-widget-irc.xml"/>
<xi:include href="xml/empathy-account-widget-sip.xml"/>
@@ -45,8 +47,8 @@
<xi:include href="xml/empathy-presence-chooser.xml"/>
<xi:include href="xml/empathy-profile-chooser.xml"/>
<xi:include href="xml/empathy-smiley-manager.xml"/>
- <xi:include href="xml/empathy-spell-dialog.xml"/>
<xi:include href="xml/empathy-spell.xml"/>
+ <xi:include href="xml/empathy-status-preset-dialog.xml"/>
<xi:include href="xml/empathy-theme-boxes.xml"/>
<xi:include href="xml/empathy-theme-irc.xml"/>
<xi:include href="xml/empathy-theme-manager.xml"/>
diff --git a/docs/libempathy-gtk/libempathy-gtk.types b/docs/libempathy-gtk/libempathy-gtk.types
index 3f4eb4565..347cbba90 100644
--- a/docs/libempathy-gtk/libempathy-gtk.types
+++ b/docs/libempathy-gtk/libempathy-gtk.types
@@ -22,6 +22,7 @@ empathy_gst_video_src_channel_get_type
empathy_sound_get_type
empathy_presence_chooser_get_type
empathy_smiley_manager_get_type
+empathy_status_preset_dialog_get_type
empathy_theme_boxes_get_type
empathy_theme_irc_get_type
empathy_theme_manager_get_type
diff --git a/docs/libempathy/libempathy-docs.sgml b/docs/libempathy/libempathy-docs.sgml
index f3291f772..5c6c3ca4e 100644
--- a/docs/libempathy/libempathy-docs.sgml
+++ b/docs/libempathy/libempathy-docs.sgml
@@ -16,6 +16,8 @@
<title>API Reference</title>
<chapter id="libempathy_api">
<title>libempathy API reference</title>
+ <xi:include href="xml/api-index-deprecated.xml"/>
+ <xi:include href="xml/api-index-full.xml"/>
<xi:include href="xml/empathy-account-manager.xml"/>
<xi:include href="xml/empathy-call-factory.xml"/>
<xi:include href="xml/empathy-call-handler.xml"/>
@@ -29,10 +31,13 @@
<xi:include href="xml/empathy-dispatcher.xml"/>
<xi:include href="xml/empathy-dispatch-operation.xml"/>
<xi:include href="xml/empathy-enum-types.xml"/>
+ <xi:include href="xml/empathy-ft-factory.xml"/>
+ <xi:include href="xml/empathy-ft-handler.xml"/>
<xi:include href="xml/empathy-idle.xml"/>
<xi:include href="xml/empathy-irc-network-manager.xml"/>
<xi:include href="xml/empathy-irc-network.xml"/>
<xi:include href="xml/empathy-irc-server.xml"/>
+ <xi:include href="xml/empathy-location.xml"/>
<xi:include href="xml/empathy-log-manager.xml"/>
<xi:include href="xml/empathy-log-store-empathy.xml"/>
<xi:include href="xml/empathy-log-store.xml"/>
diff --git a/docs/libempathy/libempathy.types b/docs/libempathy/libempathy.types
index 26040474e..9da0bbe18 100644
--- a/docs/libempathy/libempathy.types
+++ b/docs/libempathy/libempathy.types
@@ -14,6 +14,9 @@ empathy_capabilities_get_type
empathy_debug_flags_get_type
empathy_dispatch_operation_state_get_type
empathy_tp_call_status_get_type
+empathy_ft_error_enum_get_type
+empathy_ft_factory_get_type
+empathy_ft_handler_get_type
empathy_idle_get_type
empathy_irc_network_get_type
empathy_irc_network_manager_get_type
diff --git a/empathy.doap b/empathy.doap
index acd6494bc..e37ed35c3 100644
--- a/empathy.doap
+++ b/empathy.doap
@@ -14,7 +14,7 @@
<maintainer>
<foaf:Person>
<foaf:name>Xavier Claessens</foaf:name>
- <foaf:mbox rdf:resource="xclaesse@gmail.com" />
+ <foaf:mbox rdf:resource="mailto:xclaesse@gmail.com" />
<gnome:userid>xclaesse</gnome:userid>
</foaf:Person>
</maintainer>
diff --git a/extensions/Channel_Interface_Tube.xml b/extensions/Channel_Interface_Tube.xml
deleted file mode 100644
index 8e6eb6514..000000000
--- a/extensions/Channel_Interface_Tube.xml
+++ /dev/null
@@ -1,148 +0,0 @@
-<?xml version="1.0" ?>
-<node name="/Channel_Interface_Tube" xmlns:tp="http://telepathy.freedesktop.org/wiki/DbusSpec#extensions-v0">
- <tp:copyright>Copyright © 2008-2009 Collabora Limited</tp:copyright>
- <tp:copyright>Copyright © 2008-2009 Nokia Corporation</tp:copyright>
- <tp:license>
- This library is free software; you can redistribute it and/or
-modify it under the terms of the GNU Lesser General Public
-License as published by the Free Software Foundation; either
-version 2.1 of the License, or (at your option) any later version.
-
-This library is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-Lesser General Public License for more details.
-
-You should have received a copy of the GNU Lesser General Public
-License along with this library; if not, write to the Free Software
-Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- </tp:license>
- <interface name="org.freedesktop.Telepathy.Channel.Interface.Tube.DRAFT"
- tp:causes-havoc="experimental">
- <tp:requires interface="org.freedesktop.Telepathy.Channel"/>
- <tp:docstring xmlns="http://www.w3.org/1999/xhtml">
- <p>A <i>tube</i> is a mechanism for arbitrary data transfer between
- two or more IM users, used to allow applications on the users'
- systems to communicate without having to establish network
- connections themselves. Currently, two types of tube exist:
- <tp:dbus-ref namespace="org.freedesktop.Telepathy"
- >Channel.Type.DBusTube</tp:dbus-ref> and
- <tp:dbus-ref namespace="org.freedesktop.Telepathy"
- >Channel.Type.StreamTube</tp:dbus-ref>. This interface contains
- the properties, signals and methods common to both types of tube;
- you can only create channels of a specific tube type, not of this
- type. A tube channel contains exactly one tube; if you need several
- tubes, you have to create several tube channels.</p>
-
- <p>Tube channels can be requested for handles of type
- HANDLE_TYPE_CONTACT (for 1-1 communication) or of type
- HANDLE_TYPE_ROOM (to communicate with others in the room
- simultaneously).</p>
-
- <p>As an exception to the usual handling of capabilities, connection managers
- for protocols with capability discovery, such as XMPP, SHOULD advertise the
- capability representing each Tube type that they support
- (<tp:dbus-ref namespace="org.freedesktop.Telepathy">Channel.Type.DBusTube</tp:dbus-ref> and/or
- <tp:dbus-ref namespace="org.freedesktop.Telepathy">Channel.Type.StreamTube</tp:dbus-ref>)
- even if no client has indicated via
- <tp:dbus-ref
- namespace="org.freedesktop.Telepathy.Connection.Interface.ContactCapabilities.DRAFT">SetSelfCapabilities</tp:dbus-ref>
- that such a tube is supported.</p>
-
- <tp:rationale>
- <p>To lower the barrier entry of new tube application, CM SHOULD accept to offer tubes of any
- <tp:dbus-ref
- namespace="org.freedesktop.Telepathy.Channel.Type.StreamTube.DRAFT">Service</tp:dbus-ref> or
- <tp:dbus-ref
- namespace="org.freedesktop.Telepathy.Channel.Type.DBusTube.DRAFT">ServiceName</tp:dbus-ref>
- if the contact announced to support tubes.</p>
- </tp:rationale>
- </tp:docstring>
-
- <property name="Parameters" type="a{sv}" tp:type="String_Variant_Map"
- access="read" tp:name-for-bindings="Parameters">
- <tp:docstring xmlns="http://www.w3.org/1999/xhtml">
- <p>Each tube has a dictionary of arbitrary parameters. Parameters are
- commonly used to bootstrap legacy protocols where you can't
- negotiate parameters in-band. The allowable keys,
- types and values are defined by the service. Connection managers
- must support the value being a string (D-Bus type 's'), array of bytes
- (D-Bus type 'ay'), unsigned integer (D-Bus type 'u'), integer (D-Bus
- type 'i') and boolean (D-Bus type 'b').</p>
- <p>When the tube is offered, the parameters are transmitted with the
- offer and appear as a property of the incoming tube for other
- participants.</p>
- <p>Example of valid parameters for 'smb' Server Message Block over
- TCP/IP (from <a href="http://www.dns-sd.org/ServiceTypes.html">DNS
- SRV (RFC 2782) Service Types
- http://www.dns-sd.org/ServiceTypes.html</a>):
- <code>{'u': 'username', 'p': 'password', 'path': 'path'}</code></p>
- <p>When requesting a channel with
- <tp:dbus-ref namespace="org.freedesktop.Telepathy">Connection.Interface.Requests.CreateChannel</tp:dbus-ref>,
- this property MUST NOT be included in the request. This property is undefined until the tube is offered
- (using <tp:dbus-ref namespace="org.freedesktop.Telepathy.Channel.Type.StreamTube.DRAFT">OfferStreamTube</tp:dbus-ref>
- or <tp:dbus-ref namespace="org.freedesktop.Telepathy.Channel.Type.DBusTube.DRAFT">OfferDBusTube</tp:dbus-ref>).
- Once it has been offered, this property MUST NOT change.</p>
- <p>When receiving an incoming tube, this property is immutable and so advertised in the
- <tp:dbus-ref namespace="org.freedesktop.Telepathy">Connection.Interface.Requests.NewChannels</tp:dbus-ref>
- signal.</p>
- </tp:docstring>
- </property>
-
- <property name="State" type="u" tp:type="Tube_Channel_State" access="read"
- tp:name-for-bindings="State">
- <tp:docstring xmlns="http://www.w3.org/1999/xhtml">
- <p>State of the tube in this channel.</p>
- <p>When requesting a channel with
- <tp:dbus-ref namespace="org.freedesktop.Telepathy">Connection.Interface.Requests.CreateChannel</tp:dbus-ref>,
- this property MUST NOT be included in the request.</p>
- </tp:docstring>
- </property>
-
- <tp:enum name="Tube_Channel_State" type="u">
- <tp:enumvalue suffix="Local_Pending" value="0">
- <tp:docstring>
- The initiator offered the tube. The tube is waiting to be
- accepted/closed locally. If the client accepts the tube, the tube's
- state will be Open.
- </tp:docstring>
- </tp:enumvalue>
- <tp:enumvalue suffix="Remote_Pending" value="1">
- <tp:docstring>
- The tube is waiting to be accepted/closed remotely. If the
- recipient accepts the tube, the tube's state will be Open.
- </tp:docstring>
- </tp:enumvalue>
- <tp:enumvalue suffix="Open" value="2">
- <tp:docstring>
- The initiator offered the tube and the recipient accepted it. The
- tube is open for traffic. The tube's state stays in this state until
- it is closed.
- </tp:docstring>
- </tp:enumvalue>
- <tp:enumvalue suffix="Not_Offered" value="3">
- <tp:docstring>
- The tube channel has been requested but the tube is not yet offered.
- The client should offer the tube to the recipient and the tube's
- state will be Remote_Pending. The method to offer the tube depend on
- the tube type.
- </tp:docstring>
- </tp:enumvalue>
- </tp:enum>
-
- <signal name="TubeChannelStateChanged"
- tp:name-for-bindings="Tube_Channel_State_Changed">
- <tp:docstring>
- Emitted when the state of the tube channel changes.
- </tp:docstring>
- <arg name="state" type="u" tp:type="Tube_Channel_State">
- <tp:docstring>
- The new state of the tube; see the Tube_Channel_State enumeration.
- </tp:docstring>
- </arg>
- </signal>
-
- </interface>
-
-</node>
-<!-- vim:set sw=2 sts=2 et ft=xml: -->
diff --git a/extensions/Channel_Type_DBus_Tube.xml b/extensions/Channel_Type_DBus_Tube.xml
deleted file mode 100644
index 513d77caa..000000000
--- a/extensions/Channel_Type_DBus_Tube.xml
+++ /dev/null
@@ -1,163 +0,0 @@
-<?xml version="1.0" ?>
-<node name="/Channel_Type_DBus_Tube" xmlns:tp="http://telepathy.freedesktop.org/wiki/DbusSpec#extensions-v0">
- <tp:copyright>Copyright © 2008-2009 Collabora Limited</tp:copyright>
- <tp:copyright>Copyright © 2008-2009 Nokia Corporation</tp:copyright>
- <tp:license>
- This library is free software; you can redistribute it and/or
-modify it under the terms of the GNU Lesser General Public
-License as published by the Free Software Foundation; either
-version 2.1 of the License, or (at your option) any later version.
-
-This library is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-Lesser General Public License for more details.
-
-You should have received a copy of the GNU Lesser General Public
-License along with this library; if not, write to the Free Software
-Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- </tp:license>
- <interface name="org.freedesktop.Telepathy.Channel.Type.DBusTube.DRAFT"
- tp:causes-havoc="experimental">
- <tp:requires interface="org.freedesktop.Telepathy.Channel"/>
- <tp:requires interface="org.freedesktop.Telepathy.Channel.Interface.Tube.DRAFT"/>
- <tp:docstring xmlns="http://www.w3.org/1999/xhtml">
- <p>A D-Bus tube is an ordered reliable transport, for transporting D-Bus
- traffic.</p>
-
- <p>For each D-Bus tube, the connection manager listens on a D-Bus
- server address, as detailed in the D-Bus specification. On this
- address, it emulates a bus upon which each tube participant appears
- as an endpoint.</p>
-
- <p>The objects and interfaces which are expected to exist on the
- emulated bus depend on the well-known name; typically, either the
- participant who initiated the tube is expected to export the same
- objects/interfaces that would be exported by a service of that name
- on a bus, or all participants are expected to export those
- objects/interfaces.</p>
-
- <p>In a multi-user context (Handle_Type_Room) the tube behaves
- like the D-Bus bus daemon, so participants can send each other
- private messages, or can send broadcast messages which are
- received by everyone in the tube (including themselves).
- Each participant has a D-Bus unique name; connection managers
- MUST prevent participants from sending messages with the wrong
- sender unique name, and SHOULD attempt to avoid participants
- receiving messages not intended for them.</p>
-
- <p>In a 1-1 context (Handle_Type_Contact) the tube behaves like
- a peer-to-peer D-Bus connection - arbitrary D-Bus messages with
- any sender and/or destination can be sent by each participant,
- and each participant receives all messages sent by the other
- participant.</p>
-
- </tp:docstring>
-
- <method name="OfferDBusTube" tp:name-for-bindings="Offer_DBus_Tube">
- <tp:docstring>
- Offers a D-Bus tube providing the service specified.
- </tp:docstring>
- <arg direction="in" name="parameters" type="a{sv}"
- tp:type="String_Variant_Map">
- <tp:docstring>
- The dictionary of arbitrary
- <tp:dbus-ref namespace="org.freedesktop.Telepathy.Channel.Interface.Tube.DRAFT">Parameters</tp:dbus-ref>
- to send with the tube offer.
- </tp:docstring>
- </arg>
- <arg direction="out" name="address" type="s">
- <tp:docstring>
- The string describing the address of the private bus. The client
- SHOULD not attempt to connect to the address until the tube is open.
- </tp:docstring>
- </arg>
- <tp:possible-errors>
- <tp:error name="org.freedesktop.Telepathy.Error.NetworkError"/>
- <tp:error name="org.freedesktop.Telepathy.Error.NotAvailable">
- <tp:docstring>
- The contact associated with this channel doesn't have tubes
- capabilities.
- </tp:docstring>
- </tp:error>
- </tp:possible-errors>
- </method>
-
- <method name="AcceptDBusTube" tp:name-for-bindings="Accept_DBus_Tube">
- <tp:docstring>
- Accept a D-Bus tube that's in the "local pending" state. The
- connection manager will attempt to open the tube. The tube remains in
- the "local pending" state until the TubeStateChanged signal is
- emitted.
- </tp:docstring>
- <arg direction="out" name="address" type="s">
- <tp:docstring>
- The string describing the address of the private bus. The client
- SHOULD not attempt to connect to the address until the tube is open.
- </tp:docstring>
- </arg>
- </method>
-
- <signal name="DBusNamesChanged" tp:name-for-bindings="DBus_Names_Changed">
- <tp:docstring>
- Emitted on a multi-user (i.e. Handle_Type_Room) D-Bus tube when a
- participant opens or closes the tube. This provides change
- notification for the <tp:member-ref>DBusNames</tp:member-ref> property.
- </tp:docstring>
- <arg name="added" type="a{us}" tp:type="DBus_Tube_Participants">
- <tp:docstring>
- Array of handles and D-Bus names of new participants.
- </tp:docstring>
- </arg>
- <arg name="removed" type="au" tp:type="Contact_Handle[]">
- <tp:docstring>
- Array of handles of former participants.
- </tp:docstring>
- </arg>
- </signal>
-
- <property name="ServiceName" type="s" access="read"
- tp:name-for-bindings="Service_Name">
- <tp:docstring xmlns="http://www.w3.org/1999/xhtml">
- <p>A string representing the service name that will be used over the
- tube. It SHOULD be a well-known D-Bus service name, of the form
- com.example.ServiceName.</p>
- <p>When the tube is offered, the service name is transmitted to the
- other end.</p>
- <p>When requesting a channel with
- <tp:dbus-ref namespace="org.freedesktop.Telepathy">Connection.Interface.Requests.CreateChannel</tp:dbus-ref>,
- this property MUST be included in the request.</p>
- </tp:docstring>
- </property>
-
- <property name="DBusNames" tp:name-for-bindings="DBus_Names"
- access="read" type="a{us}" tp:type="DBus_Tube_Participants">
- <tp:docstring>
- For a multi-user (i.e. Handle_Type_Room) D-Bus tube, a mapping
- between contact handles and their unique bus names on this tube.
- For a peer-to-peer (i.e. Handle_Type_Contact) D-Bus tube, the empty
- dictionary. Change notification is via
- <tp:member-ref>DBusNamesChanged</tp:member-ref>.
- </tp:docstring>
- </property>
-
- <tp:mapping name="DBus_Tube_Participants">
- <tp:docstring>Represents the participants in a multi-user D-Bus tube, as
- used by the <tp:member-ref>DBusNames</tp:member-ref> property and the
- <tp:member-ref>DBusNamesChanged</tp:member-ref> signal.</tp:docstring>
- <tp:member type="u" tp:type="Contact_Handle" name="Handle">
- <tp:docstring>
- The handle of a participant in this D-Bus tube.
- </tp:docstring>
- </tp:member>
- <tp:member type="s" tp:type="DBus_Unique_Name" name="Unique_Name">
- <tp:docstring>
- That participant's unique name.
- </tp:docstring>
- </tp:member>
- </tp:mapping>
-
- </interface>
-
-</node>
-<!-- vim:set sw=2 sts=2 et ft=xml: -->
diff --git a/extensions/Channel_Type_Stream_Tube.xml b/extensions/Channel_Type_Stream_Tube.xml
deleted file mode 100644
index 060cd0bb0..000000000
--- a/extensions/Channel_Type_Stream_Tube.xml
+++ /dev/null
@@ -1,206 +0,0 @@
-<?xml version="1.0" ?>
-<node name="/Channel_Type_Stream_Tube" xmlns:tp="http://telepathy.freedesktop.org/wiki/DbusSpec#extensions-v0">
- <tp:copyright>Copyright © 2008-2009 Collabora Limited</tp:copyright>
- <tp:copyright>Copyright © 2008-2009 Nokia Corporation</tp:copyright>
- <tp:license>
- This library is free software; you can redistribute it and/or
-modify it under the terms of the GNU Lesser General Public
-License as published by the Free Software Foundation; either
-version 2.1 of the License, or (at your option) any later version.
-
-This library is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-Lesser General Public License for more details.
-
-You should have received a copy of the GNU Lesser General Public
-License along with this library; if not, write to the Free Software
-Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- </tp:license>
- <interface name="org.freedesktop.Telepathy.Channel.Type.StreamTube.DRAFT"
- tp:causes-havoc="experimental">
- <tp:requires interface="org.freedesktop.Telepathy.Channel"/>
- <tp:requires interface="org.freedesktop.Telepathy.Channel.Interface.Tube.DRAFT"/>
- <tp:docstring xmlns="http://www.w3.org/1999/xhtml">
- <p>A stream tube is a transport for ordered, reliable data transfer,
- similar to SOCK_STREAM sockets.</p>
-
- <p>When offering a stream tube, the initiating client creates a local
- listening socket and offers it to the recipient client using the
- <tp:member-ref>OfferStreamTube</tp:member-ref> method. When a
- recipient accepts a stream tube using the
- <tp:member-ref>AcceptStreamTube</tp:member-ref> method, the
- recipient's connection manager creates a new local listening socket.
- Each time the recipient's client connects to this socket, the
- initiator's connection manager proxies this connection to the
- originally offered socket.</p>
-
- </tp:docstring>
-
- <method name="OfferStreamTube" tp:name-for-bindings="Offer_Stream_Tube">
- <tp:docstring>
- Offer a stream tube exporting the local socket specified.
- </tp:docstring>
- <arg direction="in" name="address_type" type="u" tp:type="Socket_Address_Type">
- <tp:docstring>
- The type of the listening address of the local service, as a member of
- Socket_Address_Type.
- </tp:docstring>
- </arg>
- <arg direction="in" name="address" type="v">
- <tp:docstring>
- The listening address of the local service, as indicated by the
- address_type.
- </tp:docstring>
- </arg>
- <arg direction="in" name="access_control" type="u" tp:type="Socket_Access_Control">
- <tp:docstring>
- The access control the local service applies to the local socket,
- specified so the connection manager can behave appropriately
- when it connects.
- </tp:docstring>
- </arg>
- <arg direction="in" name="access_control_param" type="v">
- <tp:docstring>
- A parameter for the access control type, to be interpreted as
- specified in the documentation for the Socket_Access_Control enum.
- </tp:docstring>
- </arg>
- <arg direction="in" name="parameters" type="a{sv}"
- tp:type="String_Variant_Map">
- <tp:docstring>
- The dictionary of arbitrary
- <tp:dbus-ref namespace="org.freedesktop.Telepathy.Channel.Interface.Tube.DRAFT">Parameters</tp:dbus-ref>
- to send with the tube offer.
- </tp:docstring>
- </arg>
- <tp:possible-errors>
- <tp:error name="org.freedesktop.Telepathy.Error.NetworkError"/>
- <tp:error name="org.freedesktop.Telepathy.Error.NotAvailable">
- <tp:docstring>
- The contact associated with this channel doesn't have tube
- capabilities.
- </tp:docstring>
- </tp:error>
- <tp:error name="org.freedesktop.Telepathy.Error.NotImplemented">
- <tp:docstring>
- The connection manager doesn't support the given address type
- or access-control type.
- </tp:docstring>
- </tp:error>
- </tp:possible-errors>
- </method>
-
- <method name="AcceptStreamTube" tp:name-for-bindings="Accept_Stream_Tube">
- <tp:docstring>
- Accept a stream tube that's in the "local pending" state. The
- connection manager will attempt to open the tube. The tube remains in
- the "local pending" state until the TubeStateChanged signal is
- emitted.
- </tp:docstring>
- <arg direction="in" name="address_type" type="u" tp:type="Socket_Address_Type">
- <tp:docstring>
- The type of address the connection manager should listen on.
- </tp:docstring>
- </arg>
- <arg direction="in" name="access_control" type="u" tp:type="Socket_Access_Control">
- <tp:docstring>
- The type of access control the connection manager should apply to
- the socket.
- </tp:docstring>
- </arg>
- <arg direction="in" name="access_control_param" type="v">
- <tp:docstring>
- A parameter for the access control type, to be interpreted as
- specified in the documentation for the Socket_Access_Control enum.
- </tp:docstring>
- </arg>
- <arg direction="out" name="address" type="v">
- <tp:docstring>
- The address on which the connection manager will listen for
- connections to this tube. The client should not attempt to connect
- to the address until the tube is open.
- </tp:docstring>
- </arg>
-
- <tp:possible-errors>
- <tp:error name="org.freedesktop.Telepathy.Error.InvalidArgument">
- <tp:docstring>
- The access_control_param is invalid with the given access_control.
- </tp:docstring>
- </tp:error>
- <tp:error name="org.freedesktop.Telepathy.Error.NotImplemented">
- <tp:docstring>
- The given address type or access-control mechanism is not supported.
- </tp:docstring>
- </tp:error>
- </tp:possible-errors>
- </method>
-
- <signal name="StreamTubeNewConnection"
- tp:name-for-bindings="Stream_Tube_New_Connection">
- <tp:docstring>
- Emitted on a stream tube when a participant opens a new connection
- to its socket.
- </tp:docstring>
- <arg name="handle" type="u" tp:type="Contact_Handle">
- <tp:docstring>
- The handle of the participant who opened the new connection
- </tp:docstring>
- </arg>
- </signal>
-
- <property name="Service" type="s" access="read"
- tp:name-for-bindings="Service">
- <tp:docstring xmlns="http://www.w3.org/1999/xhtml">
- <p> A string representing the service name that will be used over the
- tube. It should be a well-known TCP service name as defined by
- <a href="http://www.iana.org/assignments/port-numbers">
- http://www.iana.org/assignments/port-numbers</a> or
- <a href="http://www.dns-sd.org/ServiceTypes.html">
- http://www.dns-sd.org/ServiceTypes.html</a>, for instance
- "rsync" or "daap".</p>
- <p>When the tube is offered, the service name is transmitted to the
- other end.</p>
- <p>When requesting a channel with
- <tp:dbus-ref namespace="org.freedesktop.Telepathy">Connection.Interface.Requests.CreateChannel</tp:dbus-ref>,
- this property MUST be included in the request.</p>
- </tp:docstring>
- </property>
-
- <property name="SupportedSocketTypes" type="a{uau}"
- tp:type="Supported_Socket_Map" access="read"
- tp:name-for-bindings="Supported_Socket_Types">
- <tp:docstring xmlns="http://www.w3.org/1999/xhtml">
- <p>A mapping from address types (members of Socket_Address_Type) to
- arrays of access-control type (members of Socket_Access_Control)
- that the connection manager supports for stream tubes with that
- address type. For simplicity, if a CM supports offering a
- particular type of tube, it is assumed to support accepting it.</p>
-
- <p>A typical value for a host without IPv6 support:</p>
-
- <pre>
- {
- Socket_Address_Type_IPv4:
- [Socket_Access_Control_Localhost, Socket_Access_Control_Port,
- Socket_Access_Control_Netmask],
- Socket_Address_Type_Unix:
- [Socket_Access_Control_Localhost, Socket_Access_Control_Credentials]
- }
- </pre>
-
- <p>Connection Managers MUST support at least IPv4 with the localhost
- access control.</p>
-
- <p>When requesting a channel with
- <tp:dbus-ref namespace="org.freedesktop.Telepathy">Connection.Interface.Requests.CreateChannel</tp:dbus-ref>,
- this property MUST NOT be included in the request.</p>
-
- </tp:docstring>
- </property>
-
- </interface>
-
-</node>
-<!-- vim:set sw=2 sts=2 et ft=xml: -->
diff --git a/extensions/Connection_Interface_Location.xml b/extensions/Connection_Interface_Location.xml
new file mode 100644
index 000000000..1e7bee4e0
--- /dev/null
+++ b/extensions/Connection_Interface_Location.xml
@@ -0,0 +1,330 @@
+<?xml version="1.0" ?>
+<node name="/Connection_Interface_Location"
+ xmlns:tp="http://telepathy.freedesktop.org/wiki/DbusSpec#extensions-v0">
+ <tp:copyright>Copyright (C) 2008 Collabora Ltd.</tp:copyright>
+ <tp:copyright>Copyright (C) 2008 Nokia Corporation</tp:copyright>
+ <tp:license xmlns="http://www.w3.org/1999/xhtml">
+ <p>This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.</p>
+
+<p>This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+Lesser General Public License for more details.</p>
+
+<p>You should have received a copy of the GNU Lesser General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.</p>
+ </tp:license>
+ <interface name="org.freedesktop.Telepathy.Connection.Interface.Location.DRAFT"
+ tp:causes-havoc='experimental'>
+ <tp:requires interface="org.freedesktop.Telepathy.Connection"/>
+
+ <tp:docstring xmlns="http://www.w3.org/1999/xhtml">
+ <p>An interface on connections to support protocols which allow users to
+ publish their current geographical location, and subscribe to the
+ current location of their contacts.</p>
+
+ <p>This interface is geared strongly towards automatic propagation and
+ use of this information, so focuses on latitude, longitude and
+ altitude which can be determined by GPS, although provision is also
+ included for an optional human-readable description of locations. All
+ co-ordinate information is required to be relative to the WGS84
+ datum.</p>
+
+ <p>The information published through this interface is intended to have
+ the same scope as presence information, so will normally be made
+ available to those individuals on the user's "publish" contact list.
+ Even so, user interfaces should not automatically publish location
+ information without the consent of the user, and it is recommended
+ that an option is made available to reduce the accuracy of the
+ reported information to allow the user to maintain their privacy.</p>
+
+ <p>Location information is represented using the terminology of XMPP's
+ <a href="http://www.xmpp.org/extensions/xep-0080.html">XEP-0080</a>
+ or the XEP-0080-derived
+ <a href="http://geoclue.freedesktop.org/">Geoclue</a> API where
+ possible.</p>
+ </tp:docstring>
+
+ <tp:enum name="Location_Accuracy_Level" type="i">
+ <tp:docstring>
+ A location accuracy level. This should be kept in sync with
+ GeoclueAccuracyLevel in the Geoclue project.
+ </tp:docstring>
+
+ <tp:enumvalue suffix="None" value="0">
+ <tp:docstring>
+ The accuracy is unspecified.
+ </tp:docstring>
+ </tp:enumvalue>
+ <tp:enumvalue suffix="Country" value="1">
+ <tp:docstring>
+ The location indicates the contact's country.
+ </tp:docstring>
+ </tp:enumvalue>
+ <tp:enumvalue suffix="Region" value="2">
+ <tp:docstring>
+ The location indicates the contact's region within a country.
+ </tp:docstring>
+ </tp:enumvalue>
+ <tp:enumvalue suffix="Locality" value="3">
+ <tp:docstring>
+ The location indicates the contact's locality within a region
+ (e.g. the correct city).
+ </tp:docstring>
+ </tp:enumvalue>
+ <tp:enumvalue suffix="Postal_Code" value="4">
+ <tp:docstring>
+ The location indicates the correct postal code.
+ </tp:docstring>
+ </tp:enumvalue>
+ <tp:enumvalue suffix="Street" value="5">
+ <tp:docstring>
+ The location indicates the correct street.
+ </tp:docstring>
+ </tp:enumvalue>
+ <tp:enumvalue suffix="Detailed" value="6">
+ <tp:docstring>
+ The location's accuracy is given by the error, horizontal-error-m
+ and/or vertical-error-m keys.
+ </tp:docstring>
+ </tp:enumvalue>
+ </tp:enum>
+
+ <tp:mapping name="Location">
+ <tp:docstring>
+ A user's location, represented as an extensible mapping.
+ </tp:docstring>
+
+ <tp:member name="Key" type="s">
+ <tp:docstring xmlns="http://www.w3.org/1999/xhtml">
+
+ <p>Civic addresses are represented by the following well-known
+ keys (all of which have string values), which should be kept in
+ sync with those used in XEP-0080 and in the Geoclue project:</p>
+
+ <ul>
+ <li>countrycode - s: an ISO-3166-1 alpha-2 (two-letter) country
+ code, e.g. "us", "gb", "fr"</li>
+ <li>country - s: a country name in unspecified locale, e.g.
+ "USA"</li>
+ <li>region - s: an administrative region of the nation, such as a
+ state or province</li>
+ <li>locality - s: a locality within the administrative region, such
+ as a town or city</li>
+ <li>area - s: a named area such as a campus or neighborhood</li>
+ <li>postalcode - s: a code used for postal delivery</li>
+ <li>street - s: a thoroughfare within the locality, or a crossing of
+ two thoroughfares</li>
+ </ul>
+
+ <p>The following address keys are defined in XEP-0080 but not by
+ Geoclue, and are also allowed:</p>
+
+ <ul>
+ <li>building - s: a specific building on a street or in an area</li>
+ <li>floor - s: a particular floor in a building</li>
+ <li>room - s: a particular room in a building</li>
+ <li>text - s: any more specific information, e.g.
+ "Northwest corner of the lobby"</li>
+ <li>description - s: A natural-language name for or description of
+ the location, e.g. "Bill's house"</li>
+ <li>uri - s: a URI representing the location or pointing to more
+ information about it</li>
+ </ul>
+
+ <p>Positions are represented by the following well-known keys:</p>
+
+ <ul>
+ <li>lat - d: latitude in decimal degrees north, -90 to +90,
+ relative to the WGS-84 datum
+ <tp:rationale>
+ This is from XEP-0080; the XEP allows use of a different
+ datum, but recommends this one. We enforce sanity by requiring
+ a consistent datum: a minimal compliant implementation of this
+ specification in terms of XEP-0080 would simply ignore the
+ &lt;lat&gt; and &lt;lon&gt; elements if &lt;datum&gt; exists
+ and has a value other than WGS-84, while an advanced
+ implementation might correct for the different datum.
+ </tp:rationale>
+ </li>
+ <li>lon - d: Longitude in decimal degrees east, -180 to +180,
+ relative to the WGS-84 datum
+ <tp:rationale>
+ Same rationale as 'lat'
+ </tp:rationale>
+ </li>
+ <li>alt - d: altitude in metres above sea level (negative
+ if below sea level)
+ <tp:rationale>
+ This is from XEP-0080
+ </tp:rationale>
+ </li>
+ <li>accuracy-level - i (<tp:type>Location_Accuracy_Level</tp:type>):
+ an indication of accuracy, which SHOULD be omitted if it would be
+ Location_Accuracy_Level_None or
+ Location_Accuracy_Level_Detailed
+ <tp:rationale>
+ This is a struct field in GeoClue; the name is new in this
+ specification, and was chosen in an attempt to avoid clashing
+ with any future XEP-0080 terminology.
+ </tp:rationale>
+ </li>
+ <li>error - d: horizontal position error in arc-minutes (1/60
+ degree) if known
+ <tp:rationale>
+ This is from XEP-0080
+ </tp:rationale>
+ </li>
+ <li>vertical-error-m - d: vertical position error in metres if
+ known
+ <tp:rationale>
+ This exists as a struct field in GeoClue; the name is new
+ in this specification.
+ </tp:rationale>
+ </li>
+ <li>horizontal-error-m - d: horizontal position error in metres if
+ known
+ <tp:rationale>
+ This exists as a struct field in GeoClue; the name is new
+ in this specification.
+ </tp:rationale>
+ </li>
+ </ul>
+
+ <p>Velocities are represented by the following well-known keys:</p>
+
+ <ul>
+ <li>speed - d: speed in metres per second
+ <tp:rationale>
+ This is from XEP-0080
+ </tp:rationale>
+ </li>
+ <li>bearing - d: direction of movement in decimal degrees,
+ where North is 0 and East is 90
+ <tp:rationale>
+ This is from XEP-0080, and is equivalent to the struct field
+ called "direction" in GeoClue
+ </tp:rationale>
+ </li>
+ <li>climb - d: rate of change of 'alt' in metres per second
+ <tp:rationale>
+ This is a struct field in GeoClue; the name is new to this
+ specification, but seems uncontroversial
+ </tp:rationale>
+ </li>
+ </ul>
+
+ <p>Other well-known keys:</p>
+
+ <ul>
+ <li>timestamp - t (<tp:type>Unix_Timestamp64</tp:type>): the time
+ that the contact was at this location, in seconds since
+ 1970-01-01T00:00:00Z (i.e. the beginning of 1970 in UTC)
+ <tp:rationale>
+ XEP-0080 uses an ISO 8601 string for this, but a number of
+ seconds since the epoch is probably easier to work with.
+ </tp:rationale>
+ </li>
+ </ul>
+ </tp:docstring>
+ </tp:member>
+
+ <tp:member name="Value" type="v">
+ <tp:docstring>
+ The value corresponding to the well-known key.
+ </tp:docstring>
+ </tp:member>
+ </tp:mapping>
+
+ <tp:mapping name="Contact_Locations" type="a{ua{sv}}">
+ <tp:member name="Contact" type="u" tp:type="Contact_Handle">
+ </tp:member>
+ <tp:member name="Location" type="a{sv}" tp:type="Location">
+ </tp:member>
+ </tp:mapping>
+
+ <method name="GetLocations" tp:name-for-bindings="Get_Locations">
+ <tp:docstring>
+ Return the current locations of the given contacts, if they are
+ already known. If any of the given contacts' locations are not known,
+ request their current locations, and later emit
+ <tp:member-ref>LocationUpdated</tp:member-ref> for them; the
+ <tp:member-ref>LocationUpdated</tp:member-ref> signal for contacts
+ whose location could not be determined will have an empty Location.
+ </tp:docstring>
+
+ <arg direction="in" name="Contacts" type="au" tp:type="Contact_Handle[]">
+ <tp:docstring>
+ The contacts whose locations should be returned or signalled.
+ </tp:docstring>
+ </arg>
+
+ <arg direction="out" name="Locations" type="a{ua{sv}}"
+ tp:type="Contact_Locations">
+ <tp:docstring>
+ The contacts' locations, if already known. Contacts whose locations
+ are not already known are omitted from the mapping; contacts known
+ to have no location information appear in the mapping with an empty
+ Location dictionary.
+ </tp:docstring>
+ </arg>
+ </method>
+
+ <signal name="LocationUpdated" tp:name-for-bindings="Location_Updated">
+ <tp:docstring>
+ Emitted when a contact's location changes or becomes known.
+ </tp:docstring>
+
+ <arg name="Contact" type="u" tp:type="Contact_Handle">
+ <tp:docstring>
+ The contact
+ </tp:docstring>
+ </arg>
+ <arg name="Location" type="a{sv}" tp:type="Location">
+ <tp:docstring>
+ The contact's location, or empty to indicate that nothing is known
+ about the contact's location.
+ </tp:docstring>
+ </arg>
+ </signal>
+
+ <method name="SetLocation" tp:name-for-bindings="SetLocation">
+ <tp:docstring>
+ Set the local user's own location.
+ </tp:docstring>
+
+ <arg direction="in" name="Location" type="a{sv}">
+ <tp:docstring>
+ The location to advertise. If the user wants to obscure their
+ exact location by reducing the precision or accuracy, clients
+ MUST do this themselves, rather than relying on the connection
+ manager to do so. Clients that interact with more than one
+ connection SHOULD advertise the same reduced-accuracy location
+ to all of them, so that contacts cannot obtain an undesirably
+ accurate location by assuming that random errors have been added
+ and averaging the locations advertised on multiple connections.
+ </tp:docstring>
+ </arg>
+ </method>
+
+ <property name="LocationAccessControlTypes" type="au" access="read"
+ tp:type="Rich_Presence_Access_Control_Type[]" tp:name-for-bindings="Location_Access_Control_Types">
+ <tp:docstring>The types of access control that are supported by this
+ connection.</tp:docstring>
+ </property>
+
+ <property name="LocationAccessControl" type="(uv)" access="readwrite"
+ tp:type="Rich_Presence_Access_Control" tp:name-for-bindings="Location_Access_Control">
+ <tp:docstring>The current access control mechanism and settings
+ for this connection. Before publishing location for the first time,
+ if this has not been set by a client, implementations SHOULD
+ set it to be as restrictive as possible (an empty whitelist, if
+ supported).</tp:docstring>
+ </property>
+ </interface>
+</node>
+<!-- vim:set sw=2 sts=2 et ft=xml: -->
diff --git a/extensions/Makefile.am b/extensions/Makefile.am
index f179ebc19..0ed6fc522 100644
--- a/extensions/Makefile.am
+++ b/extensions/Makefile.am
@@ -1,3 +1,5 @@
+include $(top_srcdir)/tools/shave.mk
+
tools_dir = $(top_srcdir)/tools
AM_CPPFLAGS = $(DISABLE_DEPRECATED)
@@ -13,10 +15,8 @@ EXTRA_DIST = \
generic-types.xml \
misc.xml \
Channel_Handler.xml \
+ Connection_Interface_Location.xml \
Tube_Handler.xml \
- Channel_Interface_Tube.xml \
- Channel_Type_DBus_Tube.xml \
- Channel_Type_Stream_Tube.xml \
Debug.xml
noinst_LTLIBRARIES = libemp-extensions.la
@@ -61,45 +61,45 @@ XSLTPROCFLAGS = --nonet --novalid
_gen/all.xml: all.xml $(wildcard *.xml)
$(mkdir_p) _gen
- $(XSLTPROC) $(XSLTPROCFLAGS) --xinclude $(tools_dir)/identity.xsl \
+ $(QUIET_GEN)$(XSLTPROC) $(XSLTPROCFLAGS) --xinclude $(tools_dir)/identity.xsl \
$< > $@
extensions.html: _gen/all.xml $(tools_dir)/doc-generator.xsl
- $(XSLTPROC) $(XSLTPROCFLAGS) \
+ $(QUIET_GEN)$(XSLTPROC) $(XSLTPROCFLAGS) \
--param "allow-undefined-interfaces" "true()" \
$(tools_dir)/doc-generator.xsl \
$< > $@
_gen/gtypes.h _gen/gtypes-body.h: _gen/all.xml \
$(top_srcdir)/tools/glib-gtypes-generator.py
- $(PYTHON) $(top_srcdir)/tools/glib-gtypes-generator.py \
+ $(QUIET_GEN)$(PYTHON) $(top_srcdir)/tools/glib-gtypes-generator.py \
$< _gen/gtypes Emp
_gen/signals-marshal.list: _gen/all.xml \
$(tools_dir)/glib-signals-marshal-gen.py
- $(PYTHON) $(tools_dir)/glib-signals-marshal-gen.py $< > $@
+ $(QUIET_GEN)$(PYTHON) $(tools_dir)/glib-signals-marshal-gen.py $< > $@
_gen/signals-marshal.h: _gen/signals-marshal.list Makefile.am
- $(GLIB_GENMARSHAL) --header --prefix=_emp_ext_marshal $< > $@
+ $(QUIET_GEN)$(GLIB_GENMARSHAL) --header --prefix=_emp_ext_marshal $< > $@
_gen/signals-marshal.c: _gen/signals-marshal.list Makefile.am
- { echo '#include "_gen/signals-marshal.h"' && \
+ $(QUIET_GEN){ echo '#include "_gen/signals-marshal.h"' && \
$(GLIB_GENMARSHAL) --body --prefix=_emp_ext_marshal $< ; } > $@
_gen/register-dbus-glib-marshallers-body.h: _gen/all.xml \
$(tools_dir)/glib-client-marshaller-gen.py
- $(PYTHON) $(tools_dir)/glib-client-marshaller-gen.py $< \
+ $(QUIET_GEN)$(PYTHON) $(tools_dir)/glib-client-marshaller-gen.py $< \
_emp_ext > $@
_gen/enums.h: _gen/all.xml \
$(tools_dir)/c-constants-gen.py
- $(PYTHON) $(tools_dir)/c-constants-gen.py \
+ $(QUIET_GEN)$(PYTHON) $(tools_dir)/c-constants-gen.py \
Emp \
$< > $@
_gen/interfaces-body.h _gen/interfaces.h: _gen/all.xml \
$(tools_dir)/glib-interfaces-gen.py
- $(PYTHON) $(tools_dir)/glib-interfaces-gen.py \
+ $(QUIET_GEN)$(PYTHON) $(tools_dir)/glib-interfaces-gen.py \
Emp _gen/interfaces-body.h _gen/interfaces.h $<
# Generated files which must be generated per "category". Each TpProxy
@@ -108,12 +108,12 @@ _gen/interfaces-body.h _gen/interfaces.h: _gen/all.xml \
_gen/misc.xml: misc.xml $(wildcard *.xml)
$(mkdir_p) _gen
- $(XSLTPROC) $(XSLTPROCFLAGS) --xinclude $(tools_dir)/identity.xsl \
+ $(QUIET_GEN)$(XSLTPROC) $(XSLTPROCFLAGS) --xinclude $(tools_dir)/identity.xsl \
$< > $@
_gen/cli-misc-body.h _gen/cli-misc.h: _gen/misc.xml \
$(tools_dir)/glib-client-gen.py
- $(PYTHON) $(tools_dir)/glib-client-gen.py \
+ $(QUIET_GEN)$(PYTHON) $(tools_dir)/glib-client-gen.py \
--group=misc \
--subclass=TpProxy \
--subclass-assert=TP_IS_PROXY \
@@ -123,7 +123,7 @@ _gen/cli-misc-body.h _gen/cli-misc.h: _gen/misc.xml \
_gen/svc-misc.c _gen/svc-misc.h: _gen/misc.xml \
$(tools_dir)/glib-ginterface-gen.py
- $(PYTHON) $(tools_dir)/glib-ginterface-gen.py \
+ $(QUIET_GEN)$(PYTHON) $(tools_dir)/glib-ginterface-gen.py \
--filename=_gen/svc-misc \
--signal-marshal-prefix=_emp_ext \
--include='<telepathy-glib/dbus.h>' \
diff --git a/extensions/all.xml b/extensions/all.xml
index c9f4c0bd7..85d9dde68 100644
--- a/extensions/all.xml
+++ b/extensions/all.xml
@@ -28,6 +28,18 @@
from="Telepathy specification"/>
<tp:external-type name="Tube_ID" type="u"
from="Telepathy specification"/>
+
+ <!-- for localisation -->
+ <tp:external-type name="Rich_Presence_Access_Control_Type" type="u"
+ from="Telepathy specification"/>
+ <tp:external-type name="Rich_Presence_Access_Control" type="(uv)"
+ from="Telepathy specification"/>
+ <tp:external-type name="Unix_Timestamp64" type="t"
+ from="Telepathy specification"/>
+ <tp:external-type name="Unix_Timestamp" type="u"
+ from="Telepathy specification"/>
+ <tp:external-type name="String_String_Map" type="a{ss}"
+ from="Telepathy specification"/>
</tp:generic-types>
diff --git a/extensions/misc.xml b/extensions/misc.xml
index 38e802e97..dd3125fb2 100644
--- a/extensions/misc.xml
+++ b/extensions/misc.xml
@@ -6,9 +6,7 @@
<xi:include href="Channel_Handler.xml"/>
<xi:include href="Tube_Handler.xml"/>
-<xi:include href="Channel_Interface_Tube.xml" />
-<xi:include href="Channel_Type_DBus_Tube.xml" />
-<xi:include href="Channel_Type_Stream_Tube.xml" />
+<xi:include href="Connection_Interface_Location.xml"/>
<xi:include href="Debug.xml" />
</tp:spec>
diff --git a/help/C/empathy.xml b/help/C/empathy.xml
index c75f92efa..7eea5e9fd 100644
--- a/help/C/empathy.xml
+++ b/help/C/empathy.xml
@@ -2,9 +2,9 @@
<!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook XML V4.3//EN"
"http://www.oasis-open.org/docbook/xml/4.3/docbookx.dtd" [
<!ENTITY legal SYSTEM "legal.xml">
-<!ENTITY appversion "2.26">
-<!ENTITY manrevision "2.1">
-<!ENTITY date "January 2009">
+<!ENTITY appversion "2.28">
+<!ENTITY manrevision "2.2">
+<!ENTITY date "May 2009">
<!ENTITY app "<application>Empathy</application>">
<!ENTITY appname "Empathy">
<!ENTITY gtalk "http://www.google.com/talk/">
@@ -23,43 +23,52 @@
<article id="index" lang="en">
<!-- please do not change the id; for translations, change lang to -->
<!-- appropriate code -->
- <articleinfo>
- <title>&app; Manual V&manrevision;</title>
+ <articleinfo>
+ <title>&app; Manual V&manrevision;</title>
+
+ <copyright>
+ <year>2008, 2009</year>
+ <holder>Ubuntu Documentation Project</holder>
+ </copyright>
+ <copyright>
+ <year>2009</year>
+ <holder>GNOME Documentation Project</holder>
+ </copyright>
- <copyright>
- <year>2008, 2009</year>
- <holder>Ubuntu Documentation Project</holder>
- </copyright>
<!-- An address can be added to the publisher information. If a role is
not specified, the publisher/author is the same for all versions of the
document. -->
- <publisher>
- <publishername>Ubuntu Documentation Project</publishername>
- </publisher>
+ <publisher>
+ <publishername>GNOME Documentation Project</publishername>
+ </publisher>
<!-- licence stuff -->
&legal;
- <authorgroup>
- <author role="maintainer">
- <firstname>Milo</firstname>
- <surname>Casagrande</surname>
- <affiliation>
- <orgname>Ubuntu Documentation Project</orgname>
- <address><email>milo@ubuntu.com</email></address>
- </affiliation>
+ <authorgroup>
+ <author role="maintainer">
+ <firstname>Milo</firstname>
+ <surname>Casagrande</surname>
+ <affiliation>
+ <orgname>GNOME Documentation Project</orgname>
+ <address><email>milo@ubuntu.com</email></address>
+ </affiliation>
+ <affiliation>
+ <orgname>Ubuntu Documentation Project</orgname>
+ <address><email>milo@ubuntu.com</email></address>
+ </affiliation>
+ </author>
+ <author>
+ <firstname>Seth</firstname>
+ <surname>Dudenhofer</surname>
+ <affiliation>
+ <orgname>Ubuntu Documentation Project</orgname>
+ <address><email>sdudenhofer@gmail.com</email></address>
+ </affiliation>
</author>
- <author>
- <firstname>Seth</firstname>
- <surname>Dudenhofer</surname>
- <affiliation>
- <orgname>Ubuntu Documentation Project</orgname>
- <address><email>sdudenhofer@gmail.com</email></address>
- </affiliation>
- </author>
</authorgroup>
- <releaseinfo revision="2.26" role="incomplete">
+ <releaseinfo revision="2.28" role="incomplete">
<ulink type="bug" url="http://bugzilla.gnome.org/show_bug.cgi?id=561033" />
<ulink type="planning" url="http://live.gnome.org/Empathy/Documentation" />
</releaseinfo>
@@ -77,21 +86,32 @@
<!-- When the desktop release version changes to V3.x, the revision number of the manual changes -->
<!-- to V3.0, and so on. -->
<revhistory>
- <revision>
- <revnumber>Empathy Manual V&manrevision;</revnumber>
- <date>&date;</date>
- <revdescription>
+ <revision>
+ <revnumber>Empathy Manual V&manrevision;</revnumber>
+ <date>&date;</date>
+ <revdescription>
+ <para role="author">Milo Casagrande
+ <email>milo@ubuntu.com</email>
+ </para>
+ <para role="publisher">GNOME Documentation Project</para>
+ </revdescription>
+ </revision>
+
+ <revision>
+ <revnumber>Empathy Manual V2.1</revnumber>
+ <date>January 2009</date>
+ <revdescription>
<para role="author">Milo Casagrande
<email>milo@ubuntu.com</email>
</para>
<para role="publisher">Ubuntu Documentation Project</para>
- </revdescription>
- </revision>
+ </revdescription>
+ </revision>
<revision>
- <revnumber>Empathy Manual V2.0</revnumber>
- <date>April 2008</date>
- <revdescription>
+ <revnumber>Empathy Manual V2.0</revnumber>
+ <date>April 2008</date>
+ <revdescription>
<para role="author">Milo Casagrande
<email>milo@ubuntu.com</email>
</para>
@@ -99,8 +119,8 @@
<email>sdudenhofer@gmail.com</email>
</para>
<para role="publisher">Ubuntu Documentation Project</para>
- </revdescription>
- </revision>
+ </revdescription>
+ </revision>
</revhistory>
<releaseinfo>
@@ -123,10 +143,10 @@
</articleinfo>
<indexterm zone="index">
- <primary>Empathy</primary>
- </indexterm>
- <indexterm zone="index">
- <primary>empathy</primary>
+ <primary>Empathy</primary>
+ </indexterm>
+ <indexterm zone="index">
+ <primary>empathy</primary>
<secondary>istant messaging</secondary>
</indexterm>
diff --git a/help/ca/ca.po b/help/ca/ca.po
index ab634124e..bac47cf10 100644
--- a/help/ca/ca.po
+++ b/help/ca/ca.po
@@ -1,12 +1,12 @@
# Traducció del emphaty de l'equip de Softcatalà.
-# Copyright © 2008 Free Software Foundation, Inc.
-# Joan Duran <jodufi@gmail.com>, 2008.
+# Copyright © 2009 Free Software Foundation, Inc.
+# Joan Duran <jodufi@gmail.com>, 2008, 2009.
#
msgid ""
msgstr ""
"Project-Id-Version: emphaty\n"
-"POT-Creation-Date: 2008-11-09 22:11+0000\n"
-"PO-Revision-Date: 2008-12-06 16:02+0100\n"
+"POT-Creation-Date: 2009-05-01 17:22+0000\n"
+"PO-Revision-Date: 2009-03-09 23:09+0100\n"
"Last-Translator: Joan Duran <jodufi@gmail.com>\n"
"Language-Team: Catalan <tradgnome@softcatala.org>\n"
"MIME-Version: 1.0\n"
@@ -16,482 +16,1373 @@ msgstr ""
#. When image changes, this message will be marked fuzzy or untranslated for you.
#. It doesn't matter what you translate it to: it's not used at all.
-#: C/empathy.xml:215(None)
-msgid "@@image: 'figures/empathy-main-window.png'; md5=38259a866f38ff1f754828e46d2b0e5c"
-msgstr "@@image: 'figures/empathy-main-window.png'; md5=38259a866f38ff1f754828e46d2b0e5c"
-
-#. When image changes, this message will be marked fuzzy or untranslated for you.
-#. It doesn't matter what you translate it to: it's not used at all.
-#: C/empathy.xml:306(None)
-msgid "@@image: 'figures/empathy-new-account.png'; md5=6c1e0d8c709125d387e975e5738b8c0f"
-msgstr "@@image: 'figures/empathy-new-account.png'; md5=6c1e0d8c709125d387e975e5738b8c0f"
+#: C/empathy.xml:237(None)
+msgid ""
+"@@image: 'figures/empathy-main-window.png'; "
+"md5=38259a866f38ff1f754828e46d2b0e5c"
+msgstr ""
+"@@image: 'figures/empathy-main-window.png'; "
+"md5=38259a866f38ff1f754828e46d2b0e5c"
-#: C/empathy.xml:25(title)
-msgid "<application>Empathy</application> Manual V2.0"
-msgstr "Manual de l'<application>Empathy</application> v2.0"
+#: C/empathy.xml:27(title)
+msgid "<application>Empathy</application> Manual V2.1"
+msgstr "Manual de l'<application>Empathy</application> (versió 2.1)"
-#: C/empathy.xml:28(year)
-msgid "2008"
-msgstr "2008"
+#: C/empathy.xml:30(year)
+msgid "2008, 2009"
+msgstr "2008, 2009"
-#: C/empathy.xml:29(holder) C/empathy.xml:35(publishername) C/empathy.xml:46(orgname) C/empathy.xml:54(orgname) C/empathy.xml:83(para)
+#: C/empathy.xml:31(holder) C/empathy.xml:37(publishername)
+#: C/empathy.xml:48(orgname) C/empathy.xml:56(orgname) C/empathy.xml:87(para)
+#: C/empathy.xml:101(para)
msgid "Ubuntu Documentation Project"
msgstr "Projecte de documentació de l'Ubuntu"
-#: C/empathy.xml:2(para)
-msgid "Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License (GFDL), Version 1.1 or any later version published by the Free Software Foundation with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. You can find a copy of the GFDL at this <ulink type=\"help\" url=\"ghelp:fdl\">link</ulink> or in the file COPYING-DOCS distributed with this manual."
-msgstr "Teniu permís per a copiar, distribuir i/o modificar aquest document, sota els termes de la Llicència de documentació lliure GNU (GFDL), versió 1.1 o qualsevol versió publicada posteriorment per la Free Software Foundation, sense seccions invariants, sense texts de portada i sense texts de contraportada. Podeu trobar una còpia de la GFDL en aquest <ulink type=\"help\" url=\"ghelp:fdl\">enllaç</ulink> o en el fitxer COPYING-DOCS distribuït amb aquest manual."
-
-#: C/empathy.xml:12(para)
-msgid "This manual is part of a collection of GNOME manuals distributed under the GFDL. If you want to distribute this manual separately from the collection, you can do so by adding a copy of the license to the manual, as described in section 6 of the license."
-msgstr "Aquest manual forma part d'una col·lecció de manuals del GNOME distribuïts sota la GFDL. Si voleu distribuir aquest manual independentment de la col·lecció, podeu fer-ho afegint una còpia de la llicència al manual, tal com es descriu a la secció 6 de la llicència."
-
-#: C/empathy.xml:19(para)
-msgid "Many of the names used by companies to distinguish their products and services are claimed as trademarks. Where those names appear in any GNOME documentation, and the members of the GNOME Documentation Project are made aware of those trademarks, then the names are in capital letters or initial capital letters."
-msgstr "Molts dels noms que les empreses utilitzen per a distingir els seus productes i serveis es consideren marques comercials. Quan aquests noms apareguin en qualsevol documentació del GNOME, si els membres del Projecte de documentació del GNOME han estat avisats pel que fa a les marques, els noms apareixeran en majúscules o amb les inicials en majúscules."
-
-#: C/empathy.xml:35(para)
-msgid "DOCUMENT IS PROVIDED ON AN \"AS IS\" BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE DOCUMENT OR MODIFIED VERSION OF THE DOCUMENT IS FREE OF DEFECTS MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY, ACCURACY, AND PERFORMANCE OF THE DOCUMENT OR MODIFIED VERSION OF THE DOCUMENT IS WITH YOU. SHOULD ANY DOCUMENT OR MODIFIED VERSION PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL WRITER, AUTHOR OR ANY CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY DOCUMENT OR MODIFIED VERSION OF THE DOCUMENT IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER; AND"
-msgstr "EL DOCUMENT S'OFEREIX «TAL COM ÉS», SENSE CAP TIPUS DE GARANTIA, NI EXPLÍCITA NI IMPLÍCITA; AIXÒ INCLOU, SENSE LIMITAR-S'HI, LES GARANTIES QUE EL DOCUMENT O LA VERSIÓ MODIFICADA DEL DOCUMENT NO TINGUI DEFECTES, SIGUI COMERCIALITZABLE, SIGUI ADEQUAT PER A UN ÚS CONCRET O NO INFRINGEIXI CAP LLEI. TOT EL RISC PEL QUE FA A LA QUALITAT, EXACTITUD I RENDIMENT DEL DOCUMENT O LA VERSIÓ MODIFICADA DEL DOCUMENT ÉS VOSTRE. EN CAS QUE EL DOCUMENT RESULTÉS DEFECTUÓS EN QUALSEVOL ASPECTE, VÓS (NO PAS L'ESCRIPTOR INICIAL, L'AUTOR O CAP ALTRE COL·LABORADOR) ASSUMIU TOT EL COST DE MANTENIMENT, REPARACIÓ O CORRECCIÓ. AQUESTA RENÚNCIA DE GARANTIA CONSTITUEIX UNA PART ESSENCIAL D'AQUESTA LLICÈNCIA. NO S'AUTORITZA L'ÚS DE CAP DOCUMENT O VERSIÓ MODIFICADA DEL DOCUMENT EXCEPTE SOTA AQUESTA RENÚNCIA DE GARANTIA; I"
+#: C/empathy.xml:2(para)
+msgid ""
+"Permission is granted to copy, distribute and/or modify this document under "
+"the terms of the GNU Free Documentation License (GFDL), Version 1.1 or any "
+"later version published by the Free Software Foundation with no Invariant "
+"Sections, no Front-Cover Texts, and no Back-Cover Texts. You can find a copy "
+"of the GFDL at this <ulink type=\"help\" url=\"ghelp:fdl\">link</ulink> or "
+"in the file COPYING-DOCS distributed with this manual."
+msgstr ""
+"Teniu permís per a copiar, distribuir i/o modificar aquest document, sota "
+"els termes de la Llicència de documentació lliure GNU (GFDL), versió 1.1 o "
+"qualsevol versió publicada posteriorment per la Free Software Foundation, "
+"sense seccions invariants, sense texts de portada i sense texts de "
+"contraportada. Podeu trobar una còpia de la GFDL en aquest <ulink type=\"help"
+"\" url=\"ghelp:fdl\">enllaç</ulink> o en el fitxer COPYING-DOCS distribuït "
+"amb aquest manual."
+
+#: C/empathy.xml:12(para)
+msgid ""
+"This manual is part of a collection of GNOME manuals distributed under the "
+"GFDL. If you want to distribute this manual separately from the collection, "
+"you can do so by adding a copy of the license to the manual, as described in "
+"section 6 of the license."
+msgstr ""
+"Aquest manual forma part d'una col·lecció de manuals del GNOME distribuïts "
+"sota la GFDL. Si voleu distribuir aquest manual independentment de la "
+"col·lecció, podeu fer-ho afegint una còpia de la llicència al manual, tal "
+"com es descriu a la secció 6 de la llicència."
-#: C/empathy.xml:55(para)
-msgid "UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER IN TORT (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL THE AUTHOR, INITIAL WRITER, ANY CONTRIBUTOR, OR ANY DISTRIBUTOR OF THE DOCUMENT OR MODIFIED VERSION OF THE DOCUMENT, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER DAMAGES OR LOSSES ARISING OUT OF OR RELATING TO USE OF THE DOCUMENT AND MODIFIED VERSIONS OF THE DOCUMENT, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES."
-msgstr "EN CAP CAS I SOTA CAP INTERPRETACIÓ LEGAL, JA SIGUI PER AGREUJAMENT (INCLOENT-HI LA NEGLIGÈNCIA), CONTRACTE O ALTRE CAS, L'AUTOR, L'ESCRIPTOR ORIGINAL, QUALSEVOL DELS COL·LABORADORS O DISTRIBUÏDORS DEL DOCUMENT O UNA VERSIÓ MODIFICADA DEL DOCUMENT NI CAP PROVEÏDOR D'AQUESTES PARTS NO SERAN RESPONSABLES DAVANT DE NINGÚ PER CAP DANY DIRECTE, INDIRECTE, ESPECIAL, ACCIDENTAL O CONSECUTIU DE QUALSEVOL TIPUS; AIXÒ INCLOU, SENSE LIMITAR-S'HI, ELS DANYS PER PÈRDUA DE CLIENTS, INTERRUPCIONS DE LA FEINA, FALLADA O MALFUNCIONAMENT DE L'ORDINADOR, O QUALSEVOL ALTRA PÈRDUA O DANY RELACIONAT AMB L'ÚS DEL DOCUMENT I LES VERSIONS MODIFICADES DEL DOCUMENT, FINS I TOT SI S'HA INFORMAT AQUESTA PART DE LA POSSIBILITAT D'AQUESTS DANYS."
+#: C/empathy.xml:19(para)
+msgid ""
+"Many of the names used by companies to distinguish their products and "
+"services are claimed as trademarks. Where those names appear in any GNOME "
+"documentation, and the members of the GNOME Documentation Project are made "
+"aware of those trademarks, then the names are in capital letters or initial "
+"capital letters."
+msgstr ""
+"Molts dels noms que les empreses utilitzen per a distingir els seus "
+"productes i serveis es consideren marques comercials. Quan aquests noms "
+"apareguin en qualsevol documentació del GNOME, si els membres del Projecte "
+"de documentació del GNOME han estat avisats pel que fa a les marques, els "
+"noms apareixeran en majúscules o amb les inicials en majúscules."
-#: C/empathy.xml:28(para)
-msgid "DOCUMENT AND MODIFIED VERSIONS OF THE DOCUMENT ARE PROVIDED UNDER THE TERMS OF THE GNU FREE DOCUMENTATION LICENSE WITH THE FURTHER UNDERSTANDING THAT: <placeholder-1/>"
-msgstr "EL DOCUMENT I LES VERSIONS MODIFICADES DEL DOCUMENT S'OFEREIXEN SOTA ELS TERMES DE LA LLICÈNCIA DE DOCUMENTACIÓ LLIURE DE GNU, TENINT EN COMPTE QUE: <placeholder-1/>"
+#: C/empathy.xml:35(para)
+msgid ""
+"DOCUMENT IS PROVIDED ON AN \"AS IS\" BASIS, WITHOUT WARRANTY OF ANY KIND, "
+"EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT "
+"THE DOCUMENT OR MODIFIED VERSION OF THE DOCUMENT IS FREE OF DEFECTS "
+"MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE "
+"RISK AS TO THE QUALITY, ACCURACY, AND PERFORMANCE OF THE DOCUMENT OR "
+"MODIFIED VERSION OF THE DOCUMENT IS WITH YOU. SHOULD ANY DOCUMENT OR "
+"MODIFIED VERSION PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL "
+"WRITER, AUTHOR OR ANY CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY "
+"SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN "
+"ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY DOCUMENT OR MODIFIED VERSION "
+"OF THE DOCUMENT IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER; AND"
+msgstr ""
+"EL DOCUMENT S'OFEREIX «TAL COM ÉS», SENSE CAP TIPUS DE GARANTIA, NI EXPLÍCITA "
+"NI IMPLÍCITA; AIXÒ INCLOU, SENSE LIMITAR-S'HI, LES GARANTIES QUE EL DOCUMENT "
+"O LA VERSIÓ MODIFICADA DEL DOCUMENT NO TINGUI DEFECTES, SIGUI "
+"COMERCIALITZABLE, SIGUI ADEQUAT PER A UN ÚS CONCRET O NO INFRINGEIXI CAP "
+"LLEI. TOT EL RISC PEL QUE FA A LA QUALITAT, EXACTITUD I RENDIMENT DEL "
+"DOCUMENT O LA VERSIÓ MODIFICADA DEL DOCUMENT ÉS VOSTRE. EN CAS QUE EL "
+"DOCUMENT RESULTÉS DEFECTUÓS EN QUALSEVOL ASPECTE, VÓS (NO PAS L'ESCRIPTOR "
+"INICIAL, L'AUTOR O CAP ALTRE COL·LABORADOR) ASSUMIU TOT EL COST DE "
+"MANTENIMENT, REPARACIÓ O CORRECCIÓ. AQUESTA RENÚNCIA DE GARANTIA CONSTITUEIX "
+"UNA PART ESSENCIAL D'AQUESTA LLICÈNCIA. NO S'AUTORITZA L'ÚS DE CAP DOCUMENT "
+"O VERSIÓ MODIFICADA DEL DOCUMENT EXCEPTE SOTA AQUESTA RENÚNCIA DE GARANTIA; I"
+
+#: C/empathy.xml:55(para)
+msgid ""
+"UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER IN TORT (INCLUDING "
+"NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL THE AUTHOR, INITIAL WRITER, ANY "
+"CONTRIBUTOR, OR ANY DISTRIBUTOR OF THE DOCUMENT OR MODIFIED VERSION OF THE "
+"DOCUMENT, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON "
+"FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF "
+"ANY CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, "
+"WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER DAMAGES "
+"OR LOSSES ARISING OUT OF OR RELATING TO USE OF THE DOCUMENT AND MODIFIED "
+"VERSIONS OF THE DOCUMENT, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE "
+"POSSIBILITY OF SUCH DAMAGES."
+msgstr ""
+"EN CAP CAS I SOTA CAP INTERPRETACIÓ LEGAL, JA SIGUI PER AGREUJAMENT "
+"(INCLOENT-HI LA NEGLIGÈNCIA), CONTRACTE O ALTRE CAS, L'AUTOR, L'ESCRIPTOR "
+"ORIGINAL, QUALSEVOL DELS COL·LABORADORS O DISTRIBUÏDORS DEL DOCUMENT O UNA "
+"VERSIÓ MODIFICADA DEL DOCUMENT NI CAP PROVEÏDOR D'AQUESTES PARTS NO SERAN "
+"RESPONSABLES DAVANT DE NINGÚ PER CAP DANY DIRECTE, INDIRECTE, ESPECIAL, "
+"ACCIDENTAL O CONSECUTIU DE QUALSEVOL TIPUS; AIXÒ INCLOU, SENSE LIMITAR-S'HI, "
+"ELS DANYS PER PÈRDUA DE CLIENTS, INTERRUPCIONS DE LA FEINA, FALLADA O "
+"MALFUNCIONAMENT DE L'ORDINADOR, O QUALSEVOL ALTRA PÈRDUA O DANY RELACIONAT "
+"AMB L'ÚS DEL DOCUMENT I LES VERSIONS MODIFICADES DEL DOCUMENT, FINS I TOT SI "
+"S'HA INFORMAT AQUESTA PART DE LA POSSIBILITAT D'AQUESTS DANYS."
+
+#: C/empathy.xml:28(para)
+msgid ""
+"DOCUMENT AND MODIFIED VERSIONS OF THE DOCUMENT ARE PROVIDED UNDER THE TERMS "
+"OF THE GNU FREE DOCUMENTATION LICENSE WITH THE FURTHER UNDERSTANDING THAT: "
+"<placeholder-1/>"
+msgstr ""
+"EL DOCUMENT I LES VERSIONS MODIFICADES DEL DOCUMENT S'OFEREIXEN SOTA ELS "
+"TERMES DE LA LLICÈNCIA DE DOCUMENTACIÓ LLIURE DE GNU, TENINT EN COMPTE QUE: "
+"<placeholder-1/>"
-#: C/empathy.xml:43(firstname)
+#: C/empathy.xml:45(firstname)
msgid "Milo"
msgstr "Milo"
-#: C/empathy.xml:44(surname)
+#: C/empathy.xml:46(surname)
msgid "Casagrande"
msgstr "Casagrande"
-#: C/empathy.xml:47(email)
-msgid "milo_casagrande@yahoo.it"
-msgstr "milo_casagrande@yahoo.it"
+#: C/empathy.xml:49(email)
+msgid "milo@ubuntu.com"
+msgstr "milo@ubuntu.com"
-#: C/empathy.xml:51(firstname)
+#: C/empathy.xml:53(firstname)
msgid "Seth"
msgstr "Seth"
-#: C/empathy.xml:52(surname)
+#: C/empathy.xml:54(surname)
msgid "Dudenhofer"
msgstr "Dudenhofer"
-#: C/empathy.xml:55(email)
+#: C/empathy.xml:57(email)
msgid "sdudenhofer@gmail.com"
msgstr "sdudenhofer@gmail.com"
-#: C/empathy.xml:74(revnumber)
+#: C/empathy.xml:81(revnumber)
+msgid "Empathy Manual V2.1"
+msgstr "Manual de l'Empathy (versió 2.1)"
+
+#: C/empathy.xml:82(date)
+msgid "January 2009"
+msgstr "Gener de 2009"
+
+#: C/empathy.xml:84(para) C/empathy.xml:95(para)
+msgid "Milo Casagrande <email>milo@ubuntu.com</email>"
+msgstr "Milo Casagrande <email>milo@ubuntu.com</email>"
+
+#: C/empathy.xml:92(revnumber)
msgid "Empathy Manual V2.0"
-msgstr "Manual de l'Empathy v2.0"
+msgstr "Manual de l'Empathy (versió 2.0)"
-#: C/empathy.xml:75(date)
+#: C/empathy.xml:93(date)
msgid "April 2008"
msgstr "Abril de 2008"
-#: C/empathy.xml:77(para)
-msgid "Milo Casagrande <email>milo_casagrande@yahoo.it</email>"
-msgstr "Milo Casagrande <email>milo_casagrande@yahoo.it</email>"
-
-#: C/empathy.xml:80(para)
+#: C/empathy.xml:98(para)
msgid "Seth Dudenhofer <email>sdudenhofer@gmail.com</email>"
msgstr "Seth Dudenhofer <email>sdudenhofer@gmail.com</email>"
-#: C/empathy.xml:88(releaseinfo)
-msgid "This manual describes version 2.24 of Empathy."
-msgstr "Aquest manual descriu la versió 2.24 de l'Empathy."
+#: C/empathy.xml:106(releaseinfo)
+msgid "This manual describes version 2.26 of Empathy."
+msgstr "Aquest manual descriu la versió 2.26 de l'Empathy."
-#: C/empathy.xml:92(title)
+#: C/empathy.xml:110(title)
msgid "Feedback"
msgstr "Comentaris"
-#: C/empathy.xml:93(para)
-msgid "To report a bug or make a suggestion regarding the <application>Empathy</application> application or this manual, follow the directions in the <ulink url=\"ghelp:gnome-feedback\" type=\"help\">GNOME Feedback Page</ulink>."
-msgstr "Per a informar d'un error o fer algun suggeriment sobre l'aplicació <application>Empathy</application> o aquest manual, seguiu les indicacions a la <ulink url=\"ghelp:gnome-feedback\" type=\"help\">pàgina de comentaris del GNOME</ulink>."
+#: C/empathy.xml:111(para)
+#, fuzzy
+msgid ""
+"To report a bug or make a suggestion regarding the <application>Empathy</"
+"application> application or this manual, follow the directions in the <ulink "
+"url=\"ghelp:user-guide?feedback\" type=\"help\">GNOME Feedback Page</ulink>."
+msgstr ""
+"Per a informar d'un error o fer algun suggeriment sobre l'aplicació "
+"<application>Empathy</application> o aquest manual, seguiu les indicacions a "
+"la <ulink url=\"ghelp:gnome-feedback\" type=\"help\">pàgina de comentaris "
+"del GNOME</ulink>."
-#: C/empathy.xml:101(para)
+#: C/empathy.xml:118(para)
msgid "Empathy is an application for instant messaging."
msgstr "L'Empathy és una aplicació de missatgeria instantània."
-#: C/empathy.xml:109(primary) C/empathy.xml:0(application) C/empathy.xml:0(application)
+#: C/empathy.xml:126(primary) C/empathy.xml:0(application)
msgid "Empathy"
msgstr "Empathy"
-#: C/empathy.xml:112(primary)
+#: C/empathy.xml:129(primary)
msgid "empathy"
msgstr "empathy"
-#: C/empathy.xml:113(secondary)
+#: C/empathy.xml:130(secondary)
msgid "istant messaging"
msgstr "missatgeria instantània"
-#: C/empathy.xml:117(title)
+#: C/empathy.xml:134(title)
msgid "Introduction"
msgstr "Introducció"
-#: C/empathy.xml:118(para)
-msgid "<application>Empathy</application> is a multi-protocol instant messaging program for the GNOME Desktop. With <application>Empathy</application> you can keep in touch with all of your friends through lots of supported instant messaging services."
-msgstr "L'<application>Empathy</application> és un programa de missatgeria instantània multi-protocol per a l'escriptori GNOME. Amb l'<application>Empathy</application> podeu mantenir-vos amb contacte amb tots els vostres amics a través dels molts serveis de missatgeria instantània compatibles."
+#: C/empathy.xml:135(para)
+msgid ""
+"<application>Empathy</application> is a multi-protocol instant messaging "
+"program for the GNOME Desktop. With <application>Empathy</application> you "
+"can keep in touch with all of your friends through lots of supported instant "
+"messaging services."
+msgstr ""
+"L'<application>Empathy</application> és un programa de missatgeria "
+"instantània multi-protocol per a l'escriptori GNOME. Amb "
+"l'<application>Empathy</application> podeu mantenir-vos en contacte amb tots "
+"els vostres amics a través dels molts serveis de missatgeria instantània "
+"compatibles."
-#: C/empathy.xml:128(acronym)
+#: C/empathy.xml:145(acronym)
msgid "AIM"
msgstr "AIM"
-#: C/empathy.xml:132(para)
+#: C/empathy.xml:149(para)
msgid "Google Talk"
msgstr "Google Talk"
-#: C/empathy.xml:137(para)
+#: C/empathy.xml:154(para) C/empathy.xml:1089(title)
msgid "ICQ"
msgstr "ICQ"
-#: C/empathy.xml:143(acronym)
+#: C/empathy.xml:160(acronym)
msgid "IRC"
msgstr "IRC"
-#: C/empathy.xml:147(para)
-msgid "Jabber"
-msgstr "Jabber"
+#: C/empathy.xml:164(para)
+msgid "Jabber (or <acronym>XMPP</acronym>)"
+msgstr "Jabber (o <acronym>XMPP</acronym>)"
-#: C/empathy.xml:153(acronym)
+#: C/empathy.xml:170(acronym)
msgid "MSN"
msgstr "MSN"
-#: C/empathy.xml:157(para) C/empathy.xml:440(para)
+#: C/empathy.xml:174(para) C/empathy.xml:441(para) C/empathy.xml:1049(title)
msgid "Salut"
msgstr "Salut"
-#: C/empathy.xml:163(acronym)
+#: C/empathy.xml:180(acronym)
msgid "SIP"
msgstr "SIP"
-#: C/empathy.xml:167(para)
+#: C/empathy.xml:184(para) C/empathy.xml:919(title)
msgid "Yahoo"
msgstr "Yahoo"
-#: C/empathy.xml:123(para)
-msgid "<application>Empathy</application> supports the following services: <placeholder-1/>"
-msgstr "L'<application>Empathy</application> és compatible amb els serveis següents: <placeholder-1/>"
+#: C/empathy.xml:189(para)
+msgid "And many others..."
+msgstr "I molts altres..."
+
+#: C/empathy.xml:140(para)
+msgid ""
+"<application>Empathy</application> supports the following services: "
+"<placeholder-1/>"
+msgstr ""
+"L'<application>Empathy</application> és compatible amb els serveis següents: "
+"<placeholder-1/>"
-#: C/empathy.xml:176(title)
+#: C/empathy.xml:198(title)
msgid "Getting Started"
msgstr "Primers passos"
-#: C/empathy.xml:179(title)
+#: C/empathy.xml:201(title)
msgid "Starting Empathy"
msgstr "Com iniciar l'Empathy"
-#: C/empathy.xml:180(para)
+#: C/empathy.xml:202(para)
msgid "You can start <application>Empathy</application> in the following ways:"
-msgstr "Podeu iniciar l'<application>Empathy</application> de les maneres següents:"
+msgstr ""
+"Podeu iniciar l'<application>Empathy</application> de les maneres següents:"
-#: C/empathy.xml:184(term)
+#: C/empathy.xml:206(term)
msgid "<guimenu>Applications</guimenu> menu"
msgstr "Menú <guimenu>Aplicacions</guimenu>"
-#: C/empathy.xml:186(para)
-msgid "Choose <menuchoice><guisubmenu>Internet</guisubmenu><guimenuitem>Empathy Instant Messenger</guimenuitem></menuchoice>."
-msgstr "Trieu <menuchoice><guisubmenu>Internet</guisubmenu><guimenuitem>Missatgeria instantània Empathy</guimenuitem></menuchoice>."
+#: C/empathy.xml:208(para)
+msgid ""
+"Choose <menuchoice><guisubmenu>Internet</guisubmenu><guimenuitem>Empathy "
+"Instant Messenger</guimenuitem></menuchoice>."
+msgstr ""
+"Trieu <menuchoice><guisubmenu>Internet</guisubmenu><guimenuitem>Missatgeria "
+"instantània Empathy</guimenuitem></menuchoice>."
-#: C/empathy.xml:195(term)
+#: C/empathy.xml:217(term)
msgid "Command line"
msgstr "Línia d'ordres"
-#: C/empathy.xml:197(para)
+#: C/empathy.xml:219(para)
msgid "Type <command>empathy</command> and then press <keycap>Enter</keycap>."
msgstr "Introduïu <command>empathy</command> i premeu <keycap>Retorn</keycap>."
-#: C/empathy.xml:206(title)
+#: C/empathy.xml:228(title)
msgid "When You Start Empathy"
msgstr "Quan inicieu l'Empathy"
-#: C/empathy.xml:211(title)
+#: C/empathy.xml:233(title)
msgid "<application>Empathy</application> Main Window"
msgstr "Finestra principal de l'<application>Empathy</application>"
-#: C/empathy.xml:218(phrase)
-msgid "Shows <placeholder-1/> main window. Contains the titlebar, the menubar, contact list, status icon and status arrow button list."
-msgstr "Mostra la finestra principal de l'<placeholder-1/>. Conté la barra de títol, la barra de menú, la llista de contactes, la icona d'estat i el botó fletxa de la llista d'estats."
+#: C/empathy.xml:240(phrase)
+msgid ""
+"Shows <placeholder-1/> main window. Contains the titlebar, the menubar, "
+"contact list, status icon and status arrow button list."
+msgstr ""
+"Mostra la finestra principal de l'<placeholder-1/>. Conté la barra de títol, "
+"la barra de menú, la llista de contactes, la icona d'estat i el botó fletxa "
+"de la llista d'estats."
-#: C/empathy.xml:207(para)
-msgid "When you start <application>Empathy</application> the following window is shown. <placeholder-1/>"
-msgstr "Quan inicieu l'<application>Empathy</application> es mostrarà la finestra següent. <placeholder-1/>"
+#: C/empathy.xml:229(para)
+msgid ""
+"When you start <application>Empathy</application> the following window is "
+"shown. <placeholder-1/>"
+msgstr ""
+"Quan inicieu l'<application>Empathy</application> es mostrarà la finestra "
+"següent. <placeholder-1/>"
-#: C/empathy.xml:233(title)
+#: C/empathy.xml:255(title)
msgid "<application>Empathy</application> Main Components"
msgstr "Els components principals de l'<application>Empathy</application>"
-#: C/empathy.xml:240(para)
+#: C/empathy.xml:262(para)
msgid "Component"
msgstr "Component"
-#: C/empathy.xml:243(para)
+#: C/empathy.xml:265(para)
msgid "Description"
msgstr "Descripció"
-#: C/empathy.xml:250(para)
+#: C/empathy.xml:272(para)
msgid "Menubar"
msgstr "Barra de menú"
-#: C/empathy.xml:253(para)
-msgid "Contains menus used to perform actions in <application>Empathy</application>."
-msgstr "Conté els menús utilitzats per a realitzar accions a l'<application>Empathy</application>."
+#: C/empathy.xml:275(para)
+msgid ""
+"Contains menus used to perform actions in <application>Empathy</application>."
+msgstr ""
+"Conté els menús utilitzats per a realitzar accions a l'<application>Empathy</"
+"application>."
-#: C/empathy.xml:260(para)
+#: C/empathy.xml:282(para)
msgid "Status Drop-Down List"
msgstr "Llista desplegable d'estats"
-#: C/empathy.xml:263(para)
-msgid "Allows to update the user's status."
-msgstr "Permet actualitzar l'estat de l'usuari."
+#: C/empathy.xml:285(para)
+msgid "Allows to update the status."
+msgstr "Permet actualitzar l'estat."
-#: C/empathy.xml:270(para)
+#: C/empathy.xml:292(para)
msgid "Account Button"
msgstr "Botó de compte"
-#: C/empathy.xml:273(para)
+#: C/empathy.xml:295(para)
msgid "Opens the <guilabel>Accounts</guilabel> dialog."
msgstr "Obre el diàleg de <guilabel>Comptes</guilabel>."
-#: C/empathy.xml:280(para)
+#: C/empathy.xml:302(para)
msgid "Contact List"
msgstr "Llista de contactes"
-#: C/empathy.xml:283(para)
+#: C/empathy.xml:305(para)
msgid "Shows all the available contacts and their associated status."
msgstr "Mostra tots els contactes disponibles i el seu estat associat."
-#: C/empathy.xml:229(para)
-msgid "<xref linkend=\"empathy-TBL-1\"/> describes the components of <application>Empathy</application>'s main window. <table frame=\"topbot\" id=\"empathy-TBL-1\"><placeholder-1/><tgroup cols=\"2\" colsep=\"0\" rowsep=\"0\"><colspec colname=\"colspec0\" colwidth=\"29.39*\"/><colspec colname=\"colspec1\" colwidth=\"70.61*\"/><placeholder-2/><placeholder-3/></tgroup></table>"
-msgstr "La <xref linkend=\"empathy-TBL-1\"/> descriu els components de la finestra principal de l'<application>Empathy</application>. <table frame=\"topbot\" id=\"empathy-TBL-1\"><placeholder-1/><tgroup cols=\"2\" colsep=\"0\" rowsep=\"0\"><colspec colname=\"colspec0\" colwidth=\"29.39*\"/><colspec colname=\"colspec1\" colwidth=\"70.61*\"/><placeholder-2/><placeholder-3/></tgroup></table>"
-
-#: C/empathy.xml:296(title)
-msgid "When You Start Empathy for the First Time"
-msgstr "Quan inicieu l'Empathy per primer cop"
-
-#: C/empathy.xml:302(title)
-msgid "<application>Empathy</application> Accounts Dialog"
-msgstr "Diàleg de comptes de l'<application>Empathy</application>"
-
-#: C/empathy.xml:309(phrase)
-msgid "Shows <placeholder-1/> account creation dialog."
-msgstr "Mostra el diàleg de creació de comptes de l'<placeholder-1/>."
-
-#: C/empathy.xml:297(para)
-msgid "When you start <application>Empathy</application> for the first time and you don't have configured any account yet, the following dialog is shown. <placeholder-1/>"
-msgstr "Quan inicieu l'<application>Empathy</application> per primer cop i encara no teniu configurat cap compte, es mostrarà el diàleg següent. <placeholder-1/>"
-
-#: C/empathy.xml:318(para)
-msgid "From here, you can configure and create your accounts. See <xref linkend=\"empathy-accounts\"/> for more information."
-msgstr "Des d'aquí podeu configurar i crear els vostres comptes. Per a obtenir més informació vegeu la <xref linkend=\"empathy-accounts\"/>."
-
-#: C/empathy.xml:327(title)
+#: C/empathy.xml:251(para)
+msgid ""
+"<xref linkend=\"empathy-TBL-1\"/> describes the components of "
+"<application>Empathy</application>'s main window. <table frame=\"topbot\" id="
+"\"empathy-TBL-1\"><placeholder-1/><tgroup cols=\"2\" colsep=\"0\" rowsep=\"0"
+"\"><colspec colname=\"colspec0\" colwidth=\"29.39*\"/><colspec colname="
+"\"colspec1\" colwidth=\"70.61*\"/><placeholder-2/><placeholder-3/></tgroup></"
+"table>"
+msgstr ""
+"La <xref linkend=\"empathy-TBL-1\"/> descriu els components de la finestra "
+"principal de l'<application>Empathy</application>. <table frame=\"topbot\" "
+"id=\"empathy-TBL-1\"><placeholder-1/><tgroup cols=\"2\" colsep=\"0\" rowsep="
+"\"0\"><colspec colname=\"colspec0\" colwidth=\"29.39*\"/><colspec colname="
+"\"colspec1\" colwidth=\"70.61*\"/><placeholder-2/><placeholder-3/></tgroup></"
+"table>"
+
+#: C/empathy.xml:319(title)
msgid "Accounts"
msgstr "Comptes"
-#: C/empathy.xml:328(para)
-msgid "To use <application>Empathy</application> you need at least one account of the supported services."
-msgstr "Per a utilitzar l'<application>Empathy</application> heu de tenir com a mínim un compte dels serveis compatibles."
+#: C/empathy.xml:320(para)
+msgid ""
+"To use <application>Empathy</application> you need at least one account of "
+"the supported services."
+msgstr ""
+"Per a utilitzar l'<application>Empathy</application> heu de tenir com a "
+"mínim un compte dels serveis compatibles."
-#: C/empathy.xml:331(para)
-msgid "If you don't already have an account and you don't have your <emphasis>user name</emphasis> and <emphasis>password</emphasis>, you need to register a new account (see <xref linkend=\"empathy-register-account\"/>)."
-msgstr "Si encara no teniu un compte o no teniu el vostre <emphasis>nom d'usuari</emphasis> i <emphasis>contrasenya</emphasis>, necessitareu registrar-vos a un compte nou (vegeu la <xref linkend=\"empathy-register-account\"/>)."
+#: C/empathy.xml:323(para)
+msgid ""
+"If you don't already have an account and you don't have your <emphasis>user "
+"name</emphasis> and <emphasis>password</emphasis>, you need to register a "
+"new account (see <xref linkend=\"empathy-register-account\"/>)."
+msgstr ""
+"Si encara no teniu un compte o no teniu el vostre <emphasis>nom d'usuari</"
+"emphasis> i <emphasis>contrasenya</emphasis>, us caldrà registrar un compte "
+"nou (vegeu la <xref linkend=\"empathy-register-account\"/>)."
-#: C/empathy.xml:336(para)
-msgid "In order to talk with other users (called <emphasis>contatcs</emphasis>), you need to use the same service they are using. If, for example, one contact is using the <emphasis role=\"strong\">Jabber</emphasis> service, you need to have an account registerd with that service."
-msgstr "Per a poder parlar amb altres usuaris (anomenats <emphasis>contactes</emphasis>), necessiteu utilitzar el mateix servei que estan utilitzant. Per exemple, si el contacte utilitza el servei <emphasis role=\"strong\">Jabber</emphasis>, necessitareu tenir un compte registrat a aquest servei."
+#: C/empathy.xml:328(para)
+msgid ""
+"In order to talk with other users, also called <emphasis>contacts</"
+"emphasis>, you need to use the same service they are using. If, for example, "
+"one contact is using the <emphasis role=\"strong\">Jabber</emphasis> "
+"service, you need to have an account registered with that service."
+msgstr ""
+"Per a poder parlar amb altres usuaris, també anomenats <emphasis>contactes</"
+"emphasis>, necessiteu utilitzar el mateix servei que ells estiguin "
+"utilitzant. Per exemple, si el contacte utilitza el servei <emphasis role="
+"\"strong\">Jabber</emphasis>, necessitareu tenir un compte registrat a "
+"aquest servei."
-#: C/empathy.xml:343(para)
-msgid "<application>Empathy</application> can handle as many accounts on any supported services as you want and you can have them all open at the same time."
-msgstr "L'<application>Empathy</application> pot gestionar tants comptes com vulgueu de qualsevol dels serveis compatibles i els podeu tenir tots oberts a la mateixa vegada."
+#: C/empathy.xml:335(para)
+msgid ""
+"<application>Empathy</application> can handle as many accounts on any "
+"supported services as you want and you can have them all open at the same "
+"time."
+msgstr ""
+"L'<application>Empathy</application> pot gestionar tants comptes com vulgueu "
+"de qualsevol dels serveis compatibles i els podeu tenir tots oberts alhora."
-#: C/empathy.xml:349(title)
+#: C/empathy.xml:341(title)
msgid "Registering an Account"
msgstr "Com registrar un compte"
-#: C/empathy.xml:350(para)
-msgid "You can freely register an account on any of the following services. Follow the instructions reported on each website on how to register your new account. At the end of the registration process you should have a <emphasis>user name</emphasis> (or an <emphasis>account ID</emphasis>) and a <emphasis>password</emphasis> that you will use to create the account in <application>Empathy</application>."
-msgstr "Podeu registrar gratuïtament un compte a qualsevol dels serveis següents. Seguiu les instruccions proporcionades a cada lloc web de com registrar el vostre compte nou. Al final del procés de registre hauríeu de tenir un <emphasis>nom d'usuari</emphasis> (o un <emphasis>ID del compte</emphasis>) i una <emphasis>contrasenya</emphasis> que utilitzareu per a a crear el compte a l'<application>Empathy</application>."
+#: C/empathy.xml:342(para)
+msgid ""
+"You can freely register an account on any of the following services. Follow "
+"the instructions reported on each website on how to register your new "
+"account. At the end of the registration process you should have a "
+"<emphasis>user name</emphasis> (or an <emphasis>account ID</emphasis>) and a "
+"<emphasis>password</emphasis> that you will use to create the account in "
+"<application>Empathy</application>."
+msgstr ""
+"Podeu registrar gratuïtament un compte a qualsevol dels serveis següents. "
+"Seguiu les instruccions proporcionades a cada lloc web sobre com registrar "
+"el vostre compte nou. Al final del procés de registre hauríeu de tenir un "
+"<emphasis>nom d'usuari</emphasis> (o un <emphasis>identificador del compte</"
+"emphasis>) i una <emphasis>contrasenya</emphasis>, els quals utilitzareu per "
+"a a crear el compte a l'<application>Empathy</application>."
#. Translators: try to find a localized version of the
#. registration service website
-#: C/empathy.xml:368(para)
-msgid "The <ulink type=\"http\" url=\"http://dashboard.aim.com/aim\">AIM</ulink> service."
-msgstr "El servei <ulink type=\"http\" url=\"http://dashboard.aim.com/aim\">AIM</ulink>."
+#: C/empathy.xml:360(para)
+msgid ""
+"The <ulink type=\"http\" url=\"http://dashboard.aim.com/aim\">AIM</ulink> "
+"service."
+msgstr ""
+"El servei <ulink type=\"http\" url=\"http://dashboard.aim.com/aim\">AIM</"
+"ulink>."
#. Translators: try to find a localized version of the
#. registration service website
-#: C/empathy.xml:375(para)
-msgid "The <ulink type=\"http\" url=\"http://www.google.com/talk/\">Google Talk</ulink> service."
-msgstr "El servei <ulink type=\"http\" url=\"http://www.google.com/talk/\">Google Talk</ulink>."
+#: C/empathy.xml:367(para)
+msgid ""
+"The <ulink type=\"http\" url=\"http://www.google.com/talk/\">Google Talk</"
+"ulink> service."
+msgstr ""
+"El servei <ulink type=\"http\" url=\"http://www.google.cat/talk/\">Google "
+"Talk</ulink>."
#. Translators: try to find a localized version of the
#. registration service website
-#: C/empathy.xml:383(para)
-msgid "The <ulink type=\"http\" url=\"https://www.icq.com/register/\">ICQ</ulink> service."
-msgstr "El servei <ulink type=\"http\" url=\"https://www.icq.com/register/\">ICQ</ulink>."
+#: C/empathy.xml:375(para)
+msgid ""
+"The <ulink type=\"http\" url=\"https://www.icq.com/register/\">ICQ</ulink> "
+"service."
+msgstr ""
+"El servei <ulink type=\"http\" url=\"https://www.icq.com/register/\">ICQ</"
+"ulink>."
#. Translators: try to find a localized version of the
#. registration service website
-#: C/empathy.xml:390(para)
-msgid "The <ulink type=\"http\" url=\"https://accountservices.passport.net\">MSN</ulink> service."
-msgstr "El servei <ulink type=\"http\" url=\"https://accountservices.passport.net\">MSN</ulink>."
+#: C/empathy.xml:382(para)
+msgid ""
+"The <ulink type=\"http\" url=\"https://accountservices.passport.net\">MSN</"
+"ulink> service."
+msgstr ""
+"El servei <ulink type=\"http\" url=\"https://accountservices.passport.net"
+"\">MSN</ulink>."
#. Translators: try to find a localized version of the
#. registration service website
-#: C/empathy.xml:397(para)
-msgid "The <ulink type=\"http\" url=\"https://login.yahoo.com/config/login\">Yahoo</ulink> service."
-msgstr "El servei <ulink type=\"http\" url=\"https://login.yahoo.com/config/login\">Yahoo</ulink>."
+#: C/empathy.xml:389(para)
+msgid ""
+"The <ulink type=\"http\" url=\"https://login.yahoo.com/config/login\">Yahoo</"
+"ulink> service."
+msgstr ""
+"El servei <ulink type=\"http\" url=\"https://login.yahoo.com/config/login"
+"\">Yahoo</ulink>."
-#: C/empathy.xml:359(para)
+#: C/empathy.xml:351(para)
msgid "Click on the name of the service to visit its website: <placeholder-1/>"
-msgstr "Feu clic al nom del servei per a visitar el seu lloc web: <placeholder-1/>"
+msgstr ""
+"Feu clic al nom del servei per a anar al seu lloc web: <placeholder-1/>"
-#: C/empathy.xml:403(para)
-msgid "For registering a <acronym>SIP</acronym> account, you can use one of the following service:"
-msgstr "Per a registrar un compte <acronym>SIP</acronym> podeu utilitzar un dels serveis següents:"
+#: C/empathy.xml:395(para)
+msgid ""
+"For registering a <acronym>SIP</acronym> account, you can use one of the "
+"following service:"
+msgstr ""
+"Per a registrar un compte <acronym>SIP</acronym> podeu utilitzar un dels "
+"serveis següents:"
#. Translators: try to find a localized version of the
#. registration service website
-#: C/empathy.xml:412(para)
-msgid "The <ulink type=\"http\" url=\"http://www.ekiga.net/user/reg/\">Ekiga</ulink> service."
-msgstr "El servei <ulink type=\"http\" url=\"http://www.ekiga.net/user/reg/\">Ekiga</ulink>."
+#: C/empathy.xml:404(para)
+msgid ""
+"The <ulink type=\"http\" url=\"https://www.ekiga.net/index.php?page=register"
+"\">Ekiga</ulink> service."
+msgstr ""
+"El servei <ulink type=\"http\" url=\"https://www.ekiga.net/index.php?"
+"page=register\">Ekiga</ulink>."
#. Translators: try to find a localized version of the
#. registration service website
-#: C/empathy.xml:419(para)
-msgid "The <ulink type=\"http\" url=\"http://account2.freeworlddialup.com/index.php?section_id=94\"><acronym>FWD</acronym></ulink> (Free World Dialup) service."
-msgstr "El servei <ulink type=\"http\" url=\"http://account2.freeworlddialup.com/index.php?section_id=94\"><acronym>FWD</acronym></ulink> (Free World Dialup)."
+#: C/empathy.xml:411(para)
+msgid ""
+"The <ulink type=\"http\" url=\"http://account2.freeworlddialup.com/index.php?"
+"section_id=94\"><acronym>FWD</acronym></ulink> (Free World Dialup) service."
+msgstr ""
+"El servei <ulink type=\"http\" url=\"http://account2.freeworlddialup.com/"
+"index.php?section_id=94\"><acronym>FWD</acronym></ulink> (Free World Dialup)."
#. Translators: try to find a localized version of the
#. registration service website
-#: C/empathy.xml:427(para)
-msgid "The <ulink type=\"http\" url=\"https://signup.sipphone.com/new-users/app?class=NewUser;proc=start\">Sipphone</ulink> service."
-msgstr "El servei <ulink type=\"http\" url=\"https://signup.sipphone.com/new-users/app?class=NewUser;proc=start\">Sipphone</ulink>."
+#: C/empathy.xml:419(para)
+msgid ""
+"The <ulink type=\"http\" url=\"https://signup.sipphone.com/new-users/app?"
+"class=NewUser;proc=start\">Sipphone</ulink> service."
+msgstr ""
+"El servei <ulink type=\"http\" url=\"https://signup.sipphone.com/new-users/"
+"app?class=NewUser;proc=start\">Sipphone</ulink>."
-#: C/empathy.xml:433(para)
-msgid "You can use one of the following services if you already have a <emphasis role=\"strong\">Jabber</emphasis> account:"
-msgstr "Podeu utilitzar un dels serveis següents si ja teniu un compte <emphasis role=\"strong\">Jabber</emphasis>:"
+#: C/empathy.xml:425(para)
+msgid ""
+"For registering a <emphasis role=\"strong\">Jabber</emphasis> account, you "
+"can use the automatic account creation of <application>Empathy</"
+"application>. Not all Jabber service providers support the automatic "
+"creation of accounts, one service provider known to work with "
+"<application>Empathy</application> is <ulink type=\"http\" url=\"http://www."
+"jabber.org/web/Jabber.org\">jabber.org</ulink>."
+msgstr ""
+"Per a registrar un compte <emphasis role=\"strong\">Jabber</emphasis>, podeu "
+"utilitzar la creació automàtica de comptes de l'<application>Empathy</"
+"application>. Tingueu en compte que no tots els proveïdors de servei Jabber "
+"admeten la creació automàtica de comptes. Un dels proveïdor de servei que "
+"funciona amb l'<application>Empathy</application> és el <ulink type=\"http\" "
+"url=\"http://www.jabber.org/web/Jabber.org\">jabber.org</ulink>."
+
+#: C/empathy.xml:433(para)
+msgid ""
+"If you already have a <emphasis role=\"strong\">Jabber</emphasis> account, "
+"you can use one of the following services:"
+msgstr ""
+"Si ja teniu un compte <emphasis role=\"strong\">Jabber</emphasis>, podeu "
+"utilitzar un dels serveis següents:"
+
+#: C/empathy.xml:450(title)
+msgid "Adding your Account to <application>Empathy</application>"
+msgstr "Com afegir un compte a l'<application>Empathy</application>."
+
+#: C/empathy.xml:455(para) C/empathy.xml:533(para) C/empathy.xml:585(para)
+#: C/empathy.xml:618(para) C/empathy.xml:648(para) C/empathy.xml:671(para)
+msgid ""
+"From the <link linkend=\"empathy-FIG-mainwindow\">main window </link> "
+"(<guilabel>Contact List</guilabel>) click on the account button or press "
+"<keycap>F4</keycap> to open the <guilabel>Accounts</guilabel> dialog."
+msgstr ""
+"Des de la <link linkend=\"empathy-FIG-mainwindow\">finestra principal</link> "
+"(<guilabel>Llista de contactes</guilabel>) feu clic al botó de compte o "
+"premeu la tecla <keycap>F4</keycap> per a obrir el diàleg de "
+"<guilabel>Comptes</guilabel>."
+
+#: C/empathy.xml:467(para) C/empathy.xml:484(para)
+msgid ""
+"From the <guilabel>Type</guilabel> drop-down list choose the service you "
+"wish to add an account for, then click on the <guibutton>Create</guibutton> "
+"button."
+msgstr ""
+"Des de la llista desplegable <guilabel>Tipus</guilabel> trieu el servei al "
+"qual voleu afegir un compte i seguidament feu clic al botó <guibutton>Crea</"
+"guibutton>."
+
+#: C/empathy.xml:463(para)
+msgid ""
+"If it is the first time you launch <application>Empathy</application>: "
+"<placeholder-1/>"
+msgstr ""
+"Si és el primer cop que executeu l'<application>Empathy</application>: "
+"<placeholder-1/>"
+
+#: C/empathy.xml:479(para)
+msgid "Click on the <guilabel>Add</guilabel> button."
+msgstr "Feu clic al botó <guilabel>Afegeix</guilabel>."
+
+#: C/empathy.xml:475(para)
+msgid "Otherwise: <placeholder-1/>"
+msgstr "Altrament: <placeholder-1/>"
+
+#: C/empathy.xml:494(para)
+msgid ""
+"Fill the required fields with your <emphasis>user name</emphasis> and "
+"<emphasis>password</emphasis>. Optionally, you can modify some advanced "
+"options. For more information, see <xref linkend=\"empathy-advanced-options"
+"\"/>."
+msgstr ""
+"Ompliu els camps necessaris amb el vostre <emphasis>nom d'usuari</emphasis> "
+"i la <emphasis>contrasenya</emphasis>. Opcionalment, podeu modificar algunes "
+"opcions avançades. Per a obtenir més informació, vegeu la <xref linkend="
+"\"empathy-advanced-options\"/>."
+
+#: C/empathy.xml:503(para) C/empathy.xml:566(para)
+msgid ""
+"To enable the new account, select the <guilabel>Enabled</guilabel> check-box "
+"next to the name of the account in the box on the left."
+msgstr ""
+"Per a habilitar el compte nou, seleccioneu la casella de selecció "
+"<guilabel>Habilitat</guilabel> al costat del nom del compte al quadre de "
+"l'esquerra."
+
+#: C/empathy.xml:451(para)
+msgid ""
+"To add your account to <application>Empathy</application>, proceed as "
+"follows: <placeholder-1/>"
+msgstr ""
+"Per a afegir el vostre compte a l'<application>Empathy</application>, feu el "
+"següent: <placeholder-1/>"
+
+#: C/empathy.xml:513(title)
+msgid "Importing Accounts"
+msgstr "Com importar un compte"
+
+#: C/empathy.xml:514(para)
+msgid ""
+"If you use another instant messaging program, you can import the accounts "
+"from that program into <application>Empathy</application>"
+msgstr ""
+"Si utilitzeu un altre programa de missatgeria instantània, podeu importar "
+"els comptes d'aquest programa a l'<application>Empathy</application>"
+
+#: C/empathy.xml:520(para)
+msgid ""
+"At the moment <application>Empathy</application> can import the accounts "
+"only from the instant messaging program <application>Pidgin</application>. "
+"For more information about <application>Pidgin</application>, see the <ulink "
+"type=\"http\" url=\"http://www.pidgin.im/\">Pidgin website</ulink>."
+msgstr ""
+"En aquest moment l'<application>Empathy</application> només pot importar els "
+"comptes del programa de missatgeria instantània <application>Pidgin</"
+"application>. Per a obtenir més informació sobre el <application>Pidgin</"
+"application>, vegeu el <ulink type=\"http\" url=\"http://www.pidgin.im/"
+"\">lloc web del Pidgin</ulink>."
+
+#: C/empathy.xml:541(para)
+msgid ""
+"Click on the <guibutton>Import Accounts...</guibutton> button to open the "
+"<guilabel>Import Accounts</guilabel> dialog."
+msgstr ""
+"Feu clic al botó <guibutton>Importació de comptes...</guibutton> per a obrir "
+"el diàleg <guilabel>Importa els comptes</guilabel>."
+
+#: C/empathy.xml:548(para)
+msgid ""
+"Select the accounts you would like to import by clicking on the "
+"<guilabel>Import</guilabel> check-box."
+msgstr ""
+"Seleccioneu els comptes que vulgueu importar fent clic a la casella de "
+"selecció <guilabel>Importa</guilabel>."
+
+#: C/empathy.xml:554(para)
+msgid ""
+"When you have selected all the desired accounts, click <guibutton>OK</"
+"guibutton> to import them. If you don't want to import the accounts, click "
+"<guibutton>Cancel</guibutton>."
+msgstr ""
+"Quan hàgiu seleccionat tots els comptes desitjats, feu clic a "
+"<guibutton>D'acord</guibutton> per a importar-los. Si no voleu importar els "
+"comptes, feu clic a <guibutton>Cancel·la</guibutton>."
+
+#: C/empathy.xml:562(para)
+msgid ""
+"When you import a new account into <application>Empathy</application>, it "
+"will not be enabled by default."
+msgstr ""
+"Quan importeu un compte nou a l'<application>Empathy</application>, aquest "
+"no s'habilitarà per defecte."
+
+#: C/empathy.xml:529(para)
+msgid ""
+"To import the accounts into <application>Empathy</application>, proceed as "
+"follows: <placeholder-1/>"
+msgstr ""
+"Per a importar els comptes a l'<application>Empathy</application>, feu el "
+"següent: <placeholder-1/>"
+
+#: C/empathy.xml:578(title)
+msgid "Editing an Account"
+msgstr "Com editar un compte"
-#: C/empathy.xml:449(title)
-msgid "Creating an Account"
-msgstr "Com crear un compte"
+#: C/empathy.xml:593(para)
+msgid "Select the account you wish to edit in the box on the left."
+msgstr "Seleccioneu el compte que vulgueu editar al quadre de l'esquerra."
-#: C/empathy.xml:454(para) C/empathy.xml:500(para) C/empathy.xml:522(para)
-msgid "From the <link linkend=\"empathy-FIG-mainwindow\">main window </link> (<guilabel>Contact List</guilabel>) click on the account button to open the <guilabel>Accounts</guilabel> dialog."
-msgstr "Des de la <link linkend=\"empathy-FIG-mainwindow\">finestra principal</link> (<guilabel>Llista de contactes</guilabel>) feu clic al botó de compte per a obrir el diàleg de <guilabel>Comptes</guilabel>."
+#: C/empathy.xml:599(para)
+msgid "Modify the desired data."
+msgstr "Modifiqueu les dades desitjades."
-#: C/empathy.xml:462(para)
-msgid "Click on the <guibutton>Add</guibutton> button."
-msgstr "Feu clic al botó <guibutton>Afegeix</guibutton>."
+#: C/empathy.xml:579(para)
+msgid ""
+"To edit one of your accounts, i.e. to change the <emphasis>password</"
+"emphasis> or your <emphasis>user name</emphasis>, proceed as follows: "
+"<placeholder-1/>"
+msgstr ""
+"Per a editar un dels vostres comptes, per exemple per a canviar la "
+"<emphasis>contrasenya</emphasis> o el <emphasis>nom d'usuari</emphasis>, feu "
+"el següent: <placeholder-1/>"
-#: C/empathy.xml:467(para)
-msgid "From the <guilabel>Type</guilabel> drop-down list choose the service you wish to create an account for, then click on the <guibutton>Create</guibutton> button."
-msgstr "Des de la llista desplegable <guilabel>Tipus</guilabel> trieu el servei del que en voleu crear un compte, després feu clic al botó <guibutton>Crea</guibutton>."
+#: C/empathy.xml:607(para)
+msgid ""
+"Based on the type of the account, it is possibile to edit different settings."
+msgstr ""
+"En funció del tipus de compte, és possible editar diferents paràmetres."
-#: C/empathy.xml:474(para)
-msgid "Fill the required fields with your <emphasis>user name</emphasis> and <emphasis>password</emphasis>."
-msgstr "Empleneu els camps necessaris amb el vostre <emphasis>nom d'usuari</emphasis> i <emphasis>contrasenya</emphasis>."
+#: C/empathy.xml:626(para)
+#, fuzzy
+msgid ""
+"Select the account you wish to edit in the box on the left and double-click "
+"on its name."
+msgstr ""
+"Seleccioneu el compte que vulgueu editar al quadre de l'esquerra i feu doble "
+"clic al seu nom."
-#: C/empathy.xml:480(para)
-msgid "To enable the new account, select the <guilabel>Enabled</guilabel> check-box next to the name of the account."
-msgstr "Per a habilitar el compte nou, seleccioneu la casella de selecció <guilabel>Habilitat</guilabel> al costat del nom del compte."
+#: C/empathy.xml:632(para)
+msgid "Change the name of the account as you desire."
+msgstr "Canvieu el nom del compte de la manera que vulgueu."
-#: C/empathy.xml:450(para)
-msgid "To create an account, proceed as follow: <placeholder-1/>"
-msgstr "Per a crear un compte, procediu com segueix: <placeholder-1/>"
+#: C/empathy.xml:613(para)
+msgid ""
+"To modify the identifier of an account, how <application>Empathy</"
+"application> identifies an account, proceed as follows: <placeholder-1/>"
+msgstr ""
+"Per a modificar l'identificador d'un compte, és a dir, la manera com "
+"l'<application>Empathy</application> identifica un compte, feu el següent: "
+"<placeholder-1/>"
-#: C/empathy.xml:493(title)
+#: C/empathy.xml:641(title)
msgid "Disabling and Removing an Account"
msgstr "Com inhabilitar i suprimir un compte"
-#: C/empathy.xml:494(para)
-msgid "To disable an account, proceed as follow:"
-msgstr "Per a inhabilitar un compte, procediu com segueix:"
+#: C/empathy.xml:642(para)
+msgid "To disable an account, proceed as follows:"
+msgstr "Per a inhabilitar un compte, feu el següent:"
-#: C/empathy.xml:508(para)
-msgid "Select the account you wish to disable in the box on the left of the dialog and deselect the <guilabel>Enabled</guilabel> check-box."
-msgstr "Seleccioneu el compte que voleu inhabilitar al quadre a l'esquerra del diàleg i desseleccioneu la casella de selecció <guilabel>Habilitat</guilabel>."
+#: C/empathy.xml:657(para)
+msgid ""
+"Select the account you wish to disable in the box on the left of the dialog "
+"and deselect the <guilabel>Enabled</guilabel> check-box."
+msgstr ""
+"Seleccioneu el compte que vulgueu inhabilitar al quadre de l'esquerra del "
+"diàleg i anul·leu la selecció de la casella <guilabel>Habilitat</guilabel>."
-#: C/empathy.xml:516(para)
-msgid "To remove an account, proceed as follow:"
-msgstr "Per a suprimir un compte, procediu com segueix:"
+#: C/empathy.xml:665(para)
+msgid "To remove an account, proceed as follows:"
+msgstr "Per a suprimir un compte, feu el següent:"
-#: C/empathy.xml:530(para)
-msgid "Select the account you wish to disable in the box on the left of the dialog."
-msgstr "Seleccioneu el compte que voleu suprimir al quadre a l'esquerra del diàleg."
+#: C/empathy.xml:680(para)
+msgid ""
+"Select the account you wish to disable in the box on the left of the dialog."
+msgstr ""
+"Seleccioneu el compte que vulgueu suprimir al quadre de l'esquerra del "
+"diàleg."
-#: C/empathy.xml:536(para)
+#: C/empathy.xml:686(para)
msgid "Click on the <guibutton>Remove</guibutton> button."
msgstr "Feu clic al botó <guibutton>Suprimeix</guibutton>."
-#: C/empathy.xml:541(para)
-msgid "A dialog will be shown asking for confirmation. Click on the <guibutton>Remove</guibutton> button to remove the account."
-msgstr "Es mostrarà un diàleg sol·licitant confirmació. Feu clic al botó <guibutton>Suprimeix</guibutton> per a suprimir el compte."
+#: C/empathy.xml:691(para)
+msgid ""
+"A dialog will be shown asking for confirmation. Click on the "
+"<guibutton>Remove</guibutton> button to remove the account."
+msgstr ""
+"Es mostrarà un diàleg sol·licitant confirmació. Feu clic al botó "
+"<guibutton>Suprimeix</guibutton> per a suprimir el compte."
+
+#: C/empathy.xml:701(title)
+msgid "Editing Personal Information"
+msgstr "Com editar la informació personal"
+
+#: C/empathy.xml:702(para)
+msgid ""
+"To change your personal information, your alias and your icon (the image "
+"that other contacts will see of you), for each of your accounts, proceed as "
+"follows:"
+msgstr ""
+"Per a canviar la informació personal, el sobrenom i la icona (la imatge com "
+"els altres contactes us veuen) per a cadascun dels vostres comptes, feu el "
+"següent:"
+
+#: C/empathy.xml:710(para)
+msgid ""
+"From the <link linkend=\"empathy-FIG-mainwindow\">main window</link>, select "
+"<menuchoice><guimenu>Edit</guimenu><guimenuitem>Personal Information</"
+"guimenuitem></menuchoice>."
+msgstr ""
+"Des de la <link linkend=\"empathy-FIG-mainwindow\">finestra principal</link> "
+"seleccioneu <menuchoice><guimenu>Edita</guimenu><guimenuitem>Informació "
+"personal </guimenuitem></menuchoice>."
+
+#: C/empathy.xml:719(para)
+msgid ""
+"From the <guilabel>Account</guilabel> drop-down list, choose the account you "
+"want to edit."
+msgstr ""
+"Des de la llista desplegable <guilabel>Compte</guilabel>, trieu el compte "
+"que vulgueu editar."
+
+#: C/empathy.xml:725(para)
+msgid "In the <guilabel>Alias</guilabel> text box, write your new alias."
+msgstr ""
+"Al quadre de text <guilabel>Sobrenom</guilabel> introduïu el sobrenom nou."
+
+#: C/empathy.xml:731(para)
+msgid ""
+"To change your icon, click on the person-looking button and choose an image "
+"file."
+msgstr ""
+"Per a canviar la icona, feu clic al botó d'aparença personal i trieu un "
+"fitxer d'imatge."
+
+#: C/empathy.xml:737(para) C/empathy.xml:1318(para) C/empathy.xml:1352(para)
+msgid "When done, click <guibutton>Close</guibutton>."
+msgstr "Quan acabeu, feu clic a <guibutton>Tanca</guibutton>."
+
+#: C/empathy.xml:745(para)
+#, fuzzy
+msgid ""
+"An <emphasis>alias</emphasis> is an alternative way you can identify "
+"yourself. You can use your real name or a nickname."
+msgstr ""
+"Un <emphasis>sobrenom</emphasis> és una manera alternativa d'identificar-"
+"vos. Podeu utilitzar el nom real o l'àlies."
+
+#: C/empathy.xml:755(title)
+msgid "Advanced Options"
+msgstr "Opcions avançades"
+
+#: C/empathy.xml:756(para)
+msgid ""
+"Based on the service you are using, it is possible to configure more "
+"advanced options to modify the normal behavior of <application>Empathy</"
+"application>."
+msgstr ""
+
+#: C/empathy.xml:761(para)
+msgid ""
+"To configure these options, when you are <link linkend=\"empathy-create-"
+"account\">adding a new account</link>, click on the drop-down section "
+"<guilabel>Advanced</guilabel>."
+msgstr ""
+
+#: C/empathy.xml:769(title)
+#, fuzzy
+msgid "Jabber (or <acronym>XMPP</acronym>) and Google Talk"
+msgstr "Jabber (o <acronym>XMPP</acronym>)"
+
+#: C/empathy.xml:776(guilabel)
+msgid "Encryption required (TLS/SSL)"
+msgstr ""
+
+#: C/empathy.xml:779(para)
+msgid ""
+"Select this option in order to use some sort of encryption during your "
+"conversations."
+msgstr ""
+
+#: C/empathy.xml:787(guilabel)
+msgid "Ignore SSL certificate errors"
+msgstr ""
+
+#: C/empathy.xml:790(para)
+msgid ""
+"Select this option in order to ignore the errors that can be generated by "
+"some types of security certificates. Usually these certificates are called "
+"auto-signed."
+msgstr ""
-#: C/empathy.xml:552(title)
-msgid "Contacts"
-msgstr "Contactes"
+#: C/empathy.xml:798(para)
+msgid ""
+"Select this option only if you are sure the certificate is secure and you "
+"can trust it."
+msgstr ""
+
+#: C/empathy.xml:808(guilabel)
+msgid "Resource"
+msgstr ""
+
+#: C/empathy.xml:811(para)
+msgid ""
+"Use this text box to set a name with which you can identify the running "
+"program based on where you are running it. With this option, and the "
+"<guilabel>Priority</guilabel> one, you can use your account simultaneously "
+"in two different devices. For example, if you set one device to "
+"<replaceable>desktop</replaceable> and the other one to <replaceable>mobile</"
+"replaceable>, you can connect with both of them and based on the "
+"<guilabel>Priority</guilabel> value you will receive messages on one of the "
+"two devices or both."
+msgstr ""
-#: C/empathy.xml:553(para)
-msgid "All the contacts are handled within <application>Empathy</application>'s <link linkend=\"empathy-FIG-mainwindow\">main window</link>."
-msgstr "Tots els contactes es gestionen amb la <link linkend=\"empathy-FIG-mainwindow\">finestra principal</link> de l'<application>Empathy</application>."
+#: C/empathy.xml:824(para)
+msgid ""
+"This can be useful if you have two devices, a main one and a portable one, "
+"and you move away from the main one bringing with you the other: you can "
+"still receive messages from your account with the portable device even if "
+"you do not disconnet from the main one."
+msgstr ""
-#: C/empathy.xml:558(title)
-msgid "Adding a Contact"
-msgstr "Com afegir un contacte"
+#: C/empathy.xml:833(para)
+msgid ""
+"If you set the same value for this text box on both the devices, when you "
+"connect with one of them, the other one will be disconnected, even if you "
+"set a different value with the <guilabel>Priority</guilabel> spin box."
+msgstr ""
-#: C/empathy.xml:559(para)
-msgid "To add a new contact, proceed as follow:"
-msgstr "Per a afegir un contacte nou, procediu com segueix:"
+#: C/empathy.xml:846(guilabel)
+msgid "Priority"
+msgstr ""
-#: C/empathy.xml:565(para)
-msgid "From the <link linkend=\"empathy-FIG-mainwindow\">main window</link> choose <menuchoice><guimenu>Chat</guimenu><guimenuitem>Add Contact...</guimenuitem></menuchoice>. The <guilabel>New Contact</guilabel> dialog will be shown."
-msgstr "Des de la <link linkend=\"empathy-FIG-mainwindow\">finestra principal</link> trieu <menuchoice><guimenu>Xat</guimenu><guimenuitem>Afegeix un contacte...</guimenuitem></menuchoice>. Es mostrarà el diàleg <guilabel>Contacte nou</guilabel>."
+#: C/empathy.xml:849(para)
+msgid ""
+"Use this spin box to indicate wich device, set in the <guilabel>Resource</"
+"guilabel> text box, will receive the new messages. The higher the number, "
+"the higher the priority: you will receive the new messages on the device "
+"with the highest number."
+msgstr ""
-#: C/empathy.xml:575(para)
-msgid "From the <guilabel>Account</guilabel> drop-down list, choose the service used by the contact you are adding."
-msgstr "En la llista desplegable <guilabel>Compte</guilabel>, trieu el servei utilitzat pel contacte que esteu afegint."
+#: C/empathy.xml:856(para)
+msgid ""
+"You can set values in the range from <literal>-128</literal> to "
+"<literal>127</literal>."
+msgstr ""
-#: C/empathy.xml:581(para)
-msgid "In the <guilabel>Identifier</guilabel> text-box type the <emphasis>address</emphasis> of the contact in the form of <userinput><replaceable>user name</replaceable>@<replaceable>service\n\t domain</replaceable></userinput>."
-msgstr "Al quadre de text <guilabel>Identificador</guilabel> introduïu l'<emphasis>adreça</emphasis> del contacte de la forma <userinput><replaceable>nom d'usuari</replaceable>@<replaceable>servei\n\t domini</replaceable></userinput>."
+#: C/empathy.xml:862(para)
+msgid ""
+"If you set the same value of this spin box in both the devices, you will "
+"receive messages on both of them."
+msgstr ""
-#: C/empathy.xml:590(para)
-msgid "In the <guilabel>Alias</guilabel> text-box type the name you want to give at the the new contact."
-msgstr "Al quadre de text <guilabel>Sobrenom</guilabel> introduïu el nom que voleu donar al contacte nou."
+#: C/empathy.xml:879(guilabel) C/empathy.xml:972(guilabel)
+#: C/empathy.xml:1020(guilabel) C/empathy.xml:1114(guilabel)
+msgid "Server"
+msgstr ""
-#: C/empathy.xml:596(para)
+#: C/empathy.xml:882(para) C/empathy.xml:975(para) C/empathy.xml:1023(para)
+#: C/empathy.xml:1117(para)
+msgid ""
+"Use this text box to write the name of the server you want to use for this "
+"service."
+msgstr ""
+
+#: C/empathy.xml:890(guilabel) C/empathy.xml:983(guilabel)
+#: C/empathy.xml:1031(guilabel) C/empathy.xml:1125(guilabel)
+msgid "Port"
+msgstr ""
+
+#: C/empathy.xml:893(para) C/empathy.xml:986(para) C/empathy.xml:1034(para)
+#: C/empathy.xml:1128(para)
+msgid "Use this spin box to set the number of the port of the server to use."
+msgstr ""
+
+#: C/empathy.xml:897(para) C/empathy.xml:990(para) C/empathy.xml:1038(para)
+#: C/empathy.xml:1132(para)
+msgid ""
+"You can set values in the range from <literal>0</literal> to "
+"<literal>65,555</literal>."
+msgstr ""
+
+#: C/empathy.xml:905(guilabel)
+msgid "Use old SSL"
+msgstr ""
+
+#: C/empathy.xml:908(para)
+msgid ""
+"Select this option to use the old version of the secure protocol for "
+"encrypting your connection."
+msgstr ""
+
+#: C/empathy.xml:873(para)
+msgid ""
+"In the <guilabel>Override server settings</guilabel> section you can set "
+"options that take precedence over the default settings. <placeholder-1/>"
+msgstr ""
+
+#: C/empathy.xml:924(guilabel)
+msgid "Ignore conference and chatrooms invitations"
+msgstr ""
+
+#: C/empathy.xml:928(para)
+msgid ""
+"Select this option to ignore the invitations that other people may send you."
+msgstr ""
+
+#: C/empathy.xml:936(guilabel)
+msgid "Room List locale"
+msgstr ""
+
+#: C/empathy.xml:939(para)
+msgid ""
+"The value of this text box identifies the language used to retrieve the room "
+"list when connecting to the Yahoo service."
+msgstr ""
+
+#: C/empathy.xml:944(para)
+msgid ""
+"If you need to change this value, use the two letter code of your language."
+msgstr ""
+
+#: C/empathy.xml:952(guilabel) C/empathy.xml:1094(guilabel)
+msgid "Charset"
+msgstr ""
+
+#: C/empathy.xml:955(para) C/empathy.xml:1097(para)
+#, fuzzy
+msgid ""
+"The value of this text box identifies the set of the characters used by "
+"<application>Empathy</application>."
+msgstr ""
+"Conté els menús utilitzats per a realitzar accions a l'<application>Empathy</"
+"application>."
+
+#: C/empathy.xml:961(para) C/empathy.xml:1103(para)
+msgid ""
+"It is advise to leave this value to <literal>UTF-8</literal>. Change it only "
+"if that charset does not cover your language."
+msgstr ""
+
+#: C/empathy.xml:998(guilabel)
+msgid "Use Yahoo Japan"
+msgstr ""
+
+#: C/empathy.xml:1001(para)
+msgid ""
+"Select this option only if you have a Yahoo! Japan account. With the Yahoo! "
+"Japan service you can only use a Yahoo! Japan account: if you have "
+"registered an account with the English version of the service, that account "
+"will not work."
+msgstr ""
+
+#: C/empathy.xml:1015(title)
+msgid "<acronym>AIM</acronym>, GroupWise and <acronym>MSN</acronym>"
+msgstr ""
+
+#: C/empathy.xml:1054(guilabel)
+msgid "Published Name"
+msgstr ""
+
+#: C/empathy.xml:1057(para)
+msgid ""
+"Use this text box to write the name that will be visible to the other users "
+"of the network."
+msgstr ""
+
+#: C/empathy.xml:1065(guilabel)
+msgid "Email"
+msgstr ""
+
+#: C/empathy.xml:1068(para)
+msgid "Use this text box to write your email."
+msgstr ""
+
+#: C/empathy.xml:1075(guilabel)
+#, fuzzy
+msgid "Jabber ID"
+msgstr "Jabber"
+
+#: C/empathy.xml:1078(para)
+msgid "Use this text box to write your Jabber ID, if you have one."
+msgstr ""
+
+#: C/empathy.xml:1143(title)
+msgid "Gadu Gadu"
+msgstr ""
+
+#: C/empathy.xml:1147(guilabel)
+msgid "Nick"
+msgstr ""
+
+#: C/empathy.xml:1149(para)
+msgid ""
+"Use this text box to write an alternative name to use with this service."
+msgstr ""
+
+#: C/empathy.xml:1164(title)
+msgid "Contacts and Groups"
+msgstr "Contactes i grups"
+
+#: C/empathy.xml:1165(para)
+msgid ""
+"All the contacts are handled within <application>Empathy</application>'s "
+"<link linkend=\"empathy-FIG-mainwindow\">main window</link>."
+msgstr ""
+"Tots els contactes es gestionen amb la <link linkend=\"empathy-FIG-mainwindow"
+"\">finestra principal</link> de l'<application>Empathy</application>."
+
+#: C/empathy.xml:1169(para)
+msgid ""
+"You can add or remove a contact or you can edit the information of a "
+"particular contact. It is also possibile to arrange contacts in groups. You "
+"can have a group for your work contacts, one for you family contacts, and so "
+"on."
+msgstr ""
+"Podeu afegir o suprimir un contacte o podeu editar la informació d'un "
+"contacte concret. També és possible ordenar els contactes en grups. Podeu "
+"tenir un grup pels contactes de la feina, un pels contactes familiars, etc."
+
+#: C/empathy.xml:1176(title)
+msgid "Adding and Removing a Contact"
+msgstr "Com afegir i suprimir un contacte"
+
+#: C/empathy.xml:1177(para)
+msgid "To add a new contact, proceed as follows:"
+msgstr "Per a afegir un contacte nou, feu el següent:"
+
+#: C/empathy.xml:1183(para)
+msgid ""
+"From the <link linkend=\"empathy-FIG-mainwindow\">main window</link> choose "
+"<menuchoice><guimenu>Chat</guimenu><guimenuitem>Add Contact...</"
+"guimenuitem></menuchoice>. The <guilabel>New Contact</guilabel> dialog will "
+"be shown."
+msgstr ""
+"Des de la <link linkend=\"empathy-FIG-mainwindow\">finestra principal</link> "
+"trieu <menuchoice><guimenu>Xat</guimenu><guimenuitem>Afegeix un contacte...</"
+"guimenuitem></menuchoice>. Es mostrarà el diàleg <guilabel>Contacte nou</"
+"guilabel>."
+
+#: C/empathy.xml:1193(para)
+msgid ""
+"From the <guilabel>Account</guilabel> drop-down list, choose the service "
+"used by the contact you are adding."
+msgstr ""
+"Des de la llista desplegable <guilabel>Compte</guilabel>, trieu el servei "
+"utilitzat pel contacte que esteu afegint."
+
+#: C/empathy.xml:1199(para)
+msgid ""
+"In the <guilabel>Identifier</guilabel> text box type the <emphasis>address</"
+"emphasis> of the contact in the form of <userinput><replaceable>user name</"
+"replaceable>@<replaceable>service\n"
+"\t domain</replaceable></userinput>."
+msgstr ""
+"Al quadre de text <guilabel>Identificador</guilabel> introduïu "
+"l'<emphasis>adreça</emphasis> del contacte de la forma "
+"<userinput><replaceable>nom d'usuari</replaceable>@<replaceable>servei\n"
+"\t domini</replaceable></userinput>."
+
+#: C/empathy.xml:1208(para)
+msgid ""
+"In the <guilabel>Alias</guilabel> text box type the name you want to give at "
+"the the new contact."
+msgstr ""
+"Al quadre de text <guilabel>Sobrenom</guilabel> introduïu el nom que vulgueu "
+"donar al contacte nou."
+
+#: C/empathy.xml:1214(para)
msgid "Click on <guibutton>Add</guibutton> to add the new contact."
-msgstr "Feu clic a <guibutton>Afegeix</guibutton> per a afegir el contacte nou."
+msgstr ""
+"Feu clic a <guibutton>Afegeix</guibutton> per a afegir el contacte nou."
+
+#: C/empathy.xml:1220(para)
+msgid "To remove a contact, proceed as follows:"
+msgstr "Per a suprimir un contacte, feu el següent:"
-#: C/empathy.xml:604(title)
-msgid "Removing a Contact"
-msgstr "Com suprimir un contacte"
+#: C/empathy.xml:1226(para)
+msgid ""
+"From the <link linkend=\"empathy-FIG-mainwindow\">main window</link>, select "
+"the contact you would like to remove and right-click on it."
+msgstr ""
+"Des de la <link linkend=\"empathy-FIG-mainwindow\">finestra principal</link> "
+"seleccioneu el contacte que vulgueu suprimir i feu-hi clic amb el botó "
+"secundari."
+
+#: C/empathy.xml:1233(para)
+msgid ""
+"From the popup menu, choose <guilabel>Remove</guilabel> to remove the "
+"contact."
+msgstr ""
+"Des del menú emergent, trieu <guilabel>Suprimeix</guilabel> per a suprimir "
+"el contacte."
-#: C/empathy.xml:605(para)
-msgid "To remove a contact, proceed as follow:"
-msgstr "Per a suprimir un contacte, procediu com segueix:"
+#: C/empathy.xml:1242(para) C/empathy.xml:1278(para)
+msgid ""
+"An <emphasis>alias</emphasis> is an alternative way you can identify that "
+"particular contact. You can use the real name or the nickname of that person."
+msgstr ""
+"Un <emphasis>sobrenom</emphasis> és una manera alternativa d'identificar un "
+"contacte en particular. Podeu utilitzar el nom real o l'àlies d'aquesta "
+"persona."
-#: C/empathy.xml:611(para)
-msgid "From the <link linkend=\"empathy-FIG-mainwindow\">main window</link>, select the contact you would like to remove and right-click on it."
-msgstr "Des de la <link linkend=\"empathy-FIG-mainwindow\">finestra principal</link> trieu el contacte que us agradaria suprimir i feu-hi clic amb el botó secundari."
+#: C/empathy.xml:1251(title)
+msgid "Editing a Contact"
+msgstr "Com editar un contacte"
-#: C/empathy.xml:618(para)
-msgid "From the popup menu, choose <guilabel>Remove</guilabel> to remove the contact."
-msgstr "Des del menú emergent, trieu <guilabel>Suprimeix</guilabel> per a suprimir el contacte."
+#: C/empathy.xml:1252(para)
+msgid "To edit a contact, proceed as follows:"
+msgstr "Per a editar un contacte, feu el següent:"
-#: C/empathy.xml:627(title)
-msgid "Modifying a Contact"
-msgstr "Com modificar un contacte"
+#: C/empathy.xml:1258(para) C/empathy.xml:1300(para)
+#, fuzzy
+msgid ""
+"From the <link linkend=\"empathy-FIG-mainwindow\">main window</link>, select "
+"the contact you would like to modify and choose <menuchoice><guimenu>Edit</"
+"guimenu><guisubmenu>Contact</guisubmenu><guimenuitem>Edit</guimenuitem></"
+"menuchoice>, or right-click on it and choose <guilabel>Edit</guilabel>."
+msgstr ""
+"Des de la <link linkend=\"empathy-FIG-mainwindow\">finestra principal</link> "
+"seleccioneu el contacte que voleu modificar i trieu "
+"<menuchoice><guimenu>Edita</guimenu><guisubmenu>Compte</"
+"guisubmenu><guimenuitem>Modifica</guimenuitem></menuchoice> o feu-hi clic "
+"amb el botó secundari i trieu <guilabel>Modifica</guilabel>."
+
+#: C/empathy.xml:1271(para)
+msgid ""
+"From the <guilabel>Edit Contact Information</guilabel> dialog, you can "
+"modify the <emphasis>alias</emphasis> and the <emphasis>group</emphasis> of "
+"the contact."
+msgstr ""
+"Des del diàleg <guilabel>Edita la informació del contacte</guilabel>, podeu "
+"modificar el <emphasis>sobrenom</emphasis> i el <emphasis>grup</emphasis> "
+"del contacte."
+
+#: C/empathy.xml:1285(para)
+msgid ""
+"For more information about groups, see <xref linkend=\"empathy-add-contact-"
+"group\"/> and <xref linkend=\"empathy-add-group\"/>."
+msgstr ""
+"Per a obtenir més informació sobre els grups, vegeu la <xref linkend="
+"\"empathy-add-contact-group\"/> i la <xref linkend=\"empathy-add-group\"/>."
+
+#: C/empathy.xml:1293(title)
+msgid "Adding a Contact to a Group"
+msgstr "Com afegir un contacte a un grup"
+
+#: C/empathy.xml:1294(para)
+msgid "To add a contact to one or more groups, proceed as follows:"
+msgstr "Per a afegir un contacte a un o més grups, feu el següent:"
+
+#: C/empathy.xml:1312(para)
+msgid ""
+"From the <guilabel>Groups</guilabel> section, select the group, or groups, "
+"you want to add the contact to."
+msgstr ""
+"Des de la secció <guilabel>Grups</guilabel>, seleccioneu el grup o grups on "
+"voleu afegir el contacte."
+
+#: C/empathy.xml:1327(title)
+msgid "Adding a New Group"
+msgstr "Com afegir un grup nou"
+
+#: C/empathy.xml:1328(para)
+msgid "To add a new group, proceed as follows:"
+msgstr "Per a afegir un grup nou, feu el següent:"
+
+#: C/empathy.xml:1334(para)
+#, fuzzy
+msgid ""
+"From the <link linkend=\"empathy-FIG-mainwindow\">main window</link>, select "
+"one contact and choose <menuchoice><guimenu>Edit</"
+"guimenu><guisubmenu>Contact</guisubmenu><guimenuitem>Edit</guimenuitem></"
+"menuchoice>, or right-click on it and choose <guilabel>Edit</guilabel>."
+msgstr ""
+"Des de la <link linkend=\"empathy-FIG-mainwindow\">finestra principal</link> "
+"seleccioneu un contacte i trieu <menuchoice><guimenu>Edita</"
+"guimenu><guisubmenu>Compte</guisubmenu><guimenuitem>Modifica</guimenuitem></"
+"menuchoice> o feu-hi clic amb el botó secundari i trieu <guilabel>Modifica</"
+"guilabel>."
+
+#: C/empathy.xml:1345(para)
+msgid ""
+"In the <guilabel>Groups</guilabel> section, write the name of the group you "
+"want to add and then click on <guibutton>Add Group</guibutton>."
+msgstr ""
+"A la secció <guilabel>Grups</guilabel>, introduïu el nom del grup que "
+"vulgueu afegir i feu clic a <guibutton>Afegeix un grup</guibutton>."
#. Put one translator per line, in the form of NAME <EMAIL>, YEAR1, YEAR2.
-#: C/empathy.xml:0(None)
+#: C/empathy.xml:0(None)
msgid "translator-credits"
-msgstr "Joan Duran <jodufi@gmail.com>, 2008"
-
+msgstr "Joan Duran <jodufi@gmail.com>, 2008, 2009"
+
+#~ msgid "TODO"
+#~ msgstr "Pendent"
+
+#~ msgid ""
+#~ "@@image: 'figures/empathy-new-account.png'; "
+#~ "md5=6c1e0d8c709125d387e975e5738b8c0f"
+#~ msgstr ""
+#~ "@@image: 'figures/empathy-new-account.png'; "
+#~ "md5=6c1e0d8c709125d387e975e5738b8c0f"
+
+#~ msgid "2008"
+#~ msgstr "2008"
+
+#~ msgid "milo_casagrande@yahoo.it"
+#~ msgstr "milo_casagrande@yahoo.it"
+
+#~ msgid "When You Start Empathy for the First Time"
+#~ msgstr "Quan inicieu l'Empathy per primer cop"
+
+#~ msgid "<application>Empathy</application> Accounts Dialog"
+#~ msgstr "Diàleg de comptes de l'<application>Empathy</application>"
+
+#~ msgid "Shows <placeholder-1/> account creation dialog."
+#~ msgstr "Mostra el diàleg de creació de comptes de l'<placeholder-1/>."
+
+#~ msgid ""
+#~ "When you start <application>Empathy</application> for the first time and "
+#~ "you don't have configured any account yet, the following dialog is shown. "
+#~ "<placeholder-1/>"
+#~ msgstr ""
+#~ "Quan inicieu l'<application>Empathy</application> per primer cop i encara "
+#~ "no teniu configurat cap compte, es mostrarà el diàleg següent. "
+#~ "<placeholder-1/>"
+
+#~ msgid ""
+#~ "From here, you can configure and create your accounts. See <xref linkend="
+#~ "\"empathy-accounts\"/> for more information."
+#~ msgstr ""
+#~ "Des d'aquí podeu configurar i crear els vostres comptes. Per a obtenir "
+#~ "més informació, vegeu la <xref linkend=\"empathy-accounts\"/>."
+
+#~ msgid ""
+#~ "You can use one of the following services if you already have a <emphasis "
+#~ "role=\"strong\">Jabber</emphasis> account:"
+#~ msgstr ""
+#~ "Podeu utilitzar un dels serveis següents si ja teniu un compte <emphasis "
+#~ "role=\"strong\">Jabber</emphasis>:"
+
+#~ msgid ""
+#~ "Fill the required fields with your <emphasis>user name</emphasis> and "
+#~ "<emphasis>password</emphasis>."
+#~ msgstr ""
+#~ "Empleneu els camps necessaris amb el vostre <emphasis>nom d'usuari</"
+#~ "emphasis> i <emphasis>contrasenya</emphasis>."
+
+#~ msgid "To create an account, proceed as follow: <placeholder-1/>"
+#~ msgstr "Per a crear un compte, procediu com segueix: <placeholder-1/>"
+
+#~ msgid "Contacts"
+#~ msgstr "Contactes"
+
+#~ msgid "Modifying a Contact"
+#~ msgstr "Com modificar un contacte"
diff --git a/help/el/el.po b/help/el/el.po
index fb433ba40..f5bd283ea 100644
--- a/help/el/el.po
+++ b/help/el/el.po
@@ -3,37 +3,38 @@
msgid ""
msgstr ""
"Project-Id-Version: empathy-help.HEAD.el\n"
-"POT-Creation-Date: 2009-01-17 07:11+0000\n"
-"PO-Revision-Date: 2009-01-17 23:14+0200\n"
-"Last-Translator: Marios Zindilis <m.zindilis@dmajor.org>\n"
+"POT-Creation-Date: 2009-04-16 20:27+0000\n"
+"PO-Revision-Date: 2009-05-18 16:09+0200\n"
+"Last-Translator: Giannis Katsampirhs <juankatsampirhs@gmail.com>\n"
"Language-Team: Greek <team@gnome.gr>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: KBabel 1.11.4\n"
+"X-Poedit-Language: Greek\n"
#. When image changes, this message will be marked fuzzy or untranslated for you.
#. It doesn't matter what you translate it to: it's not used at all.
-#: C/empathy.xml:215(None)
+#: C/empathy.xml:237(None)
msgid "@@image: 'figures/empathy-main-window.png'; md5=38259a866f38ff1f754828e46d2b0e5c"
msgstr "@@image: 'figures/empathy-main-window.png'; md5=38259a866f38ff1f754828e46d2b0e5c"
-#. When image changes, this message will be marked fuzzy or untranslated for you.
-#. It doesn't matter what you translate it to: it's not used at all.
-#: C/empathy.xml:306(None)
-msgid "@@image: 'figures/empathy-new-account.png'; md5=6c1e0d8c709125d387e975e5738b8c0f"
-msgstr "@@image: 'figures/empathy-new-account.png'; md5=6c1e0d8c709125d387e975e5738b8c0f"
-
-#: C/empathy.xml:25(title)
-msgid "<application>Empathy</application> Manual V2.0"
-msgstr "Εγχειρίδιο του <application>Empathy</application>, έκδοση 2.0"
+#: C/empathy.xml:27(title)
+#| msgid "<application>Empathy</application> Manual V2.0"
+msgid "<application>Empathy</application> Manual V2.1"
+msgstr "Εγχειρίδιο του <application>Empathy</application> V2.1"
-#: C/empathy.xml:28(year)
-msgid "2008"
-msgstr "2008"
+#: C/empathy.xml:30(year)
+msgid "2008, 2009"
+msgstr "2008, 2009"
-#: C/empathy.xml:29(holder) C/empathy.xml:35(publishername) C/empathy.xml:46(orgname) C/empathy.xml:54(orgname) C/empathy.xml:83(para)
+#: C/empathy.xml:31(holder)
+#: C/empathy.xml:37(publishername)
+#: C/empathy.xml:48(orgname)
+#: C/empathy.xml:56(orgname)
+#: C/empathy.xml:87(para)
+#: C/empathy.xml:101(para)
msgid "Ubuntu Documentation Project"
msgstr "Έργο τεκμηρίωσης του GNOME"
@@ -61,433 +62,917 @@ msgstr "ΣΕ ΚΑΜΙΑ ΠΕΡΙΠΤΩΣΗ ΚΑΙ ΥΠΟ ΚΑΜΙΑ ΝΟΜΙΚΗ
msgid "DOCUMENT AND MODIFIED VERSIONS OF THE DOCUMENT ARE PROVIDED UNDER THE TERMS OF THE GNU FREE DOCUMENTATION LICENSE WITH THE FURTHER UNDERSTANDING THAT: <placeholder-1/>"
msgstr "ΤΟ ΈΓΓΡΑΦΟ ΚΑΙ ΤΡΟΠΟΠΟΙΗΜΕΝΕΣ ΕΚΔΟΣΕΙΣ ΑΥΤΟΥ ΠΑΡΕΧΟΝΤΑΙ ΥΠΟ ΤΟΥΣ ΟΡΟΥΣ ΤΗΣ ΑΔΕΙΑΣ GNU FREE DOCUMENTATION ΜΕ ΤΗΝ ΠΕΡΑΙΤΕΡΩ ΔΙΕΥΚΡΙΝΙΣΗ ΟΤΙ: <placeholder-1/>"
-#: C/empathy.xml:43(firstname)
+#: C/empathy.xml:45(firstname)
msgid "Milo"
msgstr "Milo"
-#: C/empathy.xml:44(surname)
+#: C/empathy.xml:46(surname)
msgid "Casagrande"
msgstr "Casagrande"
-#: C/empathy.xml:47(email)
-msgid "milo_casagrande@yahoo.it"
-msgstr "milo_casagrande@yahoo.it"
+#: C/empathy.xml:49(email)
+msgid "milo@ubuntu.com"
+msgstr "milo@ubuntu.com"
-#: C/empathy.xml:51(firstname)
+#: C/empathy.xml:53(firstname)
msgid "Seth"
msgstr "Seth"
-#: C/empathy.xml:52(surname)
+#: C/empathy.xml:54(surname)
msgid "Dudenhofer"
msgstr "Dudenhofer"
-#: C/empathy.xml:55(email)
+#: C/empathy.xml:57(email)
msgid "sdudenhofer@gmail.com"
msgstr "sdudenhofer@gmail.com"
-#: C/empathy.xml:74(revnumber)
+#: C/empathy.xml:81(revnumber)
+#| msgid "Empathy Manual V2.0"
+msgid "Empathy Manual V2.1"
+msgstr "Εγχειρίδιο του Empathy V2.1"
+
+#: C/empathy.xml:82(date)
+msgid "January 2009"
+msgstr "Ιανουάριος 2009"
+
+#: C/empathy.xml:84(para)
+#: C/empathy.xml:95(para)
+#| msgid "Milo Casagrande <email>milo_casagrande@yahoo.it</email>"
+msgid "Milo Casagrande <email>milo@ubuntu.com</email>"
+msgstr "Milo Casagrande <email>milo@ubuntu.com</email>"
+
+#: C/empathy.xml:92(revnumber)
msgid "Empathy Manual V2.0"
msgstr "Εγχειρίδιο του Empathy, εκδοση 2.0"
-#: C/empathy.xml:75(date)
+#: C/empathy.xml:93(date)
msgid "April 2008"
msgstr "Απρίλιος 2008"
-#: C/empathy.xml:77(para)
-msgid "Milo Casagrande <email>milo_casagrande@yahoo.it</email>"
-msgstr "Milo Casagrande <email>milo_casagrande@yahoo.it</email>"
-
-#: C/empathy.xml:80(para)
+#: C/empathy.xml:98(para)
msgid "Seth Dudenhofer <email>sdudenhofer@gmail.com</email>"
msgstr "Seth Dudenhofer <email>sdudenhofer@gmail.com</email>"
-#: C/empathy.xml:88(releaseinfo)
-msgid "This manual describes version 2.24 of Empathy."
-msgstr "Αυτό το εγχειρίδιο περιγράφει την έκδοση 2.24 του Empathy."
+#: C/empathy.xml:106(releaseinfo)
+#| msgid "This manual describes version 2.24 of Empathy."
+msgid "This manual describes version 2.26 of Empathy."
+msgstr "Το εγχειρίδιο αυτό περιγράφει την έκδοση 2.26 του Empathy."
-#: C/empathy.xml:92(title)
+#: C/empathy.xml:110(title)
msgid "Feedback"
msgstr "Ανάδραση"
-#: C/empathy.xml:93(para)
-msgid "To report a bug or make a suggestion regarding the <application>Empathy</application> application or this manual, follow the directions in the <ulink url=\"ghelp:gnome-feedback\" type=\"help\">GNOME Feedback Page</ulink>."
-msgstr "Για να αναφέρετε ένα σφάλμα ή να κάνετε μια πρόταση σχετικά με την εφαρμογή <application>Ιάγνος</application> ή αυτή την τεκμηρίωση, ακολουθήστε τις οδηγίες στη <ulink url=\"ghelp:gnome-feedback\" type=\"help\">Σελίδα ανάδρασης του GNOME</ulink>."
+#: C/empathy.xml:111(para)
+#| msgid ""
+#| "To report a bug or make a suggestion regarding the <application>Empathy</"
+#| "application> application or this manual, follow the directions in the "
+#| "<ulink url=\"ghelp:gnome-feedback\" type=\"help\">GNOME Feedback Page</"
+#| "ulink>."
+msgid "To report a bug or make a suggestion regarding the <application>Empathy</application> application or this manual, follow the directions in the <ulink url=\"ghelp:user-guide?feedback\" type=\"help\">GNOME Feedback Page</ulink>."
+msgstr "Για να αναφέρετε ένα σφάλμα ή να κάνετε μια πρόταση σχετικά με την εφαρμογή <application>Empathy</application> ή αυτή την τεκμηρίωση, ακολουθήστε τις οδηγίες στη <ulink url=\"ghelp:gnome-feedback\" type=\"help\">Σελίδα ανάδρασης του GNOME</ulink>."
-#: C/empathy.xml:101(para)
+#: C/empathy.xml:118(para)
msgid "Empathy is an application for instant messaging."
msgstr "Το Empathy είναι μια εφαρμογή για ανταλλαγή άμεσων μηνυμάτων."
-#: C/empathy.xml:109(primary) C/empathy.xml:0(application) C/empathy.xml:0(application)
+#: C/empathy.xml:126(primary)
+#: C/empathy.xml:0(application)
msgid "Empathy"
msgstr "Empathy"
-#: C/empathy.xml:112(primary)
+#: C/empathy.xml:129(primary)
msgid "empathy"
msgstr "empathy"
-#: C/empathy.xml:113(secondary)
+#: C/empathy.xml:130(secondary)
msgid "istant messaging"
msgstr "ανταλλαγή άμεσων μηνυμάτων"
-#: C/empathy.xml:117(title)
+#: C/empathy.xml:134(title)
msgid "Introduction"
msgstr "Εισαγωγή"
-#: C/empathy.xml:118(para)
+#: C/empathy.xml:135(para)
msgid "<application>Empathy</application> is a multi-protocol instant messaging program for the GNOME Desktop. With <application>Empathy</application> you can keep in touch with all of your friends through lots of supported instant messaging services."
msgstr "Το <application>Empathy</application> είναι μια εφαρμογή ανταλλαγής άμεσων μηνυμάτων σε πολλαπλά πρωτόκολλα, για την επιφάνεια εργασίας GNOME. Με το <application>Empathy</application> μπορείτε να είστε σε επικοινωνία με όλους τους φίλους σας μέσα από πολλές υποστηριζόμενες υπηρεσίες μηνυμάτων."
-#: C/empathy.xml:128(acronym)
+#: C/empathy.xml:145(acronym)
msgid "AIM"
msgstr "AIM"
-#: C/empathy.xml:132(para)
+#: C/empathy.xml:149(para)
msgid "Google Talk"
msgstr "Google Talk"
-#: C/empathy.xml:137(para)
+#: C/empathy.xml:154(para)
+#: C/empathy.xml:1089(title)
msgid "ICQ"
msgstr "ICQ"
-#: C/empathy.xml:143(acronym)
+#: C/empathy.xml:160(acronym)
msgid "IRC"
msgstr "IRC"
-#: C/empathy.xml:147(para)
-msgid "Jabber"
-msgstr "Jabber"
+#: C/empathy.xml:164(para)
+msgid "Jabber (or <acronym>XMPP</acronym>)"
+msgstr "Jabber (ή <acronym>XMPP</acronym>)"
-#: C/empathy.xml:153(acronym)
+#: C/empathy.xml:170(acronym)
msgid "MSN"
msgstr "MSN"
-#: C/empathy.xml:157(para) C/empathy.xml:440(para)
+#: C/empathy.xml:174(para)
+#: C/empathy.xml:441(para)
+#: C/empathy.xml:1049(title)
msgid "Salut"
msgstr "Salut"
-#: C/empathy.xml:163(acronym)
+#: C/empathy.xml:180(acronym)
msgid "SIP"
msgstr "SIP"
-#: C/empathy.xml:167(para)
+#: C/empathy.xml:184(para)
+#: C/empathy.xml:919(title)
msgid "Yahoo"
msgstr "Yahoo"
-#: C/empathy.xml:123(para)
+#: C/empathy.xml:189(para)
+msgid "And many others..."
+msgstr "Και άλλοι πολλοί..."
+
+#: C/empathy.xml:140(para)
msgid "<application>Empathy</application> supports the following services: <placeholder-1/>"
msgstr "Το <application>Empathy</application> υποστηρίζει τις ακόλουθες υπηρεσίες: <placeholder-1/>"
-#: C/empathy.xml:176(title)
+#: C/empathy.xml:198(title)
msgid "Getting Started"
msgstr "Ξεκίνημα"
-#: C/empathy.xml:179(title)
+#: C/empathy.xml:201(title)
msgid "Starting Empathy"
msgstr "Εκκίνηση του Empathy"
-#: C/empathy.xml:180(para)
+#: C/empathy.xml:202(para)
msgid "You can start <application>Empathy</application> in the following ways:"
msgstr "Μπορείτε να ξεκινήσετε το <application>Empathy</application> με τους εξής τρόπους:"
-#: C/empathy.xml:184(term)
+#: C/empathy.xml:206(term)
msgid "<guimenu>Applications</guimenu> menu"
msgstr "Μενού <guimenu>Εφαρμογές</guimenu>"
-#: C/empathy.xml:186(para)
+#: C/empathy.xml:208(para)
msgid "Choose <menuchoice><guisubmenu>Internet</guisubmenu><guimenuitem>Empathy Instant Messenger</guimenuitem></menuchoice>."
msgstr "Επιλέξτε <menuchoice><guisubmenu>Διαδίκτυο</guisubmenu><guimenuitem>Αποστολέας άμεσων μηνυμάτων Empathy</guimenuitem></menuchoice>."
-#: C/empathy.xml:195(term)
+#: C/empathy.xml:217(term)
msgid "Command line"
msgstr "Γραμμή εντολής"
-#: C/empathy.xml:197(para)
+#: C/empathy.xml:219(para)
msgid "Type <command>empathy</command> and then press <keycap>Enter</keycap>."
msgstr "Πληκτρολογήστε <command>empathy</command> και μετά πατήστε το <keycap>Enter</keycap>."
-#: C/empathy.xml:206(title)
+#: C/empathy.xml:228(title)
msgid "When You Start Empathy"
msgstr "Μόλις εκκινήσετε το Empathy"
-#: C/empathy.xml:211(title)
+#: C/empathy.xml:233(title)
msgid "<application>Empathy</application> Main Window"
msgstr "Βασικό παράθυρο του <application>Empathy</application>"
-#: C/empathy.xml:218(phrase)
+#: C/empathy.xml:240(phrase)
msgid "Shows <placeholder-1/> main window. Contains the titlebar, the menubar, contact list, status icon and status arrow button list."
msgstr "Εμφανίζει το βασικό παράθυρο <placeholder-1/>. Περιέχει τη μπάρα τίτλου, το μπάρα μενού, τη λίστα επαφών, το εικονίδιο κατάστασης και το βελάκι της αναδιπλούμενης λίστας καταστάσεων."
-#: C/empathy.xml:207(para)
+#: C/empathy.xml:229(para)
msgid "When you start <application>Empathy</application> the following window is shown. <placeholder-1/>"
msgstr "Όταν εκκινείτε το <application>Empathy</application> εμφανίζεται το ακόλουθο παράθυρο. <placeholder-1/>"
-#: C/empathy.xml:233(title)
+#: C/empathy.xml:255(title)
msgid "<application>Empathy</application> Main Components"
msgstr "Βασικά συστατικά του <application>Empathy</application>"
-#: C/empathy.xml:240(para)
+#: C/empathy.xml:262(para)
msgid "Component"
msgstr "Συστατικό"
-#: C/empathy.xml:243(para)
+#: C/empathy.xml:265(para)
msgid "Description"
msgstr "Περιγραφή"
-#: C/empathy.xml:250(para)
+#: C/empathy.xml:272(para)
msgid "Menubar"
msgstr "Μπάρα μενού"
-#: C/empathy.xml:253(para)
+#: C/empathy.xml:275(para)
msgid "Contains menus used to perform actions in <application>Empathy</application>."
msgstr "Περιέχει τα μενού που χρησιμοποιούνται για τις ενέργειες στο <application>Empathy</application>."
-#: C/empathy.xml:260(para)
+#: C/empathy.xml:282(para)
msgid "Status Drop-Down List"
msgstr "Αναδιπλούμενη λίστα κατάστασης"
-#: C/empathy.xml:263(para)
-msgid "Allows to update the user's status."
-msgstr "Επιτρέπει την ενημέρωση της κατάστασης του χρήστη."
+#: C/empathy.xml:285(para)
+#| msgid "Allows to update the user's status."
+msgid "Allows to update the status."
+msgstr "Επιτρέπει την ενημέρωση της κατάστασης."
-#: C/empathy.xml:270(para)
+#: C/empathy.xml:292(para)
msgid "Account Button"
msgstr "Κουμπί λογαριασμού"
-#: C/empathy.xml:273(para)
+#: C/empathy.xml:295(para)
msgid "Opens the <guilabel>Accounts</guilabel> dialog."
msgstr "Ανοίγει το διάλογο <guilabel>Λογαριασμοί</guilabel>."
-#: C/empathy.xml:280(para)
+#: C/empathy.xml:302(para)
msgid "Contact List"
msgstr "Λίστα επαφών"
-#: C/empathy.xml:283(para)
+#: C/empathy.xml:305(para)
msgid "Shows all the available contacts and their associated status."
msgstr "Εμφανίζει τις διαθέσιμες επαφές και την κατάστασή τους."
-#: C/empathy.xml:229(para)
+#: C/empathy.xml:251(para)
msgid "<xref linkend=\"empathy-TBL-1\"/> describes the components of <application>Empathy</application>'s main window. <table frame=\"topbot\" id=\"empathy-TBL-1\"><placeholder-1/><tgroup cols=\"2\" colsep=\"0\" rowsep=\"0\"><colspec colname=\"colspec0\" colwidth=\"29.39*\"/><colspec colname=\"colspec1\" colwidth=\"70.61*\"/><placeholder-2/><placeholder-3/></tgroup></table>"
msgstr "<xref linkend=\"empathy-TBL-1\"/> περιγράφει τα συστατικά του βασικού παραθύρου του <application>Empathy</application>. <table frame=\"topbot\" id=\"empathy-TBL-1\"><placeholder-1/><tgroup cols=\"2\" colsep=\"0\" rowsep=\"0\"><colspec colname=\"colspec0\" colwidth=\"29.39*\"/><colspec colname=\"colspec1\" colwidth=\"70.61*\"/><placeholder-2/><placeholder-3/></tgroup></table>"
-#: C/empathy.xml:296(title)
-msgid "When You Start Empathy for the First Time"
-msgstr "Πρώτη εκκίνηση του Empathy"
-
-#: C/empathy.xml:302(title)
-msgid "<application>Empathy</application> Accounts Dialog"
-msgstr "Διάλογος λογαριασμών του <application>Empathy</application>"
-
-#: C/empathy.xml:309(phrase)
-msgid "Shows <placeholder-1/> account creation dialog."
-msgstr "Δείχνει το διάλογο δημιουργίας λογαριασμού <placeholder-1/>."
-
-#: C/empathy.xml:297(para)
-msgid "When you start <application>Empathy</application> for the first time and you don't have configured any account yet, the following dialog is shown. <placeholder-1/>"
-msgstr "Όταν εκκινήσετε το <application>Empathy</application> για πρώτη φορά και δεν έχετε ακόμα ρυθμίσει κάποιο λογαριασμό, εμφανίζεται ο ακόλουθος διάλογος. <placeholder-1/>"
-
-#: C/empathy.xml:318(para)
-msgid "From here, you can configure and create your accounts. See <xref linkend=\"empathy-accounts\"/> for more information."
-msgstr "Από εδώ μπορείτε να δημιουργήσετε και να ρυθμίσετε τους λογαριασμούς σας. Δείτε το <xref linkend=\"empathy-accounts\"/> για περισσότερες πληροφορίες."
-
-#: C/empathy.xml:327(title)
+#: C/empathy.xml:319(title)
msgid "Accounts"
msgstr "Λογαριασμοί"
-#: C/empathy.xml:328(para)
+#: C/empathy.xml:320(para)
msgid "To use <application>Empathy</application> you need at least one account of the supported services."
msgstr "Για να χρησιμοποιήσετε το <application>Empathy</application> χρειάζεστε έναν τουλάχιστον λογαριασμό από τις υποστηριζόμενες υπηρεσίες."
-#: C/empathy.xml:331(para)
+#: C/empathy.xml:323(para)
msgid "If you don't already have an account and you don't have your <emphasis>user name</emphasis> and <emphasis>password</emphasis>, you need to register a new account (see <xref linkend=\"empathy-register-account\"/>)."
msgstr "Αν δεν έχετε ήδη κάποιο λογαριασμό και δεν έχετε <emphasis>όνομα χρήστη</emphasis> και <emphasis>συνθηματικό</emphasis>, πρέπει να εγγράψετε ένα νέο λογαριασμό (δείτε το <xref linkend=\"empathy-register-account\"/>)."
-#: C/empathy.xml:336(para)
-msgid "In order to talk with other users (called <emphasis>contatcs</emphasis>), you need to use the same service they are using. If, for example, one contact is using the <emphasis role=\"strong\">Jabber</emphasis> service, you need to have an account registerd with that service."
-msgstr "Για να συνομιλήσετε με άλλους χρήστες (που ονομάζονται <emphasis>επαφές</emphasis>), πρέπει να χρησιμοποιείτε την ίδια υπηρεσία που χρησιμοποιούν. Αν, για παράδειγμα, μια επαφή χρησιμοποιεί την υπηρεσία <emphasis>Jabber</emphasis>, τότε θα πρέπει να έχετε ένα εγγεγραμμένο λογαριασμό σε εκείνη την υπηρεσία."
-
-#: C/empathy.xml:343(para)
+#: C/empathy.xml:328(para)
+#| msgid ""
+#| "In order to talk with other users (called <emphasis>contatcs</emphasis>), "
+#| "you need to use the same service they are using. If, for example, one "
+#| "contact is using the <emphasis role=\"strong\">Jabber</emphasis> service, "
+#| "you need to have an account registerd with that service."
+msgid "In order to talk with other users, also called <emphasis>contacts</emphasis>, you need to use the same service they are using. If, for example, one contact is using the <emphasis role=\"strong\">Jabber</emphasis> service, you need to have an account registered with that service."
+msgstr "Για να συνομιλήσετε με άλλους χρήστες, δηλαδή με άλλες <emphasis>επαφές</emphasis>, πρέπει να χρησιμοποιήσετε την ίδια υπηρεσία που χρησιμοποιούν κι αυτοί. Αν, για παράδειγμα, μία επαφή χρησιμοποιεί την υπηρεσία <emphasis role=\"strong\">Jabber</emphasis>, πρέπει να έχετε ένα λογαριασμό που να έχει καταχωρηθεί με την υπηρεσία αυτή."
+
+#: C/empathy.xml:335(para)
msgid "<application>Empathy</application> can handle as many accounts on any supported services as you want and you can have them all open at the same time."
msgstr "Το <application>Empathy</application> μπορεί να χειριστεί όσους λογαριασμούς σε όσες υπηρεσίες θέλετε και μπορείτε να τους έχετε όλους ταυτόχρονα ανοικτούς."
-#: C/empathy.xml:349(title)
+#: C/empathy.xml:341(title)
msgid "Registering an Account"
msgstr "Δημιουργία λογαριασμού"
-#: C/empathy.xml:350(para)
+#: C/empathy.xml:342(para)
msgid "You can freely register an account on any of the following services. Follow the instructions reported on each website on how to register your new account. At the end of the registration process you should have a <emphasis>user name</emphasis> (or an <emphasis>account ID</emphasis>) and a <emphasis>password</emphasis> that you will use to create the account in <application>Empathy</application>."
msgstr "Μπορείτε να δημιουργήσετε δωρεάν ένα λογαριασμό σε οποιαδήποτε από τις ακόλουθες υπηρεσίες. Ακολουθήστε τις οδηγίες που περιγράφονται σε κάθε ιστότοπο για τον τρόπο δημιουργίας του λογαριασμού σας. Στο τέλος της διαδικασίας εγγραφής θα πρέπει να έχετε ένα <emphasis>όνομα χρήστη</emphasis> (ή μια <emphasis>ταυτότητα - ID</emphasis>) και ένα <emphasis>συνθηματικό</emphasis> που θα χρησιμοποιήσετε για να δημιουργήσετε ένα λογαριασμό στο <application>Empathy</application>."
#. Translators: try to find a localized version of the
#. registration service website
-#: C/empathy.xml:368(para)
+#: C/empathy.xml:360(para)
msgid "The <ulink type=\"http\" url=\"http://dashboard.aim.com/aim\">AIM</ulink> service."
msgstr "Η υπηρεσία <ulink type=\"http\" url=\"http://dashboard.aim.com/aim\">AIM</ulink>."
#. Translators: try to find a localized version of the
#. registration service website
-#: C/empathy.xml:375(para)
+#: C/empathy.xml:367(para)
msgid "The <ulink type=\"http\" url=\"http://www.google.com/talk/\">Google Talk</ulink> service."
msgstr "Η υπηρεσία <ulink type=\"http\" url=\"http://www.google.com/talk/\">Google Talk</ulink>."
#. Translators: try to find a localized version of the
#. registration service website
-#: C/empathy.xml:383(para)
+#: C/empathy.xml:375(para)
msgid "The <ulink type=\"http\" url=\"https://www.icq.com/register/\">ICQ</ulink> service."
msgstr "Η υπηρεσία <ulink type=\"http\" url=\"https://www.icq.com/register/\">ICQ</ulink>."
#. Translators: try to find a localized version of the
#. registration service website
-#: C/empathy.xml:390(para)
+#: C/empathy.xml:382(para)
msgid "The <ulink type=\"http\" url=\"https://accountservices.passport.net\">MSN</ulink> service."
msgstr "Η υπηρεσία <ulink type=\"http\" url=\"https://accountservices.passport.net\">MSN</ulink>."
#. Translators: try to find a localized version of the
#. registration service website
-#: C/empathy.xml:397(para)
+#: C/empathy.xml:389(para)
msgid "The <ulink type=\"http\" url=\"https://login.yahoo.com/config/login\">Yahoo</ulink> service."
msgstr "Η υπηρεσία <ulink type=\"http\" url=\"https://login.yahoo.com/config/login\">Yahoo</ulink>."
-#: C/empathy.xml:359(para)
+#: C/empathy.xml:351(para)
msgid "Click on the name of the service to visit its website: <placeholder-1/>"
msgstr "Πατήστε στο όνομα της υπηρεσίας για να επισκεφθείτε τον ιστότοπό της."
-#: C/empathy.xml:403(para)
+#: C/empathy.xml:395(para)
msgid "For registering a <acronym>SIP</acronym> account, you can use one of the following service:"
msgstr "Για να δημιουργήσετε ένα λογαριασμό <acronym>SIP</acronym>, μπορείτε να χρησιμοποιήσετε μία από τις ακόλουθες υπηρεσίες:"
#. Translators: try to find a localized version of the
#. registration service website
-#: C/empathy.xml:412(para)
-msgid "The <ulink type=\"http\" url=\"http://www.ekiga.net/user/reg/\">Ekiga</ulink> service."
-msgstr "Η υπηρεσία <ulink type=\"http\" url=\"http://www.ekiga.net/user/reg/\">Ekiga</ulink>."
+#: C/empathy.xml:404(para)
+#| msgid ""
+#| "The <ulink type=\"http\" url=\"http://www.ekiga.net/user/reg/\">Ekiga</"
+#| "ulink> service."
+msgid "The <ulink type=\"http\" url=\"https://www.ekiga.net/index.php?page=register\">Ekiga</ulink> service."
+msgstr "Η υπηρεσία <ulink type=\"http\" url=\"https://www.ekiga.net/index.php?page=register\">Ekiga</ulink>."
#. Translators: try to find a localized version of the
#. registration service website
-#: C/empathy.xml:419(para)
+#: C/empathy.xml:411(para)
msgid "The <ulink type=\"http\" url=\"http://account2.freeworlddialup.com/index.php?section_id=94\"><acronym>FWD</acronym></ulink> (Free World Dialup) service."
msgstr "Η υπηρεσία <ulink type=\"http\" url=\"http://account2.freeworlddialup.com/index.php?section_id=94\"><acronym>FWD</acronym></ulink> (Free World Dialup)."
#. Translators: try to find a localized version of the
#. registration service website
-#: C/empathy.xml:427(para)
+#: C/empathy.xml:419(para)
msgid "The <ulink type=\"http\" url=\"https://signup.sipphone.com/new-users/app?class=NewUser;proc=start\">Sipphone</ulink> service."
msgstr "Η υπηρεσία <ulink type=\"http\" url=\"https://signup.sipphone.com/new-users/app?class=NewUser;proc=start\">Sipphone</ulink>."
-#: C/empathy.xml:433(para)
-msgid "You can use one of the following services if you already have a <emphasis role=\"strong\">Jabber</emphasis> account:"
-msgstr "Μπορείτε να επιλέξετε μια από τις ακόλουθες υπηρεσίες αν έχετε ήδη έναν λογαριασμό <emphasis>Jabber</emphasis>:"
-
-#: C/empathy.xml:449(title)
-msgid "Creating an Account"
-msgstr "Δημιουργία λογαριασμού"
-
-#: C/empathy.xml:454(para) C/empathy.xml:500(para) C/empathy.xml:522(para)
-msgid "From the <link linkend=\"empathy-FIG-mainwindow\">main window </link> (<guilabel>Contact List</guilabel>) click on the account button to open the <guilabel>Accounts</guilabel> dialog."
-msgstr "Από το <link linkend=\"empathy-FIG-mainwindow\">βασικό παράθυρο</link> (<guilabel>Λίστα επαφών</guilabel>) πατήστε το κουμπίθ λογαριασμοί για να ανοίξετε το διάλογο <guilabel>Λογαριασμοί</guilabel>."
+#: C/empathy.xml:425(para)
+msgid "For registering a <emphasis role=\"strong\">Jabber</emphasis> account, you can use the automatic account creation of <application>Empathy</application>. Not all Jabber service providers support the automatic creation of accounts, one service provider known to work with <application>Empathy</application> is <ulink type=\"http\" url=\"http://www.jabber.org/web/Jabber.org\">jabber.org</ulink>."
+msgstr "Για να καταχωρήσετε ένα λογαριασμό <emphasis role=\"strong\">Jabber</emphasis>, μπορείτε να χρησιμοποιήσετε την αυτόματη δημιουργία λογαριασμού του <application>Empathy</application>. Δεν υποστηρίζουν όλες οι υπηρεσίες Jabber την αυτόματη δημιουργία λογαριασμών, ένας παροχέας της υπηρεσίας που είναι γνωστό ότι λειτουργεί με το <application>Empathy</application> είναι ο <ulink type=\"http\" url=\"http://www.jabber.org/web/Jabber.org\">jabber.org</ulink>."
-#: C/empathy.xml:462(para)
-msgid "Click on the <guibutton>Add</guibutton> button."
-msgstr "Πατήστε στο <guibutton>Δημιουργία</guibutton>."
+#: C/empathy.xml:433(para)
+#| msgid ""
+#| "For registering a <acronym>SIP</acronym> account, you can use one of the "
+#| "following service:"
+msgid "If you already have a <emphasis role=\"strong\">Jabber</emphasis> account, you can use one of the following services:"
+msgstr "Αν έχετε ήδη ένα λογαριασμό <emphasis role=\"strong\">Jabber</emphasis>, μπορείτε να χρησιμοποιήσετε μία από τις ακόλουθες υπηρεσίες:"
+
+#: C/empathy.xml:450(title)
+#| msgid ""
+#| "Contains menus used to perform actions in <application>Empathy</"
+#| "application>."
+msgid "Adding your Account to <application>Empathy</application>"
+msgstr "Προσθήκη του λογαριασμού σας στο <application>Empathy</application>"
+
+#: C/empathy.xml:455(para)
+#: C/empathy.xml:533(para)
+#: C/empathy.xml:585(para)
+#: C/empathy.xml:618(para)
+#: C/empathy.xml:648(para)
+#: C/empathy.xml:671(para)
+#| msgid ""
+#| "From the <link linkend=\"empathy-FIG-mainwindow\">main window </link> "
+#| "(<guilabel>Contact List</guilabel>) click on the account button to open "
+#| "the <guilabel>Accounts</guilabel> dialog."
+msgid "From the <link linkend=\"empathy-FIG-mainwindow\">main window </link> (<guilabel>Contact List</guilabel>) click on the account button or press <keycap>F4</keycap> to open the <guilabel>Accounts</guilabel> dialog."
+msgstr "Από το <link linkend=\"empathy-FIG-mainwindow\">κύριο παράθυρο </link> (<guilabel>Λίστα επαφών</guilabel>) κάντε κλικ στο κουμπί του λογαριασμού ή πιέστε το πλήκτρο <keycap>F4</keycap> για να ανοίξετε το παράθυρο διαλόγου <guilabel>Λογαριασμοί</guilabel>."
#: C/empathy.xml:467(para)
-msgid "From the <guilabel>Type</guilabel> drop-down list choose the service you wish to create an account for, then click on the <guibutton>Create</guibutton> button."
-msgstr "Από την αναδιπλούμενη λίστα <guilabel>Τύπος</guilabel> επιλέξτε την υπηρεσία στην οποία θέλετε να δημιουργήσετε ένα λογαριασμό, μετά πατήστε στο <guibutton>Δημιουργία</guibutton>."
-
-#: C/empathy.xml:474(para)
-msgid "Fill the required fields with your <emphasis>user name</emphasis> and <emphasis>password</emphasis>."
-msgstr "Συμπληρώστε τα απαραίτητα πεδία με τον <emphasis>όνομα χρήστη</emphasis> και το <emphasis>συνθηματικό</emphasis> σας."
-
-#: C/empathy.xml:480(para)
-msgid "To enable the new account, select the <guilabel>Enabled</guilabel> check-box next to the name of the account."
-msgstr "Για να ενεργοποιήσετε το νέο λογαριασμό, επιλέξτε το κουτάκι <guilabel>Ενεργοποιημένο</guilabel> πλάι στο όνομα του λογαριασμού."
+#: C/empathy.xml:484(para)
+#| msgid ""
+#| "From the <guilabel>Type</guilabel> drop-down list choose the service you "
+#| "wish to create an account for, then click on the <guibutton>Create</"
+#| "guibutton> button."
+msgid "From the <guilabel>Type</guilabel> drop-down list choose the service you wish to add an account for, then click on the <guibutton>Create</guibutton> button."
+msgstr "Από την αναδιπλούμενη λίστα <guilabel>Τύπος</guilabel> επιλέξτε την υπηρεσία για την οποία επιθυμείτε να δημιουργήσετε ένα λογαριασμό, ύστερα κάντε κλικ στο κουμπί <guibutton>Δημιουργία</guibutton>."
+
+#: C/empathy.xml:463(para)
+#| msgid ""
+#| "When you start <application>Empathy</application> the following window is "
+#| "shown. <placeholder-1/>"
+msgid "If it is the first time you launch <application>Empathy</application>: <placeholder-1/>"
+msgstr "Είναι η πρώτη φορά που εκκινείτε την εφαρμογή <application>Empathy</application>: <placeholder-1/>"
+
+#: C/empathy.xml:479(para)
+#| msgid "Click on the <guibutton>Add</guibutton> button."
+msgid "Click on the <guilabel>Add</guilabel> button."
+msgstr "Κάντε κλικ στο κουμπί <guilabel>Προσθήκη</guilabel>."
+
+#: C/empathy.xml:475(para)
+msgid "Otherwise: <placeholder-1/>"
+msgstr "Ειδάλλως: <placeholder-1/>"
-#: C/empathy.xml:450(para)
-msgid "To create an account, proceed as follow: <placeholder-1/>"
-msgstr "Για να δημιουργήσετε ένα λογαριασμό, προχωρήστε ως εξής: <placeholder-1/>"
+#: C/empathy.xml:494(para)
+#| msgid ""
+#| "If you don't already have an account and you don't have your "
+#| "<emphasis>user name</emphasis> and <emphasis>password</emphasis>, you "
+#| "need to register a new account (see <xref linkend=\"empathy-register-"
+#| "account\"/>)."
+msgid "Fill the required fields with your <emphasis>user name</emphasis> and <emphasis>password</emphasis>. Optionally, you can modify some advanced options. For more information, see <xref linkend=\"empathy-advanced-options\"/>."
+msgstr "Συμπληρώστε τα απαιτούμενα πεδία με το <emphasis>όνομα χρήστη</emphasis> σας και το <emphasis>συνθηματικό</emphasis>. Εναλλακτικά, μπορείτε να τροποποιήσετε κάποιες επιλογές για προχωρημένους. Για μερικές πληροφορίες, δείτε <xref linkend=\"empathy - επιλογές για προχωρημένους\"/>."
+
+#: C/empathy.xml:503(para)
+#: C/empathy.xml:566(para)
+#| msgid ""
+#| "To enable the new account, select the <guilabel>Enabled</guilabel> check-"
+#| "box next to the name of the account."
+msgid "To enable the new account, select the <guilabel>Enabled</guilabel> check-box next to the name of the account in the box on the left."
+msgstr "Για να ενεργοποιήσετε το νέο λογαριασμό, επιλέξτε το πεδίο ελέγχου <guilabel>Ενεργοποιημένο</guilabel> δίπλα στο όνομα του λογαριασμού στο πεδίο στα αριστερά."
+
+#: C/empathy.xml:451(para)
+#| msgid ""
+#| "When you start <application>Empathy</application> the following window is "
+#| "shown. <placeholder-1/>"
+msgid "To add your account to <application>Empathy</application>, proceed as follows: <placeholder-1/>"
+msgstr "Για να προσθέσετε το λογαριασμό σας στο <application>Empathy</application>, προχωρήστε ως εξής: <placeholder-1/>"
+
+#: C/empathy.xml:513(title)
+#| msgid "Creating an Account"
+msgid "Importing Accounts"
+msgstr "Εισαγωγή λογαριασμών"
+
+#: C/empathy.xml:514(para)
+msgid "If you use another instant messaging program, you can import the accounts from that program into <application>Empathy</application>"
+msgstr "Αν χρησιμοποιείτε κάποιο άλλο πρόγραμμα άμεσων μηνυμάτων, μπορείτε να εισάγετε στο <application>Empathy</application> τους λογαριασμούς από το πρόγραμμα αυτό"
+
+#: C/empathy.xml:520(para)
+msgid "At the moment <application>Empathy</application> can import the accounts only from the instant messaging program <application>Pidgin</application>. For more information about <application>Pidgin</application>, see the <ulink type=\"http\" url=\"http://www.pidgin.im/\">Pidgin website</ulink>."
+msgstr "Προς το παρόν το <application>Empathy</application> μπορεί να εισάγει μόνο τους λογαριασμούς από το πρόγραμμα άμεσων μηνυμάτων <application>Pidgin</application>. Για περισσότερες πληροφορίες σχετικά με το <application>Pidgin</application>, δείτε την <ulink type=\"http\" url=\"http://www.pidgin.im/\">Ιστοσελίδα του Pidgin</ulink>."
-#: C/empathy.xml:493(title)
+#: C/empathy.xml:541(para)
+msgid "Click on the <guibutton>Import Accounts...</guibutton> button to open the <guilabel>Import Accounts</guilabel> dialog."
+msgstr "Κάντε κλικ στο κουμπί <guibutton>Εισαγωγή λογαριασμών...</guibutton>για να ανοίξει το παράθυρο διαλόγου <guilabel>Εισαγωγή λογαριασμών</guilabel>."
+
+#: C/empathy.xml:548(para)
+#| msgid ""
+#| "Select the account you wish to disable in the box on the left of the "
+#| "dialog and deselect the <guilabel>Enabled</guilabel> check-box."
+msgid "Select the accounts you would like to import by clicking on the <guilabel>Import</guilabel> check-box."
+msgstr "Επιλέξτε τους λογαριασμού που επιθυμείτε να εισάγετε κάνοντας κλικ στο πεδίο ελέγχου <guilabel>Εισαγωγή</guilabel>."
+
+#: C/empathy.xml:554(para)
+msgid "When you have selected all the desired accounts, click <guibutton>OK</guibutton> to import them. If you don't want to import the accounts, click <guibutton>Cancel</guibutton>."
+msgstr "Αφού έχετε επιλέξει όλους τους επιθυμητούς λογαριασμούς, κάντε κλικ στο κουμπί <guibutton>OK</guibutton> για να τους εισάγετε. Αν δεν επιθυμείτε να εισάγετε τους λογαριασμούς, κάντε κλικ στο κουμπί <guibutton>Ακύρωση</guibutton>."
+
+#: C/empathy.xml:562(para)
+#| msgid ""
+#| "When you start <application>Empathy</application> the following window is "
+#| "shown. <placeholder-1/>"
+msgid "When you import a new account into <application>Empathy</application>, it will not be enabled by default."
+msgstr "Όταν εισάγετε ένα νέο λογαριασμό στο <application>Empathy</application>, αυτός δεν θα ενεργοποιηθεί εξ ορισμού."
+
+#: C/empathy.xml:529(para)
+#| msgid ""
+#| "When you start <application>Empathy</application> the following window is "
+#| "shown. <placeholder-1/>"
+msgid "To import the accounts into <application>Empathy</application>, proceed as follows: <placeholder-1/>"
+msgstr "Για να εισάγετε τους λογαριασμούς στο <application>Empathy</application>, προχωρήστε ως εξής: <placeholder-1/>"
+
+#: C/empathy.xml:578(title)
+#| msgid "Creating an Account"
+msgid "Editing an Account"
+msgstr "Επεξεργασία λογαριασμού"
+
+#: C/empathy.xml:593(para)
+#| msgid ""
+#| "Select the account you wish to disable in the box on the left of the "
+#| "dialog."
+msgid "Select the account you wish to edit in the box on the left."
+msgstr "Επιλέξτε το λογαριασμό που επιθυμείτε να επεξεργαστείτε στο πεδίο στα αριστερά."
+
+#: C/empathy.xml:599(para)
+msgid "Modify the desired data."
+msgstr "Τροποποιήστε τα δεδομένα που επιθυμείτε."
+
+#: C/empathy.xml:579(para)
+msgid "To edit one of your accounts, i.e. to change the <emphasis>password</emphasis> or your <emphasis>user name</emphasis>, proceed as follows: <placeholder-1/>"
+msgstr "Για να επεξεργαστείτε κάποιον από τους λογαριασμούς σας, για παράδειγμα, για να τροποποιήσετε το <emphasis>συνθηματικό</emphasis> ή το <emphasis>όνομα χρήστη</emphasis> σας, προχωρήστε ως εξής: <placeholder-1/>"
+
+#: C/empathy.xml:607(para)
+msgid "Based on the type of the account, it is possibile to edit different settings."
+msgstr "Με βάση τον τύπο του λογαριασμού, είναι δυνατό να επεξεργαστείτε διάφορες ρυθμίσεις."
+
+#: C/empathy.xml:626(para)
+#| msgid ""
+#| "Select the account you wish to disable in the box on the left of the "
+#| "dialog."
+msgid "Select the account you wish to edit in the box on the left and double-click on its name."
+msgstr "Επιλέξτε το λογαριασμό που επιθυμείτε να επεξεργαστείτε στο πεδίο στα αριστερά και κάντε διπλό κλικ στο όνομά του."
+
+#: C/empathy.xml:632(para)
+msgid "Change the name of the account as you desire."
+msgstr "Τροποποιήστε το όνομα του λογαριασμού όπως επιθυμείτε."
+
+#: C/empathy.xml:613(para)
+#| msgid ""
+#| "When you start <application>Empathy</application> the following window is "
+#| "shown. <placeholder-1/>"
+msgid "To modify the identifier of an account, how <application>Empathy</application> identifies an account, proceed as follows: <placeholder-1/>"
+msgstr "Για να τροποποιήσετε το αναγνωριστικό ενός λογαριασμού, δηλαδή πως το <application>Empathy</application> αναγνωρίζει ένα λογαριασμό, προχωρήστε ως εξής: <placeholder-1/>"
+
+#: C/empathy.xml:641(title)
msgid "Disabling and Removing an Account"
msgstr "Απενεργοποίηση και αφαίρεση λογαριασμού"
-#: C/empathy.xml:494(para)
-msgid "To disable an account, proceed as follow:"
+#: C/empathy.xml:642(para)
+#| msgid "To disable an account, proceed as follow:"
+msgid "To disable an account, proceed as follows:"
msgstr "Για να απενεργοποιήσετε ένα λογαριασμό, προχωρήστε ως εξής:"
-#: C/empathy.xml:508(para)
+#: C/empathy.xml:657(para)
msgid "Select the account you wish to disable in the box on the left of the dialog and deselect the <guilabel>Enabled</guilabel> check-box."
-msgstr "Επιλέξτε το λογαριασμό που θέλετε να απενεργοποιήσετε στο κουτί στα δεξιά του διαλόγου και αποεπιλέξτε το κουτάκι <guilabel>Ενεργοποιημένο</guilabel>."
+msgstr "Επιλέξτε το λογαριασμό που θέλετε να απενεργοποιήσετε στο πεδίο στα δεξιά του διαλόγου και αποεπιλέξτε το πεδίο ελέγχου <guilabel>Ενεργοποιημένο</guilabel>."
-#: C/empathy.xml:516(para)
-msgid "To remove an account, proceed as follow:"
+#: C/empathy.xml:665(para)
+#| msgid "To remove an account, proceed as follow:"
+msgid "To remove an account, proceed as follows:"
msgstr "Για να αφαιρέσετε ένα λογαριασμό, προχωρήστε ως εξής:"
-#: C/empathy.xml:530(para)
+#: C/empathy.xml:680(para)
msgid "Select the account you wish to disable in the box on the left of the dialog."
-msgstr "Επιλέξτε το λογαριασμό που θέλετε να αφαιρέσετε από το κουτί στα αριστερά του διαλόγου."
+msgstr "Επιλέξτε το λογαριασμό που θέλετε να αφαιρέσετε από το πεδίο στα αριστερά του διαλόγου."
-#: C/empathy.xml:536(para)
+#: C/empathy.xml:686(para)
msgid "Click on the <guibutton>Remove</guibutton> button."
msgstr "Πατήστε στο <guibutton>Αφαίρεση</guibutton>."
-#: C/empathy.xml:541(para)
+#: C/empathy.xml:691(para)
msgid "A dialog will be shown asking for confirmation. Click on the <guibutton>Remove</guibutton> button to remove the account."
msgstr "Θα εμφανιστεί ένας διάλογος που θα σας ζητάει επιβεβαίωση. Πατήστε στο <guibutton>Αφαίρεση</guibutton> για να αφαιρέσετε το λογαριασμό."
-#: C/empathy.xml:552(title)
-msgid "Contacts"
-msgstr "Επαφές"
-
-#: C/empathy.xml:553(para)
+#: C/empathy.xml:701(title)
+msgid "Editing Personal Information"
+msgstr "Επεξεργασία προσωπικών πληροφοριών"
+
+#: C/empathy.xml:702(para)
+msgid "To change your personal information, your alias and your icon (the image that other contacts will see of you), for each of your accounts, proceed as follows:"
+msgstr "Για να τροποποιήσετε τις προσωπικές σας πληροφορίες, το ψευδώνυμο και το εικονίδιό σας (η εικόνα σας η οποία θα εμφανίζεται στις άλλες επαφές), για καθέναν από τους λογαριασμούς σας, προχωρήστε ως εξής:"
+
+#: C/empathy.xml:710(para)
+#| msgid ""
+#| "From the <link linkend=\"empathy-FIG-mainwindow\">main window</link> "
+#| "choose <menuchoice><guimenu>Chat</guimenu><guimenuitem>Add Contact...</"
+#| "guimenuitem></menuchoice>. The <guilabel>New Contact</guilabel> dialog "
+#| "will be shown."
+msgid "From the <link linkend=\"empathy-FIG-mainwindow\">main window</link>, select <menuchoice><guimenu>Edit</guimenu><guimenuitem>Personal Information</guimenuitem></menuchoice>."
+msgstr "Από το <link linkend=\"empathy-FIG-mainwindow\">κύριο παράθυρο</link>, επιλέξτε <menuchoice><guimenu>Επεξεργασία</guimenu><guimenuitem>Προσωπικές πληροφορίες</guimenuitem></menuchoice>."
+
+#: C/empathy.xml:719(para)
+#| msgid ""
+#| "From the <guilabel>Account</guilabel> drop-down list, choose the service "
+#| "used by the contact you are adding."
+msgid "From the <guilabel>Account</guilabel> drop-down list, choose the account you want to edit."
+msgstr "Από την αναδιπλούμενη λίστα <guilabel>Λογαριασμός</guilabel>, επιλέξτε το λογαριασμό που επιθυμείτε να επεξεργαστείτε."
+
+#: C/empathy.xml:725(para)
+#| msgid ""
+#| "In the <guilabel>Alias</guilabel> text-box type the name you want to give "
+#| "at the the new contact."
+msgid "In the <guilabel>Alias</guilabel> text box, write your new alias."
+msgstr "Στο πεδίο κειμένου <guilabel>Ψευδώνυμο</guilabel>, εισάγετε το νέο σας ψευδώνυμο."
+
+#: C/empathy.xml:731(para)
+msgid "To change your icon, click on the person-looking button and choose an image file."
+msgstr "Για να αντικαταστήσετε το εικονίδιό σας, κάντε κλικ στο κουμπί με το πρόσωπο και επιλέξτε ένα αρχείο εικόνας."
+
+#: C/empathy.xml:737(para)
+#: C/empathy.xml:1318(para)
+#: C/empathy.xml:1352(para)
+#| msgid "Click on the <guibutton>Remove</guibutton> button."
+msgid "When done, click <guibutton>Close</guibutton>."
+msgstr "Όταν τελειώσετε, κάντε κλικ στο κουμπί <guibutton>Κλείσιμο</guibutton>."
+
+#: C/empathy.xml:745(para)
+msgid "An <emphasis>alias</emphasis> is an alternative way you can identify yourself. You can use your real name or a nickname."
+msgstr "Το <emphasis>ψευδώνυμο</emphasis> είναι ένας εναλλακτικός τρόπος για να προσδιορίσετε τον εαυτό σας. Μπορείτε να χρησιμοποιήσετε το πραγματικό σας όνομα ή το ψευδώνυμό σας."
+
+#: C/empathy.xml:755(title)
+msgid "Advanced Options"
+msgstr "Επιλογές για προχωρημένους"
+
+#: C/empathy.xml:756(para)
+msgid "Based on the service you are using, it is possible to configure more advanced options to modify the normal behavior of <application>Empathy</application>."
+msgstr "Με βάση την υπηρεσία που χρησιμοποιείτε, είναι δυνατό να ρυθμίσετε περισσότερες επιλογές για προχωρημένους για να τροποποιήσετε την κανονική συμπεριφορά του <application>Empathy</application>."
+
+#: C/empathy.xml:761(para)
+msgid "To configure these options, when you are <link linkend=\"empathy-create-account\">adding a new account</link>, click on the drop-down section <guilabel>Advanced</guilabel>."
+msgstr "Για να ρυθμίσετε τις επιλογές αυτές, όταν <link linkend=\"empathy - δημιουργία λογαριασμού\">προσθέτετε ένα νέο λογαριασμό</link>, κάντε κλικ στην αναδιπλούμενη ενότητα <guilabel>Προχωρημένο</guilabel>."
+
+#: C/empathy.xml:769(title)
+msgid "Jabber (or <acronym>XMPP</acronym>) and Google Talk"
+msgstr "Jabber (ή <acronym>XMPP</acronym>) και Google Talk"
+
+#: C/empathy.xml:776(guilabel)
+msgid "Encryption required (TLS/SSL)"
+msgstr "Απαιτείται κρυπτογράφηση (TLS/SSL)"
+
+#: C/empathy.xml:779(para)
+msgid "Select this option in order to use some sort of encryption during your conversations."
+msgstr "Επιλέξτε την επιλογή αυτή για να χρησιμοποιήσετε κάποιο είδος κρυπτογράφησης για τις συνομιλίες σας."
+
+#: C/empathy.xml:787(guilabel)
+msgid "Ignore SSL certificate errors"
+msgstr "Παράβλεψη σφαλμάτων για πιστοποιητικά SSL"
+
+#: C/empathy.xml:790(para)
+msgid "Select this option in order to ignore the errors that can be generated by some types of security certificates. Usually these certificates are called auto-signed."
+msgstr "Επιλέξτε την επιλογή αυτή ώστε να παραβλέπονται τα σφάλματα που ενδεχομένως να παράγονται από μερικούς τύπους πιστοποιητικών ασφαλείας. Συνήθως τα πιστοποιητικά αυτά ονομάζονται αυτόματα υπογεγραμμένα."
+
+#: C/empathy.xml:798(para)
+msgid "Select this option only if you are sure the certificate is secure and you can trust it."
+msgstr "Επιλέξτε την επιλογή αυτή μόνο αν είστε βέβαιος ότι το πιστοποιητικό είναι ασφαλές και μπορείτε να το εμπιστευτείτε."
+
+#: C/empathy.xml:808(guilabel)
+msgid "Resource"
+msgstr "Πηγή"
+
+#: C/empathy.xml:811(para)
+msgid "Use this text box to set a name with which you can identify the running program based on where you are running it. With this option, and the <guilabel>Priority</guilabel> one, you can use your account simultaneously in two different devices. For example, if you set one device to <replaceable>desktop</replaceable> and the other one to <replaceable>mobile</replaceable>, you can connect with both of them and based on the <guilabel>Priority</guilabel> value you will receive messages on one of the two devices or both."
+msgstr "Χρησιμοποιήστε αυτό το πεδίο κειμένου για να καθορίσετε ένα όνομα με το οποίο θα μπορείτε να αναγνωρίσετε το πρόγραμμα που εκτελείται με βάση τη θέση από την οποία το εκτελείτε εσείς. Με την επιλογή αυτή, και με την επιλογή για την <guilabel>Προτεραιότητα</guilabel>, μπορείτε να χρησιμοποιήσετε το λογαριασμό σας ταυτόχρονα σε δύο διαφορετικές συσκευές. Για παράδειγμα, αν καθορίσετε τη μία συσκευή ως <replaceable>επιτραπέζιο υπολογιστή</replaceable> και την άλλη ως <replaceable>συσκευή κινητού</replaceable>, μπορείτε να συνδεθείτε και με τις δύο και με βάση με την τιμή που έχετε εισάγει για την <guilabel>Προτεραιότητα</guilabel> θα λαμβάνετε μηνύματα σε μία ή και στις δύο συσκευές."
+
+#: C/empathy.xml:824(para)
+msgid "This can be useful if you have two devices, a main one and a portable one, and you move away from the main one bringing with you the other: you can still receive messages from your account with the portable device even if you do not disconnet from the main one."
+msgstr "Η επιλογή αυτή μπορεί να είναι χρήσιμη αν έχετε δύο συσκευές, μία κύρια και μία φορητή, και βρίσκεστε μακριά από την κύρια αλλά έχετε μαζί σας την φορητή συσκευή: μπορείτε ακόμη να λαμβάνετε μηνύματα από το λογαριασμό σας με την φορητή συσκευή αν δεν έχετε αποσυνδεθεί από την κύρια."
+
+#: C/empathy.xml:833(para)
+msgid "If you set the same value for this text box on both the devices, when you connect with one of them, the other one will be disconnected, even if you set a different value with the <guilabel>Priority</guilabel> spin box."
+msgstr "Αν καθορίσετε την ίδια τιμή για αυτό το πεδίο κειμένου και στις δύο συσκευές, όταν συνδέεστε με μία από αυτές, η άλλη θα αποσυνδέεται, ακόμη και αν καθορίζετε μία διαφορετική τιμή με το περιστρεφόμενο κουτί <guilabel>Προτεραιότητα</guilabel>."
+
+#: C/empathy.xml:846(guilabel)
+msgid "Priority"
+msgstr "Προτεραιότητα"
+
+#: C/empathy.xml:849(para)
+msgid "Use this spin box to indicate wich device, set in the <guilabel>Resource</guilabel> text box, will receive the new messages. The higher the number, the higher the priority: you will receive the new messages on the device with the highest number."
+msgstr "Χρησιμοποιήστε αυτό το περιστρεφόμενο πεδίο για να αναδείξετε ποια συσκευή, που καθορίστηκε στο κουτί κειμένου <guilabel>Πηγή</guilabel>, θα λαμβάνει τα νέα μηνύματα. Όσο υψηλότερος είναι ο αριθμός, τόσο υψηλή θα είναι και η προτεραιότητα: θα λαμβάνετε τα νέα μηνύματα στη συσκευή με τον υψηλότερο αριθμό."
+
+#: C/empathy.xml:856(para)
+msgid "You can set values in the range from <literal>-128</literal> to <literal>127</literal>."
+msgstr "Μπορείτε να ορίσετε τιμές με εύρος από <literal>-128</literal> μέχρι <literal>127</literal>."
+
+#: C/empathy.xml:862(para)
+msgid "If you set the same value of this spin box in both the devices, you will receive messages on both of them."
+msgstr "Αν ορίσετε την ίδια τιμή σε αυτό το περιστρεφόμενο πεδίο και για τις δύο συσκευές, θα λαμβάνετε μηνύματα και στις δύο."
+
+#: C/empathy.xml:879(guilabel)
+#: C/empathy.xml:972(guilabel)
+#: C/empathy.xml:1020(guilabel)
+#: C/empathy.xml:1114(guilabel)
+msgid "Server"
+msgstr "Εξυπηρετητής"
+
+#: C/empathy.xml:882(para)
+#: C/empathy.xml:975(para)
+#: C/empathy.xml:1023(para)
+#: C/empathy.xml:1117(para)
+msgid "Use this text box to write the name of the server you want to use for this service."
+msgstr "Χρησιμοποιήστε αυτό το πεδίο κειμένου για να εισάγετε το όνομα του εξυπηρετητή που επιθυμείτε να χρησιμοποιήσετε για την υπηρεσία αυτή."
+
+#: C/empathy.xml:890(guilabel)
+#: C/empathy.xml:983(guilabel)
+#: C/empathy.xml:1031(guilabel)
+#: C/empathy.xml:1125(guilabel)
+msgid "Port"
+msgstr "Θύρα"
+
+#: C/empathy.xml:893(para)
+#: C/empathy.xml:986(para)
+#: C/empathy.xml:1034(para)
+#: C/empathy.xml:1128(para)
+msgid "Use this spin box to set the number of the port of the server to use."
+msgstr "Χρησιμοποιήστε αυτό το περιστρεφόμενο πεδίο για να ορίσετε τον αριθμό της θύρας που θα χρησιμοποιεί ο εξυπηρετητής."
+
+#: C/empathy.xml:897(para)
+#: C/empathy.xml:990(para)
+#: C/empathy.xml:1038(para)
+#: C/empathy.xml:1132(para)
+msgid "You can set values in the range from <literal>0</literal> to <literal>65,555</literal>."
+msgstr "Μπορείτε να ορίσετε τιμές με εύρος από <literal>0</literal> μέχρι <literal>65,555</literal>."
+
+#: C/empathy.xml:905(guilabel)
+msgid "Use old SSL"
+msgstr "Χρήση παλαιού SSL"
+
+#: C/empathy.xml:908(para)
+msgid "Select this option to use the old version of the secure protocol for encrypting your connection."
+msgstr "Επιλέξτε την επιλογή αυτή για να χρησιμοποιήσετε την παλαιά έκδοση του ασφαλούς πρωτοκόλλου για την κρυπτογράφηση της σύνδεσής σας."
+
+#: C/empathy.xml:873(para)
+msgid "In the <guilabel>Override server settings</guilabel> section you can set options that take precedence over the default settings. <placeholder-1/>"
+msgstr "Στην ενότητα <guilabel>Παράκαμψη ιδιοτήτων εξυπηρετητή</guilabel> μπορείτε να καθορίσετε επιλογές με μεγαλύτερη προτεραιότητα από τις προεπιλεγμένες ρυθμίσεις. <placeholder-1/>"
+
+#: C/empathy.xml:924(guilabel)
+msgid "Ignore conference and chatrooms invitations"
+msgstr "Παράβλεψη συνδιάσκεψης και προσκλήσεων σε δωμάτια συνομιλιών"
+
+#: C/empathy.xml:928(para)
+msgid "Select this option to ignore the invitations that other people may send you."
+msgstr "Επιλέξτε την επιλογή αυτή για να παραβλέψετε τις προσκλήσεις που ενδεχομένως να σας στέλνουν άλλα άτομα."
+
+#: C/empathy.xml:936(guilabel)
+msgid "Room List locale"
+msgstr "Εντοπιότητα λίστας συνομιλιών"
+
+#: C/empathy.xml:939(para)
+msgid "The value of this text box identifies the language used to retrieve the room list when connecting to the Yahoo service."
+msgstr "Η τιμή σε αυτό το πεδίο κειμένου αναγνωρίζει τη γλώσσα που χρησιμοποιείται για την ανάκτηση της λίστα με τα δωμάτια συνομιλιών όταν γίνεται σύνδεση με την υπηρεσία Yahoo."
+
+#: C/empathy.xml:944(para)
+msgid "If you need to change this value, use the two letter code of your language."
+msgstr "Αν επιθυμείτε να τροποποιήσετε την τιμή αυτή, χρησιμοποιήστε τον κώδικα δύο γραμμάτων της γλώσσας σας."
+
+#: C/empathy.xml:952(guilabel)
+#: C/empathy.xml:1094(guilabel)
+msgid "Charset"
+msgstr "Κωδικοποίηση"
+
+#: C/empathy.xml:955(para)
+#: C/empathy.xml:1097(para)
+#| msgid ""
+#| "Contains menus used to perform actions in <application>Empathy</"
+#| "application>."
+msgid "The value of this text box identifies the set of the characters used by <application>Empathy</application>."
+msgstr "Η τιμή αυτού του πεδίου κειμένου αναγνωρίζει το σύνολο των χαρακτήρων που χρησιμοποιούνται από το <application>Empathy</application>."
+
+#: C/empathy.xml:961(para)
+#: C/empathy.xml:1103(para)
+msgid "It is advise to leave this value to <literal>UTF-8</literal>. Change it only if that charset does not cover your language."
+msgstr "Προτείνεται να αφήσετε την τιμή αυτή ως <literal>UTF-8</literal>. Τροποποιήστε της μόνο αν η κωδικοποίηση αυτή δεν καλύπτει τη γλώσσα σας."
+
+#: C/empathy.xml:998(guilabel)
+msgid "Use Yahoo Japan"
+msgstr "Χρήση του Yahoo Ιαπωνίας"
+
+#: C/empathy.xml:1001(para)
+msgid "Select this option only if you have a Yahoo! Japan account. With the Yahoo! Japan service you can only use a Yahoo! Japan account: if you have registered an account with the English version of the service, that account will not work."
+msgstr "Επιλέξτε την επιλογή αυτή μόνο αν έχετε ένα λογαριασμό του Yahoo! Ιαπωνίας. Με την υπηρεσία Yahoo! Ιαπωνίας μπορείτε να χρησιμοποιήσετε μόνο ένα λογαριασμό Yahoo! Ιαπωνίας: αν έχετε καταχωρήσει ένα λογαριασμό με την αγγλική έκδοση της υπηρεσίας, ο λογαριασμός αυτός δε μπορεί να χρησιμοποιηθεί."
+
+#: C/empathy.xml:1015(title)
+msgid "<acronym>AIM</acronym>, GroupWise and <acronym>MSN</acronym>"
+msgstr "<acronym>AIM</acronym>, GroupWise και <acronym>MSN</acronym>"
+
+#: C/empathy.xml:1054(guilabel)
+msgid "Published Name"
+msgstr "Δημοσιευμένο όνομα"
+
+#: C/empathy.xml:1057(para)
+msgid "Use this text box to write the name that will be visible to the other users of the network."
+msgstr "Χρησιμοποιήστε αυτό το πεδίο κειμένου για να εισάγετε το όνομα το οποίο θα είναι ορατό προς τους άλλους χρήστες του δικτύου."
+
+#: C/empathy.xml:1065(guilabel)
+msgid "Email"
+msgstr "Ηλεκτρονική Διεύθυνση"
+
+#: C/empathy.xml:1068(para)
+msgid "Use this text box to write your email."
+msgstr "Χρησιμοποιήστε αυτό το πεδίο κειμένου για να εισάγετε την ηλεκτρονικής σας διεύθυνση."
+
+#: C/empathy.xml:1075(guilabel)
+#| msgid "Jabber"
+msgid "Jabber ID"
+msgstr "Jabber ID"
+
+#: C/empathy.xml:1078(para)
+msgid "Use this text box to write your Jabber ID, if you have one."
+msgstr "Χρησιμοποιήστε αυτό το πεδίο κειμένου για να εισάγετε το Jabber ID σας, αν έχετε κάποιο."
+
+#: C/empathy.xml:1143(title)
+msgid "Gadu Gadu"
+msgstr "Gadu Gadu"
+
+#: C/empathy.xml:1147(guilabel)
+msgid "Nick"
+msgstr "Nick"
+
+#: C/empathy.xml:1149(para)
+msgid "Use this text box to write an alternative name to use with this service."
+msgstr "Χρησιμοποιήστε αυτό το πεδίο κειμένου για να εισάγετε ένα εναλλακτικό όνομα ώστε να το χρησιμοποιήσετε με την υπηρεσία αυτή."
+
+#: C/empathy.xml:1164(title)
+msgid "Contacts and Groups"
+msgstr "Επαφές και Ομάδες"
+
+#: C/empathy.xml:1165(para)
msgid "All the contacts are handled within <application>Empathy</application>'s <link linkend=\"empathy-FIG-mainwindow\">main window</link>."
msgstr "Η διαχείριση των επαφών γίνεται μέσα από το <link linkend=\"empathy-FIG-mainwindow\">βασικό παράθυρο</link> του <application>Empathy</application>."
-#: C/empathy.xml:558(title)
-msgid "Adding a Contact"
-msgstr "Προσθήκη μιας επαφής"
+#: C/empathy.xml:1169(para)
+msgid "You can add or remove a contact or you can edit the information of a particular contact. It is also possibile to arrange contacts in groups. You can have a group for your work contacts, one for you family contacts, and so on."
+msgstr "Μπορείτε να προσθέσετε ή να αφαιρέσετε μία επαφή ή μπορείτε να επεξεργαστεί τις πληροφορίες μίας συγκεκριμένης επαφής. Είναι επίσης δυνατό να τακτοποιήσετε επαφές σε ομάδες. Μπορείτε να έχετε μία ομάδα για τις επαφές της εργασίας σας, μία για τις οικογενειακές επαφές, και ούτω καθεξής."
+
+#: C/empathy.xml:1176(title)
+#| msgid "Removing a Contact"
+msgid "Adding and Removing a Contact"
+msgstr "Προσθήκη και αφαίρεση μιας επαφής"
-#: C/empathy.xml:559(para)
-msgid "To add a new contact, proceed as follow:"
-msgstr "Για να προσθέσετε μια νέα επαφή, προχωρήστε ως εξής:"
+#: C/empathy.xml:1177(para)
+#| msgid "To add a new contact, proceed as follow:"
+msgid "To add a new contact, proceed as follows:"
+msgstr "To add a new contact, proceed as follows:"
-#: C/empathy.xml:565(para)
+#: C/empathy.xml:1183(para)
msgid "From the <link linkend=\"empathy-FIG-mainwindow\">main window</link> choose <menuchoice><guimenu>Chat</guimenu><guimenuitem>Add Contact...</guimenuitem></menuchoice>. The <guilabel>New Contact</guilabel> dialog will be shown."
msgstr "Από το <link linkend=\"empathy-FIG-mainwindow\">βασικό παράθυρο</link> επιλέξτε <menuchoice><guimenu>Συζήτηση</guimenu><guimenuitem>Πρόσθεση επαφής...</guimenuitem></menuchoice>. Ο διάλογος <guilabel>Νέα επαφή</guilabel> θα εμφανιστεί."
-#: C/empathy.xml:575(para)
+#: C/empathy.xml:1193(para)
msgid "From the <guilabel>Account</guilabel> drop-down list, choose the service used by the contact you are adding."
msgstr "Από την αναδιπλούμενη λίστα <guilabel>Λογαριασμός</guilabel>, επιλέξτε την υπηρεσία που χρησιμοποιεί η επαφή που προσθέτετε."
-#: C/empathy.xml:581(para)
-msgid "In the <guilabel>Identifier</guilabel> text-box type the <emphasis>address</emphasis> of the contact in the form of <userinput><replaceable>user name</replaceable>@<replaceable>service\n\t domain</replaceable></userinput>."
-msgstr "Στο πεδίο <guilabel>Αναγνωριστικό</guilabel> πληκτρολογήστε τη <emphasis>διεύθυνση</emphasis> την επαφής στη μορφή <userinput><replaceable>όνομα χρήστη</replaceable>@<replaceable>διεύθυνση υπηρεσίας\n\t</replaceable></userinput>."
+#: C/empathy.xml:1199(para)
+#| msgid ""
+#| "In the <guilabel>Identifier</guilabel> text-box type the "
+#| "<emphasis>address</emphasis> of the contact in the form of "
+#| "<userinput><replaceable>user name</replaceable>@<replaceable>service\n"
+#| "\t domain</replaceable></userinput>."
+msgid ""
+"In the <guilabel>Identifier</guilabel> text box type the <emphasis>address</emphasis> of the contact in the form of <userinput><replaceable>user name</replaceable>@<replaceable>service\n"
+"\t domain</replaceable></userinput>."
+msgstr ""
+"Στο πεδίο κειμένου <guilabel>Αναγνωριστικό</guilabel> πληκτρολογήστε τη <emphasis>διεύθυνση</emphasis> της επαφής στη μορφή <userinput><replaceable>όνομα χρήστη</replaceable>@<replaceable>υπηρεσία\n"
+"\t τομέας</replaceable></userinput>."
-#: C/empathy.xml:590(para)
-msgid "In the <guilabel>Alias</guilabel> text-box type the name you want to give at the the new contact."
-msgstr "Στο <guilabel>Ψευδώνυμο</guilabel> πληκτρολογήστε το όνομα που θέλετε να δώσετε στη νέα επαφή."
+#: C/empathy.xml:1208(para)
+#| msgid ""
+#| "In the <guilabel>Alias</guilabel> text-box type the name you want to give "
+#| "at the the new contact."
+msgid "In the <guilabel>Alias</guilabel> text box type the name you want to give at the the new contact."
+msgstr "Στο πεδίο κειμένου <guilabel>Ψευδώνυμο</guilabel> πληκτρολογήστε το όνομα που επιθυμείτε να δώσετε στη νέα επαφή."
-#: C/empathy.xml:596(para)
+#: C/empathy.xml:1214(para)
msgid "Click on <guibutton>Add</guibutton> to add the new contact."
msgstr "Πατήστε στο <guibutton>Προσθήκη</guibutton> για να προσθέσετε τη νέα επαφή."
-#: C/empathy.xml:604(title)
-msgid "Removing a Contact"
-msgstr "Αφαίρεση μιας επαφής"
-
-#: C/empathy.xml:605(para)
-msgid "To remove a contact, proceed as follow:"
+#: C/empathy.xml:1220(para)
+#| msgid "To remove a contact, proceed as follow:"
+msgid "To remove a contact, proceed as follows:"
msgstr "Για να αφαιρέσετε μια επαφή, προχωρήστε ως εξής:"
-#: C/empathy.xml:611(para)
+#: C/empathy.xml:1226(para)
msgid "From the <link linkend=\"empathy-FIG-mainwindow\">main window</link>, select the contact you would like to remove and right-click on it."
msgstr "Από το <link linkend=\"empathy-FIG-mainwindow\">βασικό παράθυρο</link> επιλέξτε την επαφή που θέλετε να αφαιρέσετε και κάντε πάνω της δεξί κλικ."
-#: C/empathy.xml:618(para)
+#: C/empathy.xml:1233(para)
msgid "From the popup menu, choose <guilabel>Remove</guilabel> to remove the contact."
msgstr "Από το αναδυόμενο μενού επιλέξτε <guilabel>Αφαίρεση</guilabel> για να αφαιρέσετε την επαφή."
-#: C/empathy.xml:627(title)
-msgid "Modifying a Contact"
-msgstr "Τροποποίηση επαφής."
+#: C/empathy.xml:1242(para)
+#: C/empathy.xml:1278(para)
+msgid "An <emphasis>alias</emphasis> is an alternative way you can identify that particular contact. You can use the real name or the nickname of that person."
+msgstr "Το <emphasis>ψευδώνυμο</emphasis> είναι ένας εναλλακτικός τρόπος με τον οποίο μπορείτε να προσδιορίσετε τη συγκεκριμένη επαφή. Μπορείτε να χρησιμοποιήσετε το πραγματικό όνομα ή το ψευδώνυμο του προσώπου αυτού."
+
+#: C/empathy.xml:1251(title)
+#| msgid "Adding a Contact"
+msgid "Editing a Contact"
+msgstr "Επεξεργασία επαφής"
+
+#: C/empathy.xml:1252(para)
+#| msgid "To remove a contact, proceed as follow:"
+msgid "To edit a contact, proceed as follows:"
+msgstr "Για να επεξεργαστείτε μια επαφή, προχωρήστε ως εξής:"
+
+#: C/empathy.xml:1258(para)
+#: C/empathy.xml:1300(para)
+#| msgid ""
+#| "From the <link linkend=\"empathy-FIG-mainwindow\">main window</link> "
+#| "choose <menuchoice><guimenu>Chat</guimenu><guimenuitem>Add Contact...</"
+#| "guimenuitem></menuchoice>. The <guilabel>New Contact</guilabel> dialog "
+#| "will be shown."
+msgid "From the <link linkend=\"empathy-FIG-mainwindow\">main window</link>, select the contact you would like to modify and choose <menuchoice><guimenu>Edit</guimenu><guisubmenu>Contact</guisubmenu><guimenuitem>Edit</guimenuitem></menuchoice>, or right-click on it and choose <guilabel>Edit</guilabel>."
+msgstr "Από <link linkend=\"empathy-FIG-mainwindow\">κύριο παράθυρο</link>, επιλέξτε την επαφή που επιθυμείτε να τροποποιήσετε και επιλέξτε <menuchoice><guimenu>Επεξεργασία</guimenu><guisubmenu>Επαφή</guisubmenu><guimenuitem>Επεξεργασία</guimenuitem></menuchoice>, ή κάντε δεξί κλικ πάνω του και επιλέξτε <guilabel>Επεξεργασία</guilabel>."
+
+#: C/empathy.xml:1271(para)
+msgid "From the <guilabel>Edit Contact Information</guilabel> dialog, you can modify the <emphasis>alias</emphasis> and the <emphasis>group</emphasis> of the contact."
+msgstr "Από το παράθυρο διαλόγου <guilabel>Επεξεργασία πληροφοριών επαφής</guilabel>, μπορείτε να τροποποιήσετε το <emphasis>ψευδώνυμο</emphasis> και την <emphasis>ομάδα</emphasis> της επαφής."
+
+#: C/empathy.xml:1285(para)
+msgid "For more information about groups, see <xref linkend=\"empathy-add-contact-group\"/> and <xref linkend=\"empathy-add-group\"/>."
+msgstr "Για περισσότερες πληροφορίες σχετικά με τις ομάδες, δείτε <xref linkend=\"empathy - προσθήκη επαφής σε ομάδα\"/> και <xref linkend=\"empathy - προσθήκη ομάδας\"/>."
+
+#: C/empathy.xml:1293(title)
+#| msgid "Adding a Contact"
+msgid "Adding a Contact to a Group"
+msgstr "Προσθήκη επαφής σε μία ομάδα"
+
+#: C/empathy.xml:1294(para)
+#| msgid "To add a new contact, proceed as follow:"
+msgid "To add a contact to one or more groups, proceed as follows:"
+msgstr "Για να προσθέσετε μια επαφή σε μία ή περισσότερες ομάδες, προχωρήστε ως εξής:"
+
+#: C/empathy.xml:1312(para)
+#| msgid ""
+#| "In the <guilabel>Alias</guilabel> text-box type the name you want to give "
+#| "at the the new contact."
+msgid "From the <guilabel>Groups</guilabel> section, select the group, or groups, you want to add the contact to."
+msgstr "Από την ενότητα <guilabel>Ομάδες</guilabel>, επιλέξτε την ομάδα, ή τις ομάδες, όπου επιθυμείτε να προσθέσετε την επαφή."
+
+#: C/empathy.xml:1327(title)
+msgid "Adding a New Group"
+msgstr "Προσθήκη νέας ομάδας"
+
+#: C/empathy.xml:1328(para)
+#| msgid "To add a new contact, proceed as follow:"
+msgid "To add a new group, proceed as follows:"
+msgstr "Για να προσθέσετε μια νέα ομάδα, προχωρήστε ως εξής:"
+
+#: C/empathy.xml:1334(para)
+#| msgid ""
+#| "From the <link linkend=\"empathy-FIG-mainwindow\">main window</link> "
+#| "choose <menuchoice><guimenu>Chat</guimenu><guimenuitem>Add Contact...</"
+#| "guimenuitem></menuchoice>. The <guilabel>New Contact</guilabel> dialog "
+#| "will be shown."
+msgid "From the <link linkend=\"empathy-FIG-mainwindow\">main window</link>, select one contact and choose <menuchoice><guimenu>Edit</guimenu><guisubmenu>Contact</guisubmenu><guimenuitem>Edit</guimenuitem></menuchoice>, or right-click on it and choose <guilabel>Edit</guilabel>."
+msgstr "Από το <link linkend=\"empathy-FIG-mainwindow\">κύριο παράθυρο</link>, επιλέξτε μία επαφή και επιλέξτε <menuchoice><guimenu>Επεξεργασία</guimenu><guisubmenu>Επαφή</guisubmenu><guimenuitem>Επεξεργασία</guimenuitem></menuchoice>, ή κάντε δεξί κλικ πάνω του και επιλέξτε <guilabel>Επεξεργασία</guilabel>."
+
+#: C/empathy.xml:1345(para)
+#| msgid ""
+#| "From the <guilabel>Type</guilabel> drop-down list choose the service you "
+#| "wish to create an account for, then click on the <guibutton>Create</"
+#| "guibutton> button."
+msgid "In the <guilabel>Groups</guilabel> section, write the name of the group you want to add and then click on <guibutton>Add Group</guibutton>."
+msgstr "Από την ενότητα <guilabel>Ομάδες</guilabel>, εισάγετε το όνομα της ομάδες που επιθυμείτε να προσθέσετε και ύστερα κάντε κλικ στο κουμπί <guibutton>Προσθήκη ομάδας</guibutton>."
#. Put one translator per line, in the form of NAME <EMAIL>, YEAR1, YEAR2.
#: C/empathy.xml:0(None)
@@ -498,3 +983,54 @@ msgstr ""
"\n"
"Για περισσότερα δείτε http://www.gnome.gr/"
+#~ msgid ""
+#~ "@@image: 'figures/empathy-new-account.png'; "
+#~ "md5=6c1e0d8c709125d387e975e5738b8c0f"
+#~ msgstr ""
+#~ "@@image: 'figures/empathy-new-account.png'; "
+#~ "md5=6c1e0d8c709125d387e975e5738b8c0f"
+#~ msgid "2008"
+#~ msgstr "2008"
+#~ msgid "milo_casagrande@yahoo.it"
+#~ msgstr "milo_casagrande@yahoo.it"
+#~ msgid "When You Start Empathy for the First Time"
+#~ msgstr "Πρώτη εκκίνηση του Empathy"
+#~ msgid "<application>Empathy</application> Accounts Dialog"
+#~ msgstr "Διάλογος λογαριασμών του <application>Empathy</application>"
+#~ msgid "Shows <placeholder-1/> account creation dialog."
+#~ msgstr "Δείχνει το διάλογο δημιουργίας λογαριασμού <placeholder-1/>."
+#~ msgid ""
+#~ "When you start <application>Empathy</application> for the first time and "
+#~ "you don't have configured any account yet, the following dialog is shown. "
+#~ "<placeholder-1/>"
+#~ msgstr ""
+#~ "Όταν εκκινήσετε το <application>Empathy</application> για πρώτη φορά και "
+#~ "δεν έχετε ακόμα ρυθμίσει κάποιο λογαριασμό, εμφανίζεται ο ακόλουθος "
+#~ "διάλογος. <placeholder-1/>"
+#~ msgid ""
+#~ "From here, you can configure and create your accounts. See <xref linkend="
+#~ "\"empathy-accounts\"/> for more information."
+#~ msgstr ""
+#~ "Από εδώ μπορείτε να δημιουργήσετε και να ρυθμίσετε τους λογαριασμούς σας. "
+#~ "Δείτε το <xref linkend=\"empathy-accounts\"/> για περισσότερες "
+#~ "πληροφορίες."
+#~ msgid ""
+#~ "You can use one of the following services if you already have a <emphasis "
+#~ "role=\"strong\">Jabber</emphasis> account:"
+#~ msgstr ""
+#~ "Μπορείτε να επιλέξετε μια από τις ακόλουθες υπηρεσίες αν έχετε ήδη έναν "
+#~ "λογαριασμό <emphasis>Jabber</emphasis>:"
+#~ msgid ""
+#~ "Fill the required fields with your <emphasis>user name</emphasis> and "
+#~ "<emphasis>password</emphasis>."
+#~ msgstr ""
+#~ "Συμπληρώστε τα απαραίτητα πεδία με τον <emphasis>όνομα χρήστη</emphasis> "
+#~ "και το <emphasis>συνθηματικό</emphasis> σας."
+#~ msgid "To create an account, proceed as follow: <placeholder-1/>"
+#~ msgstr ""
+#~ "Για να δημιουργήσετε ένα λογαριασμό, προχωρήστε ως εξής: <placeholder-1/>"
+#~ msgid "Contacts"
+#~ msgstr "Επαφές"
+#~ msgid "Modifying a Contact"
+#~ msgstr "Τροποποίηση επαφής."
+
diff --git a/help/es/es.po b/help/es/es.po
index 8357dde94..753288b03 100644
--- a/help/es/es.po
+++ b/help/es/es.po
@@ -3,8 +3,8 @@
msgid ""
msgstr ""
"Project-Id-Version: empathy.help.HEAD\n"
-"POT-Creation-Date: 2009-04-18 18:34+0000\n"
-"PO-Revision-Date: 2009-04-21 21:04+0200\n"
+"POT-Creation-Date: 2009-05-05 20:43+0000\n"
+"PO-Revision-Date: 2009-05-09 10:54+0200\n"
"Last-Translator: Jorge González <jorgegonz@svn.gnome.org>\n"
"Language-Team: Español <gnome-es-list@gnome.org>\n"
"MIME-Version: 1.0\n"
@@ -15,7 +15,7 @@ msgstr ""
#. When image changes, this message will be marked fuzzy or untranslated for you.
#. It doesn't matter what you translate it to: it's not used at all.
-#: C/empathy.xml:237(None)
+#: C/empathy.xml:262(None)
msgid ""
"@@image: 'figures/empathy-main-window.png'; "
"md5=38259a866f38ff1f754828e46d2b0e5c"
@@ -24,19 +24,31 @@ msgstr ""
"md5=38259a866f38ff1f754828e46d2b0e5c"
#: C/empathy.xml:27(title)
-msgid "<application>Empathy</application> Manual V2.1"
-msgstr "Manual de <application>Empathy</application> V2.1"
+#| msgid "<application>Empathy</application> Manual V2.1"
+msgid "<application>Empathy</application> Manual V2.2"
+msgstr "Manual de <application>Empathy</application> V2.2"
-#: C/empathy.xml:30(year)
+#: C/empathy.xml:30(year) C/empathy.xml:46(year)
msgid "2008, 2009"
msgstr "2008, 2009"
-#: C/empathy.xml:31(holder) C/empathy.xml:37(publishername)
-#: C/empathy.xml:48(orgname) C/empathy.xml:56(orgname) C/empathy.xml:87(para)
-#: C/empathy.xml:101(para)
+#: C/empathy.xml:31(holder) C/empathy.xml:47(publishername)
+#: C/empathy.xml:62(orgname) C/empathy.xml:70(orgname) C/empathy.xml:112(para)
+#: C/empathy.xml:126(para)
msgid "Ubuntu Documentation Project"
msgstr "Proyecto de documentación de Ubuntu"
+#: C/empathy.xml:34(year) C/empathy.xml:42(year)
+#| msgid "2008"
+msgid "2009"
+msgstr "2009"
+
+#: C/empathy.xml:35(holder) C/empathy.xml:43(publishername)
+#: C/empathy.xml:58(orgname) C/empathy.xml:101(para)
+#| msgid "Ubuntu Documentation Project"
+msgid "GNOME Documentation Project"
+msgstr "Proyecto de documentación de GNOME"
+
#: C/empathy.xml:2(para)
msgid ""
"Permission is granted to copy, distribute and/or modify this document under "
@@ -142,68 +154,74 @@ msgstr ""
"LAS CONDICIONES ESTABLECIDAS EN LA LICENCIA DE DOCUMENTACIÓN LIBRE DE GNU "
"(GFDL) Y TENIENDO EN CUENTA QUE: <placeholder-1/>"
-#: C/empathy.xml:45(firstname)
+#: C/empathy.xml:55(firstname)
msgid "Milo"
msgstr "Milo"
-#: C/empathy.xml:46(surname)
+#: C/empathy.xml:56(surname)
msgid "Casagrande"
msgstr "Casagrande"
-#: C/empathy.xml:49(email)
+#: C/empathy.xml:59(email) C/empathy.xml:63(email)
msgid "milo@ubuntu.com"
msgstr "milo@ubuntu.com"
-#: C/empathy.xml:53(firstname)
+#: C/empathy.xml:67(firstname)
msgid "Seth"
msgstr "Seth"
-#: C/empathy.xml:54(surname)
+#: C/empathy.xml:68(surname)
msgid "Dudenhofer"
msgstr "Dudenhofer"
-#: C/empathy.xml:57(email)
+#: C/empathy.xml:71(email)
msgid "sdudenhofer@gmail.com"
msgstr "sdudenhofer@gmail.com"
-#: C/empathy.xml:81(revnumber)
+#: C/empathy.xml:95(revnumber)
+#| msgid "Empathy Manual V2.1"
+msgid "Empathy Manual V2.2"
+msgstr "Manual de Empathy V2.2"
+
+#: C/empathy.xml:96(date)
+#| msgid "January 2009"
+msgid "May 2009"
+msgstr "Mayo de 2009"
+
+#: C/empathy.xml:98(para) C/empathy.xml:109(para) C/empathy.xml:120(para)
+msgid "Milo Casagrande <email>milo@ubuntu.com</email>"
+msgstr "Milo Casagrande <email>milo@ubuntu.com</email>"
+
+#: C/empathy.xml:106(revnumber)
msgid "Empathy Manual V2.1"
msgstr "Manual de Empathy V2.1"
-#: C/empathy.xml:82(date)
+#: C/empathy.xml:107(date)
msgid "January 2009"
msgstr "Enero de 2009"
-#: C/empathy.xml:84(para) C/empathy.xml:95(para)
-msgid "Milo Casagrande <email>milo@ubuntu.com</email>"
-msgstr "Milo Casagrande <email>milo@ubuntu.com</email>"
-
-#: C/empathy.xml:92(revnumber)
+#: C/empathy.xml:117(revnumber)
msgid "Empathy Manual V2.0"
msgstr "Manual de Empathy V2.0"
-#: C/empathy.xml:93(date)
+#: C/empathy.xml:118(date)
msgid "April 2008"
msgstr "Abril de 2008"
-#: C/empathy.xml:98(para)
+#: C/empathy.xml:123(para)
msgid "Seth Dudenhofer <email>sdudenhofer@gmail.com</email>"
msgstr "Seth Dudenhofer <email>sdudenhofer@gmail.com</email>"
-#: C/empathy.xml:106(releaseinfo)
-msgid "This manual describes version 2.26 of Empathy."
-msgstr "Este manual describe la versión 2.26 de Empathy."
+#: C/empathy.xml:131(releaseinfo)
+#| msgid "This manual describes version 2.26 of Empathy."
+msgid "This manual describes version 2.28 of Empathy."
+msgstr "Este manual describe la versión 2.28 de Empathy."
-#: C/empathy.xml:110(title)
+#: C/empathy.xml:135(title)
msgid "Feedback"
msgstr "Comentarios"
-#: C/empathy.xml:111(para)
-#| msgid ""
-#| "To report a bug or make a suggestion regarding the <application>Empathy</"
-#| "application> application or this manual, follow the directions in the "
-#| "<ulink url=\"ghelp:gnome-feedback\" type=\"help\">GNOME Feedback Page</"
-#| "ulink>."
+#: C/empathy.xml:136(para)
msgid ""
"To report a bug or make a suggestion regarding the <application>Empathy</"
"application> application or this manual, follow the directions in the <ulink "
@@ -214,27 +232,27 @@ msgstr ""
"indicaciones en la <ulink url=\"ghelp:user-guide?feedback\" type=\"help"
"\">Página de comentarios de GNOME</ulink>."
-#: C/empathy.xml:118(para)
+#: C/empathy.xml:143(para)
msgid "Empathy is an application for instant messaging."
msgstr "Empathy es una aplicación para mensajería instantánea."
-#: C/empathy.xml:126(primary) C/empathy.xml:0(application)
+#: C/empathy.xml:151(primary) C/empathy.xml:0(application)
msgid "Empathy"
msgstr "Empathy"
-#: C/empathy.xml:129(primary)
+#: C/empathy.xml:154(primary)
msgid "empathy"
msgstr "empathy"
-#: C/empathy.xml:130(secondary)
+#: C/empathy.xml:155(secondary)
msgid "istant messaging"
msgstr "mensajería instantánea"
-#: C/empathy.xml:134(title)
+#: C/empathy.xml:159(title)
msgid "Introduction"
msgstr "Introducción"
-#: C/empathy.xml:135(para)
+#: C/empathy.xml:160(para)
msgid ""
"<application>Empathy</application> is a multi-protocol instant messaging "
"program for the GNOME Desktop. With <application>Empathy</application> you "
@@ -246,47 +264,47 @@ msgstr ""
"application> puede mantenerse en contacto con sus amigos a través de muchos "
"de los servicios de mensajería instantánea soportados."
-#: C/empathy.xml:145(acronym)
+#: C/empathy.xml:170(acronym)
msgid "AIM"
msgstr "AIM"
-#: C/empathy.xml:149(para)
+#: C/empathy.xml:174(para)
msgid "Google Talk"
msgstr "Google Talk"
-#: C/empathy.xml:154(para) C/empathy.xml:1089(title)
+#: C/empathy.xml:179(para) C/empathy.xml:1114(title)
msgid "ICQ"
msgstr "ICQ"
-#: C/empathy.xml:160(acronym)
+#: C/empathy.xml:185(acronym)
msgid "IRC"
msgstr "IRC"
-#: C/empathy.xml:164(para)
+#: C/empathy.xml:189(para)
msgid "Jabber (or <acronym>XMPP</acronym>)"
msgstr "Jabber (o <acronym>XMPP</acronym>)"
-#: C/empathy.xml:170(acronym)
+#: C/empathy.xml:195(acronym)
msgid "MSN"
msgstr "MSN"
-#: C/empathy.xml:174(para) C/empathy.xml:441(para) C/empathy.xml:1049(title)
+#: C/empathy.xml:199(para) C/empathy.xml:466(para) C/empathy.xml:1074(title)
msgid "Salut"
msgstr "Salut"
-#: C/empathy.xml:180(acronym)
+#: C/empathy.xml:205(acronym)
msgid "SIP"
msgstr "SIP"
-#: C/empathy.xml:184(para) C/empathy.xml:919(title)
+#: C/empathy.xml:209(para) C/empathy.xml:944(title)
msgid "Yahoo"
msgstr "Yahoo"
-#: C/empathy.xml:189(para)
+#: C/empathy.xml:214(para)
msgid "And many others..."
msgstr "Y muchos otros…"
-#: C/empathy.xml:140(para)
+#: C/empathy.xml:165(para)
msgid ""
"<application>Empathy</application> supports the following services: "
"<placeholder-1/>"
@@ -294,24 +312,24 @@ msgstr ""
"<application>Empathy</application> soporta los siguientes servicios: "
"<placeholder-1/>"
-#: C/empathy.xml:198(title)
+#: C/empathy.xml:223(title)
msgid "Getting Started"
msgstr "Inicio"
-#: C/empathy.xml:201(title)
+#: C/empathy.xml:226(title)
msgid "Starting Empathy"
msgstr "Iniciar Empathy"
-#: C/empathy.xml:202(para)
+#: C/empathy.xml:227(para)
msgid "You can start <application>Empathy</application> in the following ways:"
msgstr ""
"Puede iniciar <application>Empathy</application> de las siguientes formas:"
-#: C/empathy.xml:206(term)
+#: C/empathy.xml:231(term)
msgid "<guimenu>Applications</guimenu> menu"
msgstr "Menú <guimenu>Aplicaciones</guimenu>"
-#: C/empathy.xml:208(para)
+#: C/empathy.xml:233(para)
msgid ""
"Choose <menuchoice><guisubmenu>Internet</guisubmenu><guimenuitem>Empathy "
"Instant Messenger</guimenuitem></menuchoice>."
@@ -319,23 +337,23 @@ msgstr ""
"Elija <menuchoice><guisubmenu>Internet</guisubmenu><guimenuitem>Mensajería "
"instantánea Empathy</guimenuitem></menuchoice>."
-#: C/empathy.xml:217(term)
+#: C/empathy.xml:242(term)
msgid "Command line"
msgstr "Línea de comandos"
-#: C/empathy.xml:219(para)
+#: C/empathy.xml:244(para)
msgid "Type <command>empathy</command> and then press <keycap>Enter</keycap>."
msgstr "Escriba <command>empathy</command> y pulse <keycap>intro</keycap>."
-#: C/empathy.xml:228(title)
+#: C/empathy.xml:253(title)
msgid "When You Start Empathy"
msgstr "Al iniciar Empathy"
-#: C/empathy.xml:233(title)
+#: C/empathy.xml:258(title)
msgid "<application>Empathy</application> Main Window"
msgstr "Ventana principal de <application>Empathy</application>"
-#: C/empathy.xml:240(phrase)
+#: C/empathy.xml:265(phrase)
msgid ""
"Shows <placeholder-1/> main window. Contains the titlebar, the menubar, "
"contact list, status icon and status arrow button list."
@@ -344,7 +362,7 @@ msgstr ""
"título, la barra de menú, la lista de contactos, el icono de estado y la "
"lista de estados."
-#: C/empathy.xml:229(para)
+#: C/empathy.xml:254(para)
msgid ""
"When you start <application>Empathy</application> the following window is "
"shown. <placeholder-1/>"
@@ -352,54 +370,54 @@ msgstr ""
"Se mostrará la siguiente ventana al iniciar <application>Empathy</"
"application>. <placeholder-1/>"
-#: C/empathy.xml:255(title)
+#: C/empathy.xml:280(title)
msgid "<application>Empathy</application> Main Components"
msgstr "Componentes principales de <application>Empathy</application>"
-#: C/empathy.xml:262(para)
+#: C/empathy.xml:287(para)
msgid "Component"
msgstr "Componente"
-#: C/empathy.xml:265(para)
+#: C/empathy.xml:290(para)
msgid "Description"
msgstr "Descripción"
-#: C/empathy.xml:272(para)
+#: C/empathy.xml:297(para)
msgid "Menubar"
msgstr "Barra de menú"
-#: C/empathy.xml:275(para)
+#: C/empathy.xml:300(para)
msgid ""
"Contains menus used to perform actions in <application>Empathy</application>."
msgstr ""
"Contiene los menús usados para realizar acciones en <application>Empathy</"
"application>."
-#: C/empathy.xml:282(para)
+#: C/empathy.xml:307(para)
msgid "Status Drop-Down List"
msgstr "Lista desplegable de estados"
-#: C/empathy.xml:285(para)
+#: C/empathy.xml:310(para)
msgid "Allows to update the status."
msgstr "Permite actualizar el estado."
-#: C/empathy.xml:292(para)
+#: C/empathy.xml:317(para)
msgid "Account Button"
msgstr "Botón Cuentas"
-#: C/empathy.xml:295(para)
+#: C/empathy.xml:320(para)
msgid "Opens the <guilabel>Accounts</guilabel> dialog."
msgstr "Abre el diálogo <guilabel>Cuentas</guilabel>."
-#: C/empathy.xml:302(para)
+#: C/empathy.xml:327(para)
msgid "Contact List"
msgstr "Lista de contactos"
-#: C/empathy.xml:305(para)
+#: C/empathy.xml:330(para)
msgid "Shows all the available contacts and their associated status."
msgstr "Muestra todos los contactos disponibles y su estado asociado."
-#: C/empathy.xml:251(para)
+#: C/empathy.xml:276(para)
msgid ""
"<xref linkend=\"empathy-TBL-1\"/> describes the components of "
"<application>Empathy</application>'s main window. <table frame=\"topbot\" id="
@@ -415,11 +433,11 @@ msgstr ""
"\"colspec1\" colwidth=\"70.61*\"/><placeholder-2/><placeholder-3/></tgroup></"
"table>"
-#: C/empathy.xml:319(title)
+#: C/empathy.xml:344(title)
msgid "Accounts"
msgstr "Cuentas"
-#: C/empathy.xml:320(para)
+#: C/empathy.xml:345(para)
msgid ""
"To use <application>Empathy</application> you need at least one account of "
"the supported services."
@@ -427,7 +445,7 @@ msgstr ""
"Para usar <application>Empathy</application> debe tener al menos una cuenta "
"de los servicios soportados."
-#: C/empathy.xml:323(para)
+#: C/empathy.xml:348(para)
msgid ""
"If you don't already have an account and you don't have your <emphasis>user "
"name</emphasis> and <emphasis>password</emphasis>, you need to register a "
@@ -437,7 +455,7 @@ msgstr ""
"<emphasis>contraseña</emphasis>, debe registrar una cuenta nueva (consulte "
"<xref linkend=\"empathy-register-account\"/>)."
-#: C/empathy.xml:328(para)
+#: C/empathy.xml:353(para)
msgid ""
"In order to talk with other users, also called <emphasis>contacts</"
"emphasis>, you need to use the same service they are using. If, for example, "
@@ -449,7 +467,7 @@ msgstr ""
"de sus contactos está usando el servicio <emphasis role=\"strong\">Jabber</"
"emphasis>, necesita tener una cuenta registrada en ese servicio."
-#: C/empathy.xml:335(para)
+#: C/empathy.xml:360(para)
msgid ""
"<application>Empathy</application> can handle as many accounts on any "
"supported services as you want and you can have them all open at the same "
@@ -459,11 +477,11 @@ msgstr ""
"cualquiera de los servicios soportados que quiera añadir y puede tener todas "
"ellas abiertas al mismo tiempo."
-#: C/empathy.xml:341(title)
+#: C/empathy.xml:366(title)
msgid "Registering an Account"
msgstr "Registrar una cuenta"
-#: C/empathy.xml:342(para)
+#: C/empathy.xml:367(para)
msgid ""
"You can freely register an account on any of the following services. Follow "
"the instructions reported on each website on how to register your new "
@@ -481,7 +499,7 @@ msgstr ""
#. Translators: try to find a localized version of the
#. registration service website
-#: C/empathy.xml:360(para)
+#: C/empathy.xml:385(para)
msgid ""
"The <ulink type=\"http\" url=\"http://dashboard.aim.com/aim\">AIM</ulink> "
"service."
@@ -491,7 +509,7 @@ msgstr ""
#. Translators: try to find a localized version of the
#. registration service website
-#: C/empathy.xml:367(para)
+#: C/empathy.xml:392(para)
msgid ""
"The <ulink type=\"http\" url=\"http://www.google.com/talk/\">Google Talk</"
"ulink> service."
@@ -501,7 +519,7 @@ msgstr ""
#. Translators: try to find a localized version of the
#. registration service website
-#: C/empathy.xml:375(para)
+#: C/empathy.xml:400(para)
msgid ""
"The <ulink type=\"http\" url=\"https://www.icq.com/register/\">ICQ</ulink> "
"service."
@@ -511,7 +529,7 @@ msgstr ""
#. Translators: try to find a localized version of the
#. registration service website
-#: C/empathy.xml:382(para)
+#: C/empathy.xml:407(para)
msgid ""
"The <ulink type=\"http\" url=\"https://accountservices.passport.net\">MSN</"
"ulink> service."
@@ -521,7 +539,7 @@ msgstr ""
#. Translators: try to find a localized version of the
#. registration service website
-#: C/empathy.xml:389(para)
+#: C/empathy.xml:414(para)
msgid ""
"The <ulink type=\"http\" url=\"https://login.yahoo.com/config/login\">Yahoo</"
"ulink> service."
@@ -529,12 +547,12 @@ msgstr ""
"El servicio <ulink type=\"http\" url=\"https://login.yahoo.com/config/login"
"\">Yahoo</ulink>."
-#: C/empathy.xml:351(para)
+#: C/empathy.xml:376(para)
msgid "Click on the name of the service to visit its website: <placeholder-1/>"
msgstr ""
"Pulse en el nombre del servicio para visitar su página web: <placeholder-1/>"
-#: C/empathy.xml:395(para)
+#: C/empathy.xml:420(para)
msgid ""
"For registering a <acronym>SIP</acronym> account, you can use one of the "
"following service:"
@@ -544,7 +562,7 @@ msgstr ""
#. Translators: try to find a localized version of the
#. registration service website
-#: C/empathy.xml:404(para)
+#: C/empathy.xml:429(para)
msgid ""
"The <ulink type=\"http\" url=\"https://www.ekiga.net/index.php?page=register"
"\">Ekiga</ulink> service."
@@ -554,7 +572,7 @@ msgstr ""
#. Translators: try to find a localized version of the
#. registration service website
-#: C/empathy.xml:411(para)
+#: C/empathy.xml:436(para)
msgid ""
"The <ulink type=\"http\" url=\"http://account2.freeworlddialup.com/index.php?"
"section_id=94\"><acronym>FWD</acronym></ulink> (Free World Dialup) service."
@@ -564,7 +582,7 @@ msgstr ""
#. Translators: try to find a localized version of the
#. registration service website
-#: C/empathy.xml:419(para)
+#: C/empathy.xml:444(para)
msgid ""
"The <ulink type=\"http\" url=\"https://signup.sipphone.com/new-users/app?"
"class=NewUser;proc=start\">Sipphone</ulink> service."
@@ -572,7 +590,7 @@ msgstr ""
"El servicio <ulink type=\"http\" url=\"https://signup.sipphone.com/new-users/"
"app?class=NewUser;proc=start\">Sipphone</ulink>."
-#: C/empathy.xml:425(para)
+#: C/empathy.xml:450(para)
msgid ""
"For registering a <emphasis role=\"strong\">Jabber</emphasis> account, you "
"can use the automatic account creation of <application>Empathy</"
@@ -588,7 +606,7 @@ msgstr ""
"sabe que funcionan con <application>Empathy</application> es <ulink type="
"\"http\" url=\"http://www.jabber.org/web/Jabber.org\">jabber.org</ulink>."
-#: C/empathy.xml:433(para)
+#: C/empathy.xml:458(para)
msgid ""
"If you already have a <emphasis role=\"strong\">Jabber</emphasis> account, "
"you can use one of the following services:"
@@ -596,12 +614,12 @@ msgstr ""
"Si ya tiene una cuenta <emphasis role=\"strong\">Jabber</emphasis> puede "
"usar uno de los siguientes servicios:"
-#: C/empathy.xml:450(title)
+#: C/empathy.xml:475(title)
msgid "Adding your Account to <application>Empathy</application>"
msgstr "Añadir su cuenta a <application>Empathy</application>"
-#: C/empathy.xml:455(para) C/empathy.xml:533(para) C/empathy.xml:585(para)
-#: C/empathy.xml:618(para) C/empathy.xml:648(para) C/empathy.xml:671(para)
+#: C/empathy.xml:480(para) C/empathy.xml:558(para) C/empathy.xml:610(para)
+#: C/empathy.xml:643(para) C/empathy.xml:673(para) C/empathy.xml:696(para)
msgid ""
"From the <link linkend=\"empathy-FIG-mainwindow\">main window </link> "
"(<guilabel>Contact List</guilabel>) click on the account button or press "
@@ -611,7 +629,7 @@ msgstr ""
"(<guilabel>Lista de contactos</guilabel>) pulse en el botón de cuentas o "
"<keycap>F4</keycap> para abrir el diálogo <guilabel>Cuentas</guilabel>."
-#: C/empathy.xml:467(para) C/empathy.xml:484(para)
+#: C/empathy.xml:492(para) C/empathy.xml:509(para)
msgid ""
"From the <guilabel>Type</guilabel> drop-down list choose the service you "
"wish to add an account for, then click on the <guibutton>Create</guibutton> "
@@ -621,7 +639,7 @@ msgstr ""
"el que quiere crear la cuenta, después pulse en el botón <guibutton>Crear</"
"guibutton>."
-#: C/empathy.xml:463(para)
+#: C/empathy.xml:488(para)
msgid ""
"If it is the first time you launch <application>Empathy</application>: "
"<placeholder-1/>"
@@ -629,15 +647,15 @@ msgstr ""
"Si ésta es la primera vez que lanza <application>Empathy</application>: "
"<placeholder-1/>"
-#: C/empathy.xml:479(para)
+#: C/empathy.xml:504(para)
msgid "Click on the <guilabel>Add</guilabel> button."
msgstr "Pulse el botón <guibutton>Añadir</guibutton>."
-#: C/empathy.xml:475(para)
+#: C/empathy.xml:500(para)
msgid "Otherwise: <placeholder-1/>"
msgstr "De otra forma: <placeholder-1/>"
-#: C/empathy.xml:494(para)
+#: C/empathy.xml:519(para)
msgid ""
"Fill the required fields with your <emphasis>user name</emphasis> and "
"<emphasis>password</emphasis>. Optionally, you can modify some advanced "
@@ -649,7 +667,7 @@ msgstr ""
"opciones avanzadas. Para obtener más información consulte <xref linkend="
"\"empathy-advanced-options\"/>."
-#: C/empathy.xml:503(para) C/empathy.xml:566(para)
+#: C/empathy.xml:528(para) C/empathy.xml:591(para)
msgid ""
"To enable the new account, select the <guilabel>Enabled</guilabel> check-box "
"next to the name of the account in the box on the left."
@@ -658,7 +676,7 @@ msgstr ""
"<guilabel>Activada</guilabel> junto al nombre de la cuenta, en la caja de la "
"izquierda."
-#: C/empathy.xml:451(para)
+#: C/empathy.xml:476(para)
msgid ""
"To add your account to <application>Empathy</application>, proceed as "
"follows: <placeholder-1/>"
@@ -666,11 +684,11 @@ msgstr ""
"Para añadir su cuenta a <application>Empathy</application>, proceda como "
"sigue: <placeholder-1/>"
-#: C/empathy.xml:513(title)
+#: C/empathy.xml:538(title)
msgid "Importing Accounts"
msgstr "Importar cuentas"
-#: C/empathy.xml:514(para)
+#: C/empathy.xml:539(para)
msgid ""
"If you use another instant messaging program, you can import the accounts "
"from that program into <application>Empathy</application>"
@@ -678,7 +696,7 @@ msgstr ""
"Si usa otro programa de mensajería instantánea puede importar las cuentas de "
"ese programa en <application>Empathy</application>"
-#: C/empathy.xml:520(para)
+#: C/empathy.xml:545(para)
msgid ""
"At the moment <application>Empathy</application> can import the accounts "
"only from the instant messaging program <application>Pidgin</application>. "
@@ -690,7 +708,7 @@ msgstr ""
"información acerca de <application>Pidgin</application> consulte la <ulink "
"type=\"http\" url=\"http://www.pidgin.im/\">página web de Pidgin</ulink>."
-#: C/empathy.xml:541(para)
+#: C/empathy.xml:566(para)
msgid ""
"Click on the <guibutton>Import Accounts...</guibutton> button to open the "
"<guilabel>Import Accounts</guilabel> dialog."
@@ -698,7 +716,7 @@ msgstr ""
"Pulse en el botón <guibutton>Importar cuentas...</guibutton> para abrir el "
"diálogo <guilabel>Importar cuentas</guilabel>."
-#: C/empathy.xml:548(para)
+#: C/empathy.xml:573(para)
msgid ""
"Select the accounts you would like to import by clicking on the "
"<guilabel>Import</guilabel> check-box."
@@ -706,7 +724,7 @@ msgstr ""
"Seleccione la cuenta que quiere importar pulsando en la casilla de selección "
"<guilabel>Importar</guilabel>."
-#: C/empathy.xml:554(para)
+#: C/empathy.xml:579(para)
msgid ""
"When you have selected all the desired accounts, click <guibutton>OK</"
"guibutton> to import them. If you don't want to import the accounts, click "
@@ -716,7 +734,7 @@ msgstr ""
"<guibutton>Aceptar</guibutton> para importarlas. Si no quiere importar las "
"cuentas, pulse el botón <guibutton>Cancelar</guibutton>."
-#: C/empathy.xml:562(para)
+#: C/empathy.xml:587(para)
msgid ""
"When you import a new account into <application>Empathy</application>, it "
"will not be enabled by default."
@@ -724,7 +742,7 @@ msgstr ""
"Al importar una cuenta nueva en <application>Empathy</application> no se "
"activará de forma predeterminada."
-#: C/empathy.xml:529(para)
+#: C/empathy.xml:554(para)
msgid ""
"To import the accounts into <application>Empathy</application>, proceed as "
"follows: <placeholder-1/>"
@@ -732,19 +750,19 @@ msgstr ""
"Para importar cuentas en <application>Empathy</application> proceda como "
"sigue: <placeholder-1/>"
-#: C/empathy.xml:578(title)
+#: C/empathy.xml:603(title)
msgid "Editing an Account"
msgstr "Editar una cuenta"
-#: C/empathy.xml:593(para)
+#: C/empathy.xml:618(para)
msgid "Select the account you wish to edit in the box on the left."
msgstr "Seleccione la cuenta que quiere editar en la caja a la izquierda."
-#: C/empathy.xml:599(para)
+#: C/empathy.xml:624(para)
msgid "Modify the desired data."
msgstr "Modifique los datos deseados."
-#: C/empathy.xml:579(para)
+#: C/empathy.xml:604(para)
msgid ""
"To edit one of your accounts, i.e. to change the <emphasis>password</"
"emphasis> or your <emphasis>user name</emphasis>, proceed as follows: "
@@ -754,12 +772,12 @@ msgstr ""
"<emphasis>contraseña</emphasis> o su <emphasis>usuario</emphasis>, proceda "
"como sigue: <placeholder-1/>"
-#: C/empathy.xml:607(para)
+#: C/empathy.xml:632(para)
msgid ""
"Based on the type of the account, it is possibile to edit different settings."
msgstr "Basado en el tipo de cuenta, es posible editar diferentes ajustes."
-#: C/empathy.xml:626(para)
+#: C/empathy.xml:651(para)
msgid ""
"Select the account you wish to edit in the box on the left and double-click "
"on its name."
@@ -767,11 +785,11 @@ msgstr ""
"Seleccione la cuenta que quiere editar en la caja de la izquierda y pulse "
"dos veces en su nombre."
-#: C/empathy.xml:632(para)
+#: C/empathy.xml:657(para)
msgid "Change the name of the account as you desire."
msgstr "Cambie el nombre de la cuenta como desee."
-#: C/empathy.xml:613(para)
+#: C/empathy.xml:638(para)
msgid ""
"To modify the identifier of an account, how <application>Empathy</"
"application> identifies an account, proceed as follows: <placeholder-1/>"
@@ -780,15 +798,15 @@ msgstr ""
"<application>Empathy</application> identifica a la cuente, proceda como "
"sigue: <placeholder-1/>"
-#: C/empathy.xml:641(title)
+#: C/empathy.xml:666(title)
msgid "Disabling and Removing an Account"
msgstr "Desactivar y quitaruna cuenta"
-#: C/empathy.xml:642(para)
+#: C/empathy.xml:667(para)
msgid "To disable an account, proceed as follows:"
msgstr "Para desactivar una cuenta, proceda como sigue:"
-#: C/empathy.xml:657(para)
+#: C/empathy.xml:682(para)
msgid ""
"Select the account you wish to disable in the box on the left of the dialog "
"and deselect the <guilabel>Enabled</guilabel> check-box."
@@ -797,22 +815,22 @@ msgstr ""
"diálogo y deselecicone la casilla de verificación <guilabel>Activada</"
"guilabel>."
-#: C/empathy.xml:665(para)
+#: C/empathy.xml:690(para)
msgid "To remove an account, proceed as follows:"
msgstr "Para quitar una cuenta, proceda como sigue:"
-#: C/empathy.xml:680(para)
+#: C/empathy.xml:705(para)
msgid ""
"Select the account you wish to disable in the box on the left of the dialog."
msgstr ""
"Seleccione la cuenta que desea desactivar en la caja a la izquierda del "
"diálogo."
-#: C/empathy.xml:686(para)
+#: C/empathy.xml:711(para)
msgid "Click on the <guibutton>Remove</guibutton> button."
msgstr "Pulse en el botón <guibutton>Quitar</guibutton>."
-#: C/empathy.xml:691(para)
+#: C/empathy.xml:716(para)
msgid ""
"A dialog will be shown asking for confirmation. Click on the "
"<guibutton>Remove</guibutton> button to remove the account."
@@ -820,11 +838,11 @@ msgstr ""
"Se mostrará un diálogo preguntando por una confirmación. Pulse en el botón "
"<guibutton>Quitar</guibutton> para quitar la cuenta."
-#: C/empathy.xml:701(title)
+#: C/empathy.xml:726(title)
msgid "Editing Personal Information"
msgstr "Editar información personal"
-#: C/empathy.xml:702(para)
+#: C/empathy.xml:727(para)
msgid ""
"To change your personal information, your alias and your icon (the image "
"that other contacts will see of you), for each of your accounts, proceed as "
@@ -834,7 +852,7 @@ msgstr ""
"que otros contactos le ven), para cada una de las cuentas, proceda como "
"sigue:"
-#: C/empathy.xml:710(para)
+#: C/empathy.xml:735(para)
msgid ""
"From the <link linkend=\"empathy-FIG-mainwindow\">main window</link>, select "
"<menuchoice><guimenu>Edit</guimenu><guimenuitem>Personal Information</"
@@ -844,7 +862,7 @@ msgstr ""
"seleccione <menuchoice><guimenu>Editar</guimenu><guimenuitem>Información "
"personal</guimenuitem></menuchoice>."
-#: C/empathy.xml:719(para)
+#: C/empathy.xml:744(para)
msgid ""
"From the <guilabel>Account</guilabel> drop-down list, choose the account you "
"want to edit."
@@ -852,11 +870,11 @@ msgstr ""
"Desde la lista desplegable <guilabel>Cuenta</guilabel>, elija la cuenta que "
"quiere editar."
-#: C/empathy.xml:725(para)
+#: C/empathy.xml:750(para)
msgid "In the <guilabel>Alias</guilabel> text box, write your new alias."
msgstr "En la caja de texto <guilabel>Apodo</guilabel> escriba su nuevo apodo."
-#: C/empathy.xml:731(para)
+#: C/empathy.xml:756(para)
msgid ""
"To change your icon, click on the person-looking button and choose an image "
"file."
@@ -864,11 +882,11 @@ msgstr ""
"Para cambiar su icono pulse en el botón de apariencia personal y elija un "
"archivo de imagen."
-#: C/empathy.xml:737(para) C/empathy.xml:1318(para) C/empathy.xml:1352(para)
+#: C/empathy.xml:762(para) C/empathy.xml:1343(para) C/empathy.xml:1377(para)
msgid "When done, click <guibutton>Close</guibutton>."
msgstr "Cuando termine pulse <guibutton>Cerrar</guibutton>."
-#: C/empathy.xml:745(para)
+#: C/empathy.xml:770(para)
msgid ""
"An <emphasis>alias</emphasis> is an alternative way you can identify "
"yourself. You can use your real name or a nickname."
@@ -876,11 +894,11 @@ msgstr ""
"Un <emphasis>apodo</emphasis> es una forma alternativa por la que se puede "
"identificar. Puede usar su nombre real o un apodo."
-#: C/empathy.xml:755(title)
+#: C/empathy.xml:780(title)
msgid "Advanced Options"
msgstr "Opciones avanzadas"
-#: C/empathy.xml:756(para)
+#: C/empathy.xml:781(para)
msgid ""
"Based on the service you are using, it is possible to configure more "
"advanced options to modify the normal behavior of <application>Empathy</"
@@ -890,7 +908,7 @@ msgstr ""
"avanzadas para modificar el comportamiento normal de <application>Empathy</"
"application>."
-#: C/empathy.xml:761(para)
+#: C/empathy.xml:786(para)
msgid ""
"To configure these options, when you are <link linkend=\"empathy-create-"
"account\">adding a new account</link>, click on the drop-down section "
@@ -900,15 +918,15 @@ msgstr ""
"account\">añadiendo una cuenta nueva</link>, pulse la sección desplegable "
"<guilabel>Avanzadas</guilabel>."
-#: C/empathy.xml:769(title)
+#: C/empathy.xml:794(title)
msgid "Jabber (or <acronym>XMPP</acronym>) and Google Talk"
msgstr "Jabber (o <acronym>XMPP</acronym>) y Google Talk"
-#: C/empathy.xml:776(guilabel)
+#: C/empathy.xml:801(guilabel)
msgid "Encryption required (TLS/SSL)"
msgstr "Se requiere cifrado (TLS/SSL)"
-#: C/empathy.xml:779(para)
+#: C/empathy.xml:804(para)
msgid ""
"Select this option in order to use some sort of encryption during your "
"conversations."
@@ -916,11 +934,11 @@ msgstr ""
"Seleccione esta opción para usar algún tipo de cifrado durante sus "
"conversaciones."
-#: C/empathy.xml:787(guilabel)
+#: C/empathy.xml:812(guilabel)
msgid "Ignore SSL certificate errors"
msgstr "Ignorar los errores de certificados SSL"
-#: C/empathy.xml:790(para)
+#: C/empathy.xml:815(para)
msgid ""
"Select this option in order to ignore the errors that can be generated by "
"some types of security certificates. Usually these certificates are called "
@@ -930,7 +948,7 @@ msgstr ""
"tipos de certificados de seguridad. Generalmente esos certificados se llaman "
"autofirmados."
-#: C/empathy.xml:798(para)
+#: C/empathy.xml:823(para)
msgid ""
"Select this option only if you are sure the certificate is secure and you "
"can trust it."
@@ -938,11 +956,11 @@ msgstr ""
"Seleccione esta opción sólo si está seguro de que su certificado es seguro y "
"puede confiar en él."
-#: C/empathy.xml:808(guilabel)
+#: C/empathy.xml:833(guilabel)
msgid "Resource"
msgstr "Recurso"
-#: C/empathy.xml:811(para)
+#: C/empathy.xml:836(para)
msgid ""
"Use this text box to set a name with which you can identify the running "
"program based on where you are running it. With this option, and the "
@@ -962,7 +980,7 @@ msgstr ""
"dispositivos y basándose en el valor <guilabel>Prioridad</guilabel> recibirá "
"los mensajes en uno de los dispositivos o en ambos."
-#: C/empathy.xml:824(para)
+#: C/empathy.xml:849(para)
msgid ""
"This can be useful if you have two devices, a main one and a portable one, "
"and you move away from the main one bringing with you the other: you can "
@@ -974,7 +992,7 @@ msgstr ""
"mensajes desde su cuenta con el dispositivo portable incluso si no "
"desconecta el principal."
-#: C/empathy.xml:833(para)
+#: C/empathy.xml:858(para)
msgid ""
"If you set the same value for this text box on both the devices, when you "
"connect with one of them, the other one will be disconnected, even if you "
@@ -985,11 +1003,11 @@ msgstr ""
"establece un valor diferente en la caja incrementable <guilabel>Prioridad</"
"guilabel>."
-#: C/empathy.xml:846(guilabel)
+#: C/empathy.xml:871(guilabel)
msgid "Priority"
msgstr "Prioridad"
-#: C/empathy.xml:849(para)
+#: C/empathy.xml:874(para)
msgid ""
"Use this spin box to indicate wich device, set in the <guilabel>Resource</"
"guilabel> text box, will receive the new messages. The higher the number, "
@@ -1001,7 +1019,7 @@ msgstr ""
"Cuanto mayor sea el número, mayor será la prioridad: recibirá los mensajes "
"nuevos en el dispositivo con el número más alto."
-#: C/empathy.xml:856(para)
+#: C/empathy.xml:881(para)
msgid ""
"You can set values in the range from <literal>-128</literal> to "
"<literal>127</literal>."
@@ -1009,7 +1027,7 @@ msgstr ""
"Puede establecer valores en el rango de <literal>-128</literal> a "
"<literal>127</literal>."
-#: C/empathy.xml:862(para)
+#: C/empathy.xml:887(para)
msgid ""
"If you set the same value of this spin box in both the devices, you will "
"receive messages on both of them."
@@ -1017,13 +1035,13 @@ msgstr ""
"Si establece el mismo valor de esta caja incrementable en ambos "
"dispositivos, recibirá mensajes en ambos dos."
-#: C/empathy.xml:879(guilabel) C/empathy.xml:972(guilabel)
-#: C/empathy.xml:1020(guilabel) C/empathy.xml:1114(guilabel)
+#: C/empathy.xml:904(guilabel) C/empathy.xml:997(guilabel)
+#: C/empathy.xml:1045(guilabel) C/empathy.xml:1139(guilabel)
msgid "Server"
msgstr "Servidor"
-#: C/empathy.xml:882(para) C/empathy.xml:975(para) C/empathy.xml:1023(para)
-#: C/empathy.xml:1117(para)
+#: C/empathy.xml:907(para) C/empathy.xml:1000(para) C/empathy.xml:1048(para)
+#: C/empathy.xml:1142(para)
msgid ""
"Use this text box to write the name of the server you want to use for this "
"service."
@@ -1031,20 +1049,20 @@ msgstr ""
"Use esta caja de texto para escribir el nombre del servidor que quiere usar "
"para este servicio."
-#: C/empathy.xml:890(guilabel) C/empathy.xml:983(guilabel)
-#: C/empathy.xml:1031(guilabel) C/empathy.xml:1125(guilabel)
+#: C/empathy.xml:915(guilabel) C/empathy.xml:1008(guilabel)
+#: C/empathy.xml:1056(guilabel) C/empathy.xml:1150(guilabel)
msgid "Port"
msgstr "Puerto"
-#: C/empathy.xml:893(para) C/empathy.xml:986(para) C/empathy.xml:1034(para)
-#: C/empathy.xml:1128(para)
+#: C/empathy.xml:918(para) C/empathy.xml:1011(para) C/empathy.xml:1059(para)
+#: C/empathy.xml:1153(para)
msgid "Use this spin box to set the number of the port of the server to use."
msgstr ""
"Use esta caja incrementable para establecer el número del puerto del "
"servidor que usar."
-#: C/empathy.xml:897(para) C/empathy.xml:990(para) C/empathy.xml:1038(para)
-#: C/empathy.xml:1132(para)
+#: C/empathy.xml:922(para) C/empathy.xml:1015(para) C/empathy.xml:1063(para)
+#: C/empathy.xml:1157(para)
msgid ""
"You can set values in the range from <literal>0</literal> to "
"<literal>65,555</literal>."
@@ -1052,11 +1070,11 @@ msgstr ""
"Puede establecer valores en el rango de <literal>0</literal> a "
"<literal>65.555</literal>."
-#: C/empathy.xml:905(guilabel)
+#: C/empathy.xml:930(guilabel)
msgid "Use old SSL"
msgstr "Usar SSL antiguo"
-#: C/empathy.xml:908(para)
+#: C/empathy.xml:933(para)
msgid ""
"Select this option to use the old version of the secure protocol for "
"encrypting your connection."
@@ -1064,7 +1082,7 @@ msgstr ""
"Seleccione esta opción para usar la versión antigua del protocolo seguro "
"para cifrar su conexión."
-#: C/empathy.xml:873(para)
+#: C/empathy.xml:898(para)
msgid ""
"In the <guilabel>Override server settings</guilabel> section you can set "
"options that take precedence over the default settings. <placeholder-1/>"
@@ -1073,22 +1091,22 @@ msgstr ""
"puede establecer opciones que tienen preferencia sobre los ajustes "
"predeterminados. <placeholder-1/>"
-#: C/empathy.xml:924(guilabel)
+#: C/empathy.xml:949(guilabel)
msgid "Ignore conference and chatrooms invitations"
msgstr "Ignorar invitaciones a conferencias y salas de chat"
-#: C/empathy.xml:928(para)
+#: C/empathy.xml:953(para)
msgid ""
"Select this option to ignore the invitations that other people may send you."
msgstr ""
"Seleccione esta opción para ignorar las invitaciones que otras personas "
"pueden enviarle."
-#: C/empathy.xml:936(guilabel)
+#: C/empathy.xml:961(guilabel)
msgid "Room List locale"
msgstr "Configuración de la lista de salas"
-#: C/empathy.xml:939(para)
+#: C/empathy.xml:964(para)
msgid ""
"The value of this text box identifies the language used to retrieve the room "
"list when connecting to the Yahoo service."
@@ -1096,17 +1114,17 @@ msgstr ""
"El valor de esta caja de texto identifica el idioma que usar al obtener la "
"lista de salas al conectar con el servicio de Yahoo!"
-#: C/empathy.xml:944(para)
+#: C/empathy.xml:969(para)
msgid ""
"If you need to change this value, use the two letter code of your language."
msgstr ""
"Si necesita cambiar ese valor use el código de dos letras para su idioma."
-#: C/empathy.xml:952(guilabel) C/empathy.xml:1094(guilabel)
+#: C/empathy.xml:977(guilabel) C/empathy.xml:1119(guilabel)
msgid "Charset"
msgstr "Conjunto de caracteres"
-#: C/empathy.xml:955(para) C/empathy.xml:1097(para)
+#: C/empathy.xml:980(para) C/empathy.xml:1122(para)
msgid ""
"The value of this text box identifies the set of the characters used by "
"<application>Empathy</application>."
@@ -1114,7 +1132,7 @@ msgstr ""
"El valor de esta caja de texto identifica el conjunto de caracteres que usa "
"<application>Empathy</application>."
-#: C/empathy.xml:961(para) C/empathy.xml:1103(para)
+#: C/empathy.xml:986(para) C/empathy.xml:1128(para)
msgid ""
"It is advise to leave this value to <literal>UTF-8</literal>. Change it only "
"if that charset does not cover your language."
@@ -1122,11 +1140,11 @@ msgstr ""
"Se recomienda dejar este valor en <literal>UTF-8</literal>. Cámbielo sólo si "
"ese conjunto de caracteres no cubre su idioma."
-#: C/empathy.xml:998(guilabel)
+#: C/empathy.xml:1023(guilabel)
msgid "Use Yahoo Japan"
msgstr "Usar Yahoo Japón"
-#: C/empathy.xml:1001(para)
+#: C/empathy.xml:1026(para)
msgid ""
"Select this option only if you have a Yahoo! Japan account. With the Yahoo! "
"Japan service you can only use a Yahoo! Japan account: if you have "
@@ -1138,15 +1156,15 @@ msgstr ""
"registrado una cuenta con la versión inglesa del servicio, esa cuenta no "
"funcionará."
-#: C/empathy.xml:1015(title)
+#: C/empathy.xml:1040(title)
msgid "<acronym>AIM</acronym>, GroupWise and <acronym>MSN</acronym>"
msgstr "<acronym>AIM</acronym>, GroupWise y <acronym>MSN</acronym>"
-#: C/empathy.xml:1054(guilabel)
+#: C/empathy.xml:1079(guilabel)
msgid "Published Name"
msgstr "Nombre publicado"
-#: C/empathy.xml:1057(para)
+#: C/empathy.xml:1082(para)
msgid ""
"Use this text box to write the name that will be visible to the other users "
"of the network."
@@ -1154,42 +1172,42 @@ msgstr ""
"Use esta caja de texto para escribir el nombre que será visible al resto de "
"usuarios de la red."
-#: C/empathy.xml:1065(guilabel)
+#: C/empathy.xml:1090(guilabel)
msgid "Email"
msgstr "Correo-e"
-#: C/empathy.xml:1068(para)
+#: C/empathy.xml:1093(para)
msgid "Use this text box to write your email."
msgstr "Use esta caja de texto para escribir su correo-e."
-#: C/empathy.xml:1075(guilabel)
+#: C/empathy.xml:1100(guilabel)
msgid "Jabber ID"
msgstr "ID Jabber"
-#: C/empathy.xml:1078(para)
+#: C/empathy.xml:1103(para)
msgid "Use this text box to write your Jabber ID, if you have one."
msgstr "Use esta caja de texto para escribir su ID Jabber, si tiene uno."
-#: C/empathy.xml:1143(title)
+#: C/empathy.xml:1168(title)
msgid "Gadu Gadu"
msgstr "Gadu Gadu"
-#: C/empathy.xml:1147(guilabel)
+#: C/empathy.xml:1172(guilabel)
msgid "Nick"
msgstr "Apodo"
-#: C/empathy.xml:1149(para)
+#: C/empathy.xml:1174(para)
msgid ""
"Use this text box to write an alternative name to use with this service."
msgstr ""
"Use esta caja de texto para escribir un nombre alternativo que usar con este "
"servicio."
-#: C/empathy.xml:1164(title)
+#: C/empathy.xml:1189(title)
msgid "Contacts and Groups"
msgstr "Contactos y grupos"
-#: C/empathy.xml:1165(para)
+#: C/empathy.xml:1190(para)
msgid ""
"All the contacts are handled within <application>Empathy</application>'s "
"<link linkend=\"empathy-FIG-mainwindow\">main window</link>."
@@ -1197,7 +1215,7 @@ msgstr ""
"Todos los contactos se gestionan en la <link linkend=\"empathy-FIG-mainwindow"
"\">ventana principal</link> de <application>Empathy</application>."
-#: C/empathy.xml:1169(para)
+#: C/empathy.xml:1194(para)
msgid ""
"You can add or remove a contact or you can edit the information of a "
"particular contact. It is also possibile to arrange contacts in groups. You "
@@ -1209,15 +1227,15 @@ msgstr ""
"Puede tener un grupo para sus contactos del trabajo, uno para los contactos "
"de su familia, y demás."
-#: C/empathy.xml:1176(title)
+#: C/empathy.xml:1201(title)
msgid "Adding and Removing a Contact"
msgstr "Añadir y quitar un contacto"
-#: C/empathy.xml:1177(para)
+#: C/empathy.xml:1202(para)
msgid "To add a new contact, proceed as follows:"
msgstr "Para añadir un contacto nuevo, proceda como sigue:"
-#: C/empathy.xml:1183(para)
+#: C/empathy.xml:1208(para)
msgid ""
"From the <link linkend=\"empathy-FIG-mainwindow\">main window</link> choose "
"<menuchoice><guimenu>Chat</guimenu><guimenuitem>Add Contact...</"
@@ -1229,7 +1247,7 @@ msgstr ""
"guimenuitem></menuchoice>. Se mostrará el diálogo <guilabel>Contacto nuevo</"
"guilabel>."
-#: C/empathy.xml:1193(para)
+#: C/empathy.xml:1218(para)
msgid ""
"From the <guilabel>Account</guilabel> drop-down list, choose the service "
"used by the contact you are adding."
@@ -1237,7 +1255,7 @@ msgstr ""
"Desde la lista desplegable <guilabel>Cuenta</guilabel>, elija el servicio "
"que usa el contacto que está añadiendo."
-#: C/empathy.xml:1199(para)
+#: C/empathy.xml:1224(para)
msgid ""
"In the <guilabel>Identifier</guilabel> text box type the <emphasis>address</"
"emphasis> of the contact in the form of <userinput><replaceable>user name</"
@@ -1250,7 +1268,7 @@ msgstr ""
"replaceable>@<replaceable>servicio\n"
"\t dominio</replaceable></userinput>."
-#: C/empathy.xml:1208(para)
+#: C/empathy.xml:1233(para)
msgid ""
"In the <guilabel>Alias</guilabel> text box type the name you want to give at "
"the the new contact."
@@ -1258,15 +1276,15 @@ msgstr ""
"En la caja de texto <guilabel>Apodo</guilabel> escriba el nombre que quiere "
"darle a su nuevo contacto."
-#: C/empathy.xml:1214(para)
+#: C/empathy.xml:1239(para)
msgid "Click on <guibutton>Add</guibutton> to add the new contact."
msgstr "Pulse en <guibutton>Añadir</guibutton> para añadir el contacto nuevo."
-#: C/empathy.xml:1220(para)
+#: C/empathy.xml:1245(para)
msgid "To remove a contact, proceed as follows:"
msgstr "Para quitar un contacto, proceda como sigue:"
-#: C/empathy.xml:1226(para)
+#: C/empathy.xml:1251(para)
msgid ""
"From the <link linkend=\"empathy-FIG-mainwindow\">main window</link>, select "
"the contact you would like to remove and right-click on it."
@@ -1275,7 +1293,7 @@ msgstr ""
"seleccione el contacto que quiere quitar y pulse con el botón derecho sobre "
"él."
-#: C/empathy.xml:1233(para)
+#: C/empathy.xml:1258(para)
msgid ""
"From the popup menu, choose <guilabel>Remove</guilabel> to remove the "
"contact."
@@ -1283,7 +1301,7 @@ msgstr ""
"Desde el menú emergente, elija <guilabel>Quitar</guilabel> para quitar el "
"contacto."
-#: C/empathy.xml:1242(para) C/empathy.xml:1278(para)
+#: C/empathy.xml:1267(para) C/empathy.xml:1303(para)
msgid ""
"An <emphasis>alias</emphasis> is an alternative way you can identify that "
"particular contact. You can use the real name or the nickname of that person."
@@ -1291,15 +1309,15 @@ msgstr ""
"Un <emphasis>apodo</emphasis> es una forma alternativa de identificar un "
"contacto en particular. Puede usar el nombre real o el apodo de esa persona."
-#: C/empathy.xml:1251(title)
+#: C/empathy.xml:1276(title)
msgid "Editing a Contact"
msgstr "Editar un contacto"
-#: C/empathy.xml:1252(para)
+#: C/empathy.xml:1277(para)
msgid "To edit a contact, proceed as follows:"
msgstr "Para editar un contacto, proceda como sigue:"
-#: C/empathy.xml:1258(para) C/empathy.xml:1300(para)
+#: C/empathy.xml:1283(para) C/empathy.xml:1325(para)
msgid ""
"From the <link linkend=\"empathy-FIG-mainwindow\">main window</link>, select "
"the contact you would like to modify and choose <menuchoice><guimenu>Edit</"
@@ -1312,7 +1330,7 @@ msgstr ""
"guisubmenu><guimenuitem>Editar</guimenuitem></menuchoice> o pulse con el "
"botón derecho sobre él y elija <guilabel>Editar</guilabel>."
-#: C/empathy.xml:1271(para)
+#: C/empathy.xml:1296(para)
msgid ""
"From the <guilabel>Edit Contact Information</guilabel> dialog, you can "
"modify the <emphasis>alias</emphasis> and the <emphasis>group</emphasis> of "
@@ -1322,7 +1340,7 @@ msgstr ""
"modificar el <emphasis>apodp</emphasis> y el <emphasis>grupo</emphasis> del "
"contacto."
-#: C/empathy.xml:1285(para)
+#: C/empathy.xml:1310(para)
msgid ""
"For more information about groups, see <xref linkend=\"empathy-add-contact-"
"group\"/> and <xref linkend=\"empathy-add-group\"/>."
@@ -1330,15 +1348,15 @@ msgstr ""
"Para obtener más información acerca de los grupos, consulte <xref linkend="
"\"empathy-add-contact-group\"/> y <xref linkend=\"empathy-add-group\"/>."
-#: C/empathy.xml:1293(title)
+#: C/empathy.xml:1318(title)
msgid "Adding a Contact to a Group"
msgstr "Añadir un contacto a un grupo"
-#: C/empathy.xml:1294(para)
+#: C/empathy.xml:1319(para)
msgid "To add a contact to one or more groups, proceed as follows:"
msgstr "Para añadir un contacto a uno o más grupos, proceda como sigue:"
-#: C/empathy.xml:1312(para)
+#: C/empathy.xml:1337(para)
msgid ""
"From the <guilabel>Groups</guilabel> section, select the group, or groups, "
"you want to add the contact to."
@@ -1346,15 +1364,15 @@ msgstr ""
"En la sección <guilabel>Grupos</guilabel>, seleccione el grupo o grupos a "
"los que quiera añadir el contacto."
-#: C/empathy.xml:1327(title)
+#: C/empathy.xml:1352(title)
msgid "Adding a New Group"
msgstr "Añadir un grupo nuevo"
-#: C/empathy.xml:1328(para)
+#: C/empathy.xml:1353(para)
msgid "To add a new group, proceed as follows:"
msgstr "Para añadir un grupo nuevo, proceda como sigue:"
-#: C/empathy.xml:1334(para)
+#: C/empathy.xml:1359(para)
msgid ""
"From the <link linkend=\"empathy-FIG-mainwindow\">main window</link>, select "
"one contact and choose <menuchoice><guimenu>Edit</"
@@ -1366,7 +1384,7 @@ msgstr ""
"guimenu><guisubmenu>Contacto</guisubmenu><guimenuitem>Editar</guimenuitem></"
"menuchoice> o pulse con el botón derecho y elija <guilabel>Editar</guilabel>."
-#: C/empathy.xml:1345(para)
+#: C/empathy.xml:1370(para)
msgid ""
"In the <guilabel>Groups</guilabel> section, write the name of the group you "
"want to add and then click on <guibutton>Add Group</guibutton>."
@@ -1423,9 +1441,6 @@ msgstr "Jorge González <jorgegonz@svn.gnome.org>, 2008-2009"
#~ "@@image: 'figures/empathy-new-account.png'; "
#~ "md5=6c1e0d8c709125d387e975e5738b8c0f"
-#~ msgid "2008"
-#~ msgstr "2008"
-
#~ msgid "milo_casagrande@yahoo.it"
#~ msgstr "milo_casagrande@yahoo.it"
diff --git a/libempathy-gtk/Makefile.am b/libempathy-gtk/Makefile.am
index 63bcf5ae3..4fd0fa562 100644
--- a/libempathy-gtk/Makefile.am
+++ b/libempathy-gtk/Makefile.am
@@ -1,3 +1,5 @@
+include $(top_srcdir)/tools/shave.mk
+
AM_CPPFLAGS = \
-I. \
-I$(top_srcdir) \
@@ -5,6 +7,8 @@ AM_CPPFLAGS = \
-DPKGDATADIR=\""$(pkgdatadir)"\" \
$(LIBEMPATHYGTK_CFLAGS) \
$(ENCHANT_CFLAGS) \
+ $(LIBCHAMPLAIN_CFLAGS) \
+ $(GEOCLUE_CFLAGS) \
$(WARN_CFLAGS) \
$(DISABLE_DEPRECATED)
@@ -17,7 +21,7 @@ BUILT_SOURCES = \
lib_LTLIBRARIES = libempathy-gtk.la
-libempathy_gtk_la_SOURCES = \
+libempathy_gtk_handwritten_source = \
empathy-account-chooser.c \
empathy-account-widget.c \
empathy-account-widget-irc.c \
@@ -49,12 +53,14 @@ libempathy_gtk_la_SOURCES = \
empathy-profile-chooser.c \
empathy-smiley-manager.c \
empathy-spell.c \
- empathy-spell-dialog.c \
empathy-status-preset-dialog.c \
empathy-theme-boxes.c \
empathy-theme-irc.c \
empathy-theme-manager.c \
- empathy-ui-utils.c \
+ empathy-ui-utils.c
+
+libempathy_gtk_la_SOURCES = \
+ $(libempathy_gtk_handwritten_source) \
totem-subtitle-encoding.c totem-subtitle-encoding.h
# do not distribute generated files
@@ -64,6 +70,8 @@ nodist_libempathy_gtk_la_SOURCES =\
libempathy_gtk_la_LIBADD = \
$(LIBEMPATHYGTK_LIBS) \
$(ENCHANT_LIBS) \
+ $(LIBCHAMPLAIN_LIBS) \
+ $(GEOCLUE_LIBS) \
$(top_builddir)/libempathy/libempathy.la
libempathy_gtk_la_LDFLAGS = \
@@ -103,13 +111,26 @@ libempathy_gtk_headers = \
empathy-profile-chooser.h \
empathy-smiley-manager.h \
empathy-spell.h \
- empathy-spell-dialog.h \
empathy-status-preset-dialog.h \
empathy-theme-boxes.h \
empathy-theme-irc.h \
empathy-theme-manager.h \
empathy-ui-utils.h
+if HAVE_GEOCLUE
+libempathy_gtk_handwritten_source += \
+ empathy-location-manager.c
+
+libempathy_gtk_headers += \
+ empathy-location-manager.h
+endif
+
+check_c_sources = \
+ $(libempathy_gtk_handwritten_source) \
+ $(libempathy_gtk_headers)
+include $(top_srcdir)/tools/check-coding-style.mk
+check-local: check-coding-style
+
libempathy_gtk_includedir = $(includedir)/libempathy-gtk/
libempathy_gtk_include_HEADERS = \
$(libempathy_gtk_headers) \
@@ -129,14 +150,13 @@ ui_DATA = \
empathy-account-widget-yahoo.ui \
empathy-account-widget-groupwise.ui \
empathy-account-widget-aim.ui \
- empathy-spell-dialog.ui \
empathy-status-preset-dialog.ui \
empathy-log-window.ui \
empathy-chat.ui \
empathy-new-message-dialog.ui
empathy-gtk-marshal.list: $(libempathy_gtk_la_SOURCES) Makefile.am
- ( cd $(srcdir) && \
+ $(QUIET_GEN)( cd $(srcdir) && \
sed -n -e 's/.*empathy_gtk_marshal_\([[:upper:][:digit:]]*__[[:upper:][:digit:]_]*\).*/\1/p' \
$(libempathy_gtk_la_SOURCES) ) \
| sed -e 's/__/:/' -e 'y/_/,/' | sort -u > $@.tmp
@@ -147,16 +167,16 @@ empathy-gtk-marshal.list: $(libempathy_gtk_la_SOURCES) Makefile.am
fi
%-marshal.h: %-marshal.list Makefile
- $(GLIB_GENMARSHAL) --header --prefix=_$(subst -,_,$*)_marshal $< > $*-marshal.h
+ $(QUIET_GEN)$(GLIB_GENMARSHAL) --header --prefix=_$(subst -,_,$*)_marshal $< > $*-marshal.h
%-marshal.c: %-marshal.list Makefile
- echo "#include \"empathy-gtk-marshal.h\"" > $@ && \
+ $(QUIET_GEN)echo "#include \"empathy-gtk-marshal.h\"" > $@ && \
$(GLIB_GENMARSHAL) --body --prefix=_$(subst -,_,$*)_marshal $< >> $*-marshal.c
empathy-gtk-enum-types.h: stamp-empathy-gtk-enum-types.h
- @true
+ $(QUIET_GEN)true
stamp-empathy-gtk-enum-types.h: Makefile $(libempathy_gtk_headers)
- (cd $(srcdir) \
+ $(QUIET_GEN)(cd $(srcdir) \
&& glib-mkenums \
--fhead "#ifndef __LIBEMPATHY_GTK_ENUM_TYPES_H__\n" \
--fhead "#define __LIBEMPATHY_GTK_ENUM_TYPES_H__ 1\n\n" \
@@ -173,7 +193,7 @@ stamp-empathy-gtk-enum-types.h: Makefile $(libempathy_gtk_headers)
&& echo timestamp > $(@F)
empathy-gtk-enum-types.c: Makefile $(libempathy_gtk_headers)
- (cd $(srcdir) \
+ $(QUIET_GEN)(cd $(srcdir) \
&& glib-mkenums \
--fhead "#include <config.h>\n" \
--fhead "#include <glib-object.h>\n" \
diff --git a/libempathy-gtk/empathy-account-chooser.c b/libempathy-gtk/empathy-account-chooser.c
index 5d11e8e1e..915b37b23 100644
--- a/libempathy-gtk/empathy-account-chooser.c
+++ b/libempathy-gtk/empathy-account-chooser.c
@@ -15,9 +15,9 @@
*
* You should have received a copy of the GNU General Public
* License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- *
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301 USA
+ *
* Authors: Martyn Russell <martyn@imendio.com>
* Xavier Claessens <xclaesse@gmail.com>
*/
@@ -401,22 +401,22 @@ empathy_account_chooser_set_has_all_option (EmpathyAccountChooser *chooser,
*/
if (has_all_option) {
- gtk_combo_box_set_row_separator_func (GTK_COMBO_BOX (chooser),
+ gtk_combo_box_set_row_separator_func (GTK_COMBO_BOX (chooser),
(GtkTreeViewRowSeparatorFunc)
account_chooser_separator_func,
- chooser,
+ chooser,
NULL);
gtk_list_store_prepend (store, &iter);
- gtk_list_store_set (store, &iter,
+ gtk_list_store_set (store, &iter,
COL_ACCOUNT_TEXT, NULL,
COL_ACCOUNT_ENABLED, TRUE,
COL_ACCOUNT_POINTER, NULL,
-1);
gtk_list_store_prepend (store, &iter);
- gtk_list_store_set (store, &iter,
- COL_ACCOUNT_TEXT, _("All"),
+ gtk_list_store_set (store, &iter,
+ COL_ACCOUNT_TEXT, _("All"),
COL_ACCOUNT_ENABLED, TRUE,
COL_ACCOUNT_POINTER, NULL,
-1);
@@ -427,10 +427,10 @@ empathy_account_chooser_set_has_all_option (EmpathyAccountChooser *chooser,
}
}
- gtk_combo_box_set_row_separator_func (GTK_COMBO_BOX (chooser),
+ gtk_combo_box_set_row_separator_func (GTK_COMBO_BOX (chooser),
(GtkTreeViewRowSeparatorFunc)
NULL,
- NULL,
+ NULL,
NULL);
}
diff --git a/libempathy-gtk/empathy-account-chooser.h b/libempathy-gtk/empathy-account-chooser.h
index 98d568bcc..004a3e87f 100644
--- a/libempathy-gtk/empathy-account-chooser.h
+++ b/libempathy-gtk/empathy-account-chooser.h
@@ -15,9 +15,9 @@
*
* You should have received a copy of the GNU General Public
* License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- *
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301 USA
+ *
* Authors: Martyn Russell <martyn@imendio.com>
* Xavier Claessens <xclaesse@gmail.com>
*/
@@ -68,7 +68,7 @@ void empathy_account_chooser_set_has_all_option (EmpathyAccountChooser
void empathy_account_chooser_set_filter (EmpathyAccountChooser *chooser,
EmpathyAccountChooserFilterFunc filter,
gpointer user_data);
-gboolean empathy_account_chooser_filter_is_connected(McAccount *account,
+gboolean empathy_account_chooser_filter_is_connected (McAccount *account,
gpointer user_data);
G_END_DECLS
diff --git a/libempathy-gtk/empathy-account-widget-irc.c b/libempathy-gtk/empathy-account-widget-irc.c
index cc86a5aaa..1306f517f 100644
--- a/libempathy-gtk/empathy-account-widget-irc.c
+++ b/libempathy-gtk/empathy-account-widget-irc.c
@@ -465,7 +465,7 @@ empathy_account_widget_irc_new (McAccount *account)
/* Fill the networks combobox */
store = gtk_list_store_new (2, G_TYPE_OBJECT, G_TYPE_STRING);
- gtk_cell_layout_clear (GTK_CELL_LAYOUT (settings->combobox_network));
+ gtk_cell_layout_clear (GTK_CELL_LAYOUT (settings->combobox_network));
renderer = gtk_cell_renderer_text_new ();
gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (settings->combobox_network),
renderer, TRUE);
@@ -499,5 +499,7 @@ empathy_account_widget_irc_new (McAccount *account)
"combobox_network", "changed", account_widget_irc_combobox_network_changed_cb,
NULL);
+ empathy_account_widget_set_default_focus (gui, "entry_nick");
+
return empathy_builder_unref_and_keep_widget (gui, settings->vbox_settings);
}
diff --git a/libempathy-gtk/empathy-account-widget-sip.c b/libempathy-gtk/empathy-account-widget-sip.c
index 2d4944779..da6082495 100644
--- a/libempathy-gtk/empathy-account-widget-sip.c
+++ b/libempathy-gtk/empathy-account-widget-sip.c
@@ -63,8 +63,8 @@ account_widget_sip_discover_stun_toggled_cb (
gboolean active;
active = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (checkbox));
- gtk_widget_set_sensitive(settings->entry_stun_server, !active);
- gtk_widget_set_sensitive(settings->spinbutton_stun_part, !active);
+ gtk_widget_set_sensitive (settings->entry_stun_server, !active);
+ gtk_widget_set_sensitive (settings->spinbutton_stun_part, !active);
}
/**
@@ -115,5 +115,7 @@ empathy_account_widget_sip_new (McAccount *account)
"checkbutton_discover-stun", "toggled", account_widget_sip_discover_stun_toggled_cb,
NULL);
+ empathy_account_widget_set_default_focus (gui, "entry_userid");
+
return empathy_builder_unref_and_keep_widget (gui, settings->vbox_settings);
}
diff --git a/libempathy-gtk/empathy-account-widget.c b/libempathy-gtk/empathy-account-widget.c
index f20c47c3f..669869a4d 100644
--- a/libempathy-gtk/empathy-account-widget.c
+++ b/libempathy-gtk/empathy-account-widget.c
@@ -15,9 +15,9 @@
*
* You should have received a copy of the GNU General Public
* License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- *
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301 USA
+ *
* Authors: Xavier Claessens <xclaesse@gmail.com>
* Martyn Russell <martyn@imendio.com>
*/
@@ -40,7 +40,7 @@
#define DEBUG_FLAG EMPATHY_DEBUG_ACCOUNT
#include <libempathy/empathy-debug.h>
-static gboolean
+static gboolean
account_widget_entry_focus_cb (GtkWidget *widget,
GdkEventFocus *event,
McAccount *account)
@@ -107,7 +107,7 @@ account_widget_int_changed_cb (GtkWidget *widget,
}
}
-static void
+static void
account_widget_checkbutton_toggled_cb (GtkWidget *widget,
McAccount *account)
{
@@ -157,7 +157,7 @@ account_widget_password_changed_cb (GtkWidget *entry,
gtk_widget_set_sensitive (button, !EMP_STR_EMPTY (str));
}
-static void
+static void
account_widget_jabber_ssl_toggled_cb (GtkWidget *checkbutton_ssl,
GtkWidget *spinbutton_port)
{
@@ -187,9 +187,9 @@ account_widget_setup_widget (GtkWidget *widget,
McAccount *account,
const gchar *param_name)
{
- g_object_set_data_full (G_OBJECT (widget), "param_name",
+ g_object_set_data_full (G_OBJECT (widget), "param_name",
g_strdup (param_name), g_free);
- g_object_set_data_full (G_OBJECT (widget), "account",
+ g_object_set_data_full (G_OBJECT (widget), "account",
g_object_ref (account), g_object_unref);
if (GTK_IS_SPIN_BUTTON (widget)) {
@@ -270,7 +270,7 @@ accounts_widget_generic_setup (McAccount *account,
if (!protocol) {
/* The CM is not installed, MC shouldn't list them
* see SF bug #1688779
- * FIXME: We should display something asking the user to
+ * FIXME: We should display something asking the user to
* install the CM
*/
g_object_unref (profile);
@@ -313,6 +313,11 @@ accounts_widget_generic_setup (McAccount *account,
gtk_widget_show (widget);
widget = gtk_entry_new ();
+ if (strcmp (param->name, "account") == 0) {
+ g_signal_connect (widget, "realize",
+ G_CALLBACK (gtk_widget_grab_focus),
+ NULL);
+ }
gtk_table_attach (GTK_TABLE (table_settings),
widget,
1, 2,
@@ -459,6 +464,18 @@ empathy_account_widget_add_forget_button (McAccount *account,
button_forget);
}
+void
+empathy_account_widget_set_default_focus (GtkBuilder *gui,
+ const gchar *entry)
+{
+ GObject *default_focus_entry;
+
+ default_focus_entry = gtk_builder_get_object (gui, entry);
+ g_signal_connect (default_focus_entry, "realize",
+ G_CALLBACK (gtk_widget_grab_focus),
+ NULL);
+}
+
GtkWidget *
empathy_account_widget_generic_new (McAccount *account)
{
@@ -507,6 +524,8 @@ empathy_account_widget_salut_new (McAccount *account)
"entry_jid", "jid",
NULL);
+ empathy_account_widget_set_default_focus (gui, "entry_nickname");
+
return empathy_builder_unref_and_keep_widget (gui, widget);
}
@@ -535,6 +554,8 @@ empathy_account_widget_msn_new (McAccount *account)
"button_forget",
"entry_password");
+ empathy_account_widget_set_default_focus (gui, "entry_id");
+
return empathy_builder_unref_and_keep_widget (gui, widget);
}
@@ -572,6 +593,8 @@ empathy_account_widget_jabber_new (McAccount *account)
"button_forget",
"entry_password");
+ empathy_account_widget_set_default_focus (gui, "entry_id");
+
g_signal_connect (checkbutton_ssl, "toggled",
G_CALLBACK (account_widget_jabber_ssl_toggled_cb),
spinbutton_port);
@@ -607,6 +630,8 @@ empathy_account_widget_icq_new (McAccount *account)
"button_forget",
"entry_password");
+ empathy_account_widget_set_default_focus (gui, "entry_uin");
+
return empathy_builder_unref_and_keep_widget (gui, widget);
}
@@ -637,6 +662,8 @@ empathy_account_widget_aim_new (McAccount *account)
"button_forget",
"entry_password");
+ empathy_account_widget_set_default_focus (gui, "entry_screenname");
+
return empathy_builder_unref_and_keep_widget (gui, widget);
}
@@ -669,6 +696,8 @@ empathy_account_widget_yahoo_new (McAccount *account)
"button_forget",
"entry_password");
+ empathy_account_widget_set_default_focus (gui, "entry_id");
+
return empathy_builder_unref_and_keep_widget (gui, widget);
}
@@ -697,6 +726,8 @@ empathy_account_widget_groupwise_new (McAccount *account)
"button_forget",
"entry_password");
+ empathy_account_widget_set_default_focus (gui, "entry_id");
+
return empathy_builder_unref_and_keep_widget (gui, widget);
}
diff --git a/libempathy-gtk/empathy-account-widget.h b/libempathy-gtk/empathy-account-widget.h
index 038439ee5..7287f5675 100644
--- a/libempathy-gtk/empathy-account-widget.h
+++ b/libempathy-gtk/empathy-account-widget.h
@@ -15,9 +15,9 @@
*
* You should have received a copy of the GNU General Public
* License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- *
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301 USA
+ *
* Authors: Xavier Claessens <xclaesse@gmail.com>
* Martyn Russell <martyn@imendio.com>
*/
@@ -39,6 +39,8 @@ void empathy_account_widget_add_forget_button (McAccount *account,
GtkBuilder *gui,
const gchar *button,
const gchar *entry);
+void empathy_account_widget_set_default_focus (GtkBuilder *gui,
+ const gchar *entry);
GtkWidget *empathy_account_widget_generic_new (McAccount *account);
GtkWidget *empathy_account_widget_salut_new (McAccount *account);
GtkWidget *empathy_account_widget_msn_new (McAccount *account);
diff --git a/libempathy-gtk/empathy-audio-sink.h b/libempathy-gtk/empathy-audio-sink.h
index 57579dc3e..21ebf2b5a 100644
--- a/libempathy-gtk/empathy-audio-sink.h
+++ b/libempathy-gtk/empathy-audio-sink.h
@@ -41,7 +41,7 @@ GType empathy_audio_sink_get_type (void);
/* TYPE MACROS */
#define EMPATHY_TYPE_GST_AUDIO_SINK \
- (empathy_audio_sink_get_type())
+ (empathy_audio_sink_get_type ())
#define EMPATHY_GST_AUDIO_SINK(obj) \
(G_TYPE_CHECK_INSTANCE_CAST((obj), EMPATHY_TYPE_GST_AUDIO_SINK, \
EmpathyGstAudioSink))
diff --git a/libempathy-gtk/empathy-audio-src.h b/libempathy-gtk/empathy-audio-src.h
index 4f48fe1f7..4bca31b61 100644
--- a/libempathy-gtk/empathy-audio-src.h
+++ b/libempathy-gtk/empathy-audio-src.h
@@ -41,7 +41,7 @@ GType empathy_audio_src_get_type (void);
/* TYPE MACROS */
#define EMPATHY_TYPE_GST_AUDIO_SRC \
- (empathy_audio_src_get_type())
+ (empathy_audio_src_get_type ())
#define EMPATHY_GST_AUDIO_SRC(obj) \
(G_TYPE_CHECK_INSTANCE_CAST((obj), EMPATHY_TYPE_GST_AUDIO_SRC, \
EmpathyGstAudioSrc))
diff --git a/libempathy-gtk/empathy-avatar-chooser.c b/libempathy-gtk/empathy-avatar-chooser.c
index c86b85d25..0f4311e07 100644
--- a/libempathy-gtk/empathy-avatar-chooser.c
+++ b/libempathy-gtk/empathy-avatar-chooser.c
@@ -14,8 +14,8 @@
*
* You should have received a copy of the GNU General Public
* License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301 USA
*
* Authors: Based on Novell's e-image-chooser.
* Xavier Claessens <xclaesse@gmail.com>
@@ -798,7 +798,7 @@ avatar_chooser_drag_data_received_cb (GtkWidget *widget,
gchar *uri;
uri = g_strndup (selection_data->data,
- nl - (gchar*) selection_data->data);
+ nl - (gchar *) selection_data->data);
file = g_file_new_for_uri (uri);
g_free (uri);
@@ -1000,7 +1000,7 @@ avatar_chooser_clicked_cb (GtkWidget *button,
gtk_file_chooser_add_filter (chooser_dialog, filter);
filter = gtk_file_filter_new ();
gtk_file_filter_set_name (filter, _("All Files"));
- gtk_file_filter_add_pattern(filter, "*");
+ gtk_file_filter_add_pattern (filter, "*");
gtk_file_chooser_add_filter (chooser_dialog, filter);
/* Setup response */
diff --git a/libempathy-gtk/empathy-avatar-chooser.h b/libempathy-gtk/empathy-avatar-chooser.h
index 564c1f37d..f4e40a8b0 100644
--- a/libempathy-gtk/empathy-avatar-chooser.h
+++ b/libempathy-gtk/empathy-avatar-chooser.h
@@ -14,8 +14,8 @@
*
* You should have received a copy of the GNU General Public
* License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301 USA
*
* Authors: Based on Novell's e-image-chooser.
* Xavier Claessens <xclaesse@gmail.com>
diff --git a/libempathy-gtk/empathy-avatar-image.c b/libempathy-gtk/empathy-avatar-image.c
index e5513231b..d430c0fa6 100644
--- a/libempathy-gtk/empathy-avatar-image.c
+++ b/libempathy-gtk/empathy-avatar-image.c
@@ -15,8 +15,8 @@
*
* You should have received a copy of the GNU General Public
* License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301 USA
*
* Authors: Xavier Claessens <xclaesse@gmail.com>
*/
diff --git a/libempathy-gtk/empathy-avatar-image.h b/libempathy-gtk/empathy-avatar-image.h
index 8969c1227..ddb446a60 100644
--- a/libempathy-gtk/empathy-avatar-image.h
+++ b/libempathy-gtk/empathy-avatar-image.h
@@ -15,8 +15,8 @@
*
* You should have received a copy of the GNU General Public
* License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301 USA
*
* Authors: Xavier Claessens <xclaesse@gmail.com>
*/
diff --git a/libempathy-gtk/empathy-cell-renderer-activatable.c b/libempathy-gtk/empathy-cell-renderer-activatable.c
index fc218e88b..2883c4ded 100644
--- a/libempathy-gtk/empathy-cell-renderer-activatable.c
+++ b/libempathy-gtk/empathy-cell-renderer-activatable.c
@@ -93,7 +93,7 @@ cell_renderer_activatable_activate (GtkCellRenderer *cell,
activatable = EMPATHY_CELL_RENDERER_ACTIVATABLE (cell);
- if (!GTK_IS_TREE_VIEW (widget) || event == NULL ||
+ if (!GTK_IS_TREE_VIEW (widget) || event == NULL ||
event->type != GDK_BUTTON_PRESS) {
return FALSE;
}
diff --git a/libempathy-gtk/empathy-cell-renderer-expander.c b/libempathy-gtk/empathy-cell-renderer-expander.c
index fc9189d2d..09fe8bd4f 100644
--- a/libempathy-gtk/empathy-cell-renderer-expander.c
+++ b/libempathy-gtk/empathy-cell-renderer-expander.c
@@ -14,9 +14,9 @@
*
* You should have received a copy of the GNU General Public
* License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- *
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301 USA
+ *
* Authors: Kristian Rietveld <kris@imendio.com>
*/
@@ -253,7 +253,7 @@ empathy_cell_renderer_expander_get_size (GtkCellRenderer *cell,
EmpathyCellRendererExpander *expander;
EmpathyCellRendererExpanderPriv *priv;
- expander = (EmpathyCellRendererExpander*) cell;
+ expander = (EmpathyCellRendererExpander *) cell;
priv = GET_PRIV (expander);
if (cell_area) {
@@ -295,7 +295,7 @@ empathy_cell_renderer_expander_render (GtkCellRenderer *cell,
GtkExpanderStyle expander_style;
gint x_offset, y_offset;
- expander = (EmpathyCellRendererExpander*) cell;
+ expander = (EmpathyCellRendererExpander *) cell;
priv = GET_PRIV (expander);
if (priv->animation_node) {
diff --git a/libempathy-gtk/empathy-cell-renderer-expander.h b/libempathy-gtk/empathy-cell-renderer-expander.h
index d052612bf..fc569ded2 100644
--- a/libempathy-gtk/empathy-cell-renderer-expander.h
+++ b/libempathy-gtk/empathy-cell-renderer-expander.h
@@ -14,9 +14,9 @@
*
* You should have received a copy of the GNU General Public
* License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- *
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301 USA
+ *
* Authors: Kristian Rietveld <kris@imendio.com>
*/
diff --git a/libempathy-gtk/empathy-cell-renderer-text.c b/libempathy-gtk/empathy-cell-renderer-text.c
index 567a1d9d3..e3dd27d30 100644
--- a/libempathy-gtk/empathy-cell-renderer-text.c
+++ b/libempathy-gtk/empathy-cell-renderer-text.c
@@ -14,9 +14,9 @@
*
* You should have received a copy of the GNU General Public
* License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- *
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301 USA
+ *
* Authors: Mikael Hallendal <micke@imendio.com>
*/
diff --git a/libempathy-gtk/empathy-cell-renderer-text.h b/libempathy-gtk/empathy-cell-renderer-text.h
index 7de8b2d08..540c2ebb9 100644
--- a/libempathy-gtk/empathy-cell-renderer-text.h
+++ b/libempathy-gtk/empathy-cell-renderer-text.h
@@ -14,9 +14,9 @@
*
* You should have received a copy of the GNU General Public
* License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- *
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301 USA
+ *
* Authors: Mikael Hallendal <micke@imendio.com>
*/
diff --git a/libempathy-gtk/empathy-chat-text-view.c b/libempathy-gtk/empathy-chat-text-view.c
index fbe40120a..8874b7ace 100644
--- a/libempathy-gtk/empathy-chat-text-view.c
+++ b/libempathy-gtk/empathy-chat-text-view.c
@@ -15,9 +15,9 @@
*
* You should have received a copy of the GNU General Public
* License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- *
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301 USA
+ *
* Authors: Mikael Hallendal <micke@imendio.com>
* Richard Hult <richard@imendio.com>
* Martyn Russell <martyn@imendio.com>
@@ -113,7 +113,7 @@ chat_text_view_url_event_cb (GtkTextTag *tag,
&start,
&end,
FALSE);
-
+
empathy_url_show (GTK_WIDGET (view), str);
g_free (str);
}
@@ -591,7 +591,7 @@ empathy_chat_text_view_class_init (EmpathyChatTextViewClass *klass)
object_class->set_property = chat_text_view_set_property;
widget_class->size_allocate = chat_text_view_size_allocate;
- widget_class->drag_motion = chat_text_view_drag_motion;
+ widget_class->drag_motion = chat_text_view_drag_motion;
g_object_class_install_property (object_class,
PROP_LAST_CONTACT,
@@ -688,7 +688,7 @@ chat_text_view_scroll_down (EmpathyChatView *view)
if (priv->scroll_time) {
g_timer_reset (priv->scroll_time);
} else {
- priv->scroll_time = g_timer_new();
+ priv->scroll_time = g_timer_new ();
}
if (!priv->scroll_timeout) {
priv->scroll_timeout = g_timeout_add (SCROLL_DELAY,
@@ -894,7 +894,7 @@ chat_text_view_find_previous (EmpathyChatView *view,
if (!new_search && !priv->find_wrapped) {
priv->find_wrapped = TRUE;
result = chat_text_view_find_previous (view,
- search_criteria,
+ search_criteria,
FALSE);
priv->find_wrapped = FALSE;
}
@@ -1008,8 +1008,8 @@ chat_text_view_find_next (EmpathyChatView *view,
/* Here we wrap around. */
if (!new_search && !priv->find_wrapped) {
priv->find_wrapped = TRUE;
- result = chat_text_view_find_next (view,
- search_criteria,
+ result = chat_text_view_find_next (view,
+ search_criteria,
FALSE);
priv->find_wrapped = FALSE;
}
diff --git a/libempathy-gtk/empathy-chat-text-view.h b/libempathy-gtk/empathy-chat-text-view.h
index 120d370f1..7c4ff3430 100644
--- a/libempathy-gtk/empathy-chat-text-view.h
+++ b/libempathy-gtk/empathy-chat-text-view.h
@@ -15,9 +15,9 @@
*
* You should have received a copy of the GNU General Public
* License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- *
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301 USA
+ *
* Authors: Mikael Hallendal <micke@imendio.com>
* Richard Hult <richard@imendio.com>
* Martyn Russell <martyn@imendio.com>
diff --git a/libempathy-gtk/empathy-chat-view.c b/libempathy-gtk/empathy-chat-view.c
index 23877a275..e0a7905df 100644
--- a/libempathy-gtk/empathy-chat-view.c
+++ b/libempathy-gtk/empathy-chat-view.c
@@ -14,9 +14,9 @@
*
* You should have received a copy of the GNU General Public
* License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- *
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301 USA
+ *
* Authors: Xavier Claessens <xclaesse@gmail.com>
*/
@@ -66,7 +66,7 @@ empathy_chat_view_append_message (EmpathyChatView *view,
g_return_if_fail (EMPATHY_IS_CHAT_VIEW (view));
if (EMPATHY_TYPE_CHAT_VIEW_GET_IFACE (view)->append_message) {
- EMPATHY_TYPE_CHAT_VIEW_GET_IFACE (view)->append_message (view,
+ EMPATHY_TYPE_CHAT_VIEW_GET_IFACE (view)->append_message (view,
msg);
}
}
@@ -90,7 +90,7 @@ empathy_chat_view_scroll (EmpathyChatView *view,
g_return_if_fail (EMPATHY_IS_CHAT_VIEW (view));
if (EMPATHY_TYPE_CHAT_VIEW_GET_IFACE (view)->scroll) {
- EMPATHY_TYPE_CHAT_VIEW_GET_IFACE (view)->scroll (view,
+ EMPATHY_TYPE_CHAT_VIEW_GET_IFACE (view)->scroll (view,
allow_scrolling);
}
}
@@ -134,8 +134,8 @@ empathy_chat_view_find_previous (EmpathyChatView *view,
g_return_val_if_fail (EMPATHY_IS_CHAT_VIEW (view), FALSE);
if (EMPATHY_TYPE_CHAT_VIEW_GET_IFACE (view)->find_previous) {
- return EMPATHY_TYPE_CHAT_VIEW_GET_IFACE (view)->find_previous (view,
- search_criteria,
+ return EMPATHY_TYPE_CHAT_VIEW_GET_IFACE (view)->find_previous (view,
+ search_criteria,
new_search);
}
return FALSE;
@@ -149,8 +149,8 @@ empathy_chat_view_find_next (EmpathyChatView *view,
g_return_val_if_fail (EMPATHY_IS_CHAT_VIEW (view), FALSE);
if (EMPATHY_TYPE_CHAT_VIEW_GET_IFACE (view)->find_next) {
- return EMPATHY_TYPE_CHAT_VIEW_GET_IFACE (view)->find_next (view,
- search_criteria,
+ return EMPATHY_TYPE_CHAT_VIEW_GET_IFACE (view)->find_next (view,
+ search_criteria,
new_search);
}
return FALSE;
@@ -166,9 +166,9 @@ empathy_chat_view_find_abilities (EmpathyChatView *view,
g_return_if_fail (EMPATHY_IS_CHAT_VIEW (view));
if (EMPATHY_TYPE_CHAT_VIEW_GET_IFACE (view)->find_abilities) {
- EMPATHY_TYPE_CHAT_VIEW_GET_IFACE (view)->find_abilities (view,
- search_criteria,
- can_do_previous,
+ EMPATHY_TYPE_CHAT_VIEW_GET_IFACE (view)->find_abilities (view,
+ search_criteria,
+ can_do_previous,
can_do_next);
}
}
diff --git a/libempathy-gtk/empathy-chat-view.h b/libempathy-gtk/empathy-chat-view.h
index 08fba1508..893cf83e4 100644
--- a/libempathy-gtk/empathy-chat-view.h
+++ b/libempathy-gtk/empathy-chat-view.h
@@ -14,9 +14,9 @@
*
* You should have received a copy of the GNU General Public
* License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- *
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301 USA
+ *
* Authors: Xavier Claessens <xclaesse@gmail.com>
*/
diff --git a/libempathy-gtk/empathy-chat.c b/libempathy-gtk/empathy-chat.c
index 985eaa4cf..248fd116d 100644
--- a/libempathy-gtk/empathy-chat.c
+++ b/libempathy-gtk/empathy-chat.c
@@ -15,9 +15,9 @@
*
* You should have received a copy of the GNU General Public
* License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- *
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301 USA
+ *
* Authors: Mikael Hallendal <micke@imendio.com>
* Richard Hult <richard@imendio.com>
* Martyn Russell <martyn@imendio.com>
@@ -45,7 +45,6 @@
#include "empathy-chat.h"
#include "empathy-conf.h"
#include "empathy-spell.h"
-#include "empathy-spell-dialog.h"
#include "empathy-contact-list-store.h"
#include "empathy-contact-list-view.h"
#include "empathy-contact-menu.h"
@@ -283,7 +282,7 @@ chat_composing_stop (EmpathyChat *chat)
TP_CHANNEL_CHAT_STATE_ACTIVE);
}
-static void
+static void
chat_sent_message_add (EmpathyChat *chat,
const gchar *str)
{
@@ -595,7 +594,7 @@ chat_property_changed_cb (EmpathyTpChat *tp_chat,
static void
chat_input_text_buffer_changed_cb (GtkTextBuffer *buffer,
- EmpathyChat *chat)
+ EmpathyChat *chat)
{
EmpathyChatPriv *priv;
GtkTextIter start, end;
@@ -611,8 +610,8 @@ chat_input_text_buffer_changed_cb (GtkTextBuffer *buffer,
}
empathy_conf_get_bool (empathy_conf_get (),
- EMPATHY_PREFS_CHAT_SPELL_CHECKER_ENABLED,
- &spell_checker);
+ EMPATHY_PREFS_CHAT_SPELL_CHECKER_ENABLED,
+ &spell_checker);
gtk_text_buffer_get_start_iter (buffer, &start);
@@ -685,8 +684,8 @@ chat_input_key_press_event_cb (GtkWidget *widget,
priv = GET_PRIV (chat);
/* Catch ctrl+up/down so we can traverse messages we sent */
- if ((event->state & GDK_CONTROL_MASK) &&
- (event->keyval == GDK_Up ||
+ if ((event->state & GDK_CONTROL_MASK) &&
+ (event->keyval == GDK_Up ||
event->keyval == GDK_Down)) {
GtkTextBuffer *buffer;
const gchar *str;
@@ -699,15 +698,15 @@ chat_input_key_press_event_cb (GtkWidget *widget,
str = chat_sent_message_get_last (chat);
}
- g_signal_handlers_block_by_func (buffer,
+ g_signal_handlers_block_by_func (buffer,
chat_input_text_buffer_changed_cb,
chat);
gtk_text_buffer_set_text (buffer, str ? str : "", -1);
- g_signal_handlers_unblock_by_func (buffer,
+ g_signal_handlers_unblock_by_func (buffer,
chat_input_text_buffer_changed_cb,
chat);
- return TRUE;
+ return TRUE;
}
/* Catch enter but not ctrl/shift-enter */
@@ -931,13 +930,42 @@ chat_spell_free (EmpathyChatSpell *chat_spell)
}
static void
-chat_text_check_word_spelling_cb (GtkMenuItem *menuitem,
- EmpathyChatSpell *chat_spell)
+chat_spelling_menu_activate_cb (GtkMenuItem *menu_item,
+ EmpathyChatSpell *chat_spell)
{
- empathy_spell_dialog_show (chat_spell->chat,
- &chat_spell->start,
- &chat_spell->end,
- chat_spell->word);
+ empathy_chat_correct_word (chat_spell->chat,
+ &(chat_spell->start),
+ &(chat_spell->end),
+ gtk_menu_item_get_label (menu_item));
+}
+
+static GtkWidget *
+chat_spelling_build_menu (EmpathyChatSpell *chat_spell)
+{
+ GtkWidget *menu, *menu_item;
+ GList *suggestions, *l;
+
+ menu = gtk_menu_new ();
+ suggestions = empathy_spell_get_suggestions (chat_spell->word);
+ if (suggestions == NULL) {
+ menu_item = gtk_menu_item_new_with_label (_("(No Suggestions)"));
+ gtk_widget_set_sensitive (menu_item, FALSE);
+ gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_item);
+ } else {
+ for (l = suggestions; l; l = l->next) {
+ menu_item = gtk_menu_item_new_with_label (l->data);
+ g_signal_connect (G_OBJECT (menu_item),
+ "activate",
+ G_CALLBACK (chat_spelling_menu_activate_cb),
+ chat_spell);
+ gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_item);
+ }
+ }
+ empathy_spell_free_suggestions (suggestions);
+
+ gtk_widget_show_all (menu);
+
+ return menu;
}
static void
@@ -960,7 +988,8 @@ chat_input_populate_popup_cb (GtkTextView *view,
GtkTextIter iter, start, end;
GtkWidget *item;
gchar *str = NULL;
- EmpathyChatSpell *chat_spell;
+ EmpathyChatSpell *chat_spell;
+ GtkWidget *spell_menu;
EmpathySmileyManager *smiley_manager;
GtkWidget *smiley_menu;
GtkWidget *image;
@@ -1025,14 +1054,14 @@ chat_input_populate_popup_cb (GtkTextView *view,
gtk_menu_shell_prepend (GTK_MENU_SHELL (menu), item);
gtk_widget_show (item);
- item = gtk_image_menu_item_new_with_mnemonic (_("_Check Word Spelling..."));
+ item = gtk_image_menu_item_new_with_mnemonic (_("_Spelling Suggestions"));
image = gtk_image_new_from_icon_name (GTK_STOCK_SPELL_CHECK,
GTK_ICON_SIZE_MENU);
gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (item), image);
- g_signal_connect (item,
- "activate",
- G_CALLBACK (chat_text_check_word_spelling_cb),
- chat_spell);
+
+ spell_menu = chat_spelling_build_menu (chat_spell);
+ gtk_menu_item_set_submenu (GTK_MENU_ITEM (item), spell_menu);
+
gtk_menu_shell_prepend (GTK_MENU_SHELL (menu), item);
gtk_widget_show (item);
}
@@ -1284,7 +1313,7 @@ chat_create_ui (EmpathyChat *chat)
{
EmpathyChatPriv *priv = GET_PRIV (chat);
GtkBuilder *gui;
- GList *list = NULL;
+ GList *list = NULL;
gchar *filename;
GtkTextBuffer *buffer;
@@ -1381,7 +1410,7 @@ chat_size_request (GtkWidget *widget,
if (bin->child && GTK_WIDGET_VISIBLE (bin->child))
{
GtkRequisition child_requisition;
-
+
gtk_widget_size_request (bin->child, &child_requisition);
requisition->width += child_requisition.width;
@@ -1395,7 +1424,7 @@ chat_size_allocate (GtkWidget *widget,
{
GtkBin *bin = GTK_BIN (widget);
GtkAllocation child_allocation;
-
+
widget->allocation = *allocation;
if (bin->child && GTK_WIDGET_VISIBLE (bin->child))
diff --git a/libempathy-gtk/empathy-chat.h b/libempathy-gtk/empathy-chat.h
index f61ce4154..74d7e0681 100644
--- a/libempathy-gtk/empathy-chat.h
+++ b/libempathy-gtk/empathy-chat.h
@@ -15,8 +15,8 @@
*
* You should have received a copy of the GNU General Public
* License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301 USA
*
* Authors: Mikael Hallendal <micke@imendio.com>
* Richard Hult <richard@imendio.com>
diff --git a/libempathy-gtk/empathy-conf.c b/libempathy-gtk/empathy-conf.c
index fae2c37db..62efa60c6 100644
--- a/libempathy-gtk/empathy-conf.c
+++ b/libempathy-gtk/empathy-conf.c
@@ -14,8 +14,8 @@
*
* You should have received a copy of the GNU General Public
* License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301 USA
*
* Authors: Richard Hult <richard@imendio.com>
*/
diff --git a/libempathy-gtk/empathy-conf.h b/libempathy-gtk/empathy-conf.h
index 2051a7f38..07026df5c 100644
--- a/libempathy-gtk/empathy-conf.h
+++ b/libempathy-gtk/empathy-conf.h
@@ -14,8 +14,8 @@
*
* You should have received a copy of the GNU General Public
* License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301 USA
*/
#ifndef __EMPATHY_CONF_H__
@@ -77,8 +77,13 @@ struct _EmpathyConfClass {
#define EMPATHY_PREFS_AUTOCONNECT EMPATHY_PREFS_PATH "/autoconnect"
#define EMPATHY_PREFS_IMPORT_ASKED EMPATHY_PREFS_PATH "/import_asked"
#define EMPATHY_PREFS_FILE_TRANSFER_DEFAULT_FOLDER EMPATHY_PREFS_PATH "/file_transfer/default_folder"
+#define EMPATHY_PREFS_LOCATION_PUBLISH EMPATHY_PREFS_PATH "/location/publish"
+#define EMPATHY_PREFS_LOCATION_RESOURCE_NETWORK EMPATHY_PREFS_PATH "/location/resource_network"
+#define EMPATHY_PREFS_LOCATION_RESOURCE_CELL EMPATHY_PREFS_PATH "/location/resource_cell"
+#define EMPATHY_PREFS_LOCATION_RESOURCE_GPS EMPATHY_PREFS_PATH "/location/resource_gps"
+#define EMPATHY_PREFS_LOCATION_REDUCE_ACCURACY EMPATHY_PREFS_PATH "/location/reduce_accuracy"
-typedef void (*EmpathyConfNotifyFunc) (EmpathyConf *conf,
+typedef void (*EmpathyConfNotifyFunc) (EmpathyConf *conf,
const gchar *key,
gpointer user_data);
diff --git a/libempathy-gtk/empathy-contact-dialogs.c b/libempathy-gtk/empathy-contact-dialogs.c
index 056ec2d85..307b0fbb3 100644
--- a/libempathy-gtk/empathy-contact-dialogs.c
+++ b/libempathy-gtk/empathy-contact-dialogs.c
@@ -190,6 +190,7 @@ empathy_contact_information_dialog_show (EmpathyContact *contact,
/* Contact info widget */
contact_widget = empathy_contact_widget_new (contact,
+ EMPATHY_CONTACT_WIDGET_SHOW_LOCATION |
EMPATHY_CONTACT_WIDGET_EDIT_NONE);
gtk_container_set_border_width (GTK_CONTAINER (contact_widget), 8);
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox),
@@ -364,8 +365,7 @@ new_contact_response_cb (GtkDialog *dialog,
if (contact && response == GTK_RESPONSE_OK) {
empathy_contact_list_add (EMPATHY_CONTACT_LIST (manager),
- contact,
- _("I would like to add you to my contact list."));
+ contact, "");
}
new_contact_dialog = NULL;
diff --git a/libempathy-gtk/empathy-contact-list-store.c b/libempathy-gtk/empathy-contact-list-store.c
index e7982f3aa..261b2cc60 100644
--- a/libempathy-gtk/empathy-contact-list-store.c
+++ b/libempathy-gtk/empathy-contact-list-store.c
@@ -15,8 +15,8 @@
*
* You should have received a copy of the GNU General Public
* License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301 USA
*
* Authors: Mikael Hallendal <micke@imendio.com>
* Martyn Russell <martyn@imendio.com>
@@ -707,7 +707,7 @@ empathy_contact_list_store_search_equal_func (GtkTreeModel *model,
name_folded = g_utf8_casefold (name, -1);
key_folded = g_utf8_casefold (key, -1);
- if (name_folded && key_folded &&
+ if (name_folded && key_folded &&
strstr (name_folded, key_folded)) {
ret = FALSE;
} else {
@@ -736,7 +736,8 @@ contact_list_store_setup (EmpathyContactListStore *store)
G_TYPE_BOOLEAN, /* Is active */
G_TYPE_BOOLEAN, /* Is online */
G_TYPE_BOOLEAN, /* Is separator */
- G_TYPE_BOOLEAN}; /* Can VoIP */
+ G_TYPE_BOOLEAN, /* Can make audio calls */
+ G_TYPE_BOOLEAN}; /* Can make video calls */
priv = GET_PRIV (store);
@@ -870,7 +871,12 @@ contact_list_store_add_contact (EmpathyContactListStore *store,
EMPATHY_CONTACT_LIST_STORE_COL_CONTACT, contact,
EMPATHY_CONTACT_LIST_STORE_COL_IS_GROUP, FALSE,
EMPATHY_CONTACT_LIST_STORE_COL_IS_SEPARATOR, FALSE,
- EMPATHY_CONTACT_LIST_STORE_COL_CAN_VOIP, empathy_contact_can_voip (contact),
+ EMPATHY_CONTACT_LIST_STORE_COL_CAN_AUDIO_CALL,
+ empathy_contact_get_capabilities (contact) &
+ EMPATHY_CAPABILITIES_AUDIO,
+ EMPATHY_CONTACT_LIST_STORE_COL_CAN_VIDEO_CALL,
+ empathy_contact_get_capabilities (contact) &
+ EMPATHY_CAPABILITIES_VIDEO,
-1);
}
@@ -887,7 +893,12 @@ contact_list_store_add_contact (EmpathyContactListStore *store,
EMPATHY_CONTACT_LIST_STORE_COL_CONTACT, contact,
EMPATHY_CONTACT_LIST_STORE_COL_IS_GROUP, FALSE,
EMPATHY_CONTACT_LIST_STORE_COL_IS_SEPARATOR, FALSE,
- EMPATHY_CONTACT_LIST_STORE_COL_CAN_VOIP, empathy_contact_can_voip (contact),
+ EMPATHY_CONTACT_LIST_STORE_COL_CAN_AUDIO_CALL,
+ empathy_contact_get_capabilities (contact) &
+ EMPATHY_CAPABILITIES_AUDIO,
+ EMPATHY_CONTACT_LIST_STORE_COL_CAN_VIDEO_CALL,
+ empathy_contact_get_capabilities (contact) &
+ EMPATHY_CAPABILITIES_VIDEO,
-1);
g_free (l->data);
}
@@ -920,7 +931,7 @@ contact_list_store_remove_contact (EmpathyContactListStore *store,
/* NOTE: it is only <= 2 here because we have
* separators after the group name, otherwise it
- * should be 1.
+ * should be 1.
*/
if (gtk_tree_model_iter_parent (model, &parent, l->data) &&
gtk_tree_model_iter_n_children (model, &parent) <= 2) {
@@ -1056,7 +1067,12 @@ contact_list_store_contact_update (EmpathyContactListStore *store,
EMPATHY_CONTACT_LIST_STORE_COL_IS_GROUP, FALSE,
EMPATHY_CONTACT_LIST_STORE_COL_IS_ONLINE, now_online,
EMPATHY_CONTACT_LIST_STORE_COL_IS_SEPARATOR, FALSE,
- EMPATHY_CONTACT_LIST_STORE_COL_CAN_VOIP, empathy_contact_can_voip (contact),
+ EMPATHY_CONTACT_LIST_STORE_COL_CAN_AUDIO_CALL,
+ empathy_contact_get_capabilities (contact) &
+ EMPATHY_CAPABILITIES_AUDIO,
+ EMPATHY_CONTACT_LIST_STORE_COL_CAN_VIDEO_CALL,
+ empathy_contact_get_capabilities (contact) &
+ EMPATHY_CAPABILITIES_VIDEO,
-1);
}
@@ -1138,7 +1154,7 @@ contact_list_store_contact_active_new (EmpathyContactListStore *store,
ShowActiveData *data;
DEBUG ("Contact:'%s' now active, and %s be removed",
- empathy_contact_get_name (contact),
+ empathy_contact_get_name (contact),
remove ? "WILL" : "WILL NOT");
data = g_slice_new0 (ShowActiveData);
@@ -1259,7 +1275,7 @@ contact_list_store_get_group (EmpathyContactListStore *store,
}
gtk_tree_store_append (GTK_TREE_STORE (store),
- &iter_separator,
+ &iter_separator,
&iter_group);
gtk_tree_store_set (GTK_TREE_STORE (store), &iter_separator,
EMPATHY_CONTACT_LIST_STORE_COL_IS_SEPARATOR, TRUE,
@@ -1293,28 +1309,6 @@ contact_list_store_get_group (EmpathyContactListStore *store,
}
}
-static guint
-contact_list_store_ordered_presence (McPresence state)
-{
- switch (state) {
- case MC_PRESENCE_UNSET:
- case MC_PRESENCE_OFFLINE:
- return 5;
- case MC_PRESENCE_AVAILABLE:
- return 0;
- case MC_PRESENCE_AWAY:
- return 2;
- case MC_PRESENCE_EXTENDED_AWAY:
- return 3;
- case MC_PRESENCE_HIDDEN:
- return 4;
- case MC_PRESENCE_DO_NOT_DISTURB:
- return 1;
- default:
- g_return_val_if_reached (6);
- }
-}
-
static gint
contact_list_store_state_sort_func (GtkTreeModel *model,
GtkTreeIter *iter_a,
@@ -1325,7 +1319,6 @@ contact_list_store_state_sort_func (GtkTreeModel *model,
gchar *name_a, *name_b;
gboolean is_separator_a, is_separator_b;
EmpathyContact *contact_a, *contact_b;
- guint presence_a, presence_b;
gtk_tree_model_get (model, iter_a,
EMPATHY_CONTACT_LIST_STORE_COL_NAME, &name_a,
@@ -1361,16 +1354,11 @@ contact_list_store_state_sort_func (GtkTreeModel *model,
/* If we managed to get this far, we can start looking at
* the presences.
*/
- presence_a = empathy_contact_get_presence (EMPATHY_CONTACT (contact_a));
- presence_a = contact_list_store_ordered_presence (presence_a);
- presence_b = empathy_contact_get_presence (EMPATHY_CONTACT (contact_b));
- presence_b = contact_list_store_ordered_presence (presence_b);
+ ret_val = -tp_connection_presence_type_cmp_availability (
+ empathy_contact_get_presence (EMPATHY_CONTACT (contact_a)),
+ empathy_contact_get_presence (EMPATHY_CONTACT (contact_b)));
- if (presence_a < presence_b) {
- ret_val = -1;
- } else if (presence_a > presence_b) {
- ret_val = 1;
- } else {
+ if (ret_val == 0) {
/* Fallback: compare by name */
ret_val = g_utf8_collate (name_a, name_b);
}
diff --git a/libempathy-gtk/empathy-contact-list-store.h b/libempathy-gtk/empathy-contact-list-store.h
index 10354ff11..13ea099b3 100644
--- a/libempathy-gtk/empathy-contact-list-store.h
+++ b/libempathy-gtk/empathy-contact-list-store.h
@@ -15,8 +15,8 @@
*
* You should have received a copy of the GNU General Public
* License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301 USA
*
* Authors: Mikael Hallendal <micke@imendio.com>
* Martyn Russell <martyn@imendio.com>
@@ -60,7 +60,8 @@ typedef enum {
EMPATHY_CONTACT_LIST_STORE_COL_IS_ACTIVE,
EMPATHY_CONTACT_LIST_STORE_COL_IS_ONLINE,
EMPATHY_CONTACT_LIST_STORE_COL_IS_SEPARATOR,
- EMPATHY_CONTACT_LIST_STORE_COL_CAN_VOIP,
+ EMPATHY_CONTACT_LIST_STORE_COL_CAN_AUDIO_CALL,
+ EMPATHY_CONTACT_LIST_STORE_COL_CAN_VIDEO_CALL,
EMPATHY_CONTACT_LIST_STORE_COL_COUNT
} EmpathyContactListStoreCol;
diff --git a/libempathy-gtk/empathy-contact-list-view.c b/libempathy-gtk/empathy-contact-list-view.c
index ca224f526..c106653b1 100644
--- a/libempathy-gtk/empathy-contact-list-view.c
+++ b/libempathy-gtk/empathy-contact-list-view.c
@@ -15,8 +15,8 @@
*
* You should have received a copy of the GNU General Public
* License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301 USA
*
* Authors: Mikael Hallendal <micke@imendio.com>
* Martyn Russell <martyn@imendio.com>
@@ -169,7 +169,8 @@ contact_list_view_query_tooltip_cb (EmpathyContactListView *view,
if (!priv->tooltip_widget) {
priv->tooltip_widget = empathy_contact_widget_new (contact,
- EMPATHY_CONTACT_WIDGET_FOR_TOOLTIP);
+ EMPATHY_CONTACT_WIDGET_FOR_TOOLTIP |
+ EMPATHY_CONTACT_WIDGET_SHOW_LOCATION);
g_object_ref (priv->tooltip_widget);
g_signal_connect (priv->tooltip_widget, "destroy",
G_CALLBACK (contact_list_view_tooltip_destroy_cb),
@@ -488,7 +489,7 @@ contact_list_view_drag_data_get (GtkWidget *widget,
switch (info) {
case DND_DRAG_TYPE_CONTACT_ID:
gtk_selection_data_set (selection, drag_atoms_source[info], 8,
- (guchar*)str, strlen (str) + 1);
+ (guchar *) str, strlen (str) + 1);
break;
}
@@ -615,9 +616,10 @@ contact_list_view_row_activated (GtkTreeView *view,
}
static void
-contact_list_view_voip_activated_cb (EmpathyCellRendererActivatable *cell,
- const gchar *path_string,
- EmpathyContactListView *view)
+contact_list_start_voip_call (EmpathyCellRendererActivatable *cell,
+ const gchar *path_string,
+ EmpathyContactListView *view,
+ gboolean with_video)
{
EmpathyContactListViewPriv *priv = GET_PRIV (view);
GtkTreeModel *model;
@@ -639,15 +641,32 @@ contact_list_view_voip_activated_cb (EmpathyCellRendererActivatable *cell,
if (contact) {
EmpathyCallFactory *factory;
-
factory = empathy_call_factory_get ();
- empathy_call_factory_new_call (factory, contact);
-
+ empathy_call_factory_new_call_with_streams (factory, contact,
+ TRUE, with_video);
g_object_unref (contact);
}
}
static void
+contact_list_view_video_call_activated_cb (
+ EmpathyCellRendererActivatable *cell,
+ const gchar *path_string,
+ EmpathyContactListView *view)
+{
+ contact_list_start_voip_call (cell, path_string, view, TRUE);
+}
+
+
+static void
+contact_list_view_audio_call_activated_cb (EmpathyCellRendererActivatable *cell,
+ const gchar *path_string,
+ EmpathyContactListView *view)
+{
+ contact_list_start_voip_call (cell, path_string, view, FALSE);
+}
+
+static void
contact_list_view_cell_set_background (EmpathyContactListView *view,
GtkCellRenderer *cell,
gboolean is_group,
@@ -708,7 +727,8 @@ contact_list_view_pixbuf_cell_data_func (GtkTreeViewColumn *tree_column,
}
static void
-contact_list_view_voip_cell_data_func (GtkTreeViewColumn *tree_column,
+contact_list_view_audio_call_cell_data_func (
+ GtkTreeViewColumn *tree_column,
GtkCellRenderer *cell,
GtkTreeModel *model,
GtkTreeIter *iter,
@@ -721,7 +741,7 @@ contact_list_view_voip_cell_data_func (GtkTreeViewColumn *tree_column,
gtk_tree_model_get (model, iter,
EMPATHY_CONTACT_LIST_STORE_COL_IS_GROUP, &is_group,
EMPATHY_CONTACT_LIST_STORE_COL_IS_ACTIVE, &is_active,
- EMPATHY_CONTACT_LIST_STORE_COL_CAN_VOIP, &can_voip,
+ EMPATHY_CONTACT_LIST_STORE_COL_CAN_AUDIO_CALL, &can_voip,
-1);
g_object_set (cell,
@@ -733,6 +753,33 @@ contact_list_view_voip_cell_data_func (GtkTreeViewColumn *tree_column,
}
static void
+contact_list_view_video_call_cell_data_func (
+ GtkTreeViewColumn *tree_column,
+ GtkCellRenderer *cell,
+ GtkTreeModel *model,
+ GtkTreeIter *iter,
+ EmpathyContactListView *view)
+{
+ gboolean is_group;
+ gboolean is_active;
+ gboolean can_voip;
+
+ gtk_tree_model_get (model, iter,
+ EMPATHY_CONTACT_LIST_STORE_COL_IS_GROUP, &is_group,
+ EMPATHY_CONTACT_LIST_STORE_COL_IS_ACTIVE, &is_active,
+ EMPATHY_CONTACT_LIST_STORE_COL_CAN_VIDEO_CALL, &can_voip,
+ -1);
+
+ g_object_set (cell,
+ "visible", !is_group && can_voip,
+ "icon-name", EMPATHY_IMAGE_VIDEO_CALL,
+ NULL);
+
+ contact_list_view_cell_set_background (view, cell, is_group, is_active);
+}
+
+
+static void
contact_list_view_avatar_cell_data_func (GtkTreeViewColumn *tree_column,
GtkCellRenderer *cell,
GtkTreeModel *model,
@@ -948,12 +995,12 @@ contact_list_view_setup (EmpathyContactListView *view)
gtk_tree_view_column_add_attribute (col, cell,
"is_group", EMPATHY_CONTACT_LIST_STORE_COL_IS_GROUP);
- /* Voip Capability Icon */
+ /* Audio Call Icon */
cell = empathy_cell_renderer_activatable_new ();
gtk_tree_view_column_pack_start (col, cell, FALSE);
gtk_tree_view_column_set_cell_data_func (
col, cell,
- (GtkTreeCellDataFunc) contact_list_view_voip_cell_data_func,
+ (GtkTreeCellDataFunc) contact_list_view_audio_call_cell_data_func,
view, NULL);
g_object_set (cell,
@@ -961,7 +1008,23 @@ contact_list_view_setup (EmpathyContactListView *view)
NULL);
g_signal_connect (cell, "path-activated",
- G_CALLBACK (contact_list_view_voip_activated_cb),
+ G_CALLBACK (contact_list_view_audio_call_activated_cb),
+ view);
+
+ /* Video Call Icon */
+ cell = empathy_cell_renderer_activatable_new ();
+ gtk_tree_view_column_pack_start (col, cell, FALSE);
+ gtk_tree_view_column_set_cell_data_func (
+ col, cell,
+ (GtkTreeCellDataFunc) contact_list_view_video_call_cell_data_func,
+ view, NULL);
+
+ g_object_set (cell,
+ "visible", FALSE,
+ NULL);
+
+ g_signal_connect (cell, "path-activated",
+ G_CALLBACK (contact_list_view_video_call_activated_cb),
view);
/* Avatar */
@@ -1181,7 +1244,7 @@ empathy_contact_list_view_init (EmpathyContactListView *view)
/* Get saved group states. */
empathy_contact_groups_get_all ();
- gtk_tree_view_set_row_separator_func (GTK_TREE_VIEW (view),
+ gtk_tree_view_set_row_separator_func (GTK_TREE_VIEW (view),
empathy_contact_list_store_row_separator_func,
NULL, NULL);
@@ -1275,8 +1338,8 @@ empathy_contact_list_view_get_selected_group (EmpathyContactListView *view)
}
static gboolean
-contact_list_view_remove_dialog_show (GtkWindow *parent,
- const gchar *message,
+contact_list_view_remove_dialog_show (GtkWindow *parent,
+ const gchar *message,
const gchar *secondary_text)
{
GtkWidget *dialog;
@@ -1291,9 +1354,9 @@ contact_list_view_remove_dialog_show (GtkWindow *parent,
NULL);
gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog),
"%s", secondary_text);
-
+
gtk_widget_show (dialog);
-
+
res = gtk_dialog_run (GTK_DIALOG (dialog));
gtk_widget_destroy (dialog);
@@ -1387,7 +1450,7 @@ contact_list_view_remove_activate_cb (GtkMenuItem *menuitem,
contact = empathy_contact_list_view_dup_selected (view);
if (contact) {
- gchar *text;
+ gchar *text;
GtkWindow *parent;
parent = empathy_get_toplevel_window (GTK_WIDGET (view));
@@ -1397,8 +1460,7 @@ contact_list_view_remove_activate_cb (GtkMenuItem *menuitem,
EmpathyContactList *list;
list = empathy_contact_list_store_get_list_iface (priv->store);
- empathy_contact_list_remove (list, contact,
- _("Sorry, I don't want you in my contact list anymore."));
+ empathy_contact_list_remove (list, contact, "");
}
g_free (text);
diff --git a/libempathy-gtk/empathy-contact-list-view.h b/libempathy-gtk/empathy-contact-list-view.h
index bb6766c4a..0c48764c4 100644
--- a/libempathy-gtk/empathy-contact-list-view.h
+++ b/libempathy-gtk/empathy-contact-list-view.h
@@ -15,8 +15,8 @@
*
* You should have received a copy of the GNU General Public
* License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301 USA
*
* Authors: Mikael Hallendal <micke@imendio.com>
* Martyn Russell <martyn@imendio.com>
diff --git a/libempathy-gtk/empathy-contact-menu.c b/libempathy-gtk/empathy-contact-menu.c
index a3cf1da26..fdd9c34a1 100644
--- a/libempathy-gtk/empathy-contact-menu.c
+++ b/libempathy-gtk/empathy-contact-menu.c
@@ -15,7 +15,7 @@
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- *
+ *
* Authors: Xavier Claessens <xclaesse@gmail.com>
*/
@@ -62,9 +62,14 @@ empathy_contact_menu_new (EmpathyContact *contact,
gtk_widget_show (item);
}
- /* Call */
if (features & EMPATHY_CONTACT_FEATURE_CALL) {
- item = empathy_contact_call_menu_item_new (contact);
+ /* Audio Call */
+ item = empathy_contact_audio_call_menu_item_new (contact);
+ gtk_menu_shell_append (shell, item);
+ gtk_widget_show (item);
+
+ /* Video Call */
+ item = empathy_contact_video_call_menu_item_new (contact);
gtk_menu_shell_append (shell, item);
gtk_widget_show (item);
}
@@ -141,24 +146,24 @@ empathy_contact_chat_menu_item_new (EmpathyContact *contact)
}
static void
-empathy_contact_call_menu_item_activated (GtkMenuItem *item,
+empathy_contact_audio_call_menu_item_activated (GtkMenuItem *item,
EmpathyContact *contact)
{
EmpathyCallFactory *factory;
factory = empathy_call_factory_get ();
- empathy_call_factory_new_call (factory, contact);
+ empathy_call_factory_new_call_with_streams (factory, contact, TRUE, FALSE);
}
GtkWidget *
-empathy_contact_call_menu_item_new (EmpathyContact *contact)
+empathy_contact_audio_call_menu_item_new (EmpathyContact *contact)
{
GtkWidget *item;
GtkWidget *image;
g_return_val_if_fail (EMPATHY_IS_CONTACT (contact), NULL);
- item = gtk_image_menu_item_new_with_mnemonic (C_("menu item", "_Call"));
+ item = gtk_image_menu_item_new_with_mnemonic (C_("menu item", "_Audio Call"));
image = gtk_image_new_from_icon_name (EMPATHY_IMAGE_VOIP,
GTK_ICON_SIZE_MENU);
gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (item), image);
@@ -166,9 +171,41 @@ empathy_contact_call_menu_item_new (EmpathyContact *contact)
gtk_widget_show (image);
g_signal_connect (item, "activate",
- G_CALLBACK (empathy_contact_call_menu_item_activated),
+ G_CALLBACK (empathy_contact_audio_call_menu_item_activated),
contact);
-
+
+ return item;
+}
+
+static void
+empathy_contact_video_call_menu_item_activated (GtkMenuItem *item,
+ EmpathyContact *contact)
+{
+ EmpathyCallFactory *factory;
+
+ factory = empathy_call_factory_get ();
+ empathy_call_factory_new_call_with_streams (factory, contact, TRUE, TRUE);
+}
+
+GtkWidget *
+empathy_contact_video_call_menu_item_new (EmpathyContact *contact)
+{
+ GtkWidget *item;
+ GtkWidget *image;
+
+ g_return_val_if_fail (EMPATHY_IS_CONTACT (contact), NULL);
+
+ item = gtk_image_menu_item_new_with_mnemonic (C_("menu item", "_Video Call"));
+ image = gtk_image_new_from_icon_name (EMPATHY_IMAGE_VIDEO_CALL,
+ GTK_ICON_SIZE_MENU);
+ gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (item), image);
+ gtk_widget_set_sensitive (item, empathy_contact_can_voip (contact));
+ gtk_widget_show (image);
+
+ g_signal_connect (item, "activate",
+ G_CALLBACK (empathy_contact_video_call_menu_item_activated),
+ contact);
+
return item;
}
@@ -301,7 +338,6 @@ room_sub_menu_data_new (EmpathyContact *contact,
data = g_slice_new (RoomSubMenuData);
data->contact = g_object_ref (contact);
data->chatroom = g_object_ref (chatroom);
-
return data;
}
@@ -381,7 +417,7 @@ empathy_contact_invite_menu_item_new (EmpathyContact *contact)
submenu = gtk_menu_new ();
room_item = create_room_sub_menu (contact, chatroom);
- gtk_menu_shell_append ((GtkMenuShell*)submenu, room_item);
+ gtk_menu_shell_append ((GtkMenuShell *) submenu, room_item);
gtk_widget_show (room_item);
}
}
diff --git a/libempathy-gtk/empathy-contact-menu.h b/libempathy-gtk/empathy-contact-menu.h
index fddc40c49..8126a8e59 100644
--- a/libempathy-gtk/empathy-contact-menu.h
+++ b/libempathy-gtk/empathy-contact-menu.h
@@ -15,7 +15,7 @@
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- *
+ *
* Authors: Xavier Claessens <xclaesse@gmail.com>
*/
@@ -41,7 +41,8 @@ typedef enum {
GtkWidget * empathy_contact_menu_new (EmpathyContact *contact,
EmpathyContactFeatureFlags features);
GtkWidget * empathy_contact_chat_menu_item_new (EmpathyContact *contact);
-GtkWidget * empathy_contact_call_menu_item_new (EmpathyContact *contact);
+GtkWidget * empathy_contact_audio_call_menu_item_new (EmpathyContact *contact);
+GtkWidget * empathy_contact_video_call_menu_item_new (EmpathyContact *contact);
GtkWidget * empathy_contact_log_menu_item_new (EmpathyContact *contact);
GtkWidget * empathy_contact_info_menu_item_new (EmpathyContact *contact);
GtkWidget * empathy_contact_edit_menu_item_new (EmpathyContact *contact);
diff --git a/libempathy-gtk/empathy-contact-selector.c b/libempathy-gtk/empathy-contact-selector.c
index f4a302c5b..8aa02fa6d 100644
--- a/libempathy-gtk/empathy-contact-selector.c
+++ b/libempathy-gtk/empathy-contact-selector.c
@@ -202,7 +202,7 @@ contact_selector_constructor (GType type,
GtkCellLayout *cell_layout;
GtkCellRenderer *renderer;
- object = G_OBJECT_CLASS (empathy_contact_selector_parent_class)->constructor
+ object = G_OBJECT_CLASS (empathy_contact_selector_parent_class)->constructor
(type, n_construct_params, construct_params);
priv = GET_PRIV (object);
contact_selector = EMPATHY_CONTACT_SELECTOR (object);
@@ -422,7 +422,7 @@ contact_selector_filter_visible_func (GtkTreeModel *model,
if (contact != NULL)
{
- visible = data->func(contact, data->user_data);
+ visible = data->func (contact, data->user_data);
g_object_unref (contact);
}
diff --git a/libempathy-gtk/empathy-contact-widget.c b/libempathy-gtk/empathy-contact-widget.c
index 0821066fa..6c1015364 100644
--- a/libempathy-gtk/empathy-contact-widget.c
+++ b/libempathy-gtk/empathy-contact-widget.c
@@ -27,12 +27,19 @@
#include <gtk/gtk.h>
#include <glib/gi18n-lib.h>
+#if HAVE_LIBCHAMPLAIN
+#include <champlain/champlain.h>
+#include <champlain-gtk/champlain-gtk.h>
+#endif
+
#include <libmissioncontrol/mc-account.h>
#include <telepathy-glib/util.h>
#include <libempathy/empathy-tp-contact-factory.h>
#include <libempathy/empathy-contact-manager.h>
#include <libempathy/empathy-contact-list.h>
+#include <libempathy/empathy-location.h>
+#include <libempathy/empathy-time.h>
#include <libempathy/empathy-utils.h>
#include "empathy-contact-widget.h"
@@ -90,6 +97,17 @@ typedef struct
GtkWidget *table_contact;
GtkWidget *vbox_avatar;
+ /* Location */
+ GtkWidget *vbox_location;
+ GtkWidget *subvbox_location;
+ GtkWidget *table_location;
+ GtkWidget *label_location;
+#if HAVE_LIBCHAMPLAIN
+ GtkWidget *viewport_map;
+ GtkWidget *map_view_embed;
+ ClutterActor *map_view;
+#endif
+
/* Groups */
GtkWidget *vbox_groups;
GtkWidget *entry_group;
@@ -161,6 +179,7 @@ static void contact_widget_details_setup (EmpathyContactWidget *information);
static void contact_widget_details_update (EmpathyContactWidget *information);
static void contact_widget_client_setup (EmpathyContactWidget *information);
static void contact_widget_client_update (EmpathyContactWidget *information);
+static void contact_widget_location_update (EmpathyContactWidget *information);
enum
{
@@ -203,6 +222,12 @@ empathy_contact_widget_new (EmpathyContact *contact,
"label_status", &information->label_status,
"table_contact", &information->table_contact,
"vbox_avatar", &information->vbox_avatar,
+ "vbox_location", &information->vbox_location,
+ "subvbox_location", &information->subvbox_location,
+ "label_location", &information->label_location,
+#if HAVE_LIBCHAMPLAIN
+ "viewport_map", &information->viewport_map,
+#endif
"vbox_groups", &information->vbox_groups,
"entry_group", &information->entry_group,
"button_group", &information->button_group,
@@ -222,6 +247,7 @@ empathy_contact_widget_new (EmpathyContact *contact,
"entry_group", "activate", contact_widget_entry_group_activate_cb,
"button_group", "clicked", contact_widget_button_group_clicked_cb,
NULL);
+ information->table_location = NULL;
g_object_set_data (G_OBJECT (information->vbox_contact_widget),
"EmpathyContactWidget",
@@ -317,7 +343,7 @@ empathy_contact_widget_set_account_filter (
if (chooser)
empathy_account_chooser_set_filter (chooser, filter, user_data);
}
-
+
static void
contact_widget_destroy_cb (GtkWidget *widget,
EmpathyContactWidget *information)
@@ -331,7 +357,7 @@ contact_widget_destroy_cb (GtkWidget *widget,
if (information->manager)
{
g_object_unref (information->manager);
- }
+ }
g_slice_free (EmpathyContactWidget, information);
}
@@ -379,6 +405,7 @@ contact_widget_set_contact (EmpathyContactWidget *information,
contact_widget_groups_update (information);
contact_widget_details_update (information);
contact_widget_client_update (information);
+ contact_widget_location_update (information);
}
static gboolean
@@ -393,7 +420,7 @@ contact_widget_id_changed_cb (GtkEntry *entry,
EmpathyContactWidget *self)
{
if (self->widget_id_timeout != 0)
- {
+ {
g_source_remove (self->widget_id_timeout);
}
@@ -465,7 +492,7 @@ save_avatar_menu_activate_cb (GtkWidget *widget,
GtkWidget *dialog;
dialog = gtk_message_dialog_new (NULL, 0,
- GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE,
+ GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE,
_("Unable to save avatar"));
gtk_message_dialog_format_secondary_text (
@@ -519,7 +546,7 @@ popup_avatar_menu (EmpathyContactWidget *information,
}
gtk_menu_attach_to_widget (GTK_MENU (menu), parent, NULL);
- gtk_menu_popup (GTK_MENU (menu), NULL, NULL, NULL, NULL,
+ gtk_menu_popup (GTK_MENU (menu), NULL, NULL, NULL, NULL,
button, event_time);
}
@@ -1203,3 +1230,218 @@ contact_widget_client_update (EmpathyContactWidget *information)
{
/* FIXME: Needs new telepathy spec */
}
+
+/* Converts the Location's GHashTable's key to a user readable string */
+static const gchar *
+location_key_to_label (const gchar *key)
+{
+ if (tp_strdiff (key, EMPATHY_LOCATION_COUNTRY_CODE) == FALSE)
+ return _("Country ISO Code:");
+ else if (tp_strdiff (key, EMPATHY_LOCATION_COUNTRY) == FALSE)
+ return _("Country:");
+ else if (tp_strdiff (key, EMPATHY_LOCATION_REGION) == FALSE)
+ return _("State:");
+ else if (tp_strdiff (key, EMPATHY_LOCATION_LOCALITY) == FALSE)
+ return _("City:");
+ else if (tp_strdiff (key, EMPATHY_LOCATION_AREA) == FALSE)
+ return _("Area:");
+ else if (tp_strdiff (key, EMPATHY_LOCATION_POSTAL_CODE) == FALSE)
+ return _("Postal Code:");
+ else if (tp_strdiff (key, EMPATHY_LOCATION_STREET) == FALSE)
+ return _("Street:");
+ else if (tp_strdiff (key, EMPATHY_LOCATION_BUILDING) == FALSE)
+ return _("Building:");
+ else if (tp_strdiff (key, EMPATHY_LOCATION_FLOOR) == FALSE)
+ return _("Floor:");
+ else if (tp_strdiff (key, EMPATHY_LOCATION_ROOM) == FALSE)
+ return _("Room:");
+ else if (tp_strdiff (key, EMPATHY_LOCATION_TEXT) == FALSE)
+ return _("Text:");
+ else if (tp_strdiff (key, EMPATHY_LOCATION_DESCRIPTION) == FALSE)
+ return _("Description:");
+ else if (tp_strdiff (key, EMPATHY_LOCATION_URI) == FALSE)
+ return _("URI:");
+ else if (tp_strdiff (key, EMPATHY_LOCATION_ACCURACY_LEVEL) == FALSE)
+ return _("Accuracy Level:");
+ else if (tp_strdiff (key, EMPATHY_LOCATION_ERROR) == FALSE)
+ return _("Error:");
+ else if (tp_strdiff (key, EMPATHY_LOCATION_VERTICAL_ERROR_M) == FALSE)
+ return _("Vertical Error (meters):");
+ else if (tp_strdiff (key, EMPATHY_LOCATION_HORIZONTAL_ERROR_M) == FALSE)
+ return _("Horizontal Error (meters):");
+ else if (tp_strdiff (key, EMPATHY_LOCATION_SPEED) == FALSE)
+ return _("Speed:");
+ else if (tp_strdiff (key, EMPATHY_LOCATION_BEARING) == FALSE)
+ return _("Bearing:");
+ else if (tp_strdiff (key, EMPATHY_LOCATION_CLIMB) == FALSE)
+ return _("Climb Speed:");
+ else if (tp_strdiff (key, EMPATHY_LOCATION_TIMESTAMP) == FALSE)
+ return _("Last Updated on:");
+ else if (tp_strdiff (key, EMPATHY_LOCATION_LON) == FALSE)
+ return _("Longitude:");
+ else if (tp_strdiff (key, EMPATHY_LOCATION_LAT) == FALSE)
+ return _("Latitude:");
+ else if (tp_strdiff (key, EMPATHY_LOCATION_ALT) == FALSE)
+ return _("Altitude:");
+ else
+ {
+ DEBUG ("Unexpected Location key: %s", key);
+ return key;
+ }
+}
+
+static void
+contact_widget_location_update (EmpathyContactWidget *information)
+{
+ GHashTable *location;
+ GValue *value;
+ gdouble lat = 0.0, lon = 0.0;
+ gboolean has_position = TRUE;
+ GtkWidget *label;
+ guint row = 0;
+ GHashTableIter iter;
+ gpointer key, pvalue;
+
+ if (!(information->flags & EMPATHY_CONTACT_WIDGET_SHOW_LOCATION))
+ {
+ gtk_widget_hide (information->vbox_location);
+ return;
+ }
+
+ location = empathy_contact_get_location (information->contact);
+ if (location == NULL || g_hash_table_size (location) == 0)
+ {
+ gtk_widget_hide (information->vbox_location);
+ return;
+ }
+
+ value = g_hash_table_lookup (location, EMPATHY_LOCATION_LAT);
+ if (value == NULL)
+ has_position = FALSE;
+ else
+ lat = g_value_get_double (value);
+
+ value = g_hash_table_lookup (location, EMPATHY_LOCATION_LON);
+ if (value == NULL)
+ has_position = FALSE;
+ else
+ lon = g_value_get_double (value);
+
+ value = g_hash_table_lookup (location, EMPATHY_LOCATION_TIMESTAMP);
+ if (value == NULL)
+ gtk_label_set_markup (GTK_LABEL (information->label_location), _("<b>Location</b>"));
+ else
+ {
+ gchar *user_date;
+ gchar *text;
+ gint64 stamp;
+ time_t time;
+
+ stamp = g_value_get_int64 (value);
+ time = stamp;
+
+ user_date = empathy_time_to_string_relative (time);
+
+ text = g_strconcat ( _("<b>Location</b>, "), user_date, NULL);
+ gtk_label_set_markup (GTK_LABEL (information->label_location), text);
+ g_free (text);
+ }
+
+
+ /* Prepare the location information table */
+ if (information->table_location != NULL)
+ {
+ gtk_widget_destroy (information->table_location);
+ }
+
+ information->table_location = gtk_table_new (1, 2, FALSE);
+ gtk_box_pack_start (GTK_BOX (information->subvbox_location),
+ information->table_location, FALSE, FALSE, 5);
+
+ g_hash_table_iter_init (&iter, location);
+ while (g_hash_table_iter_next (&iter, &key, &pvalue))
+ {
+ const gchar *skey;
+ const gchar* user_label;
+ GValue *gvalue;
+ char *svalue = NULL;
+
+ skey = (const gchar *) key;
+
+ user_label = location_key_to_label (skey);
+ gvalue = (GValue *) pvalue;
+
+ label = gtk_label_new (user_label);
+ gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
+ gtk_table_attach (GTK_TABLE (information->table_location),
+ label, 0, 1, row, row + 1, GTK_FILL, GTK_FILL, 10, 0);
+ gtk_widget_show (label);
+
+ if (G_VALUE_TYPE (gvalue) == G_TYPE_DOUBLE)
+ {
+ gdouble dvalue;
+ dvalue = g_value_get_double (gvalue);
+ svalue = g_strdup_printf ("%f", dvalue);
+ }
+ else if (G_VALUE_TYPE (gvalue) == G_TYPE_STRING)
+ {
+ svalue = g_value_dup_string (gvalue);
+ }
+ else if (G_VALUE_TYPE (gvalue) == G_TYPE_INT64)
+ {
+ time_t time;
+
+ time = g_value_get_int64 (value);
+ svalue = empathy_time_to_string_utc (time, _("%B %e, %Y at %R UTC"));
+ }
+
+ if (svalue != NULL)
+ {
+ label = gtk_label_new (svalue);
+ gtk_table_attach_defaults (GTK_TABLE (information->table_location),
+ label, 1, 2, row, row + 1);
+ gtk_misc_set_alignment (GTK_MISC (label), 0, 0);
+ gtk_widget_show (label);
+ }
+
+ g_free (svalue);
+ row++;
+ }
+
+ gtk_widget_show (information->table_location);
+
+#if HAVE_LIBCHAMPLAIN
+ /* Cannot be displayed in tooltips until Clutter-Gtk can deal with such
+ * windows
+ */
+ if (has_position &&
+ !(information->flags & EMPATHY_CONTACT_WIDGET_FOR_TOOLTIP))
+ {
+ ClutterActor *marker;
+ ChamplainLayer *layer;
+
+ information->map_view = champlain_view_new ();
+ information->map_view_embed = champlain_view_embed_new (
+ CHAMPLAIN_VIEW (information->map_view));
+
+ gtk_container_add (GTK_CONTAINER (information->viewport_map),
+ information->map_view_embed);
+ g_object_set (G_OBJECT (information->map_view), "show-license", FALSE,
+ "scroll-mode", CHAMPLAIN_SCROLL_MODE_KINETIC,
+ NULL);
+
+ layer = champlain_layer_new ();
+ champlain_view_add_layer (CHAMPLAIN_VIEW (information->map_view), layer);
+
+ marker = champlain_marker_new_with_text (
+ empathy_contact_get_name (information->contact), NULL, NULL, NULL);
+ champlain_base_marker_set_position (CHAMPLAIN_BASE_MARKER (marker), lat, lon);
+ clutter_container_add (CLUTTER_CONTAINER (layer), marker, NULL);
+
+ champlain_view_center_on (CHAMPLAIN_VIEW(information->map_view), lat, lon);
+ gtk_widget_show_all (information->viewport_map);
+ }
+#endif
+
+ gtk_widget_show (information->vbox_location);
+}
diff --git a/libempathy-gtk/empathy-contact-widget.h b/libempathy-gtk/empathy-contact-widget.h
index 0da5580a3..b010578ad 100644
--- a/libempathy-gtk/empathy-contact-widget.h
+++ b/libempathy-gtk/empathy-contact-widget.h
@@ -59,6 +59,7 @@ typedef enum
EMPATHY_CONTACT_WIDGET_EDIT_ID = 1 << 3,
EMPATHY_CONTACT_WIDGET_EDIT_GROUPS = 1 << 4,
EMPATHY_CONTACT_WIDGET_FOR_TOOLTIP = 1 << 5,
+ EMPATHY_CONTACT_WIDGET_SHOW_LOCATION = 1 << 6,
} EmpathyContactWidgetFlags;
GtkWidget * empathy_contact_widget_new (EmpathyContact *contact,
diff --git a/libempathy-gtk/empathy-contact-widget.ui b/libempathy-gtk/empathy-contact-widget.ui
index 1f53f765c..a46b2c6a0 100644
--- a/libempathy-gtk/empathy-contact-widget.ui
+++ b/libempathy-gtk/empathy-contact-widget.ui
@@ -162,6 +162,62 @@
</packing>
</child>
<child>
+ <object class="GtkVBox" id="vbox_location">
+ <property name="orientation">vertical</property>
+ <property name="spacing">6</property>
+ <child>
+ <object class="GtkLabel" id="label_location">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">&lt;b&gt;Location&lt;/b&gt; at (date) </property>
+ <property name="use_markup">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkAlignment" id="alignment1">
+ <property name="visible">True</property>
+ <property name="left_padding">12</property>
+ <child>
+ <object class="GtkVBox" id="subvbox_location">
+ <property name="visible">True</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">5</property>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <object class="GtkViewport" id="viewport_map">
+ <property name="height_request">150</property>
+ <property name="resize_mode">queue</property>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
<object class="GtkVBox" id="vbox_groups">
<property name="orientation">vertical</property>
<property name="spacing">6</property>
@@ -267,7 +323,7 @@
</child>
</object>
<packing>
- <property name="position">1</property>
+ <property name="position">2</property>
</packing>
</child>
<child>
@@ -411,7 +467,7 @@
</object>
<packing>
<property name="expand">False</property>
- <property name="position">2</property>
+ <property name="position">3</property>
</packing>
</child>
<child>
@@ -578,7 +634,7 @@
</object>
<packing>
<property name="expand">False</property>
- <property name="position">3</property>
+ <property name="position">4</property>
</packing>
</child>
</object>
diff --git a/libempathy-gtk/empathy-geometry.c b/libempathy-gtk/empathy-geometry.c
index b3bd09ca1..882e15aa9 100644
--- a/libempathy-gtk/empathy-geometry.c
+++ b/libempathy-gtk/empathy-geometry.c
@@ -15,8 +15,8 @@
*
* You should have received a copy of the GNU General Public
* License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301 USA
*
* Authors: Martyn Russell <martyn@imendio.com>
* Xavier Claessens <xclaesse@gmail.com>
diff --git a/libempathy-gtk/empathy-geometry.h b/libempathy-gtk/empathy-geometry.h
index 1b711c2ec..b7bd86bc2 100644
--- a/libempathy-gtk/empathy-geometry.h
+++ b/libempathy-gtk/empathy-geometry.h
@@ -15,8 +15,8 @@
*
* You should have received a copy of the GNU General Public
* License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301 USA
*
* Authors: Martyn Russell <martyn@imendio.com>
* Xavier Claessens <xclaesse@gmail.com>
diff --git a/libempathy-gtk/empathy-images.h b/libempathy-gtk/empathy-images.h
index 6abd2e8ad..c714f047d 100644
--- a/libempathy-gtk/empathy-images.h
+++ b/libempathy-gtk/empathy-images.h
@@ -15,7 +15,7 @@
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- *
+ *
* Authors: Xavier Claessens <xclaesse@gmail.com>
*/
@@ -38,6 +38,7 @@ G_BEGIN_DECLS
#define EMPATHY_IMAGE_CONTACT_INFORMATION "gtk-info"
#define EMPATHY_IMAGE_GROUP_MESSAGE "system-users"
#define EMPATHY_IMAGE_VOIP "audio-input-microphone"
+#define EMPATHY_IMAGE_VIDEO_CALL "camera-web"
#define EMPATHY_IMAGE_LOG "document-open-recent"
#define EMPATHY_IMAGE_DOCUMENT_SEND "document-send"
diff --git a/libempathy-gtk/empathy-irc-network-dialog.c b/libempathy-gtk/empathy-irc-network-dialog.c
index 8f7f47bda..63222badc 100644
--- a/libempathy-gtk/empathy-irc-network-dialog.c
+++ b/libempathy-gtk/empathy-irc-network-dialog.c
@@ -256,7 +256,7 @@ irc_network_dialog_network_update_buttons (EmpathyIrcNetworkDialog *dialog)
can_remove = TRUE;
can_move_up = selected > 0;
- can_move_down =
+ can_move_down =
selected < gtk_tree_model_iter_n_children (model, NULL) - 1;
gtk_tree_path_free (path);
@@ -515,7 +515,7 @@ empathy_irc_network_dialog_show (EmpathyIrcNetwork *network,
1, 10, 0);
renderer = gtk_cell_renderer_spin_new ();
g_object_set (renderer,
- "editable", TRUE,
+ "editable", TRUE,
"adjustment", adjustment,
NULL);
g_signal_connect (renderer, "edited",
diff --git a/libempathy-gtk/empathy-location-manager.c b/libempathy-gtk/empathy-location-manager.c
new file mode 100644
index 000000000..fb804315c
--- /dev/null
+++ b/libempathy-gtk/empathy-location-manager.c
@@ -0,0 +1,662 @@
+/*
+ * Copyright (C) 2009 Collabora Ltd.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You 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 St, Fifth Floor,
+ * Boston, MA 02110-1301 USA
+ *
+ * Authors: Pierre-Luc Beaudoin <pierre-luc.beaudoin@collabora.co.uk>
+ */
+
+#include "config.h"
+
+#include <string.h>
+#include <time.h>
+
+#include <glib/gi18n.h>
+
+#include <telepathy-glib/util.h>
+
+#include <geoclue/geoclue-master.h>
+
+#include <extensions/extensions.h>
+
+#include "empathy-location-manager.h"
+#include "empathy-conf.h"
+
+#include "libempathy/empathy-account-manager.h"
+#include "libempathy/empathy-enum-types.h"
+#include "libempathy/empathy-location.h"
+#include "libempathy/empathy-tp-contact-factory.h"
+#include "libempathy/empathy-utils.h"
+
+#define DEBUG_FLAG EMPATHY_DEBUG_LOCATION
+#include "libempathy/empathy-debug.h"
+
+/* Seconds before updating the location */
+#define TIMEOUT 10
+static EmpathyLocationManager *location_manager = NULL;
+
+#define GET_PRIV(obj) EMPATHY_GET_PRIV (obj, EmpathyLocationManager)
+typedef struct {
+ gboolean geoclue_is_setup;
+ /* Contains the location to be sent to accounts. Geoclue is used
+ * to populate it. This HashTable uses Telepathy's style (string,
+ * GValue). Keys are defined in empathy-location.h
+ */
+ GHashTable *location;
+
+ GeoclueResourceFlags resources;
+ GeoclueMasterClient *gc_client;
+ GeocluePosition *gc_position;
+ GeoclueAddress *gc_address;
+
+ gboolean reduce_accuracy;
+ gdouble reduce_value;
+ EmpathyAccountManager *account_manager;
+
+ /* The idle id for publish_on_idle func */
+ guint timeout_id;
+} EmpathyLocationManagerPriv;
+
+G_DEFINE_TYPE (EmpathyLocationManager, empathy_location_manager, G_TYPE_OBJECT);
+
+static GObject *
+location_manager_constructor (GType type,
+ guint n_construct_params,
+ GObjectConstructParam *construct_params)
+{
+ GObject *retval;
+
+ if (location_manager == NULL)
+ {
+ retval = G_OBJECT_CLASS (empathy_location_manager_parent_class)->constructor
+ (type, n_construct_params, construct_params);
+
+ location_manager = EMPATHY_LOCATION_MANAGER (retval);
+ g_object_add_weak_pointer (retval, (gpointer) &location_manager);
+ }
+ else
+ {
+ retval = g_object_ref (location_manager);
+ }
+
+ return retval;
+}
+
+static void
+location_manager_dispose (GObject *object)
+{
+ EmpathyLocationManagerPriv *priv = GET_PRIV (object);
+
+ if (priv->account_manager != NULL)
+ {
+ g_object_unref (priv->account_manager);
+ priv->account_manager = NULL;
+ }
+
+ if (priv->gc_client != NULL)
+ {
+ g_object_unref (priv->gc_client);
+ priv->gc_client = NULL;
+ }
+
+ if (priv->gc_position != NULL)
+ {
+ g_object_unref (priv->gc_position);
+ priv->gc_position = NULL;
+ }
+
+ if (priv->gc_address != NULL)
+ {
+ g_object_unref (priv->gc_address);
+ priv->gc_address = NULL;
+ }
+
+ if (priv->location != NULL)
+ {
+ g_hash_table_unref (priv->location);
+ priv->location = NULL;
+ }
+
+ G_OBJECT_CLASS (empathy_location_manager_parent_class)->finalize (object);
+}
+
+static void
+location_manager_get_property (GObject *object,
+ guint param_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ /*EmpathyLocationManagerPriv *priv = GET_PRIV (object); */
+
+ switch (param_id)
+ {
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
+ break;
+ };
+}
+
+static void
+location_manager_set_property (GObject *object,
+ guint param_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ /* EmpathyLocationManagerPriv *priv = GET_PRIV (object); */
+
+ switch (param_id)
+ {
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
+ break;
+ };
+}
+
+static void
+empathy_location_manager_class_init (EmpathyLocationManagerClass *class)
+{
+ GObjectClass *object_class;
+
+ object_class = G_OBJECT_CLASS (class);
+
+ object_class->constructor = location_manager_constructor;
+ object_class->dispose = location_manager_dispose;
+ object_class->get_property = location_manager_get_property;
+ object_class->set_property = location_manager_set_property;
+
+ g_type_class_add_private (object_class, sizeof (EmpathyLocationManagerPriv));
+}
+
+static void
+publish_location (EmpathyLocationManager *location_manager,
+ TpConnection *conn,
+ gboolean force_publication)
+{
+ EmpathyLocationManagerPriv *priv = GET_PRIV (location_manager);
+ guint connection_status = -1;
+ gboolean can_publish;
+ EmpathyConf *conf = empathy_conf_get ();
+ EmpathyTpContactFactory *factory;
+
+ if (!conn)
+ return;
+
+ if (force_publication == FALSE)
+ {
+ if (!empathy_conf_get_bool (conf, EMPATHY_PREFS_LOCATION_PUBLISH,
+ &can_publish))
+ return;
+
+ if (can_publish == FALSE)
+ return;
+ }
+
+ connection_status = tp_connection_get_status (conn, NULL);
+
+ if (connection_status != TP_CONNECTION_STATUS_CONNECTED)
+ return;
+
+ DEBUG ("Publishing %s location to connection %p",
+ (g_hash_table_size (priv->location) == 0 ? "empty" : ""),
+ conn);
+
+ factory = empathy_tp_contact_factory_dup_singleton (conn);
+ empathy_tp_contact_factory_set_location (factory, priv->location);
+ g_object_unref (factory);
+}
+
+static void
+publish_to_all_connections (EmpathyLocationManager *location_manager,
+ gboolean force_publication)
+{
+ EmpathyLocationManagerPriv *priv = GET_PRIV (location_manager);
+ GList *connections = NULL, *l;
+
+ connections = empathy_account_manager_dup_connections (priv->account_manager);
+ for (l = connections; l; l = l->next)
+ {
+ publish_location (location_manager, l->data, force_publication);
+ g_object_unref (l->data);
+ }
+ g_list_free (connections);
+
+}
+
+static gboolean
+publish_on_idle (gpointer user_data)
+{
+ EmpathyLocationManager *manager = EMPATHY_LOCATION_MANAGER (user_data);
+ EmpathyLocationManagerPriv *priv = GET_PRIV (manager);
+
+ priv->timeout_id = 0;
+ publish_to_all_connections (manager, TRUE);
+ return FALSE;
+}
+
+static void
+new_connection_cb (EmpathyAccountManager *manager,
+ TpConnection *conn,
+ gpointer *location_manager)
+{
+ EmpathyLocationManagerPriv *priv = GET_PRIV (location_manager);
+ DEBUG ("New connection %p", conn);
+
+ /* Don't publish if it is already planned (ie startup) */
+ if (priv->timeout_id == 0)
+ {
+ publish_location (EMPATHY_LOCATION_MANAGER (location_manager), conn,
+ FALSE);
+ }
+}
+
+static void
+update_timestamp (EmpathyLocationManager *location_manager)
+{
+ EmpathyLocationManagerPriv *priv= GET_PRIV (location_manager);
+ GValue *new_value;
+ gint64 stamp64;
+ time_t timestamp;
+
+ timestamp = time (NULL);
+ stamp64 = (gint64) timestamp;
+ new_value = tp_g_value_slice_new_int64 (stamp64);
+ g_hash_table_insert (priv->location, g_strdup (EMPATHY_LOCATION_TIMESTAMP),
+ new_value);
+ DEBUG ("\t - Timestamp: %" G_GINT64_FORMAT, stamp64);
+}
+
+static void
+address_changed_cb (GeoclueAddress *address,
+ int timestamp,
+ GHashTable *details,
+ GeoclueAccuracy *accuracy,
+ gpointer location_manager)
+{
+ GeoclueAccuracyLevel level;
+ EmpathyLocationManagerPriv *priv = GET_PRIV (location_manager);
+ GHashTableIter iter;
+ gpointer key, value;
+
+ geoclue_accuracy_get_details (accuracy, &level, NULL, NULL);
+ DEBUG ("New address (accuracy level %d):", level);
+ /* FIXME: Publish accuracy level also considering the position's */
+
+ g_hash_table_remove (priv->location, EMPATHY_LOCATION_STREET);
+ g_hash_table_remove (priv->location, EMPATHY_LOCATION_AREA);
+ g_hash_table_remove (priv->location, EMPATHY_LOCATION_REGION);
+ g_hash_table_remove (priv->location, EMPATHY_LOCATION_COUNTRY);
+ g_hash_table_remove (priv->location, EMPATHY_LOCATION_COUNTRY_CODE);
+ g_hash_table_remove (priv->location, EMPATHY_LOCATION_POSTAL_CODE);
+
+ if (g_hash_table_size (details) == 0)
+ return;
+
+ g_hash_table_iter_init (&iter, details);
+ while (g_hash_table_iter_next (&iter, &key, &value))
+ {
+ GValue *new_value;
+ /* Discard street information if reduced accuracy is on */
+ if (priv->reduce_accuracy && strcmp (key, EMPATHY_LOCATION_STREET) == 0)
+ continue;
+
+ new_value = tp_g_value_slice_new_string (value);
+ g_hash_table_insert (priv->location, g_strdup (key), new_value);
+
+ DEBUG ("\t - %s: %s", (gchar *) key, (gchar *) value);
+ }
+
+ update_timestamp (location_manager);
+ if (priv->timeout_id == 0)
+ priv->timeout_id = g_timeout_add_seconds (TIMEOUT, publish_on_idle, location_manager);
+}
+
+static void
+initial_address_cb (GeoclueAddress *address,
+ int timestamp,
+ GHashTable *details,
+ GeoclueAccuracy *accuracy,
+ GError *error,
+ gpointer location_manager)
+{
+ if (error)
+ {
+ DEBUG ("Error: %s", error->message);
+ g_error_free (error);
+ }
+ else
+ {
+ address_changed_cb (address, timestamp, details, accuracy, location_manager);
+ }
+}
+
+static void
+position_changed_cb (GeocluePosition *position,
+ GeocluePositionFields fields,
+ int timestamp,
+ double latitude,
+ double longitude,
+ double altitude,
+ GeoclueAccuracy *accuracy,
+ gpointer location_manager)
+{
+ EmpathyLocationManagerPriv *priv = GET_PRIV (location_manager);
+ GeoclueAccuracyLevel level;
+ gdouble mean, horizontal, vertical;
+ GValue *new_value;
+
+
+ geoclue_accuracy_get_details (accuracy, &level, &horizontal, &vertical);
+ DEBUG ("New position (accuracy level %d)", level);
+ if (level == GEOCLUE_ACCURACY_LEVEL_NONE)
+ return;
+
+ if (fields & GEOCLUE_POSITION_FIELDS_LONGITUDE)
+ {
+ longitude += priv->reduce_value;
+ new_value = tp_g_value_slice_new_double (longitude);
+ g_hash_table_insert (priv->location, g_strdup (EMPATHY_LOCATION_LON),
+ new_value);
+ DEBUG ("\t - Longitude: %f", longitude);
+ }
+ else
+ {
+ g_hash_table_remove (priv->location, EMPATHY_LOCATION_LON);
+ }
+
+ if (fields & GEOCLUE_POSITION_FIELDS_LATITUDE)
+ {
+ latitude += priv->reduce_value;
+ new_value = tp_g_value_slice_new_double (latitude);
+ g_hash_table_replace (priv->location, g_strdup (EMPATHY_LOCATION_LAT),
+ new_value);
+ DEBUG ("\t - Latitude: %f", latitude);
+ }
+ else
+ {
+ g_hash_table_remove (priv->location, EMPATHY_LOCATION_LAT);
+ }
+
+ if (fields & GEOCLUE_POSITION_FIELDS_ALTITUDE)
+ {
+ new_value = tp_g_value_slice_new_double (altitude);
+ g_hash_table_replace (priv->location, g_strdup (EMPATHY_LOCATION_ALT),
+ new_value);
+ DEBUG ("\t - Altitude: %f", altitude);
+ }
+ else
+ {
+ g_hash_table_remove (priv->location, EMPATHY_LOCATION_ALT);
+ }
+
+ if (level == GEOCLUE_ACCURACY_LEVEL_DETAILED)
+ {
+ mean = (horizontal + vertical) / 2.0;
+ new_value = tp_g_value_slice_new_double (mean);
+ g_hash_table_replace (priv->location,
+ g_strdup (EMPATHY_LOCATION_ACCURACY), new_value);
+ DEBUG ("\t - Accuracy: %f", mean);
+ }
+ else
+ {
+ g_hash_table_remove (priv->location, EMPATHY_LOCATION_ACCURACY);
+ }
+
+ update_timestamp (location_manager);
+ if (priv->timeout_id == 0)
+ priv->timeout_id = g_timeout_add_seconds (TIMEOUT, publish_on_idle, location_manager);
+}
+
+static void
+initial_position_cb (GeocluePosition *position,
+ GeocluePositionFields fields,
+ int timestamp,
+ double latitude,
+ double longitude,
+ double altitude,
+ GeoclueAccuracy *accuracy,
+ GError *error,
+ gpointer location_manager)
+{
+ if (error)
+ {
+ DEBUG ("Error: %s", error->message);
+ g_error_free (error);
+ }
+ else
+ {
+ position_changed_cb (position, fields, timestamp, latitude, longitude,
+ altitude, accuracy, location_manager);
+ }
+}
+
+static void
+update_resources (EmpathyLocationManager *location_manager)
+{
+ EmpathyLocationManagerPriv *priv = GET_PRIV (location_manager);
+
+ DEBUG ("Updating resources %d", priv->resources);
+
+ if (!geoclue_master_client_set_requirements (priv->gc_client,
+ GEOCLUE_ACCURACY_LEVEL_NONE, 0, TRUE, priv->resources,
+ NULL))
+ {
+ DEBUG ("set_requirements failed");
+ return;
+ }
+
+ if (!priv->geoclue_is_setup)
+ return;
+
+ geoclue_address_get_address_async (priv->gc_address,
+ initial_address_cb, location_manager);
+ geoclue_position_get_position_async (priv->gc_position,
+ initial_position_cb, location_manager);
+}
+
+static void
+setup_geoclue (EmpathyLocationManager *location_manager)
+{
+ EmpathyLocationManagerPriv *priv = GET_PRIV (location_manager);
+
+ GeoclueMaster *master;
+ GError *error = NULL;
+
+ DEBUG ("Setting up Geoclue");
+ master = geoclue_master_get_default ();
+ priv->gc_client = geoclue_master_create_client (master, NULL, NULL);
+ g_object_unref (master);
+
+ update_resources (location_manager);
+
+ /* Get updated when the position is changes */
+ priv->gc_position = geoclue_master_client_create_position (
+ priv->gc_client, &error);
+ if (priv->gc_position == NULL)
+ {
+ DEBUG ("Failed to create GeocluePosition: %s", error->message);
+ g_error_free (error);
+ return;
+ }
+
+ g_signal_connect (G_OBJECT (priv->gc_position), "position-changed",
+ G_CALLBACK (position_changed_cb), location_manager);
+
+ /* Get updated when the address changes */
+ priv->gc_address = geoclue_master_client_create_address (
+ priv->gc_client, &error);
+ if (priv->gc_address == NULL)
+ {
+ DEBUG ("Failed to create GeoclueAddress: %s", error->message);
+ g_error_free (error);
+ return;
+ }
+
+ g_signal_connect (G_OBJECT (priv->gc_address), "address-changed",
+ G_CALLBACK (address_changed_cb), location_manager);
+
+ priv->geoclue_is_setup = TRUE;
+}
+
+static void
+publish_cb (EmpathyConf *conf,
+ const gchar *key,
+ gpointer user_data)
+{
+ EmpathyLocationManager *manager = EMPATHY_LOCATION_MANAGER (user_data);
+ EmpathyLocationManagerPriv *priv = GET_PRIV (manager);
+ gboolean can_publish;
+
+ DEBUG ("Publish Conf changed");
+
+
+ if (empathy_conf_get_bool (conf, key, &can_publish) == FALSE)
+ return;
+
+ if (can_publish == TRUE)
+ {
+ if (priv->geoclue_is_setup == FALSE)
+ setup_geoclue (manager);
+ /* if still not setup than the init failed */
+ if (priv->geoclue_is_setup == FALSE)
+ return;
+
+ geoclue_address_get_address_async (priv->gc_address,
+ initial_address_cb, manager);
+ geoclue_position_get_position_async (priv->gc_position,
+ initial_position_cb, manager);
+ }
+ else
+ {
+ /* As per XEP-0080: send an empty location to have remove current
+ * location from the servers
+ */
+ g_hash_table_remove_all (priv->location);
+ publish_to_all_connections (manager, TRUE);
+ }
+
+}
+
+static void
+resource_cb (EmpathyConf *conf,
+ const gchar *key,
+ gpointer user_data)
+{
+ EmpathyLocationManager *manager = EMPATHY_LOCATION_MANAGER (user_data);
+ EmpathyLocationManagerPriv *priv = GET_PRIV (manager);
+ GeoclueResourceFlags resource = 0;
+ gboolean resource_enabled;
+
+ DEBUG ("%s changed", key);
+
+ if (!empathy_conf_get_bool (conf, key, &resource_enabled))
+ return;
+
+ if (strcmp (key, EMPATHY_PREFS_LOCATION_RESOURCE_NETWORK) == 0)
+ resource = GEOCLUE_RESOURCE_NETWORK;
+ if (strcmp (key, EMPATHY_PREFS_LOCATION_RESOURCE_CELL) == 0)
+ resource = GEOCLUE_RESOURCE_CELL;
+ if (strcmp (key, EMPATHY_PREFS_LOCATION_RESOURCE_GPS) == 0)
+ resource = GEOCLUE_RESOURCE_GPS;
+
+ if (resource_enabled)
+ priv->resources |= resource;
+ else
+ priv->resources &= ~resource;
+
+ if (priv->geoclue_is_setup)
+ update_resources (manager);
+}
+
+static void
+accuracy_cb (EmpathyConf *conf,
+ const gchar *key,
+ gpointer user_data)
+{
+ EmpathyLocationManager *manager = EMPATHY_LOCATION_MANAGER (user_data);
+ EmpathyLocationManagerPriv *priv = GET_PRIV (manager);
+
+ gboolean enabled;
+
+ DEBUG ("%s changed", key);
+
+ if (!empathy_conf_get_bool (conf, key, &enabled))
+ return;
+ priv->reduce_accuracy = enabled;
+
+ if (enabled)
+ {
+ GRand *rand = g_rand_new_with_seed (time (NULL));
+ priv->reduce_value = g_rand_double_range (rand, -0.25, 0.25);
+ g_rand_free (rand);
+ }
+ else
+ {
+ priv->reduce_value = 0.0;
+ }
+
+ if (!priv->geoclue_is_setup)
+ return;
+
+ geoclue_address_get_address_async (priv->gc_address,
+ initial_address_cb, manager);
+ geoclue_position_get_position_async (priv->gc_position,
+ initial_position_cb, manager);
+}
+
+static void
+empathy_location_manager_init (EmpathyLocationManager *location_manager)
+{
+ EmpathyConf *conf;
+ EmpathyLocationManagerPriv *priv = G_TYPE_INSTANCE_GET_PRIVATE (location_manager,
+ EMPATHY_TYPE_LOCATION_MANAGER, EmpathyLocationManagerPriv);
+
+ location_manager->priv = priv;
+ priv->geoclue_is_setup = FALSE;
+ priv->location = g_hash_table_new_full (g_direct_hash, g_direct_equal,
+ g_free, (GDestroyNotify) tp_g_value_slice_free);
+
+ /* Setup account status callbacks */
+ priv->account_manager = empathy_account_manager_dup_singleton ();
+ g_signal_connect (priv->account_manager,
+ "new-connection",
+ G_CALLBACK (new_connection_cb), location_manager);
+
+ /* Setup settings status callbacks */
+ conf = empathy_conf_get ();
+ empathy_conf_notify_add (conf, EMPATHY_PREFS_LOCATION_PUBLISH, publish_cb,
+ location_manager);
+ empathy_conf_notify_add (conf, EMPATHY_PREFS_LOCATION_RESOURCE_NETWORK,
+ resource_cb, location_manager);
+ empathy_conf_notify_add (conf, EMPATHY_PREFS_LOCATION_RESOURCE_CELL,
+ resource_cb, location_manager);
+ empathy_conf_notify_add (conf, EMPATHY_PREFS_LOCATION_RESOURCE_GPS,
+ resource_cb, location_manager);
+ empathy_conf_notify_add (conf, EMPATHY_PREFS_LOCATION_REDUCE_ACCURACY,
+ accuracy_cb, location_manager);
+
+ resource_cb (conf, EMPATHY_PREFS_LOCATION_RESOURCE_NETWORK, location_manager);
+ resource_cb (conf, EMPATHY_PREFS_LOCATION_RESOURCE_CELL, location_manager);
+ resource_cb (conf, EMPATHY_PREFS_LOCATION_RESOURCE_GPS, location_manager);
+ accuracy_cb (conf, EMPATHY_PREFS_LOCATION_REDUCE_ACCURACY, location_manager);
+ publish_cb (conf, EMPATHY_PREFS_LOCATION_PUBLISH, location_manager);
+}
+
+EmpathyLocationManager *
+empathy_location_manager_dup_singleton (void)
+{
+ return EMPATHY_LOCATION_MANAGER (g_object_new (EMPATHY_TYPE_LOCATION_MANAGER,
+ NULL));
+}
diff --git a/libempathy-gtk/empathy-location-manager.h b/libempathy-gtk/empathy-location-manager.h
new file mode 100644
index 000000000..092ef0809
--- /dev/null
+++ b/libempathy-gtk/empathy-location-manager.h
@@ -0,0 +1,57 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/*
+ * Copyright (C) 2009 Collabora Ltd.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You 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 St, Fifth Floor,
+ * Boston, MA 02110-1301 USA
+ *
+ * Authors: Pierre-Luc Beaudoin <pierre-luc.beaudoin@collabora.co.uk>
+ */
+
+#ifndef __EMPATHY_LOCATION_MANAGER_H__
+#define __EMPATHY_LOCATION_MANAGER_H__
+
+#include <glib-object.h>
+
+
+G_BEGIN_DECLS
+
+#define EMPATHY_TYPE_LOCATION_MANAGER (empathy_location_manager_get_type ())
+#define EMPATHY_LOCATION_MANAGER(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), EMPATHY_TYPE_LOCATION_MANAGER, EmpathyLocationManager))
+#define EMPATHY_LOCATION_MANAGER_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), EMPATHY_TYPE_LOCATION_MANAGER, EmpathyLocationManagerClass))
+#define EMPATHY_IS_LOCATION_MANAGER(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), EMPATHY_TYPE_LOCATION_MANAGER))
+#define EMPATHY_IS_LOCATION_MANAGER_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), EMPATHY_TYPE_LOCATION_MANAGER))
+#define EMPATHY_LOCATION_MANAGER_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), EMPATHY_TYPE_LOCATION_MANAGER, EmpathyLocationManagerClass))
+
+typedef struct _EmpathyLocationManager EmpathyLocationManager;
+typedef struct _EmpathyLocationManagerClass EmpathyLocationManagerClass;
+
+struct _EmpathyLocationManager
+{
+ GObject parent;
+ gpointer priv;
+};
+
+struct _EmpathyLocationManagerClass
+{
+ GObjectClass parent_class;
+};
+
+GType empathy_location_manager_get_type (void) G_GNUC_CONST;
+EmpathyLocationManager * empathy_location_manager_dup_singleton (void);
+
+G_END_DECLS
+
+#endif /* __EMPATHY_LOCATION_MANAGER_H__ */
diff --git a/libempathy-gtk/empathy-log-window.c b/libempathy-gtk/empathy-log-window.c
index 13d9bcbd3..dc2efa332 100644
--- a/libempathy-gtk/empathy-log-window.c
+++ b/libempathy-gtk/empathy-log-window.c
@@ -15,9 +15,9 @@
*
* You should have received a copy of the GNU General Public
* License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- *
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301 USA
+ *
* Authors: Martyn Russell <martyn@imendio.com>
* Xavier Claessens <xclaesse@gmail.com>
*/
@@ -287,8 +287,8 @@ log_window_entry_find_changed_cb (GtkWidget *entry,
str = gtk_entry_get_text (GTK_ENTRY (window->entry_find));
is_sensitive &= !EMP_STR_EMPTY (str);
- is_sensitive &=
- !window->last_find ||
+ is_sensitive &=
+ !window->last_find ||
(window->last_find && strcmp (window->last_find, str) != 0);
gtk_widget_set_sensitive (window->button_find, is_sensitive);
diff --git a/libempathy-gtk/empathy-log-window.h b/libempathy-gtk/empathy-log-window.h
index 266e0c30c..6dd8c0303 100644
--- a/libempathy-gtk/empathy-log-window.h
+++ b/libempathy-gtk/empathy-log-window.h
@@ -15,9 +15,9 @@
*
* You should have received a copy of the GNU General Public
* License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- *
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301 USA
+ *
* Authors: Martyn Russell <martyn@imendio.com>
* Xavier Claessens <xclaesse@gmail.com>
*/
diff --git a/libempathy-gtk/empathy-new-message-dialog.c b/libempathy-gtk/empathy-new-message-dialog.c
index 3e6e3f11d..512cd1ba3 100644
--- a/libempathy-gtk/empathy-new-message-dialog.c
+++ b/libempathy-gtk/empathy-new-message-dialog.c
@@ -195,7 +195,7 @@ new_message_dialog_call_got_contact_cb (EmpathyTpContactFactory *factory,
return;
}
- call_factory = empathy_call_factory_get();
+ call_factory = empathy_call_factory_get ();
empathy_call_factory_new_call (call_factory, contact);
}
@@ -232,7 +232,7 @@ new_message_dialog_response_cb (GtkWidget *widget,
static void
new_message_change_state_button_cb (GtkEditable *editable,
- EmpathyNewMessageDialog *dialog)
+ EmpathyNewMessageDialog *dialog)
{
const gchar *id;
gboolean sensitive;
@@ -302,8 +302,8 @@ empathy_new_message_dialog_show (GtkWindow *parent)
g_signal_connect (completion, "match-selected",
G_CALLBACK (new_message_dialog_match_selected_cb),
dialog);
- g_object_unref(completion);
- g_object_unref(model);
+ g_object_unref (completion);
+ g_object_unref (model);
empathy_builder_connect (gui, dialog,
"new_message_dialog", "destroy", new_message_dialog_destroy_cb,
@@ -326,7 +326,7 @@ empathy_new_message_dialog_show (GtkWindow *parent)
gtk_widget_show (dialog->account_chooser);
new_message_dialog_account_changed_cb (dialog->account_chooser, dialog);
- g_signal_connect (dialog->account_chooser, "changed",
+ g_signal_connect (dialog->account_chooser, "changed",
G_CALLBACK (new_message_dialog_account_changed_cb),
dialog);
diff --git a/libempathy-gtk/empathy-presence-chooser.c b/libempathy-gtk/empathy-presence-chooser.c
index f4a325b51..9f8c568c5 100644
--- a/libempathy-gtk/empathy-presence-chooser.c
+++ b/libempathy-gtk/empathy-presence-chooser.c
@@ -15,8 +15,8 @@
*
* You should have received a copy of the GNU General Public
* License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301 USA
*
* Authors: Richard Hult <richard@imendio.com>
* Martyn Russell <martyn@imendio.com>
@@ -34,7 +34,6 @@
#include <gdk/gdkkeysyms.h>
#include <telepathy-glib/util.h>
-#include <libmissioncontrol/mc-enum-types.h>
#include <libempathy/empathy-idle.h>
#include <libempathy/empathy-utils.h>
@@ -105,36 +104,40 @@ typedef struct {
int block_changed;
guint focus_out_idle_source;
- McPresence state;
+ TpConnectionPresenceType state;
PresenceChooserEntryType previous_type;
- McPresence flash_state_1;
- McPresence flash_state_2;
+ TpConnectionPresenceType flash_state_1;
+ TpConnectionPresenceType flash_state_2;
guint flash_timeout_id;
} EmpathyPresenceChooserPriv;
/* States to be listed in the menu.
* Each state has a boolean telling if it can have custom message */
-static guint states[] = {MC_PRESENCE_AVAILABLE, TRUE,
- MC_PRESENCE_DO_NOT_DISTURB, TRUE,
- MC_PRESENCE_AWAY, TRUE,
- MC_PRESENCE_HIDDEN, FALSE,
- MC_PRESENCE_OFFLINE, FALSE};
+static struct { TpConnectionPresenceType state;
+ gboolean customisable;
+} states[] = { { TP_CONNECTION_PRESENCE_TYPE_AVAILABLE, TRUE } ,
+ { TP_CONNECTION_PRESENCE_TYPE_BUSY, TRUE },
+ { TP_CONNECTION_PRESENCE_TYPE_AWAY, TRUE },
+ { TP_CONNECTION_PRESENCE_TYPE_HIDDEN, FALSE },
+ { TP_CONNECTION_PRESENCE_TYPE_OFFLINE, FALSE},
+ { TP_CONNECTION_PRESENCE_TYPE_UNSET, },
+ };
static void presence_chooser_finalize (GObject *object);
static void presence_chooser_presence_changed_cb (EmpathyPresenceChooser *chooser);
static gboolean presence_chooser_flash_timeout_cb (EmpathyPresenceChooser *chooser);
static void presence_chooser_flash_start (EmpathyPresenceChooser *chooser,
- McPresence state_1,
- McPresence state_2);
+ TpConnectionPresenceType state_1,
+ TpConnectionPresenceType state_2);
static void presence_chooser_flash_stop (EmpathyPresenceChooser *chooser,
- McPresence state);
+ TpConnectionPresenceType state);
static void presence_chooser_menu_add_item (GtkWidget *menu,
const gchar *str,
- McPresence state);
+ TpConnectionPresenceType state);
static void presence_chooser_noncustom_activate_cb (GtkWidget *item,
gpointer user_data);
-static void presence_chooser_set_state (McPresence state,
+static void presence_chooser_set_state (TpConnectionPresenceType state,
const gchar *status);
static void presence_chooser_custom_activate_cb (GtkWidget *item,
gpointer user_data);
@@ -160,7 +163,7 @@ presence_chooser_create_model (EmpathyPresenceChooser *self)
store = gtk_list_store_new (N_COLUMNS,
G_TYPE_STRING, /* COL_STATE_ICON_NAME */
- MC_TYPE_PRESENCE, /* COL_STATE */
+ G_TYPE_UINT, /* COL_STATE */
G_TYPE_STRING, /* COL_STATUS_TEXT */
G_TYPE_STRING, /* COL_DISPLAY_MARKUP */
G_TYPE_BOOLEAN, /* COL_STATUS_CUSTOMISABLE */
@@ -168,26 +171,25 @@ presence_chooser_create_model (EmpathyPresenceChooser *self)
custom_message = g_strdup_printf ("<i>%s</i>", _("Custom Message..."));
- for (i = 0; i < G_N_ELEMENTS (states); i += 2) {
+ for (i = 0; states[i].state != TP_CONNECTION_PRESENCE_TYPE_UNSET; i++) {
GList *list, *l;
const char *status, *icon_name;
- status = empathy_presence_get_default_message (states[i]);
- icon_name = empathy_icon_name_for_presence (states[i]);
+ status = empathy_presence_get_default_message (states[i].state);
+ icon_name = empathy_icon_name_for_presence (states[i].state);
gtk_list_store_insert_with_values (store, NULL, -1,
COL_STATE_ICON_NAME, icon_name,
- COL_STATE, states[i],
+ COL_STATE, states[i].state,
COL_STATUS_TEXT, status,
COL_DISPLAY_MARKUP, status,
- COL_STATUS_CUSTOMISABLE, states[i+1],
+ COL_STATUS_CUSTOMISABLE, states[i].customisable,
COL_TYPE, ENTRY_TYPE_BUILTIN,
-1);
- if (states[i+1]) {
-
+ if (states[i].customisable) {
/* Set custom messages if wanted */
- list = empathy_status_presets_get (states[i], -1);
+ list = empathy_status_presets_get (states[i].state, -1);
list = g_list_sort (list, (GCompareFunc) g_utf8_collate);
for (l = list; l; l = l->next) {
gtk_list_store_insert_with_values (store,
@@ -245,7 +247,7 @@ presence_chooser_popup_shown_cb (GObject *self,
return;
}
- /* see presence_chooser_entry_focus_out_cb() for what this does */
+ /* see presence_chooser_entry_focus_out_cb () for what this does */
if (priv->focus_out_idle_source != 0) {
g_source_remove (priv->focus_out_idle_source);
priv->focus_out_idle_source = 0;
@@ -279,7 +281,7 @@ static gboolean
presence_chooser_is_preset (EmpathyPresenceChooser *self)
{
EmpathyPresenceChooserPriv *priv = GET_PRIV (self);
- McPresence state;
+ TpConnectionPresenceType state;
const char *status;
GList *presets, *l;
gboolean match = FALSE;
@@ -383,7 +385,7 @@ presence_chooser_set_status_editing (EmpathyPresenceChooser *self,
gtk_window_set_focus (GTK_WINDOW (window), NULL);
}
- /* see presence_chooser_entry_focus_out_cb()
+ /* see presence_chooser_entry_focus_out_cb ()
* for what this does */
if (priv->focus_out_idle_source != 0) {
g_source_remove (priv->focus_out_idle_source);
@@ -407,17 +409,14 @@ mc_set_custom_state (EmpathyPresenceChooser *self)
/* update the status with MC */
status = gtk_entry_get_text (GTK_ENTRY (entry));
- DEBUG ("Sending state to MC-> %s (%s)\n",
- g_enum_get_value (g_type_class_peek (MC_TYPE_PRESENCE),
- priv->state)->value_name,
- status);
+ DEBUG ("Sending state to MC-> %d (%s)\n", priv->state, status);
empathy_idle_set_presence (priv->idle, priv->state, status);
}
static void
ui_set_custom_state (EmpathyPresenceChooser *self,
- McPresence state,
+ TpConnectionPresenceType state,
const char *status)
{
EmpathyPresenceChooserPriv *priv = GET_PRIV (self);
@@ -433,7 +432,7 @@ ui_set_custom_state (EmpathyPresenceChooser *self,
gtk_entry_set_icon_from_icon_name (GTK_ENTRY (entry),
GTK_ENTRY_ICON_PRIMARY,
icon_name);
- gtk_entry_set_text (GTK_ENTRY (entry), status);
+ gtk_entry_set_text (GTK_ENTRY (entry), status == NULL ? "" : status);
presence_chooser_set_favorite_icon (self);
priv->block_changed--;
@@ -462,7 +461,7 @@ presence_chooser_entry_icon_release_cb (EmpathyPresenceChooser *self,
}
else {
PresenceChooserEntryType type;
- McPresence state;
+ TpConnectionPresenceType state;
const char *status;
type = presence_chooser_get_entry_type (self);
@@ -554,7 +553,7 @@ presence_chooser_changed_cb (GtkComboBox *self, gpointer user_data)
EmpathyPresenceChooserPriv *priv = GET_PRIV (self);
GtkTreeIter iter;
char *icon_name;
- McPresence new_state;
+ TpConnectionPresenceType new_state;
gboolean customisable = TRUE;
PresenceChooserEntryType type = -1;
GtkWidget *entry;
@@ -627,6 +626,9 @@ presence_chooser_changed_cb (GtkComboBox *self, gpointer user_data)
presence_chooser_set_status_editing (
EMPATHY_PRESENCE_CHOOSER (self),
FALSE);
+ gtk_entry_set_icon_from_icon_name (GTK_ENTRY (entry),
+ GTK_ENTRY_ICON_PRIMARY,
+ icon_name);
gtk_tree_model_get (model, &iter,
COL_STATUS_TEXT, &status,
@@ -820,8 +822,8 @@ static void
presence_chooser_presence_changed_cb (EmpathyPresenceChooser *chooser)
{
EmpathyPresenceChooserPriv *priv;
- McPresence state;
- McPresence flash_state;
+ TpConnectionPresenceType state;
+ TpConnectionPresenceType flash_state;
const gchar *status;
GtkTreeModel *model;
GtkTreeIter iter;
@@ -843,7 +845,7 @@ presence_chooser_presence_changed_cb (EmpathyPresenceChooser *chooser)
valid;
valid = gtk_tree_model_iter_next (model, &iter)) {
int m_type;
- McPresence m_state;
+ TpConnectionPresenceType m_state;
char *m_status;
gtk_tree_model_get (model, &iter,
@@ -871,7 +873,7 @@ presence_chooser_presence_changed_cb (EmpathyPresenceChooser *chooser)
COL_STATUS_TEXT, &m_status,
-1);
- match = !strcmp (status, m_status);
+ match = !tp_strdiff (status, m_status);
g_free (m_status);
@@ -889,7 +891,7 @@ presence_chooser_presence_changed_cb (EmpathyPresenceChooser *chooser)
ui_set_custom_state (chooser, state, status);
}
- if (flash_state != MC_PRESENCE_UNSET) {
+ if (flash_state != TP_CONNECTION_PRESENCE_TYPE_UNSET) {
presence_chooser_flash_start (chooser, state, flash_state);
}
else {
@@ -901,7 +903,7 @@ static gboolean
presence_chooser_flash_timeout_cb (EmpathyPresenceChooser *chooser)
{
EmpathyPresenceChooserPriv *priv;
- McPresence state;
+ TpConnectionPresenceType state;
static gboolean on = FALSE;
GtkWidget *entry;
@@ -926,8 +928,8 @@ presence_chooser_flash_timeout_cb (EmpathyPresenceChooser *chooser)
static void
presence_chooser_flash_start (EmpathyPresenceChooser *chooser,
- McPresence state_1,
- McPresence state_2)
+ TpConnectionPresenceType state_1,
+ TpConnectionPresenceType state_2)
{
EmpathyPresenceChooserPriv *priv;
@@ -947,7 +949,7 @@ presence_chooser_flash_start (EmpathyPresenceChooser *chooser,
static void
presence_chooser_flash_stop (EmpathyPresenceChooser *chooser,
- McPresence state)
+ TpConnectionPresenceType state)
{
EmpathyPresenceChooserPriv *priv = GET_PRIV (chooser);
GtkWidget *entry;
@@ -981,21 +983,21 @@ empathy_presence_chooser_create_menu (void)
menu = gtk_menu_new ();
- for (i = 0; i < G_N_ELEMENTS (states); i += 2) {
+ for (i = 0; states[i].state != TP_CONNECTION_PRESENCE_TYPE_UNSET; i++) {
GList *list, *l;
- status = empathy_presence_get_default_message (states[i]);
+ status = empathy_presence_get_default_message (states[i].state);
presence_chooser_menu_add_item (menu,
status,
- states[i]);
+ states[i].state);
- if (states[i+1]) {
+ if (states[i].customisable) {
/* Set custom messages if wanted */
- list = empathy_status_presets_get (states[i], 5);
+ list = empathy_status_presets_get (states[i].state, 5);
for (l = list; l; l = l->next) {
presence_chooser_menu_add_item (menu,
l->data,
- states[i]);
+ states[i].state);
}
g_list_free (list);
}
@@ -1026,7 +1028,7 @@ empathy_presence_chooser_create_menu (void)
static void
presence_chooser_menu_add_item (GtkWidget *menu,
const gchar *str,
- McPresence state)
+ TpConnectionPresenceType state)
{
GtkWidget *item;
GtkWidget *image;
@@ -1058,7 +1060,7 @@ static void
presence_chooser_noncustom_activate_cb (GtkWidget *item,
gpointer user_data)
{
- McPresence state;
+ TpConnectionPresenceType state;
const gchar *status;
status = g_object_get_data (G_OBJECT (item), "status");
@@ -1068,7 +1070,7 @@ presence_chooser_noncustom_activate_cb (GtkWidget *item,
}
static void
-presence_chooser_set_state (McPresence state,
+presence_chooser_set_state (TpConnectionPresenceType state,
const gchar *status)
{
EmpathyIdle *idle;
diff --git a/libempathy-gtk/empathy-presence-chooser.h b/libempathy-gtk/empathy-presence-chooser.h
index dab95f553..7b85a6217 100644
--- a/libempathy-gtk/empathy-presence-chooser.h
+++ b/libempathy-gtk/empathy-presence-chooser.h
@@ -15,8 +15,8 @@
*
* You should have received a copy of the GNU General Public
* License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301 USA
*
* Authors: Richard Hult <richard@imendio.com>
* Martyn Russell <martyn@imendio.com>
diff --git a/libempathy-gtk/empathy-profile-chooser.c b/libempathy-gtk/empathy-profile-chooser.c
index 10eb3791a..14965741c 100644
--- a/libempathy-gtk/empathy-profile-chooser.c
+++ b/libempathy-gtk/empathy-profile-chooser.c
@@ -56,7 +56,7 @@ enum {
*
* Return value: a new reference to the selected #McProfile
*/
-McProfile*
+McProfile *
empathy_profile_chooser_dup_selected (GtkWidget *widget)
{
GtkTreeModel *model;
@@ -208,7 +208,7 @@ empathy_profile_chooser_new (void)
if (g_list_find_custom (seen, unique_name, (GCompareFunc) strcmp)) {
continue;
}
- seen = g_list_append (seen, (char*) unique_name);
+ seen = g_list_append (seen, (char *) unique_name);
gtk_list_store_insert_with_values (store, &iter, 0,
COL_ICON, mc_profile_get_icon_name (profile),
diff --git a/libempathy-gtk/empathy-smiley-manager.c b/libempathy-gtk/empathy-smiley-manager.c
index 96b50206a..a729a2929 100644
--- a/libempathy-gtk/empathy-smiley-manager.c
+++ b/libempathy-gtk/empathy-smiley-manager.c
@@ -15,7 +15,7 @@
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- *
+ *
* Authors: Dafydd Harrie <dafydd.harries@collabora.co.uk>
* Xavier Claessens <xclaesse@gmail.com>
*/
@@ -367,15 +367,15 @@ empathy_smiley_manager_get_all (EmpathySmileyManager *manager)
typedef struct {
EmpathySmileyManager *manager;
EmpathySmiley *smiley;
- EmpathySmileyMenuFunc func;
- gpointer user_data;
+ EmpathySmileyMenuFunc func;
+ gpointer user_data;
} ActivateData;
static void
smiley_menu_data_free (gpointer user_data,
GClosure *closure)
{
- ActivateData *data = (ActivateData*) user_data;
+ ActivateData *data = (ActivateData *) user_data;
g_object_unref (data->manager);
g_slice_free (ActivateData, data);
@@ -385,7 +385,7 @@ static void
smiley_menu_activate_cb (GtkMenuItem *menuitem,
gpointer user_data)
{
- ActivateData *data = (ActivateData*) user_data;
+ ActivateData *data = (ActivateData *) user_data;
data->func (data->manager, data->smiley, data->user_data);
}
@@ -417,6 +417,7 @@ empathy_smiley_menu_new (EmpathySmileyManager *manager,
item = gtk_image_menu_item_new_with_label ("");
gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (item), image);
+ gtk_image_menu_item_set_always_show_image (GTK_IMAGE_MENU_ITEM (item), TRUE);
gtk_menu_attach (GTK_MENU (menu), item,
x, x + 1, y, y + 1);
diff --git a/libempathy-gtk/empathy-smiley-manager.h b/libempathy-gtk/empathy-smiley-manager.h
index dae022dfa..5eaf4b283 100644
--- a/libempathy-gtk/empathy-smiley-manager.h
+++ b/libempathy-gtk/empathy-smiley-manager.h
@@ -15,7 +15,7 @@
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- *
+ *
* Authors: Dafydd Harrie <dafydd.harries@collabora.co.uk>
* Xavier Claessens <xclaesse@gmail.com>
*/
diff --git a/libempathy-gtk/empathy-spell-dialog.c b/libempathy-gtk/empathy-spell-dialog.c
deleted file mode 100644
index 9ce80eebb..000000000
--- a/libempathy-gtk/empathy-spell-dialog.c
+++ /dev/null
@@ -1,264 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Copyright (C) 2004-2007 Imendio AB
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation; either version 2 of the
- * License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-#include "config.h"
-
-#include <string.h>
-
-#include <glib/gi18n-lib.h>
-#include <gtk/gtk.h>
-
-#include <libempathy/empathy-utils.h>
-
-#include "empathy-chat.h"
-#include "empathy-spell.h"
-#include "empathy-spell-dialog.h"
-#include "empathy-ui-utils.h"
-
-typedef struct {
- GtkWidget *window;
- GtkWidget *button_replace;
- GtkWidget *label_word;
- GtkWidget *treeview_words;
-
- EmpathyChat *chat;
-
- gchar *word;
- GtkTextIter start;
- GtkTextIter end;
-} EmpathySpellDialog;
-
-enum {
- COL_SPELL_WORD,
- COL_SPELL_COUNT
-};
-
-static void spell_dialog_model_populate_columns (EmpathySpellDialog *dialog);
-static void spell_dialog_model_populate_suggestions (EmpathySpellDialog *dialog);
-static void spell_dialog_model_row_activated_cb (GtkTreeView *tree_view,
- GtkTreePath *path,
- GtkTreeViewColumn *column,
- EmpathySpellDialog *dialog);
-static void spell_dialog_model_selection_changed_cb (GtkTreeSelection *treeselection,
- EmpathySpellDialog *dialog);
-static void spell_dialog_model_setup (EmpathySpellDialog *dialog);
-static void spell_dialog_response_cb (GtkWidget *widget,
- gint response,
- EmpathySpellDialog *dialog);
-static void spell_dialog_destroy_cb (GtkWidget *widget,
- EmpathySpellDialog *dialog);
-
-static void
-spell_dialog_model_populate_columns (EmpathySpellDialog *dialog)
-{
- GtkTreeModel *model;
- GtkTreeViewColumn *column;
- GtkCellRenderer *renderer;
- guint col_offset;
-
- model = gtk_tree_view_get_model (GTK_TREE_VIEW (dialog->treeview_words));
-
- renderer = gtk_cell_renderer_text_new ();
- col_offset = gtk_tree_view_insert_column_with_attributes (
- GTK_TREE_VIEW (dialog->treeview_words),
- -1, _("Word"),
- renderer,
- "text", COL_SPELL_WORD,
- NULL);
-
- g_object_set_data (G_OBJECT (renderer),
- "column", GINT_TO_POINTER (COL_SPELL_WORD));
-
- column = gtk_tree_view_get_column (GTK_TREE_VIEW (dialog->treeview_words), col_offset - 1);
- gtk_tree_view_column_set_sort_column_id (column, COL_SPELL_WORD);
- gtk_tree_view_column_set_resizable (column, FALSE);
- gtk_tree_view_column_set_clickable (GTK_TREE_VIEW_COLUMN (column), TRUE);
-}
-
-static void
-spell_dialog_model_populate_suggestions (EmpathySpellDialog *dialog)
-{
- GtkTreeModel *model;
- GtkListStore *store;
- GList *suggestions, *l;
-
- model = gtk_tree_view_get_model (GTK_TREE_VIEW (dialog->treeview_words));
- store = GTK_LIST_STORE (model);
-
- suggestions = empathy_spell_get_suggestions (dialog->word);
- for (l = suggestions; l; l=l->next) {
- GtkTreeIter iter;
- gchar *word;
-
- word = l->data;
-
- gtk_list_store_append (store, &iter);
- gtk_list_store_set (store, &iter,
- COL_SPELL_WORD, word,
- -1);
- }
-
- empathy_spell_free_suggestions (suggestions);
-}
-
-static void
-spell_dialog_model_row_activated_cb (GtkTreeView *tree_view,
- GtkTreePath *path,
- GtkTreeViewColumn *column,
- EmpathySpellDialog *dialog)
-{
- spell_dialog_response_cb (dialog->window, GTK_RESPONSE_OK, dialog);
-}
-
-static void
-spell_dialog_model_selection_changed_cb (GtkTreeSelection *treeselection,
- EmpathySpellDialog *dialog)
-{
- gint count;
-
- count = gtk_tree_selection_count_selected_rows (treeselection);
- gtk_widget_set_sensitive (dialog->button_replace, (count == 1));
-}
-
-static void
-spell_dialog_model_setup (EmpathySpellDialog *dialog)
-{
- GtkTreeView *view;
- GtkListStore *store;
- GtkTreeSelection *selection;
-
- view = GTK_TREE_VIEW (dialog->treeview_words);
-
- g_signal_connect (view, "row-activated",
- G_CALLBACK (spell_dialog_model_row_activated_cb),
- dialog);
-
- store = gtk_list_store_new (COL_SPELL_COUNT,
- G_TYPE_STRING); /* word */
-
- gtk_tree_view_set_model (view, GTK_TREE_MODEL (store));
-
- selection = gtk_tree_view_get_selection (view);
- gtk_tree_selection_set_mode (selection, GTK_SELECTION_SINGLE);
-
- g_signal_connect (selection, "changed",
- G_CALLBACK (spell_dialog_model_selection_changed_cb),
- dialog);
-
- spell_dialog_model_populate_columns (dialog);
- spell_dialog_model_populate_suggestions (dialog);
-
- g_object_unref (store);
-}
-
-static void
-spell_dialog_destroy_cb (GtkWidget *widget,
- EmpathySpellDialog *dialog)
-{
- g_object_unref (dialog->chat);
- g_free (dialog->word);
-
- g_free (dialog);
-}
-
-static void
-spell_dialog_response_cb (GtkWidget *widget,
- gint response,
- EmpathySpellDialog *dialog)
-{
- if (response == GTK_RESPONSE_OK) {
- GtkTreeView *view;
- GtkTreeModel *model;
- GtkTreeSelection *selection;
- GtkTreeIter iter;
-
- gchar *new_word;
-
- view = GTK_TREE_VIEW (dialog->treeview_words);
- selection = gtk_tree_view_get_selection (view);
-
- if (!gtk_tree_selection_get_selected (selection, &model, &iter)) {
- return;
- }
-
- gtk_tree_model_get (model, &iter, COL_SPELL_WORD, &new_word, -1);
-
- empathy_chat_correct_word (dialog->chat,
- &dialog->start,
- &dialog->end,
- new_word);
-
- g_free (new_word);
- }
-
- gtk_widget_destroy (dialog->window);
-}
-
-void
-empathy_spell_dialog_show (EmpathyChat *chat,
- GtkTextIter *start,
- GtkTextIter *end,
- const gchar *word)
-{
- EmpathySpellDialog *dialog;
- GtkBuilder *gui;
- gchar *str;
- gchar *filename;
-
- g_return_if_fail (chat != NULL);
- g_return_if_fail (word != NULL);
-
- dialog = g_new0 (EmpathySpellDialog, 1);
-
- dialog->chat = g_object_ref (chat);
-
- dialog->word = g_strdup (word);
-
- dialog->start = *start;
- dialog->end = *end;
-
- filename = empathy_file_lookup ("empathy-spell-dialog.ui",
- "libempathy-gtk");
- gui = empathy_builder_get_file (filename,
- "spell_dialog", &dialog->window,
- "button_replace", &dialog->button_replace,
- "label_word", &dialog->label_word,
- "treeview_words", &dialog->treeview_words,
- NULL);
- g_free (filename);
-
- empathy_builder_connect (gui, dialog,
- "spell_dialog", "response", spell_dialog_response_cb,
- "spell_dialog", "destroy", spell_dialog_destroy_cb,
- NULL);
-
- g_object_unref (gui);
-
- str = g_markup_printf_escaped ("%s:\n<b>%s</b>",
- _("Suggestions for the word"),
- word);
-
- gtk_label_set_markup (GTK_LABEL (dialog->label_word), str);
- g_free (str);
-
- spell_dialog_model_setup (dialog);
-
- gtk_widget_show (dialog->window);
-}
diff --git a/libempathy-gtk/empathy-spell-dialog.h b/libempathy-gtk/empathy-spell-dialog.h
deleted file mode 100644
index ce0218812..000000000
--- a/libempathy-gtk/empathy-spell-dialog.h
+++ /dev/null
@@ -1,39 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * Copyright (C) 2004-2007 Imendio AB
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation; either version 2 of the
- * License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public
- * License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- *
- * Authors: Martyn Russell <martyn@imendio.com>
- * Richard Hult <richard@imendio.com>
- */
-
-#ifndef __EMPATHY_SPELL_DIALOG_H__
-#define __EMPATHY_SPELL_DIALOG_H__
-
-#include <gtk/gtktextiter.h>
-#include "empathy-chat.h"
-
-G_BEGIN_DECLS
-
-void empathy_spell_dialog_show (EmpathyChat *chat,
- GtkTextIter *start,
- GtkTextIter *end,
- const gchar *word);
-
-G_END_DECLS
-
-#endif /* __EMPATHY_SPELL_DIALOG_H__ */
diff --git a/libempathy-gtk/empathy-spell-dialog.ui b/libempathy-gtk/empathy-spell-dialog.ui
deleted file mode 100644
index 382346c1a..000000000
--- a/libempathy-gtk/empathy-spell-dialog.ui
+++ /dev/null
@@ -1,131 +0,0 @@
-<?xml version="1.0"?>
-<!--*- mode: xml -*-->
-<interface>
- <object class="GtkDialog" id="spell_dialog">
- <property name="border_width">5</property>
- <property name="title" translatable="yes">Spell Checker</property>
- <property name="modal">True</property>
- <property name="window_position">GTK_WIN_POS_CENTER_ON_PARENT</property>
- <property name="default_width">275</property>
- <property name="default_height">225</property>
- <property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property>
- <property name="has_separator">False</property>
- <child internal-child="vbox">
- <object class="GtkVBox" id="dialog-vbox7">
- <property name="visible">True</property>
- <property name="spacing">2</property>
- <child>
- <object class="GtkVBox" id="vbox128">
- <property name="visible">True</property>
- <property name="border_width">5</property>
- <property name="spacing">6</property>
- <child>
- <object class="GtkLabel" id="label_word">
- <property name="visible">True</property>
- <property name="xalign">0</property>
- <property name="label" translatable="yes">Suggestions for the word:</property>
- <property name="use_markup">True</property>
- <property name="wrap">True</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
- <child>
- <object class="GtkScrolledWindow" id="scrolledwindow9">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
- <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
- <property name="shadow_type">GTK_SHADOW_IN</property>
- <child>
- <object class="GtkTreeView" id="treeview_words">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="headers_visible">False</property>
- </object>
- </child>
- </object>
- <packing>
- <property name="position">1</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="position">1</property>
- </packing>
- </child>
- <child internal-child="action_area">
- <object class="GtkHButtonBox" id="dialog-action_area7">
- <property name="visible">True</property>
- <property name="layout_style">GTK_BUTTONBOX_END</property>
- <child>
- <object class="GtkButton" id="button_cancel">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="can_default">True</property>
- <property name="label">gtk-cancel</property>
- <property name="use_stock">True</property>
- </object>
- </child>
- <child>
- <object class="GtkButton" id="button_replace">
- <property name="visible">True</property>
- <property name="sensitive">False</property>
- <property name="can_focus">True</property>
- <property name="can_default">True</property>
- <child>
- <object class="GtkAlignment" id="alignment6">
- <property name="visible">True</property>
- <property name="xscale">0</property>
- <property name="yscale">0</property>
- <child>
- <object class="GtkHBox" id="hbox135">
- <property name="visible">True</property>
- <property name="spacing">2</property>
- <child>
- <object class="GtkImage" id="image245">
- <property name="visible">True</property>
- <property name="stock">gtk-convert</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
- <child>
- <object class="GtkLabel" id="label594">
- <property name="visible">True</property>
- <property name="label">_Replace</property>
- <property name="use_underline">True</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="position">1</property>
- </packing>
- </child>
- </object>
- </child>
- </object>
- </child>
- </object>
- <packing>
- <property name="position">1</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="pack_type">GTK_PACK_END</property>
- </packing>
- </child>
- </object>
- </child>
- <action-widgets>
- <action-widget response="-6">button_cancel</action-widget>
- <action-widget response="-5">button_replace</action-widget>
- </action-widgets>
- </object>
-</interface>
diff --git a/libempathy-gtk/empathy-spell.c b/libempathy-gtk/empathy-spell.c
index 914c0c78d..9cd7c555b 100644
--- a/libempathy-gtk/empathy-spell.c
+++ b/libempathy-gtk/empathy-spell.c
@@ -14,8 +14,8 @@
*
* You should have received a copy of the GNU General Public
* License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301 USA
*
* Authors: Martyn Russell <martyn@imendio.com>
* Richard Hult <richard@imendio.com>
diff --git a/libempathy-gtk/empathy-spell.h b/libempathy-gtk/empathy-spell.h
index 797997c0a..65dbb131d 100644
--- a/libempathy-gtk/empathy-spell.h
+++ b/libempathy-gtk/empathy-spell.h
@@ -14,8 +14,8 @@
*
* You should have received a copy of the GNU General Public
* License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301 USA
*
* Authors: Martyn Russell <martyn@imendio.com>
* Richard Hult <richard@imendio.com>
diff --git a/libempathy-gtk/empathy-status-preset-dialog.c b/libempathy-gtk/empathy-status-preset-dialog.c
index 734ac356a..7ac13ad38 100644
--- a/libempathy-gtk/empathy-status-preset-dialog.c
+++ b/libempathy-gtk/empathy-status-preset-dialog.c
@@ -19,8 +19,8 @@
*
* You should have received a copy of the GNU General Public
* License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301 USA
*
* Authors: Davyd Madeley <davyd.madeley@collabora.co.uk>
*/
@@ -39,8 +39,6 @@
#include <glib/gi18n-lib.h>
#include <gtk/gtk.h>
-#include <libmissioncontrol/mc-enum-types.h>
-
#include <libempathy/empathy-utils.h>
#include <libempathy/empathy-status-presets.h>
@@ -54,16 +52,16 @@
G_DEFINE_TYPE (EmpathyStatusPresetDialog, empathy_status_preset_dialog, GTK_TYPE_DIALOG);
-static McPresence states[] = {
- MC_PRESENCE_AVAILABLE,
- MC_PRESENCE_DO_NOT_DISTURB,
- MC_PRESENCE_AWAY
+static TpConnectionPresenceType states[] = {
+ TP_CONNECTION_PRESENCE_TYPE_AVAILABLE,
+ TP_CONNECTION_PRESENCE_TYPE_BUSY,
+ TP_CONNECTION_PRESENCE_TYPE_AWAY,
};
typedef struct _EmpathyStatusPresetDialogPriv EmpathyStatusPresetDialogPriv;
struct _EmpathyStatusPresetDialogPriv
{
- /* block status_preset_dialog_add_combo_changed() when > 0 */
+ /* block status_preset_dialog_add_combo_changed () when > 0 */
int block_add_combo_changed;
GtkWidget *presets_treeview;
@@ -153,6 +151,10 @@ static void
status_preset_add_combo_reset (EmpathyStatusPresetDialog *self)
{
EmpathyStatusPresetDialogPriv *priv = GET_PRIV (self);
+ GtkWidget *entry;
+
+ entry = gtk_bin_get_child (GTK_BIN (priv->add_combobox));
+ gtk_entry_set_text (GTK_ENTRY (entry), "");
gtk_combo_box_set_active_iter (GTK_COMBO_BOX (priv->add_combobox),
&priv->selected_iter);
@@ -168,7 +170,7 @@ status_preset_dialog_setup_add_combobox (EmpathyStatusPresetDialog *self)
int i;
store = gtk_list_store_new (ADD_COMBO_N_COLS,
- MC_TYPE_PRESENCE, /* ADD_COMBO_STATE */
+ G_TYPE_UINT, /* ADD_COMBO_STATE */
G_TYPE_STRING, /* ADD_COMBO_ICON_NAME */
G_TYPE_STRING, /* ADD_COMBO_STATUS */
G_TYPE_STRING); /* ADD_COMBO_DEFAULT_TEXT */
@@ -218,7 +220,7 @@ status_preset_dialog_status_edited (GtkCellRendererText *renderer,
GtkTreeModel *model;
GtkTreePath *path;
GtkTreeIter iter;
- McPresence state;
+ TpConnectionPresenceType state;
char *old_status;
gboolean valid;
@@ -265,7 +267,7 @@ status_preset_dialog_setup_presets_treeview (EmpathyStatusPresetDialog *self)
GtkCellRenderer *renderer;
store = gtk_list_store_new (PRESETS_STORE_N_COLS,
- MC_TYPE_PRESENCE, /* PRESETS_STORE_STATE */
+ G_TYPE_UINT, /* PRESETS_STORE_STATE */
G_TYPE_STRING, /* PRESETS_STORE_ICON_NAME */
G_TYPE_STRING); /* PRESETS_STORE_STATUS */
@@ -311,7 +313,7 @@ status_preset_dialog_preset_remove (GtkButton *button,
GtkTreeSelection *selection;
GtkTreeModel *model;
GtkTreeIter iter;
- McPresence state;
+ TpConnectionPresenceType state;
char *status;
selection = gtk_tree_view_get_selection (
@@ -412,9 +414,12 @@ status_preset_dialog_add_preset (GtkWidget *widget,
{
EmpathyStatusPresetDialogPriv *priv = GET_PRIV (self);
GtkTreeModel *model;
+ GtkTreeIter iter;
GtkWidget *entry;
- McPresence state;
+ TpConnectionPresenceType state, cstate;
const char *status;
+ char *cstatus;
+ gboolean valid, match = FALSE;
g_return_if_fail (priv->add_combo_changed);
@@ -430,6 +435,40 @@ status_preset_dialog_add_preset (GtkWidget *widget,
empathy_status_presets_set_last (state, status);
status_preset_dialog_presets_update (self);
+
+ /* select the added status*/
+ model = gtk_tree_view_get_model (GTK_TREE_VIEW (priv->presets_treeview));
+ for (valid = gtk_tree_model_get_iter_first (model, &iter);
+ valid;
+ valid = gtk_tree_model_iter_next (model, &iter)) {
+
+ gtk_tree_model_get (model, &iter,
+ PRESETS_STORE_STATE, &cstate,
+ PRESETS_STORE_STATUS, &cstatus,
+ -1);
+
+ match = (cstate == state) && (strcmp (cstatus, status) == 0);
+
+ g_free (cstatus);
+
+ if (match) {
+ GtkTreePath *path;
+
+ path = gtk_tree_model_get_path (model, &iter);
+
+ gtk_tree_selection_select_iter (
+ gtk_tree_view_get_selection (GTK_TREE_VIEW (priv->presets_treeview)),
+ &iter);
+ gtk_tree_view_scroll_to_cell (
+ GTK_TREE_VIEW (priv->presets_treeview),
+ path, NULL,
+ FALSE, 0., 0.);
+ break;
+ }
+ }
+
+ if (!match) g_warning ("No match");
+
status_preset_add_combo_reset (self);
}
@@ -520,7 +559,7 @@ empathy_status_preset_dialog_init (EmpathyStatusPresetDialog *self)
status_preset_dialog_setup_presets_treeview (self);
status_preset_dialog_setup_add_combobox (self);
- gtk_box_pack_start(GTK_BOX (GTK_DIALOG (self)->vbox), toplevel_vbox,
+ gtk_box_pack_start (GTK_BOX (GTK_DIALOG (self)->vbox), toplevel_vbox,
TRUE, TRUE, 0);
g_object_unref (gui);
diff --git a/libempathy-gtk/empathy-status-preset-dialog.h b/libempathy-gtk/empathy-status-preset-dialog.h
index e53c3d8ad..2c507ce37 100644
--- a/libempathy-gtk/empathy-status-preset-dialog.h
+++ b/libempathy-gtk/empathy-status-preset-dialog.h
@@ -19,8 +19,8 @@
*
* You should have received a copy of the GNU General Public
* License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301 USA
*
* Authors: Davyd Madeley <davyd.madeley@collabora.co.uk>
*/
diff --git a/libempathy-gtk/empathy-theme-boxes.c b/libempathy-gtk/empathy-theme-boxes.c
index 5b435f1d5..199132956 100644
--- a/libempathy-gtk/empathy-theme-boxes.c
+++ b/libempathy-gtk/empathy-theme-boxes.c
@@ -15,8 +15,8 @@
*
* You should have received a copy of the GNU General Public
* License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301 USA
*
* Authors: Xavier Claessens <xclaesse@gmail.com>
*/
@@ -259,7 +259,7 @@ theme_boxes_maybe_append_header (EmpathyThemeBoxes *theme,
/* Add the message receive time */
time = empathy_message_get_timestamp (msg);
- tmp = empathy_time_to_string_local (time,
+ tmp = empathy_time_to_string_local (time,
EMPATHY_TIME_FORMAT_DISPLAY_SHORT);
str = g_strdup_printf ("<i>%s</i>", tmp);
label2 = g_object_new (GTK_TYPE_LABEL,
@@ -330,7 +330,7 @@ theme_boxes_append_message (EmpathyChatTextView *view,
TP_CHANNEL_TEXT_MESSAGE_TYPE_ACTION) {
gchar *body;
- body = g_strdup_printf (" * %s %s",
+ body = g_strdup_printf (" * %s %s",
empathy_contact_get_name (sender),
empathy_message_get_body (message));
empathy_chat_text_view_append_body (EMPATHY_CHAT_TEXT_VIEW (view),
diff --git a/libempathy-gtk/empathy-theme-boxes.h b/libempathy-gtk/empathy-theme-boxes.h
index fed7ceea0..53dd350ad 100644
--- a/libempathy-gtk/empathy-theme-boxes.h
+++ b/libempathy-gtk/empathy-theme-boxes.h
@@ -15,8 +15,8 @@
*
* You should have received a copy of the GNU General Public
* License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301 USA
*
* Authors: Xavier Claessens <xclaesse@gmail.com>
*/
diff --git a/libempathy-gtk/empathy-theme-irc.c b/libempathy-gtk/empathy-theme-irc.c
index 479108ce3..183a5cc51 100644
--- a/libempathy-gtk/empathy-theme-irc.c
+++ b/libempathy-gtk/empathy-theme-irc.c
@@ -15,8 +15,8 @@
*
* You should have received a copy of the GNU General Public
* License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301 USA
*
* Authors: Xavier Claessens <xclaesse@gmail.com>
*/
@@ -65,7 +65,7 @@ theme_irc_append_message (EmpathyChatTextView *view,
name = empathy_contact_get_name (contact);
if (empathy_message_get_tptype (message) == TP_CHANNEL_TEXT_MESSAGE_TYPE_ACTION) {
- tmp = g_strdup_printf (" * %s %s",
+ tmp = g_strdup_printf (" * %s %s",
empathy_contact_get_name (contact),
empathy_message_get_body (message));
empathy_chat_text_view_append_body (view, tmp,
diff --git a/libempathy-gtk/empathy-theme-irc.h b/libempathy-gtk/empathy-theme-irc.h
index 58d82ac0e..30bee6271 100644
--- a/libempathy-gtk/empathy-theme-irc.h
+++ b/libempathy-gtk/empathy-theme-irc.h
@@ -15,8 +15,8 @@
*
* You should have received a copy of the GNU General Public
* License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301 USA
*
* Authors: Xavier Claessens <xclaesse@gmail.com>
*/
diff --git a/libempathy-gtk/empathy-theme-manager.c b/libempathy-gtk/empathy-theme-manager.c
index 841e26297..0186b5eb7 100644
--- a/libempathy-gtk/empathy-theme-manager.c
+++ b/libempathy-gtk/empathy-theme-manager.c
@@ -15,8 +15,8 @@
*
* You should have received a copy of the GNU General Public
* License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301 USA
*
* Authors: Xavier Claessens <xclaesse@gmail.com>
*/
@@ -69,8 +69,8 @@ G_DEFINE_TYPE (EmpathyThemeManager, empathy_theme_manager, G_TYPE_OBJECT);
static void
theme_manager_gdk_color_to_hex (GdkColor *gdk_color, gchar *str_color)
{
- g_snprintf (str_color, 10,
- "#%02x%02x%02x",
+ g_snprintf (str_color, 10,
+ "#%02x%02x%02x",
gdk_color->red >> 8,
gdk_color->green >> 8,
gdk_color->blue >> 8);
diff --git a/libempathy-gtk/empathy-theme-manager.h b/libempathy-gtk/empathy-theme-manager.h
index 05661d306..99c96d784 100644
--- a/libempathy-gtk/empathy-theme-manager.h
+++ b/libempathy-gtk/empathy-theme-manager.h
@@ -15,8 +15,8 @@
*
* You should have received a copy of the GNU General Public
* License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301 USA
*
* Authors: Xavier Claessens <xclaesse@gmail.com>
*/
diff --git a/libempathy-gtk/empathy-ui-utils.c b/libempathy-gtk/empathy-ui-utils.c
index 9a249e65b..f30c58aad 100644
--- a/libempathy-gtk/empathy-ui-utils.c
+++ b/libempathy-gtk/empathy-ui-utils.c
@@ -15,15 +15,15 @@
*
* You should have received a copy of the GNU General Public
* License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- *
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301 USA
+ *
* Authors: Mikael Hallendal <micke@imendio.com>
* Richard Hult <richard@imendio.com>
* Martyn Russell <martyn@imendio.com>
* Xavier Claessens <xclaesse@gmail.com>
* Jonny Lamb <jonny.lamb@collabora.co.uk>
- *
+ *
* Part of this file is copied from GtkSourceView (gtksourceiter.c):
* Paolo Maggi
* Jeroen Zwartepoorte
@@ -50,7 +50,7 @@
#include <libempathy/empathy-utils.h>
#include <libempathy/empathy-dispatcher.h>
#include <libempathy/empathy-idle.h>
-#include <libempathy/empathy-tp-file.h>
+#include <libempathy/empathy-ft-factory.h>
#define SCHEMES "(https?|s?ftps?|nntp|news|javascript|about|ghelp|apt|telnet|"\
"file|webcal|mailto)"
@@ -194,24 +194,25 @@ empathy_icon_name_from_account (McAccount *account)
}
const gchar *
-empathy_icon_name_for_presence (McPresence presence)
+empathy_icon_name_for_presence (TpConnectionPresenceType presence)
{
switch (presence) {
- case MC_PRESENCE_AVAILABLE:
+ case TP_CONNECTION_PRESENCE_TYPE_AVAILABLE:
return EMPATHY_IMAGE_AVAILABLE;
- case MC_PRESENCE_DO_NOT_DISTURB:
+ case TP_CONNECTION_PRESENCE_TYPE_BUSY:
return EMPATHY_IMAGE_BUSY;
- case MC_PRESENCE_AWAY:
+ case TP_CONNECTION_PRESENCE_TYPE_AWAY:
return EMPATHY_IMAGE_AWAY;
- case MC_PRESENCE_EXTENDED_AWAY:
+ case TP_CONNECTION_PRESENCE_TYPE_EXTENDED_AWAY:
return EMPATHY_IMAGE_EXT_AWAY;
- case MC_PRESENCE_HIDDEN:
+ case TP_CONNECTION_PRESENCE_TYPE_HIDDEN:
return EMPATHY_IMAGE_HIDDEN;
- case MC_PRESENCE_OFFLINE:
- case MC_PRESENCE_UNSET:
+ case TP_CONNECTION_PRESENCE_TYPE_OFFLINE:
+ case TP_CONNECTION_PRESENCE_TYPE_ERROR:
+ case TP_CONNECTION_PRESENCE_TYPE_UNKNOWN:
return EMPATHY_IMAGE_OFFLINE;
- default:
- g_assert_not_reached ();
+ case TP_CONNECTION_PRESENCE_TYPE_UNSET:
+ return NULL;
}
return NULL;
@@ -220,7 +221,7 @@ empathy_icon_name_for_presence (McPresence presence)
const gchar *
empathy_icon_name_for_contact (EmpathyContact *contact)
{
- McPresence presence;
+ TpConnectionPresenceType presence;
g_return_val_if_fail (EMPATHY_IS_CONTACT (contact),
EMPATHY_IMAGE_OFFLINE);
@@ -609,7 +610,7 @@ g_utf8_strcasestr (const gchar *haystack, const gchar *needle)
if (needle_len == 0)
{
- ret = (gchar *)haystack;
+ ret = (gchar *) haystack;
goto finally_1;
}
@@ -619,7 +620,7 @@ g_utf8_strcasestr (const gchar *haystack, const gchar *needle)
goto finally_1;
}
- p = (gchar*)caseless_haystack;
+ p = (gchar *) caseless_haystack;
needle_len = strlen (needle);
i = 0;
@@ -715,7 +716,7 @@ forward_chars_with_skipping (GtkTextIter *iter,
/* being UTF8 correct sucks; this accounts for extra
offsets coming from canonical decompositions of
UTF8 characters (e.g. accented characters) which
- g_utf8_normalize() performs */
+ g_utf8_normalize () performs */
gchar *normal;
gchar buffer[6];
gint buffer_len;
@@ -968,7 +969,7 @@ empathy_text_iter_forward_search (const GtkTextIter *iter,
}
} while (gtk_text_iter_forward_line (&search));
- g_strfreev ((gchar**)lines);
+ g_strfreev ((gchar **) lines);
return retval;
}
@@ -996,7 +997,7 @@ g_utf8_strrcasestr (const gchar *haystack, const gchar *needle)
if (needle_len == 0)
{
- ret = (gchar *)haystack;
+ ret = (gchar *) haystack;
goto finally_1;
}
@@ -1214,7 +1215,7 @@ empathy_text_iter_backward_search (const GtkTextIter *iter,
}
}
- g_strfreev ((gchar**)lines);
+ g_strfreev ((gchar **) lines);
return retval;
}
@@ -1240,7 +1241,7 @@ empathy_window_get_is_visible (GtkWindow *window)
return TRUE;
}
-void
+void
empathy_window_iconify (GtkWindow *window, GtkStatusIcon *status_icon)
{
GdkRectangle icon_location;
@@ -1350,7 +1351,7 @@ empathy_url_show (GtkWidget *parent,
GtkWidget *dialog;
dialog = gtk_message_dialog_new (NULL, 0,
- GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE,
+ GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE,
_("Unable to open URI"));
gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog),
"%s", error->message);
@@ -1401,86 +1402,31 @@ empathy_toggle_button_set_state_quietly (GtkWidget *widget,
g_signal_handlers_unblock_by_func (widget, callback, user_data);
}
-/* Sending files with the file chooser */
-
-static void
-file_manager_send_file_request_cb (EmpathyDispatchOperation *operation,
- const GError *error, gpointer user_data)
-{
- GFile *file = (GFile *)user_data;
- EmpathyTpFile *tp_file;
-
- if (error != NULL) {
- DEBUG ("Couldn't request channel: %s", error->message);
- g_object_unref (file);
- return;
- }
-
- DEBUG ("Starting to send file");
-
- tp_file = EMPATHY_TP_FILE (
- empathy_dispatch_operation_get_channel_wrapper (operation));
-
- empathy_tp_file_offer (tp_file, file, NULL);
-
- g_object_unref (file);
-}
-
static void
file_manager_send_file_response_cb (GtkDialog *widget,
gint response_id,
EmpathyContact *contact)
{
- if (response_id == GTK_RESPONSE_OK) {
- GSList *list;
- GSList *l;
-
- list = gtk_file_chooser_get_uris (GTK_FILE_CHOOSER (widget));
-
- DEBUG ("File chooser selected files:");
-
- for (l = list; l; l = l->next) {
- gchar *uri;
- GFile *gfile;
- GFileInfo *info;
- GtkRecentManager *manager;
- gchar *filename;
- GTimeVal mtime;
- GError *error = NULL;
-
- uri = l->data;
- gfile = g_file_new_for_uri (uri);
- info = g_file_query_info (gfile,
- G_FILE_ATTRIBUTE_STANDARD_SIZE ","
- G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE ","
- G_FILE_ATTRIBUTE_TIME_MODIFIED,
- 0, NULL, &error);
-
- if (error) {
- DEBUG ("Can't get info about the file: %s", error->message);
- g_clear_error (&error);
- g_object_unref (gfile);
- continue;
- }
+ EmpathyFTFactory *factory;
+ GFile *file;
+ gchar *uri;
+ GtkRecentManager *manager;
- DEBUG ("\t%s", uri);
- filename = g_file_get_basename (gfile);
- g_file_info_get_modification_time (info, &mtime);
+ if (response_id == GTK_RESPONSE_OK) {
+ file = gtk_file_chooser_get_file (GTK_FILE_CHOOSER (widget));
+ uri = g_file_get_uri (file);
- empathy_dispatcher_send_file_to_contact (contact,
- filename, g_file_info_get_size (info), mtime.tv_sec,
- g_file_info_get_content_type (info),
- file_manager_send_file_request_cb, gfile);
+ factory = empathy_ft_factory_dup_singleton ();
- g_free (filename);
- g_object_unref (info);
+ empathy_ft_factory_new_transfer_outgoing (factory, contact,
+ file);
- manager = gtk_recent_manager_get_default ();
- gtk_recent_manager_add_item (manager, uri);
+ manager = gtk_recent_manager_get_default ();
+ gtk_recent_manager_add_item (manager, uri);
- g_free (uri);
- }
- g_slist_free (list);
+ g_free (uri);
+ g_object_unref (factory);
+ g_object_unref (file);
}
gtk_widget_destroy (GTK_WIDGET (widget));
@@ -1522,6 +1468,57 @@ empathy_send_file_with_file_chooser (EmpathyContact *contact)
gtk_widget_show (widget);
}
+static void
+file_manager_receive_file_response_cb (GtkDialog *dialog,
+ GtkResponseType response,
+ EmpathyFTHandler *handler)
+{
+ EmpathyFTFactory *factory;
+ GFile *file;
+
+ if (response == GTK_RESPONSE_OK) {
+ factory = empathy_ft_factory_dup_singleton ();
+ file = gtk_file_chooser_get_file (GTK_FILE_CHOOSER (dialog));
+
+ empathy_ft_factory_set_destination_for_incoming_handler
+ (factory, handler, file);
+
+ g_object_unref (factory);
+ g_object_unref (file);
+ } else {
+ /* unref the handler, as we dismissed the file chooser,
+ * and refused the transfer.
+ */
+ g_object_unref (handler);
+ }
+
+ gtk_widget_destroy (GTK_WIDGET (dialog));
+}
+
+void
+empathy_receive_file_with_file_chooser (EmpathyFTHandler *handler)
+{
+ GtkWidget *widget;
+
+ widget = gtk_file_chooser_dialog_new (_("Select a destination"),
+ NULL,
+ GTK_FILE_CHOOSER_ACTION_SAVE,
+ GTK_STOCK_CANCEL,
+ GTK_RESPONSE_CANCEL,
+ GTK_STOCK_SAVE,
+ GTK_RESPONSE_OK,
+ NULL);
+ gtk_file_chooser_set_current_name (GTK_FILE_CHOOSER (widget),
+ empathy_ft_handler_get_filename (handler));
+ gtk_file_chooser_set_do_overwrite_confirmation
+ (GTK_FILE_CHOOSER (widget), TRUE);
+
+ g_signal_connect (widget, "response",
+ G_CALLBACK (file_manager_receive_file_response_cb), handler);
+
+ gtk_widget_show (widget);
+}
+
typedef struct {
EmpathySound sound_id;
const char * event_ca_id;
@@ -1624,7 +1621,7 @@ empathy_sound_play_full (GtkWidget *widget, EmpathySound sound_id,
entry->event_ca_id,
entry->event_ca_description);
- if (ca_proplist_create(&p) < 0)
+ if (ca_proplist_create (&p) < 0)
goto failed;
if (ca_proplist_sets (p, CA_PROP_EVENT_ID, entry->event_ca_id) < 0)
diff --git a/libempathy-gtk/empathy-ui-utils.h b/libempathy-gtk/empathy-ui-utils.h
index 8dcc4c037..4d58fedcf 100644
--- a/libempathy-gtk/empathy-ui-utils.h
+++ b/libempathy-gtk/empathy-ui-utils.h
@@ -15,15 +15,15 @@
*
* You should have received a copy of the GNU General Public
* License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- *
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301 USA
+ *
* Authors: Mikael Hallendal <micke@imendio.com>
* Richard Hult <richard@imendio.com>
* Martyn Russell <martyn@imendio.com>
* Xavier Claessens <xclaesse@gmail.com>
* Jonny Lamb <jonny.lamb@collabora.co.uk>
- *
+ *
* Part of this file is copied from GtkSourceView (gtksourceiter.c):
* Paolo Maggi
* Jeroen Zwartepoorte
@@ -39,8 +39,8 @@
#include <libmissioncontrol/mc-account.h>
#include <libmissioncontrol/mc-profile.h>
-
#include <libempathy/empathy-contact.h>
+#include <libempathy/empathy-ft-handler.h>
#include "empathy-chat-view.h"
@@ -77,7 +77,7 @@ GtkWidget *empathy_builder_unref_and_keep_widget (GtkBuilder *gui,
/* Pixbufs */
const gchar * empathy_icon_name_from_account (McAccount *account);
-const gchar * empathy_icon_name_for_presence (McPresence presence);
+const gchar * empathy_icon_name_for_presence (TpConnectionPresenceType presence);
const gchar * empathy_icon_name_for_contact (EmpathyContact *contact);
GdkPixbuf * empathy_pixbuf_from_data (gchar *data,
gsize data_size);
@@ -124,6 +124,7 @@ GtkWidget * empathy_link_button_new (const gchar *url,
const gchar *title);
void empathy_send_file_with_file_chooser (EmpathyContact *contact);
+void empathy_receive_file_with_file_chooser (EmpathyFTHandler *handler);
/* Sounds */
void empathy_sound_play (GtkWidget *widget,
diff --git a/libempathy-gtk/empathy-video-src.c b/libempathy-gtk/empathy-video-src.c
index d2d03026b..bd014a5d9 100644
--- a/libempathy-gtk/empathy-video-src.c
+++ b/libempathy-gtk/empathy-video-src.c
@@ -159,7 +159,7 @@ empathy_video_src_set_channel (GstElement *src,
channels = gst_color_balance_list_channels (balance);
- for (l = (GList *)channels; l != NULL; l = g_list_next (l))
+ for (l = (GList *) channels; l != NULL; l = g_list_next (l))
{
GstColorBalanceChannel *c = GST_COLOR_BALANCE_CHANNEL (l->data);
@@ -195,7 +195,7 @@ empathy_video_src_get_channel (GstElement *src,
channels = gst_color_balance_list_channels (balance);
- for (l = (GList *)channels; l != NULL; l = g_list_next (l))
+ for (l = (GList *) channels; l != NULL; l = g_list_next (l))
{
GstColorBalanceChannel *c = GST_COLOR_BALANCE_CHANNEL (l->data);
@@ -235,7 +235,7 @@ empathy_video_src_get_supported_channels (GstElement *src)
channels = gst_color_balance_list_channels (balance);
- for (l = (GList *)channels; l != NULL; l = g_list_next (l))
+ for (l = (GList *) channels; l != NULL; l = g_list_next (l))
{
GstColorBalanceChannel *channel = GST_COLOR_BALANCE_CHANNEL (l->data);
int i;
diff --git a/libempathy-gtk/empathy-video-src.h b/libempathy-gtk/empathy-video-src.h
index fef0b84dd..4197d7fad 100644
--- a/libempathy-gtk/empathy-video-src.h
+++ b/libempathy-gtk/empathy-video-src.h
@@ -55,7 +55,7 @@ GType empathy_video_src_get_type (void);
/* TYPE MACROS */
#define EMPATHY_TYPE_GST_VIDEO_SRC \
- (empathy_video_src_get_type())
+ (empathy_video_src_get_type ())
#define EMPATHY_GST_VIDEO_SRC(obj) \
(G_TYPE_CHECK_INSTANCE_CAST((obj), EMPATHY_TYPE_GST_VIDEO_SRC, \
EmpathyGstVideoSrc))
diff --git a/libempathy-gtk/empathy-video-widget.c b/libempathy-gtk/empathy-video-widget.c
index 4c7bee9db..7647b845f 100644
--- a/libempathy-gtk/empathy-video-widget.c
+++ b/libempathy-gtk/empathy-video-widget.c
@@ -263,14 +263,14 @@ empathy_video_widget_class_init (
param_spec = g_param_spec_int ("min-width",
"min-width",
"Minimal width of the widget",
- 0, G_MAXINT, 320,
+ 0, G_MAXINT, EMPATHY_VIDEO_WIDGET_DEFAULT_WIDTH,
G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
g_object_class_install_property (object_class, PROP_MIN_WIDTH, param_spec);
param_spec = g_param_spec_int ("min-height",
"min-height",
"Minimal height of the widget",
- 0, G_MAXINT, 240,
+ 0, G_MAXINT, EMPATHY_VIDEO_WIDGET_DEFAULT_HEIGHT,
G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
g_object_class_install_property (object_class, PROP_MIN_HEIGHT, param_spec);
diff --git a/libempathy-gtk/empathy-video-widget.h b/libempathy-gtk/empathy-video-widget.h
index 08acdaa71..cfdd0354c 100644
--- a/libempathy-gtk/empathy-video-widget.h
+++ b/libempathy-gtk/empathy-video-widget.h
@@ -21,6 +21,9 @@
#ifndef __EMPATHY_VIDEO_WIDGET_H__
#define __EMPATHY_VIDEO_WIDGET_H__
+#define EMPATHY_VIDEO_WIDGET_DEFAULT_WIDTH 320
+#define EMPATHY_VIDEO_WIDGET_DEFAULT_HEIGHT 240
+
#include <glib-object.h>
#include <gst/gst.h>
#include <gtk/gtk.h>
@@ -42,7 +45,7 @@ GType empathy_video_widget_get_type (void);
/* TYPE MACROS */
#define EMPATHY_TYPE_VIDEO_WIDGET \
- (empathy_video_widget_get_type())
+ (empathy_video_widget_get_type ())
#define EMPATHY_VIDEO_WIDGET(obj) \
(G_TYPE_CHECK_INSTANCE_CAST((obj), EMPATHY_TYPE_VIDEO_WIDGET, \
EmpathyVideoWidget))
diff --git a/libempathy/Makefile.am b/libempathy/Makefile.am
index ba1f6f8c7..c9f2c4206 100644
--- a/libempathy/Makefile.am
+++ b/libempathy/Makefile.am
@@ -1,3 +1,5 @@
+include $(top_srcdir)/tools/shave.mk
+
AM_CPPFLAGS = \
-I. \
-I$(top_srcdir) \
@@ -5,6 +7,7 @@ AM_CPPFLAGS = \
-DDATADIR=\""$(datadir)"\" \
-DLOCALEDIR=\""$(datadir)/locale"\" \
$(LIBEMPATHY_CFLAGS) \
+ $(GEOCLUE_CFLAGS) \
$(WARN_CFLAGS) \
$(DISABLE_DEPRECATED)
@@ -31,6 +34,8 @@ libempathy_la_SOURCES = \
empathy-debug.c \
empathy-dispatcher.c \
empathy-dispatch-operation.c \
+ empathy-ft-factory.c \
+ empathy-ft-handler.c \
empathy-idle.c \
empathy-irc-network.c \
empathy-irc-network-manager.c \
@@ -57,7 +62,8 @@ nodist_libempathy_la_SOURCES =\
libempathy_la_LIBADD = \
$(top_builddir)/extensions/libemp-extensions.la \
- $(LIBEMPATHY_LIBS)
+ $(LIBEMPATHY_LIBS) \
+ $(GEOCLUE_LIBS)
libempathy_la_LDFLAGS = \
-version-info ${LIBEMPATHY_CURRENT}:${LIBEMPATHY_REVISION}:${LIBEMPATHY_AGE} \
@@ -77,10 +83,13 @@ libempathy_headers = \
empathy-debug.h \
empathy-dispatcher.h \
empathy-dispatch-operation.h \
+ empathy-ft-factory.h \
+ empathy-ft-handler.h \
empathy-idle.h \
empathy-irc-network.h \
empathy-irc-network-manager.h \
empathy-irc-server.h \
+ empathy-location.h \
empathy-log-manager.h \
empathy-log-store.h \
empathy-log-store-empathy.h \
@@ -98,13 +107,19 @@ libempathy_headers = \
empathy-types.h \
empathy-utils.h
+check_c_sources = \
+ $(libempathy_la_SOURCES) \
+ $(libempathy_headers)
+include $(top_srcdir)/tools/check-coding-style.mk
+check-local: check-coding-style
+
libempathy_includedir = $(includedir)/libempathy/
libempathy_include_HEADERS = \
$(libempathy_headers) \
empathy-enum-types.h
empathy-marshal.list: $(libempathy_la_SOURCES) Makefile.am
- ( cd $(srcdir) && \
+ $(QUIET_GEN)( cd $(srcdir) && \
sed -n -e 's/.*empathy_marshal_\([[:upper:][:digit:]]*__[[:upper:][:digit:]_]*\).*/\1/p' \
$(libempathy_la_SOURCES) ) \
| sed -e 's/__/:/' -e 'y/_/,/' | sort -u > $@.tmp
@@ -115,16 +130,16 @@ empathy-marshal.list: $(libempathy_la_SOURCES) Makefile.am
fi
%-marshal.h: %-marshal.list Makefile
- $(GLIB_GENMARSHAL) --header --prefix=_$(subst -,_,$*)_marshal $< > $*-marshal.h
+ $(QUIET_GEN)$(GLIB_GENMARSHAL) --header --prefix=_$(subst -,_,$*)_marshal $< > $*-marshal.h
%-marshal.c: %-marshal.list Makefile
- echo "#include \"empathy-marshal.h\"" > $@ && \
+ $(QUIET_GEN)echo "#include \"empathy-marshal.h\"" > $@ && \
$(GLIB_GENMARSHAL) --body --prefix=_$(subst -,_,$*)_marshal $< >> $*-marshal.c
empathy-enum-types.h: stamp-empathy-enum-types.h
- @true
+ $(QUIET_GEN)true
stamp-empathy-enum-types.h: $(libempathy_headers) Makefile
- (cd $(srcdir) \
+ $(QUIET_GEN)(cd $(srcdir) \
&& glib-mkenums \
--fhead "#ifndef __LIBEMPATHY_ENUM_TYPES_H__\n" \
--fhead "#define __LIBEMPATHY_ENUM_TYPES_H__ 1\n\n" \
@@ -141,7 +156,7 @@ stamp-empathy-enum-types.h: $(libempathy_headers) Makefile
&& echo timestamp > $(@F)
empathy-enum-types.c: $(libempathy_headers) Makefile
- (cd $(srcdir) \
+ $(QUIET_GEN)(cd $(srcdir) \
&& glib-mkenums \
--fhead "#include <config.h>\n" \
--fhead "#include <glib-object.h>\n" \
diff --git a/libempathy/empathy-account-manager.c b/libempathy/empathy-account-manager.c
index b84543176..dd0a72f59 100644
--- a/libempathy/empathy-account-manager.c
+++ b/libempathy/empathy-account-manager.c
@@ -14,7 +14,7 @@
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- *
+ *
* Authors: Cosimo Cecchi <cosimo.cecchi@collabora.co.uk>
*/
@@ -44,7 +44,7 @@ typedef struct {
typedef struct {
TpConnection *connection;
- McPresence presence;
+ TpConnectionPresenceType presence;
TpConnectionStatus status;
gboolean is_enabled;
@@ -424,10 +424,35 @@ account_status_changed_cb (MissionControl *mc,
EmpathyAccountManager *manager)
{
ChangedSignalData *data;
+ TpConnectionPresenceType tp_presence;
+
+ switch (presence)
+ {
+ case MC_PRESENCE_OFFLINE:
+ tp_presence = TP_CONNECTION_PRESENCE_TYPE_OFFLINE;
+ break;
+ case MC_PRESENCE_AVAILABLE:
+ tp_presence = TP_CONNECTION_PRESENCE_TYPE_AVAILABLE;
+ break;
+ case MC_PRESENCE_AWAY:
+ tp_presence = TP_CONNECTION_PRESENCE_TYPE_AWAY;
+ break;
+ case MC_PRESENCE_EXTENDED_AWAY:
+ tp_presence = TP_CONNECTION_PRESENCE_TYPE_EXTENDED_AWAY;
+ break;
+ case MC_PRESENCE_HIDDEN:
+ tp_presence = TP_CONNECTION_PRESENCE_TYPE_HIDDEN;
+ break;
+ case MC_PRESENCE_DO_NOT_DISTURB:
+ tp_presence = TP_CONNECTION_PRESENCE_TYPE_BUSY;
+ break;
+ default:
+ tp_presence = TP_CONNECTION_PRESENCE_TYPE_UNSET;
+ }
data = g_slice_new0 (ChangedSignalData);
data->status = status;
- data->presence = presence;
+ data->presence = tp_presence;
data->reason = reason;
data->unique_name = g_strdup (unique_name);
data->manager = g_object_ref (manager);
@@ -451,7 +476,7 @@ empathy_account_manager_init (EmpathyAccountManager *manager)
priv->accounts = g_hash_table_new_full (empathy_account_hash,
empathy_account_equal,
- g_object_unref,
+ g_object_unref,
(GDestroyNotify) account_data_free);
priv->connections = g_hash_table_new_full (g_direct_hash, g_direct_equal,
g_object_unref, g_object_unref);
@@ -531,7 +556,7 @@ do_dispose (GObject *obj)
G_OBJECT_CLASS (empathy_account_manager_parent_class)->dispose (obj);
}
-static GObject*
+static GObject *
do_constructor (GType type,
guint n_construct_params,
GObjectConstructParam *construct_params)
@@ -647,7 +672,7 @@ empathy_account_manager_class_init (EmpathyAccountManagerClass *klass)
g_cclosure_marshal_VOID__OBJECT,
G_TYPE_NONE,
1, TP_TYPE_CONNECTION);
-
+
g_type_class_add_private (oclass, sizeof (EmpathyAccountManagerPriv));
}
@@ -800,7 +825,7 @@ empathy_account_manager_dup_connections (EmpathyAccountManager *manager)
priv = GET_PRIV (manager);
g_hash_table_iter_init (&iter, priv->connections);
- while (g_hash_table_iter_next (&iter, &connection, NULL))
+ while (g_hash_table_iter_next (&iter, &connection, NULL))
if (connection != NULL && tp_connection_is_ready (connection))
ret = g_list_prepend (ret, g_object_ref (connection));
diff --git a/libempathy/empathy-account-manager.h b/libempathy/empathy-account-manager.h
index ac90a34f7..11ca6aca2 100644
--- a/libempathy/empathy-account-manager.h
+++ b/libempathy/empathy-account-manager.h
@@ -52,7 +52,7 @@ GType empathy_account_manager_get_type (void);
/* public methods */
EmpathyAccountManager * empathy_account_manager_dup_singleton (void);
-int empathy_account_manager_get_connected_accounts
+int empathy_account_manager_get_connected_accounts
(EmpathyAccountManager *manager);
int empathy_account_manager_get_connecting_accounts
(EmpathyAccountManager *manager);
diff --git a/libempathy/empathy-call-factory.c b/libempathy/empathy-call-factory.c
index f412139be..d02b58327 100644
--- a/libempathy/empathy-call-factory.c
+++ b/libempathy/empathy-call-factory.c
@@ -104,7 +104,7 @@ empathy_call_factory_class_init (
object_class->constructor = empathy_call_factory_constructor;
object_class->dispose = empathy_call_factory_dispose;
- object_class->finalize = empathy_call_factory_finalize;
+ object_class->finalize = empathy_call_factory_finalize;
signals[NEW_CALL_HANDLER] =
g_signal_new ("new-call-handler",
@@ -132,16 +132,28 @@ empathy_call_factory_get (void)
return EMPATHY_CALL_FACTORY (call_factory);
}
+/**
+ * empathy_call_factory_new_call_with_streams:
+ * @factory: an #EmpathyCallFactory
+ * @contact: an #EmpathyContact
+ * @initial_audio: if %TRUE the call will be started with audio
+ * @initial_video: if %TRUE the call will be started with video
+ *
+ * Initiate a new call with @contact.
+ */
void
-empathy_call_factory_new_call (EmpathyCallFactory *factory,
- EmpathyContact *contact)
+empathy_call_factory_new_call_with_streams (EmpathyCallFactory *factory,
+ EmpathyContact *contact,
+ gboolean initial_audio,
+ gboolean initial_video)
{
EmpathyCallHandler *handler;
g_return_if_fail (factory != NULL);
g_return_if_fail (contact != NULL);
- handler = empathy_call_handler_new_for_contact (contact);
+ handler = empathy_call_handler_new_for_contact_with_streams (contact,
+ initial_audio, initial_video);
g_signal_emit (factory, signals[NEW_CALL_HANDLER], 0,
handler, TRUE);
@@ -149,6 +161,21 @@ empathy_call_factory_new_call (EmpathyCallFactory *factory,
g_object_unref (handler);
}
+
+/**
+ * empathy_call_factory_new_call:
+ * @factory: an #EmpathyCallFactory
+ * @contact: an #EmpathyContact
+ *
+ * Initiate a new call with @contact.
+ */
+void
+empathy_call_factory_new_call (EmpathyCallFactory *factory,
+ EmpathyContact *contact)
+{
+ empathy_call_factory_new_call_with_streams (factory, contact, TRUE, FALSE);
+}
+
void
empathy_call_factory_claim_channel (EmpathyCallFactory *factory,
EmpathyDispatchOperation *operation)
diff --git a/libempathy/empathy-call-factory.h b/libempathy/empathy-call-factory.h
index 13b16b692..27b205973 100644
--- a/libempathy/empathy-call-factory.h
+++ b/libempathy/empathy-call-factory.h
@@ -44,7 +44,7 @@ GType empathy_call_factory_get_type (void);
/* TYPE MACROS */
#define EMPATHY_TYPE_CALL_FACTORY \
- (empathy_call_factory_get_type())
+ (empathy_call_factory_get_type ())
#define EMPATHY_CALL_FACTORY(obj) \
(G_TYPE_CHECK_INSTANCE_CAST((obj), EMPATHY_TYPE_CALL_FACTORY, \
EmpathyCallFactory))
@@ -67,6 +67,9 @@ EmpathyCallFactory *empathy_call_factory_get (void);
void empathy_call_factory_new_call (EmpathyCallFactory *factory,
EmpathyContact *contact);
+void empathy_call_factory_new_call_with_streams (EmpathyCallFactory *factory,
+ EmpathyContact *contact, gboolean initial_audio, gboolean initial_video);
+
void empathy_call_factory_claim_channel (EmpathyCallFactory *factory,
EmpathyDispatchOperation *operation);
diff --git a/libempathy/empathy-call-handler.c b/libempathy/empathy-call-handler.c
index 820de6de5..8d70885b4 100644
--- a/libempathy/empathy-call-handler.c
+++ b/libempathy/empathy-call-handler.c
@@ -27,6 +27,8 @@
#include <telepathy-farsight/channel.h>
#include <telepathy-farsight/stream.h>
+#include <gst/farsight/fs-element-added-notifier.h>
+
#include "empathy-call-handler.h"
#include "empathy-dispatcher.h"
#include "empathy-marshal.h"
@@ -49,7 +51,9 @@ static guint signals[LAST_SIGNAL] = {0};
enum {
PROP_TP_CALL = 1,
PROP_GST_BUS,
- PROP_CONTACT
+ PROP_CONTACT,
+ PROP_INITIAL_AUDIO,
+ PROP_INITIAL_VIDEO
};
/* private structure */
@@ -59,6 +63,9 @@ typedef struct {
EmpathyTpCall *call;
EmpathyContact *contact;
TfChannel *tfchannel;
+ gboolean initial_audio;
+ gboolean initial_video;
+ FsElementAddedNotifier *fsnotifier;
} EmpathyCallHandlerPriv;
#define GET_PRIV(obj) EMPATHY_GET_PRIV (obj, EmpathyCallHandler)
@@ -91,6 +98,12 @@ empathy_call_handler_dispose (GObject *object)
priv->call = NULL;
+ if (priv->fsnotifier != NULL)
+ {
+ g_object_unref (priv->fsnotifier);
+ }
+ priv->fsnotifier = NULL;
+
/* release any references held by the object here */
if (G_OBJECT_CLASS (empathy_call_handler_parent_class)->dispose)
G_OBJECT_CLASS (empathy_call_handler_parent_class)->dispose (object);
@@ -114,6 +127,17 @@ empathy_call_handler_init (EmpathyCallHandler *obj)
}
static void
+empathy_call_handler_constructed (GObject *object)
+{
+ EmpathyCallHandlerPriv *priv = GET_PRIV (object);
+
+ if (priv->contact == NULL)
+ {
+ g_object_get (priv->call, "contact", &(priv->contact), NULL);
+ }
+}
+
+static void
empathy_call_handler_set_property (GObject *object,
guint property_id, const GValue *value, GParamSpec *pspec)
{
@@ -127,6 +151,12 @@ empathy_call_handler_set_property (GObject *object,
case PROP_TP_CALL:
priv->call = g_value_dup_object (value);
break;
+ case PROP_INITIAL_AUDIO:
+ priv->initial_audio = g_value_get_boolean (value);
+ break;
+ case PROP_INITIAL_VIDEO:
+ priv->initial_video = g_value_get_boolean (value);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
}
@@ -146,6 +176,12 @@ empathy_call_handler_get_property (GObject *object,
case PROP_TP_CALL:
g_value_set_object (value, priv->call);
break;
+ case PROP_INITIAL_AUDIO:
+ g_value_set_boolean (value, priv->initial_audio);
+ break;
+ case PROP_INITIAL_VIDEO:
+ g_value_set_boolean (value, priv->initial_video);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
}
@@ -160,6 +196,7 @@ empathy_call_handler_class_init (EmpathyCallHandlerClass *klass)
g_type_class_add_private (klass, sizeof (EmpathyCallHandlerPriv));
+ object_class->constructed = empathy_call_handler_constructed;
object_class->set_property = empathy_call_handler_set_property;
object_class->get_property = empathy_call_handler_get_property;
object_class->dispose = empathy_call_handler_dispose;
@@ -168,15 +205,29 @@ empathy_call_handler_class_init (EmpathyCallHandlerClass *klass)
param_spec = g_param_spec_object ("contact",
"contact", "The remote contact",
EMPATHY_TYPE_CONTACT,
- G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS);
g_object_class_install_property (object_class, PROP_CONTACT, param_spec);
param_spec = g_param_spec_object ("tp-call",
"tp-call", "The calls channel wrapper",
EMPATHY_TYPE_TP_CALL,
- G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS);
g_object_class_install_property (object_class, PROP_TP_CALL, param_spec);
+ param_spec = g_param_spec_boolean ("initial-audio",
+ "initial-audio", "Whether the call should start with audio",
+ TRUE,
+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS);
+ g_object_class_install_property (object_class, PROP_INITIAL_AUDIO,
+ param_spec);
+
+ param_spec = g_param_spec_boolean ("initial-video",
+ "initial-video", "Whether the call should start with video",
+ FALSE,
+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS);
+ g_object_class_install_property (object_class, PROP_INITIAL_VIDEO,
+ param_spec);
+
signals[CONFERENCE_ADDED] =
g_signal_new ("conference-added", G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_LAST, 0, NULL, NULL,
@@ -213,6 +264,14 @@ empathy_call_handler_class_init (EmpathyCallHandlerClass *klass)
0);
}
+/**
+ * empathy_call_handler_new_for_contact:
+ * @contact: an #EmpathyContact
+ *
+ * Creates a new #EmpathyCallHandler with contact @contact.
+ *
+ * Return value: a new #EmpathyCallHandler
+ */
EmpathyCallHandler *
empathy_call_handler_new_for_contact (EmpathyContact *contact)
{
@@ -220,6 +279,27 @@ empathy_call_handler_new_for_contact (EmpathyContact *contact)
"contact", contact, NULL));
}
+/**
+ * empathy_call_handler_new_for_contact_with_streams:
+ * @contact: an #EmpathyContact
+ * @audio: if %TRUE the call will be started with audio
+ * @video: if %TRUE the call will be started with video
+ *
+ * Creates a new #EmpathyCallHandler with contact @contact.
+ *
+ * Return value: a new #EmpathyCallHandler
+ */
+EmpathyCallHandler *
+empathy_call_handler_new_for_contact_with_streams (EmpathyContact *contact,
+ gboolean audio, gboolean video)
+{
+ return EMPATHY_CALL_HANDLER (g_object_new (EMPATHY_TYPE_CALL_HANDLER,
+ "contact", contact,
+ "initial-audio", audio,
+ "initial-video", video,
+ NULL));
+}
+
EmpathyCallHandler *
empathy_call_handler_new_for_channel (EmpathyTpCall *call)
{
@@ -240,10 +320,49 @@ empathy_call_handler_bus_message (EmpathyCallHandler *handler,
}
static void
+conference_element_added (FsElementAddedNotifier *notifier,
+ GstBin *bin,
+ GstElement *element,
+ gpointer user_data)
+{
+ GstElementFactory *factory;
+ const gchar *name;
+
+ factory = gst_element_get_factory (element);
+ name = gst_plugin_feature_get_name (GST_PLUGIN_FEATURE (factory));
+
+ if (!tp_strdiff (name, "x264enc"))
+ {
+ /* Ensure that the encoder creates the baseline profile */
+ g_object_set (element,
+ "byte-stream", TRUE,
+ "bframes", 0,
+ "b-adapt", FALSE,
+ "cabac", FALSE,
+ "dct8x8", FALSE,
+ NULL);
+ }
+ else if (!tp_strdiff (name, "gstrtpbin"))
+ {
+ /* Lower the jitterbuffer latency to make it more suitable for video
+ * conferencing */
+ g_object_set (element, "latency", 100, NULL);
+ }
+}
+
+static void
empathy_call_handler_tf_channel_session_created_cb (TfChannel *tfchannel,
FsConference *conference, FsParticipant *participant,
EmpathyCallHandler *self)
{
+ EmpathyCallHandlerPriv *priv = GET_PRIV (self);
+
+ priv->fsnotifier = fs_element_added_notifier_new ();
+ fs_element_added_notifier_add (priv->fsnotifier, GST_BIN (conference));
+
+ g_signal_connect (priv->fsnotifier, "element-added",
+ G_CALLBACK (conference_element_added), NULL);
+
g_signal_emit (G_OBJECT (self), signals[CONFERENCE_ADDED], 0,
GST_ELEMENT (conference));
}
@@ -397,7 +516,8 @@ empathy_call_handler_request_cb (EmpathyDispatchOperation *operation,
empathy_call_handler_start_tpfs (self);
- empathy_tp_call_to (priv->call, priv->contact);
+ empathy_tp_call_to (priv->call, priv->contact,
+ priv->initial_audio, priv->initial_video);
empathy_dispatch_operation_claim (operation);
}
@@ -409,7 +529,7 @@ empathy_call_handler_start_call (EmpathyCallHandler *handler)
EmpathyCallHandlerPriv *priv = GET_PRIV (handler);
EmpathyDispatcher *dispatcher;
TpConnection *connection;
- GStrv allowed;
+ GList *classes;
GValue *value;
GHashTable *request;
@@ -424,13 +544,15 @@ empathy_call_handler_start_call (EmpathyCallHandler *handler)
dispatcher = empathy_dispatcher_dup_singleton ();
connection = empathy_contact_get_connection (priv->contact);
- allowed = empathy_dispatcher_find_channel_class (dispatcher, connection,
- TP_IFACE_CHANNEL_TYPE_STREAMED_MEDIA, TP_HANDLE_TYPE_CONTACT);
+ classes = empathy_dispatcher_find_requestable_channel_classes
+ (dispatcher, connection, TP_IFACE_CHANNEL_TYPE_STREAMED_MEDIA,
+ TP_HANDLE_TYPE_CONTACT, NULL);
- if (!tp_strv_contains ((const gchar * const *) allowed,
- TP_IFACE_CHANNEL ".TargetHandle"))
+ if (classes == NULL)
return;
+ g_list_free (classes);
+
request = g_hash_table_new_full (g_str_hash, g_str_equal, NULL,
(GDestroyNotify) tp_g_value_slice_free);
diff --git a/libempathy/empathy-call-handler.h b/libempathy/empathy-call-handler.h
index db2396dc7..9a039f06a 100644
--- a/libempathy/empathy-call-handler.h
+++ b/libempathy/empathy-call-handler.h
@@ -46,7 +46,7 @@ GType empathy_call_handler_get_type (void);
/* TYPE MACROS */
#define EMPATHY_TYPE_CALL_HANDLER \
- (empathy_call_handler_get_type())
+ (empathy_call_handler_get_type ())
#define EMPATHY_CALL_HANDLER(obj) \
(G_TYPE_CHECK_INSTANCE_CAST((obj), EMPATHY_TYPE_CALL_HANDLER, \
EmpathyCallHandler))
@@ -64,6 +64,9 @@ GType empathy_call_handler_get_type (void);
EmpathyCallHandler * empathy_call_handler_new_for_contact (
EmpathyContact *contact);
+EmpathyCallHandler * empathy_call_handler_new_for_contact_with_streams (
+ EmpathyContact *contact, gboolean audio, gboolean video);
+
EmpathyCallHandler * empathy_call_handler_new_for_channel (
EmpathyTpCall *call);
diff --git a/libempathy/empathy-chatroom-manager.c b/libempathy/empathy-chatroom-manager.c
index e57dae7d3..3bdc5f154 100644
--- a/libempathy/empathy-chatroom-manager.c
+++ b/libempathy/empathy-chatroom-manager.c
@@ -14,8 +14,8 @@
*
* You should have received a copy of the GNU General Public
* License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301 USA
*
* Authors: Xavier Claessens <xclaesse@gmail.com>
* Martyn Russell <martyn@imendio.com>
@@ -265,7 +265,7 @@ chatroom_manager_file_parse (EmpathyChatroomManager *manager,
if (!empathy_xml_validate (doc, CHATROOMS_DTD_FILENAME)) {
g_warning ("Failed to validate file:'%s'", filename);
- xmlFreeDoc(doc);
+ xmlFreeDoc (doc);
xmlFreeParserCtxt (ctxt);
return FALSE;
}
@@ -281,7 +281,7 @@ chatroom_manager_file_parse (EmpathyChatroomManager *manager,
DEBUG ("Parsed %d chatrooms", g_list_length (priv->chatrooms));
- xmlFreeDoc(doc);
+ xmlFreeDoc (doc);
xmlFreeParserCtxt (ctxt);
return TRUE;
diff --git a/libempathy/empathy-chatroom-manager.h b/libempathy/empathy-chatroom-manager.h
index 4077a3ccd..76c71d955 100644
--- a/libempathy/empathy-chatroom-manager.h
+++ b/libempathy/empathy-chatroom-manager.h
@@ -15,8 +15,8 @@
*
* You should have received a copy of the GNU General Public
* License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301 USA
*
* Authors: Xavier Claessens <xclaesse@gmail.com>
* Martyn Russell <martyn@imendio.com>
diff --git a/libempathy/empathy-contact-groups.c b/libempathy/empathy-contact-groups.c
index 6973a960a..a9040f2df 100644
--- a/libempathy/empathy-contact-groups.c
+++ b/libempathy/empathy-contact-groups.c
@@ -14,8 +14,8 @@
*
* You should have received a copy of the GNU General Public
* License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301 USA
*
* Authors: Martyn Russell <martyn@imendio.com>
*/
@@ -101,7 +101,7 @@ contact_groups_file_parse (const gchar *filename)
if (!empathy_xml_validate (doc, CONTACT_GROUPS_DTD_FILENAME)) {
g_warning ("Failed to validate file:'%s'", filename);
- xmlFreeDoc(doc);
+ xmlFreeDoc (doc);
xmlFreeParserCtxt (ctxt);
return;
}
@@ -152,7 +152,7 @@ contact_groups_file_parse (const gchar *filename)
DEBUG ("Parsed %d contact groups", g_list_length (groups));
- xmlFreeDoc(doc);
+ xmlFreeDoc (doc);
xmlFreeParserCtxt (ctxt);
}
diff --git a/libempathy/empathy-contact-groups.h b/libempathy/empathy-contact-groups.h
index e2e9810e3..181b28753 100644
--- a/libempathy/empathy-contact-groups.h
+++ b/libempathy/empathy-contact-groups.h
@@ -14,8 +14,8 @@
*
* You should have received a copy of the GNU General Public
* License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301 USA
*
* Authors: Martyn Russell <martyn@imendio.com>
*/
diff --git a/libempathy/empathy-contact-manager.c b/libempathy/empathy-contact-manager.c
index 66c4514af..f415ec19f 100644
--- a/libempathy/empathy-contact-manager.c
+++ b/libempathy/empathy-contact-manager.c
@@ -15,7 +15,7 @@
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- *
+ *
* Authors: Xavier Claessens <xclaesse@gmail.com>
*/
diff --git a/libempathy/empathy-contact-monitor.c b/libempathy/empathy-contact-monitor.c
index 2213a330b..f41b8bd5c 100644
--- a/libempathy/empathy-contact-monitor.c
+++ b/libempathy/empathy-contact-monitor.c
@@ -14,14 +14,13 @@
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- *
+ *
* Authors: Cosimo Cecchi <cosimo.cecchi@collabora.co.uk>
*/
#include "config.h"
#include <glib-object.h>
-#include <libmissioncontrol/mc-enum-types.h>
#include "empathy-contact-monitor.h"
#include "empathy-contact-list.h"
@@ -61,9 +60,9 @@ G_DEFINE_TYPE (EmpathyContactMonitor, empathy_contact_monitor, G_TYPE_OBJECT);
static void
contact_monitor_presence_changed_cb (EmpathyContact *contact,
- McPresence current_presence,
- McPresence previous_presence,
- EmpathyContactMonitor *self)
+ TpConnectionPresenceType current_presence,
+ TpConnectionPresenceType previous_presence,
+ EmpathyContactMonitor *self)
{
g_signal_emit (self, signals[CONTACT_PRESENCE_CHANGED], 0, contact,
current_presence, previous_presence);
@@ -335,11 +334,11 @@ empathy_contact_monitor_class_init (EmpathyContactMonitorClass *klass)
G_SIGNAL_RUN_LAST,
0,
NULL, NULL,
- _empathy_marshal_VOID__OBJECT_ENUM_ENUM,
+ _empathy_marshal_VOID__OBJECT_UINT_UINT,
G_TYPE_NONE,
3, EMPATHY_TYPE_CONTACT,
- MC_TYPE_PRESENCE,
- MC_TYPE_PRESENCE);
+ G_TYPE_UINT,
+ G_TYPE_UINT);
signals[CONTACT_PRESENCE_MESSAGE_CHANGED] =
g_signal_new ("contact-presence-message-changed",
G_TYPE_FROM_CLASS (klass),
diff --git a/libempathy/empathy-contact-monitor.h b/libempathy/empathy-contact-monitor.h
index 76b943668..51957d1d6 100644
--- a/libempathy/empathy-contact-monitor.h
+++ b/libempathy/empathy-contact-monitor.h
@@ -15,7 +15,7 @@
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- *
+ *
* Authors: Cosimo Cecchi <cosimo.cecchi@collabora.co.uk>
*/
@@ -53,8 +53,8 @@ GType empathy_contact_monitor_get_type (void);
void
empathy_contact_monitor_set_iface (EmpathyContactMonitor *self,
EmpathyContactList *iface);
-
-EmpathyContactMonitor *
+
+EmpathyContactMonitor *
empathy_contact_monitor_new_for_iface (EmpathyContactList *iface);
G_END_DECLS
diff --git a/libempathy/empathy-contact.c b/libempathy/empathy-contact.c
index fe8cf8234..03ce8d28a 100644
--- a/libempathy/empathy-contact.c
+++ b/libempathy/empathy-contact.c
@@ -26,7 +26,6 @@
#include <glib/gi18n-lib.h>
#include <telepathy-glib/util.h>
-#include <libmissioncontrol/mc-enum-types.h>
#include "empathy-contact.h"
#include "empathy-account-manager.h"
@@ -44,12 +43,17 @@ typedef struct {
gchar *id;
gchar *name;
EmpathyAvatar *avatar;
- McPresence presence;
+ TpConnectionPresenceType presence;
gchar *presence_message;
guint handle;
EmpathyCapabilities capabilities;
gboolean is_user;
guint hash;
+ /* Location is composed of string keys and GValues.
+ * Example: a "city" key would have "Helsinki" as string GValue,
+ * a "latitude" would have 65.0 as double GValue.
+ */
+ GHashTable *location;
} EmpathyContactPriv;
static void contact_finalize (GObject *object);
@@ -73,6 +77,7 @@ enum
PROP_HANDLE,
PROP_CAPABILITIES,
PROP_IS_USER,
+ PROP_LOCATION
};
enum {
@@ -93,10 +98,11 @@ tp_contact_notify_cb (TpContact *tp_contact,
if (!tp_strdiff (param->name, "alias"))
g_object_notify (contact, "name");
else if (!tp_strdiff (param->name, "presence-type")) {
- McPresence presence;
+ TpConnectionPresenceType presence;
presence = empathy_contact_get_presence (EMPATHY_CONTACT (contact));
- g_signal_emit (contact, signals[PRESENCE_CHANGED], 0, presence, priv->presence);
+ g_signal_emit (contact, signals[PRESENCE_CHANGED], 0, presence,
+ priv->presence);
priv->presence = presence;
g_object_notify (contact, "presence");
}
@@ -185,9 +191,9 @@ empathy_contact_class_init (EmpathyContactClass *class)
g_param_spec_uint ("presence",
"Contact presence",
"Presence of contact",
- MC_PRESENCE_UNSET,
- LAST_MC_PRESENCE,
- MC_PRESENCE_UNSET,
+ TP_CONNECTION_PRESENCE_TYPE_UNSET,
+ NUM_TP_CONNECTION_PRESENCE_TYPES,
+ TP_CONNECTION_PRESENCE_TYPE_UNSET,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
g_object_class_install_property (object_class,
@@ -225,16 +231,25 @@ empathy_contact_class_init (EmpathyContactClass *class)
FALSE,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ g_object_class_install_property (object_class,
+ PROP_LOCATION,
+ g_param_spec_boxed ("location",
+ "Contact location",
+ "Physical location of the contact",
+ G_TYPE_HASH_TABLE,
+ G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
+
signals[PRESENCE_CHANGED] =
g_signal_new ("presence-changed",
G_TYPE_FROM_CLASS (class),
G_SIGNAL_RUN_LAST,
0,
NULL, NULL,
- _empathy_marshal_VOID__ENUM_ENUM,
+ _empathy_marshal_VOID__UINT_UINT,
G_TYPE_NONE,
- 2, MC_TYPE_PRESENCE,
- MC_TYPE_PRESENCE);
+ 2, G_TYPE_UINT,
+ G_TYPE_UINT);
g_type_class_add_private (object_class, sizeof (EmpathyContactPriv));
}
@@ -246,6 +261,8 @@ empathy_contact_init (EmpathyContact *contact)
EMPATHY_TYPE_CONTACT, EmpathyContactPriv);
contact->priv = priv;
+
+ priv->location = NULL;
}
static void
@@ -264,6 +281,9 @@ contact_finalize (GObject *object)
if (priv->avatar)
empathy_avatar_unref (priv->avatar);
+ if (priv->location != NULL)
+ g_hash_table_unref (priv->location);
+
G_OBJECT_CLASS (empathy_contact_parent_class)->finalize (object);
}
@@ -574,54 +594,28 @@ empathy_contact_get_connection (EmpathyContact *contact)
return NULL;
}
-static McPresence
-presence_type_to_mc_presence (TpConnectionPresenceType type)
-{
- switch (type)
- {
- case TP_CONNECTION_PRESENCE_TYPE_UNSET:
- case TP_CONNECTION_PRESENCE_TYPE_UNKNOWN:
- case TP_CONNECTION_PRESENCE_TYPE_ERROR:
- return MC_PRESENCE_UNSET;
- case TP_CONNECTION_PRESENCE_TYPE_OFFLINE:
- return MC_PRESENCE_OFFLINE;
- case TP_CONNECTION_PRESENCE_TYPE_AVAILABLE:
- return MC_PRESENCE_AVAILABLE;
- case TP_CONNECTION_PRESENCE_TYPE_AWAY:
- return MC_PRESENCE_AWAY;
- case TP_CONNECTION_PRESENCE_TYPE_EXTENDED_AWAY:
- return MC_PRESENCE_EXTENDED_AWAY;
- case TP_CONNECTION_PRESENCE_TYPE_HIDDEN:
- return MC_PRESENCE_HIDDEN;
- case TP_CONNECTION_PRESENCE_TYPE_BUSY:
- return MC_PRESENCE_DO_NOT_DISTURB;
- }
-
- return MC_PRESENCE_UNSET;
-}
-
-McPresence
+TpConnectionPresenceType
empathy_contact_get_presence (EmpathyContact *contact)
{
EmpathyContactPriv *priv;
- g_return_val_if_fail (EMPATHY_IS_CONTACT (contact), MC_PRESENCE_UNSET);
+ g_return_val_if_fail (EMPATHY_IS_CONTACT (contact),
+ TP_CONNECTION_PRESENCE_TYPE_UNSET);
priv = GET_PRIV (contact);
if (priv->tp_contact != NULL)
- return presence_type_to_mc_presence (tp_contact_get_presence_type (
- priv->tp_contact));
+ return tp_contact_get_presence_type (priv->tp_contact);
return priv->presence;
}
void
empathy_contact_set_presence (EmpathyContact *contact,
- McPresence presence)
+ TpConnectionPresenceType presence)
{
EmpathyContactPriv *priv;
- McPresence old_presence;
+ TpConnectionPresenceType old_presence;
g_return_if_fail (EMPATHY_IS_CONTACT (contact));
@@ -769,7 +763,15 @@ empathy_contact_is_online (EmpathyContact *contact)
{
g_return_val_if_fail (EMPATHY_IS_CONTACT (contact), FALSE);
- return (empathy_contact_get_presence (contact) > MC_PRESENCE_OFFLINE);
+ switch (empathy_contact_get_presence (contact))
+ {
+ case TP_CONNECTION_PRESENCE_TYPE_OFFLINE:
+ case TP_CONNECTION_PRESENCE_TYPE_UNKNOWN:
+ case TP_CONNECTION_PRESENCE_TYPE_ERROR:
+ return FALSE;
+ default:
+ return TRUE;
+ }
}
const gchar *
@@ -812,6 +814,18 @@ empathy_contact_can_send_files (EmpathyContact *contact)
return priv->capabilities & EMPATHY_CAPABILITIES_FT;
}
+gboolean
+empathy_contact_can_use_stream_tube (EmpathyContact *contact)
+{
+ EmpathyContactPriv *priv;
+
+ g_return_val_if_fail (EMPATHY_IS_CONTACT (contact), FALSE);
+
+ priv = GET_PRIV (contact);
+
+ return priv->capabilities & EMPATHY_CAPABILITIES_STREAM_TUBE;
+}
+
static gchar *
contact_get_avatar_filename (EmpathyContact *contact,
const gchar *token)
@@ -991,7 +1005,7 @@ empathy_avatar_ref (EmpathyAvatar *avatar)
*
* Save the avatar to a file named filename
*
- * Returns: %TRUE on success, %FALSE if an error occurred
+ * Returns: %TRUE on success, %FALSE if an error occurred
*/
gboolean
empathy_avatar_save_to_file (EmpathyAvatar *self,
@@ -1001,3 +1015,59 @@ empathy_avatar_save_to_file (EmpathyAvatar *self,
return g_file_set_contents (filename, self->data, self->len, error);
}
+/**
+ * empathy_contact_get_location:
+ * @contact: an #EmpathyContact
+ *
+ * Returns the user's location if available. The keys are defined in
+ * empathy-location.h. If the contact doesn't have location
+ * information, the GHashTable will be empthy. Use #g_hash_table_unref when
+ * you are done with the #GHashTable.
+ *
+ * It is composed of string keys and GValues. Keys are
+ * defined in empathy-location.h such as #EMPATHY_LOCATION_COUNTRY.
+ * Example: a "city" key would have "Helsinki" as string GValue,
+ * a "latitude" would have 65.0 as double GValue.
+ *
+ * Returns: a #GHashTable of location values
+ */
+GHashTable *
+empathy_contact_get_location (EmpathyContact *contact)
+{
+ EmpathyContactPriv *priv;
+
+ g_return_val_if_fail (EMPATHY_CONTACT (contact), NULL);
+
+ priv = GET_PRIV (contact);
+
+ return priv->location;
+}
+
+/**
+ * empathy_contact_set_location:
+ * @contact: an #EmpathyContact
+ * @location: a #GHashTable of the location
+ *
+ * Sets the user's location based on the location #GHashTable passed.
+ * It is composed of string keys and GValues. Keys are
+ * defined in empathy-location.h such as #EMPATHY_LOCATION_COUNTRY.
+ * Example: a "city" key would have "Helsinki" as string GValue,
+ * a "latitude" would have 65.0 as double GValue.
+ */
+void
+empathy_contact_set_location (EmpathyContact *contact,
+ GHashTable *location)
+{
+ EmpathyContactPriv *priv;
+
+ g_return_if_fail (EMPATHY_CONTACT (contact));
+ g_return_if_fail (location != NULL);
+
+ priv = GET_PRIV (contact);
+
+ if (priv->location != NULL)
+ g_hash_table_unref (priv->location);
+
+ priv->location = g_hash_table_ref (location);
+ g_object_notify (G_OBJECT (contact), "location");
+}
diff --git a/libempathy/empathy-contact.h b/libempathy/empathy-contact.h
index c10561d0f..ff8d426e2 100644
--- a/libempathy/empathy-contact.h
+++ b/libempathy/empathy-contact.h
@@ -63,6 +63,7 @@ typedef enum {
EMPATHY_CAPABILITIES_AUDIO = 1 << 0,
EMPATHY_CAPABILITIES_VIDEO = 1 << 1,
EMPATHY_CAPABILITIES_FT = 1 << 2,
+ EMPATHY_CAPABILITIES_STREAM_TUBE = 1 << 3,
EMPATHY_CAPABILITIES_UNKNOWN = 1 << 7
} EmpathyCapabilities;
@@ -80,9 +81,9 @@ void empathy_contact_set_avatar (EmpathyContact *contact,
EmpathyAvatar *avatar);
McAccount * empathy_contact_get_account (EmpathyContact *contact);
TpConnection * empathy_contact_get_connection (EmpathyContact *contact);
-McPresence empathy_contact_get_presence (EmpathyContact *contact);
+TpConnectionPresenceType empathy_contact_get_presence (EmpathyContact *contact);
void empathy_contact_set_presence (EmpathyContact *contact,
- McPresence presence);
+ TpConnectionPresenceType presence);
const gchar * empathy_contact_get_presence_message (EmpathyContact *contact);
void empathy_contact_set_presence_message (EmpathyContact *contact,
const gchar *message);
@@ -98,6 +99,7 @@ gboolean empathy_contact_is_online (EmpathyContact *contact);
const gchar * empathy_contact_get_status (EmpathyContact *contact);
gboolean empathy_contact_can_voip (EmpathyContact *contact);
gboolean empathy_contact_can_send_files (EmpathyContact *contact);
+gboolean empathy_contact_can_use_stream_tube (EmpathyContact *contact);
guint empathy_contact_hash (gconstpointer key);
void empathy_contact_load_avatar_data (EmpathyContact *contact,
@@ -119,6 +121,10 @@ void empathy_avatar_unref (EmpathyAvatar *avatar);
gboolean empathy_avatar_save_to_file (EmpathyAvatar *avatar,
const gchar *filename, GError **error);
+GHashTable * empathy_contact_get_location (EmpathyContact *contact);
+void empathy_contact_set_location (EmpathyContact *contact,
+ GHashTable *location);
+
G_END_DECLS
#endif /* __EMPATHY_CONTACT_H__ */
diff --git a/libempathy/empathy-debug.c b/libempathy/empathy-debug.c
index ec72bfcfc..bcfa25deb 100644
--- a/libempathy/empathy-debug.c
+++ b/libempathy/empathy-debug.c
@@ -45,6 +45,7 @@ static GDebugKey keys[] = {
{ "Irc", EMPATHY_DEBUG_IRC },
{ "Dispatcher", EMPATHY_DEBUG_DISPATCHER },
{ "Ft", EMPATHY_DEBUG_FT },
+ { "Location", EMPATHY_DEBUG_LOCATION },
{ "Other", EMPATHY_DEBUG_OTHER },
{ 0, }
};
diff --git a/libempathy/empathy-debug.h b/libempathy/empathy-debug.h
index 8b68fd24d..787264dd0 100644
--- a/libempathy/empathy-debug.h
+++ b/libempathy/empathy-debug.h
@@ -39,7 +39,8 @@ typedef enum
EMPATHY_DEBUG_IRC = 1 << 5,
EMPATHY_DEBUG_DISPATCHER = 1 << 6,
EMPATHY_DEBUG_FT = 1 << 7,
- EMPATHY_DEBUG_OTHER = 1 << 8,
+ EMPATHY_DEBUG_LOCATION = 1 << 8,
+ EMPATHY_DEBUG_OTHER = 1 << 9,
} EmpathyDebugFlags;
gboolean empathy_debug_flag_is_set (EmpathyDebugFlags flag);
diff --git a/libempathy/empathy-dispatch-operation.c b/libempathy/empathy-dispatch-operation.c
index cfe111181..7a116f870 100644
--- a/libempathy/empathy-dispatch-operation.c
+++ b/libempathy/empathy-dispatch-operation.c
@@ -406,23 +406,6 @@ empathy_dispatcher_operation_tp_chat_ready_cb (GObject *object,
}
static void
-empathy_dispatcher_operation_tp_file_ready_cb (GObject *object,
- GParamSpec *spec, gpointer user_data)
-{
- EmpathyDispatchOperation *self = EMPATHY_DISPATCH_OPERATION (user_data);
- EmpathyDispatchOperationPriv *priv = GET_PRIV (self);
-
- if (!empathy_tp_file_is_ready (EMPATHY_TP_FILE (priv->channel_wrapper)))
- return;
-
- g_signal_handler_disconnect (priv->channel_wrapper, priv->ready_handler);
- priv->ready_handler = 0;
-
- empathy_dispatch_operation_set_status (self,
- EMPATHY_DISPATCHER_OPERATION_STATE_PENDING);
-}
-
-static void
empathy_dispatch_operation_channel_ready_cb (TpChannel *channel,
const GError *error, gpointer user_data)
{
@@ -461,15 +444,8 @@ empathy_dispatch_operation_channel_ready_cb (TpChannel *channel,
}
else if (channel_type == TP_IFACE_QUARK_CHANNEL_TYPE_FILE_TRANSFER)
{
- EmpathyTpFile *file = empathy_tp_file_new (channel);
- priv->channel_wrapper = G_OBJECT (file);
-
- if (!empathy_tp_file_is_ready (file))
- {
- priv->ready_handler = g_signal_connect (file, "notify::ready",
- G_CALLBACK (empathy_dispatcher_operation_tp_file_ready_cb), self);
- return;
- }
+ EmpathyTpFile *file = empathy_tp_file_new (channel, priv->incoming);
+ priv->channel_wrapper = G_OBJECT (file);
}
ready:
diff --git a/libempathy/empathy-dispatch-operation.h b/libempathy/empathy-dispatch-operation.h
index 3597bd0e8..84ed36013 100644
--- a/libempathy/empathy-dispatch-operation.h
+++ b/libempathy/empathy-dispatch-operation.h
@@ -57,7 +57,7 @@ GType empathy_dispatch_operation_get_type (void);
/* TYPE MACROS */
#define EMPATHY_TYPE_DISPATCH_OPERATION \
- (empathy_dispatch_operation_get_type())
+ (empathy_dispatch_operation_get_type ())
#define EMPATHY_DISPATCH_OPERATION(obj) \
(G_TYPE_CHECK_INSTANCE_CAST((obj), EMPATHY_TYPE_DISPATCH_OPERATION, \
EmpathyDispatchOperation))
diff --git a/libempathy/empathy-dispatcher.c b/libempathy/empathy-dispatcher.c
index c8a0f9e60..f46d15f80 100644
--- a/libempathy/empathy-dispatcher.c
+++ b/libempathy/empathy-dispatcher.c
@@ -1,4 +1,4 @@
-/* * Copyright (C) 2007-2008 Collabora Ltd.
+/* * Copyright (C) 2007-2009 Collabora Ltd.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -13,8 +13,10 @@
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- *
+ *
* Authors: Xavier Claessens <xclaesse@gmail.com>
+ * Sjoerd Simons <sjoerd.simons@collabora.co.uk>
+ * Cosimo Cecchi <cosimo.cecchi@collabora.co.uk>
*/
#include <config.h>
@@ -39,7 +41,6 @@
#include "empathy-tube-handler.h"
#include "empathy-account-manager.h"
#include "empathy-tp-contact-factory.h"
-#include "empathy-tp-file.h"
#include "empathy-chatroom-manager.h"
#include "empathy-utils.h"
@@ -53,11 +54,14 @@ typedef struct
MissionControl *mc;
/* connection to connection data mapping */
GHashTable *connections;
+ GHashTable *outstanding_classes_requests;
gpointer token;
GSList *tubes;
/* channels which the dispatcher is listening "invalidated" */
GList *channels;
+
+ GHashTable *request_channel_class_async_ids;
} EmpathyDispatcherPriv;
G_DEFINE_TYPE (EmpathyDispatcher, empathy_dispatcher, G_TYPE_OBJECT);
@@ -73,6 +77,11 @@ enum
static guint signals[LAST_SIGNAL];
static EmpathyDispatcher *dispatcher = NULL;
+static GList * empathy_dispatcher_find_channel_classes
+ (EmpathyDispatcher *dispatcher, TpConnection *connection,
+ const gchar *channel_type, guint handle_type, GArray *fixed_properties);
+
+
typedef struct
{
EmpathyDispatcher *dispatcher;
@@ -111,6 +120,17 @@ typedef struct
GPtrArray *requestable_channels;
} ConnectionData;
+typedef struct
+{
+ EmpathyDispatcher *dispatcher;
+ TpConnection *connection;
+ char *channel_type;
+ guint handle_type;
+ GArray *properties;
+ EmpathyDispatcherFindChannelClassCb *callback;
+ gpointer user_data;
+} FindChannelRequest;
+
static DispatchData *
new_dispatch_data (TpChannel *channel,
GObject *channel_wrapper)
@@ -221,6 +241,29 @@ free_connection_data (ConnectionData *cd)
}
static void
+free_find_channel_request (FindChannelRequest *r)
+{
+ int idx;
+ char *str;
+
+ g_object_unref (r->dispatcher);
+ g_free (r->channel_type);
+
+ if (r->properties != NULL)
+ {
+ for (idx = 0; idx < r->properties->len ; idx++)
+ {
+ str = g_array_index (r->properties, char *, idx);
+ g_free (str);
+ }
+
+ g_array_free (r->properties, TRUE);
+ }
+
+ g_slice_free (FindChannelRequest, r);
+}
+
+static void
dispatcher_connection_invalidated_cb (TpConnection *connection,
guint domain,
gint code,
@@ -452,7 +495,7 @@ dispatcher_start_dispatching (EmpathyDispatcher *self,
dispatch_operation_ready_cb (operation, dispatcher);
break;
default:
- g_assert_not_reached();
+ g_assert_not_reached ();
}
}
@@ -522,7 +565,7 @@ dispatcher_connection_new_channel (EmpathyDispatcher *dispatcher,
if (g_hash_table_lookup (cd->dispatching_channels, object_path) != NULL)
return;
- /* Should never occur, but just in case a CM fires spurious NewChannel(s)
+ /* Should never occur, but just in case a CM fires spurious NewChannel(s)
* signals */
if (g_hash_table_lookup (cd->outstanding_channels, object_path) != NULL)
return;
@@ -713,12 +756,35 @@ dispatcher_connection_got_all (TpProxy *proxy,
else
{
ConnectionData *cd;
+ GList *requests, *l;
+ FindChannelRequest *request;
+ GList *retval;
cd = g_hash_table_lookup (priv->connections, proxy);
g_assert (cd != NULL);
cd->requestable_channels = g_boxed_copy (
TP_ARRAY_TYPE_REQUESTABLE_CHANNEL_CLASS_LIST, requestable_channels);
+
+ requests = g_hash_table_lookup (priv->outstanding_classes_requests,
+ proxy);
+
+ for (l = requests; l != NULL; l = l->next)
+ {
+ request = l->data;
+
+ retval = empathy_dispatcher_find_channel_classes (dispatcher,
+ TP_CONNECTION (proxy), request->channel_type,
+ request->handle_type, request->properties);
+ request->callback (retval, request->user_data);
+
+ free_find_channel_request (request);
+ g_list_free (retval);
+ }
+
+ g_list_free (requests);
+
+ g_hash_table_remove (priv->outstanding_classes_requests, proxy);
}
}
@@ -832,7 +898,18 @@ dispatcher_new_connection_cb (EmpathyAccountManager *manager,
g_ptr_array_free (capabilities, TRUE);
}
-static GObject*
+static void
+remove_idle_handlers (gpointer key,
+ gpointer value,
+ gpointer user_data)
+{
+ guint source_id;
+
+ source_id = GPOINTER_TO_UINT (value);
+ g_source_remove (source_id);
+}
+
+static GObject *
dispatcher_constructor (GType type,
guint n_construct_params,
GObjectConstructParam *construct_params)
@@ -862,6 +939,14 @@ dispatcher_finalize (GObject *object)
GList *l;
GHashTableIter iter;
gpointer connection;
+ GList *list;
+
+ if (priv->request_channel_class_async_ids != NULL)
+ {
+ g_hash_table_foreach (priv->request_channel_class_async_ids,
+ remove_idle_handlers, NULL);
+ g_hash_table_destroy (priv->request_channel_class_async_ids);
+ }
g_signal_handlers_disconnect_by_func (priv->account_manager,
dispatcher_new_connection_cb, object);
@@ -881,10 +966,18 @@ dispatcher_finalize (GObject *object)
dispatcher_connection_invalidated_cb, object);
}
+ g_hash_table_iter_init (&iter, priv->outstanding_classes_requests);
+ while (g_hash_table_iter_next (&iter, &connection, (gpointer *) &list))
+ {
+ g_list_foreach (list, (GFunc) free_find_channel_request, NULL);
+ g_list_free (list);
+ }
+
g_object_unref (priv->account_manager);
g_object_unref (priv->mc);
g_hash_table_destroy (priv->connections);
+ g_hash_table_destroy (priv->outstanding_classes_requests);
}
static void
@@ -947,6 +1040,9 @@ empathy_dispatcher_init (EmpathyDispatcher *dispatcher)
priv->connections = g_hash_table_new_full (g_direct_hash, g_direct_equal,
g_object_unref, (GDestroyNotify) free_connection_data);
+ priv->outstanding_classes_requests = g_hash_table_new_full (g_direct_hash,
+ g_direct_equal, g_object_unref, NULL);
+
priv->channels = NULL;
connections = empathy_account_manager_dup_connections (priv->account_manager);
@@ -956,6 +1052,9 @@ empathy_dispatcher_init (EmpathyDispatcher *dispatcher)
g_object_unref (l->data);
}
g_list_free (connections);
+
+ priv->request_channel_class_async_ids = g_hash_table_new (g_direct_hash,
+ g_direct_equal);
}
EmpathyDispatcher *
@@ -1086,7 +1185,7 @@ dispatcher_request_channel_cb (TpConnection *connection,
GObject *weak_object)
{
EmpathyDispatcher *dispatcher = EMPATHY_DISPATCHER (weak_object);
- DispatcherRequestData *request_data = (DispatcherRequestData*) user_data;
+ DispatcherRequestData *request_data = (DispatcherRequestData *) user_data;
dispatcher_connection_new_requested_channel (dispatcher,
request_data, object_path, NULL, error);
@@ -1116,7 +1215,7 @@ empathy_dispatcher_chat_with_contact (EmpathyContact *contact,
g_return_if_fail (EMPATHY_IS_CONTACT (contact));
- dispatcher = empathy_dispatcher_dup_singleton();
+ dispatcher = empathy_dispatcher_dup_singleton ();
priv = GET_PRIV (dispatcher);
connection = empathy_contact_get_connection (contact);
@@ -1238,7 +1337,7 @@ empathy_dispatcher_join_muc (TpConnection *connection,
g_return_if_fail (TP_IS_CONNECTION (connection));
g_return_if_fail (!EMP_STR_EMPTY (roomname));
- dispatcher = empathy_dispatcher_dup_singleton();
+ dispatcher = empathy_dispatcher_dup_singleton ();
priv = GET_PRIV (dispatcher);
connection_data = g_hash_table_lookup (priv->connections, connection);
@@ -1268,7 +1367,7 @@ dispatcher_create_channel_cb (TpConnection *connect,
GObject *weak_object)
{
EmpathyDispatcher *dispatcher = EMPATHY_DISPATCHER (weak_object);
- DispatcherRequestData *request_data = (DispatcherRequestData*) user_data;
+ DispatcherRequestData *request_data = (DispatcherRequestData *) user_data;
dispatcher_connection_new_requested_channel (dispatcher,
request_data, object_path, properties, error);
@@ -1318,93 +1417,100 @@ empathy_dispatcher_create_channel (EmpathyDispatcher *dispatcher,
G_OBJECT (request_data->dispatcher));
}
-void
-empathy_dispatcher_send_file_to_contact (EmpathyContact *contact,
- const gchar *filename,
- guint64 size,
- guint64 date,
- const gchar *content_type,
- EmpathyDispatcherRequestCb *callback,
- gpointer user_data)
+static gboolean
+channel_class_matches (GValueArray *class,
+ const char *channel_type,
+ guint handle_type,
+ GArray *fixed_properties)
{
- EmpathyDispatcher *dispatcher = empathy_dispatcher_dup_singleton();
- EmpathyDispatcherPriv *priv = GET_PRIV (dispatcher);
- TpConnection *connection = empathy_contact_get_connection (contact);
- ConnectionData *connection_data =
- g_hash_table_lookup (priv->connections, connection);
- DispatcherRequestData *request_data;
- GValue *value;
- GHashTable *request = g_hash_table_new_full (g_str_hash, g_str_equal, NULL,
- (GDestroyNotify) tp_g_value_slice_free);
+ GHashTable *fprops;
+ GValue *v;
+ const char *c_type;
+ guint h_type;
+ gboolean valid;
- g_return_if_fail (EMPATHY_IS_CONTACT (contact));
- g_return_if_fail (!EMP_STR_EMPTY (filename));
- g_return_if_fail (!EMP_STR_EMPTY (content_type));
-
- /* org.freedesktop.Telepathy.Channel.ChannelType */
- value = tp_g_value_slice_new (G_TYPE_STRING);
- g_value_set_string (value, TP_IFACE_CHANNEL_TYPE_FILE_TRANSFER);
- g_hash_table_insert (request, TP_IFACE_CHANNEL ".ChannelType", value);
-
- /* org.freedesktop.Telepathy.Channel.TargetHandleType */
- value = tp_g_value_slice_new (G_TYPE_UINT);
- g_value_set_uint (value, TP_HANDLE_TYPE_CONTACT);
- g_hash_table_insert (request, TP_IFACE_CHANNEL ".TargetHandleType", value);
-
- /* org.freedesktop.Telepathy.Channel.TargetHandle */
- value = tp_g_value_slice_new (G_TYPE_UINT);
- g_value_set_uint (value, empathy_contact_get_handle (contact));
- g_hash_table_insert (request, TP_IFACE_CHANNEL ".TargetHandle", value);
-
- /* org.freedesktop.Telepathy.Channel.Type.FileTransfer.ContentType */
- value = tp_g_value_slice_new (G_TYPE_STRING);
- g_value_set_string (value, content_type);
- g_hash_table_insert (request,
- TP_IFACE_CHANNEL_TYPE_FILE_TRANSFER ".ContentType", value);
-
- /* org.freedesktop.Telepathy.Channel.Type.FileTransfer.Filename */
- value = tp_g_value_slice_new (G_TYPE_STRING);
- g_value_set_string (value, filename);
- g_hash_table_insert (request,
- TP_IFACE_CHANNEL_TYPE_FILE_TRANSFER ".Filename", value);
-
- /* org.freedesktop.Telepathy.Channel.Type.FileTransfer.Size */
- value = tp_g_value_slice_new (G_TYPE_UINT64);
- g_value_set_uint64 (value, size);
- g_hash_table_insert (request,
- TP_IFACE_CHANNEL_TYPE_FILE_TRANSFER ".Size", value);
-
- /* org.freedesktop.Telepathy.Channel.Type.FileTransfer.Date */
- value = tp_g_value_slice_new (G_TYPE_UINT64);
- g_value_set_uint64 (value, date);
- g_hash_table_insert (request,
- TP_IFACE_CHANNEL_TYPE_FILE_TRANSFER ".Date", value);
-
- request_data = new_dispatcher_request_data (dispatcher, connection,
- TP_IFACE_CHANNEL_TYPE_FILE_TRANSFER, TP_HANDLE_TYPE_CONTACT,
- empathy_contact_get_handle (contact), request, contact, callback,
- user_data);
- connection_data->outstanding_requests = g_list_prepend
- (connection_data->outstanding_requests, request_data);
+ v = g_value_array_get_nth (class, 0);
- tp_cli_connection_interface_requests_call_create_channel (
- request_data->connection, -1,
- request_data->request, dispatcher_create_channel_cb, request_data, NULL,
- G_OBJECT (request_data->dispatcher));
+ /* if the class doesn't match channel type discard it. */
+ fprops = g_value_get_boxed (v);
+ c_type = tp_asv_get_string (fprops, TP_IFACE_CHANNEL ".ChannelType");
- g_object_unref (dispatcher);
+ if (tp_strdiff (channel_type, c_type))
+ return FALSE;
+
+ /* we have the right channel type, see if the handle type matches */
+ h_type = tp_asv_get_uint32 (fprops,
+ TP_IFACE_CHANNEL ".TargetHandleType", &valid);
+
+ if (!valid || handle_type != h_type)
+ return FALSE;
+
+ if (fixed_properties != NULL)
+ {
+ gpointer h_key, h_val;
+ int idx;
+ GHashTableIter iter;
+ gboolean found;
+
+ g_hash_table_iter_init (&iter, fprops);
+
+ while (g_hash_table_iter_next (&iter, &h_key, &h_val))
+ {
+ /* discard ChannelType and TargetHandleType, as we already
+ * checked them.
+ */
+ if (!tp_strdiff ((char *) h_key, TP_IFACE_CHANNEL ".ChannelType") ||
+ !tp_strdiff
+ ((char *) h_key, TP_IFACE_CHANNEL ".TargetHandleType"))
+ continue;
+
+ found = FALSE;
+
+ for (idx = 0; idx < fixed_properties->len; idx++)
+ {
+ /* if |key| doesn't exist in |fixed_properties|, discard
+ * the class.
+ */
+ if (!tp_strdiff
+ ((char *) h_key,
+ g_array_index (fixed_properties, char *, idx)))
+ {
+ found = TRUE;
+ /* exit the for() loop */
+ break;
+ }
+ }
+
+ if (!found)
+ return FALSE;
+ }
+ }
+ else
+ {
+ /* if no fixed_properties are specified, discard the classes
+ * with some fixed properties other than the two we already
+ * checked.
+ */
+ if (g_hash_table_size (fprops) > 2)
+ return FALSE;
+ }
+
+ return TRUE;
}
-GStrv
-empathy_dispatcher_find_channel_class (EmpathyDispatcher *dispatcher,
- TpConnection *connection,
- const gchar *channel_type,
- guint handle_type)
+static GList *
+empathy_dispatcher_find_channel_classes (EmpathyDispatcher *dispatcher,
+ TpConnection *connection,
+ const gchar *channel_type,
+ guint handle_type,
+ GArray *fixed_properties)
{
EmpathyDispatcherPriv *priv = GET_PRIV (dispatcher);
- ConnectionData *cd;
- int i;
+ GValueArray *class;
GPtrArray *classes;
+ GList *matching_classes;
+ int i;
+ ConnectionData *cd;
g_return_val_if_fail (channel_type != NULL, NULL);
g_return_val_if_fail (handle_type != 0, NULL);
@@ -1418,36 +1524,223 @@ empathy_dispatcher_find_channel_class (EmpathyDispatcher *dispatcher,
if (classes == NULL)
return NULL;
+ matching_classes = NULL;
+
for (i = 0; i < classes->len; i++)
{
- GValueArray *class;
- GValue *fixed;
- GValue *allowed;
- GHashTable *fprops;
- const gchar *c_type;
- guint32 h_type;
- gboolean valid;
-
class = g_ptr_array_index (classes, i);
- fixed = g_value_array_get_nth (class, 0);
-
- fprops = g_value_get_boxed (fixed);
- c_type = tp_asv_get_string (fprops, TP_IFACE_CHANNEL ".ChannelType");
- if (tp_strdiff (channel_type, c_type))
+ if (!channel_class_matches
+ (class, channel_type, handle_type, fixed_properties))
continue;
- h_type = tp_asv_get_uint32 (fprops,
- TP_IFACE_CHANNEL ".TargetHandleType", &valid);
+ matching_classes = g_list_prepend (matching_classes, class);
+ }
- if (!valid || handle_type != h_type)
- continue;
+ return matching_classes;
+}
+
+static gboolean
+find_channel_class_idle_cb (gpointer user_data)
+{
+ GList *retval;
+ GList *requests;
+ FindChannelRequest *request = user_data;
+ ConnectionData *cd;
+ gboolean is_ready = TRUE;
+ EmpathyDispatcherPriv *priv = GET_PRIV (request->dispatcher);
+
+ g_hash_table_remove (priv->request_channel_class_async_ids, request);
+
+ cd = g_hash_table_lookup (priv->connections, request->connection);
+
+ if (cd == NULL)
+ is_ready = FALSE;
+ else if (cd->requestable_channels == NULL)
+ is_ready = FALSE;
+
+ if (is_ready)
+ {
+ retval = empathy_dispatcher_find_channel_classes (request->dispatcher,
+ request->connection, request->channel_type, request->handle_type,
+ request->properties);
+
+ request->callback (retval, request->user_data);
+ free_find_channel_request (request);
+ g_list_free (retval);
+
+ return FALSE;
+ }
+
+ requests = g_hash_table_lookup (priv->outstanding_classes_requests,
+ request->connection);
+ requests = g_list_prepend (requests, request);
+
+ g_hash_table_insert (priv->outstanding_classes_requests,
+ request->connection, requests);
+
+ return FALSE;
+}
+
+static GArray *
+setup_varargs (va_list var_args,
+ const char *channel_namespace,
+ const char *first_property_name)
+{
+ const char *name;
+ char *name_full;
+ GArray *properties;
+
+ if (first_property_name == NULL)
+ return NULL;
+
+ name = first_property_name;
+ properties = g_array_new (TRUE, TRUE, sizeof (char *));
+
+ while (name != NULL)
+ {
+ name_full = g_strdup (name);
+ properties = g_array_append_val (properties, name_full);
+ name = va_arg (var_args, char *);
+ }
+
+ return properties;
+}
+
+/**
+ * empathy_dispatcher_find_requestable_channel_classes:
+ * @dispatcher: an #EmpathyDispatcher
+ * @connection: a #TpConnection
+ * @channel_type: a string identifying the type of the channel to lookup
+ * @handle_type: the handle type for the channel
+ * @first_property_name: %NULL, or the name of the first fixed property,
+ * followed optionally by more names, followed by %NULL.
+ *
+ * Returns all the channel classes that a client can request for the connection
+ * @connection, of the type identified by @channel_type, @handle_type and the
+ * fixed properties list.
+ * The classes which are compatible with a fixed properties list (i.e. those
+ * that will be returned by this function) are intended as those that do not
+ * contain any fixed property other than those in the list; note that this
+ * doesn't guarantee that all the classes compatible with the list will contain
+ * all the requested fixed properties, so the clients will have to filter
+ * the returned list themselves.
+ * If @first_property_name is %NULL, only the classes with no other fixed
+ * properties than ChannelType and TargetHandleType will be returned.
+ * Note that this function may return %NULL without performing any lookup if
+ * @connection is not ready. To ensure that @connection is always ready,
+ * use the empathy_dispatcher_find_requestable_channel_classes_async() variant.
+ *
+ * Return value: a #GList of #GValueArray objects, where the first element in
+ * the array is a #GHashTable of the fixed properties, and the second is
+ * a #GStrv of the allowed properties for the class. The list should be free'd
+ * with g_list_free() when done, but the objects inside the list are owned
+ * by the #EmpathyDispatcher and must not be modified.
+ */
+GList *
+empathy_dispatcher_find_requestable_channel_classes
+ (EmpathyDispatcher *dispatcher,
+ TpConnection *connection,
+ const gchar *channel_type,
+ guint handle_type,
+ const char *first_property_name,
+ ...)
+{
+ va_list var_args;
+ GArray *properties;
+ EmpathyDispatcherPriv *priv;
+ GList *retval;
+ int idx;
+ char *str;
+
+ g_return_val_if_fail (EMPATHY_IS_DISPATCHER (dispatcher), NULL);
+ g_return_val_if_fail (TP_IS_CONNECTION (connection), NULL);
+ g_return_val_if_fail (channel_type != NULL, NULL);
+ g_return_val_if_fail (handle_type != 0, NULL);
+
+ priv = GET_PRIV (dispatcher);
+
+ va_start (var_args, first_property_name);
- allowed = g_value_array_get_nth (class, 1);
+ properties = setup_varargs (var_args, channel_type, first_property_name);
- return g_value_get_boxed (allowed);
+ va_end (var_args);
+
+ retval = empathy_dispatcher_find_channel_classes (dispatcher, connection,
+ channel_type, handle_type, properties);
+
+ if (properties != NULL)
+ {
+ /* free the properties array */
+ for (idx = 0; idx < properties->len ; idx++)
+ {
+ str = g_array_index (properties, char *, idx);
+ g_free (str);
+ }
+
+ g_array_free (properties, TRUE);
}
- return NULL;
+ return retval;
}
+/**
+ * empathy_dispatcher_find_requestable_channel_classes_async:
+ * @dispatcher: an #EmpathyDispatcher
+ * @connection: a #TpConnection
+ * @channel_type: a string identifying the type of the channel to lookup
+ * @handle_type: the handle type for the channel
+ * @callback: the callback to call when @connection is ready
+ * @user_data: the user data to pass to @callback
+ * @first_property_name: %NULL, or the name of the first fixed property,
+ * followed optionally by more names, followed by %NULL.
+ *
+ * Please see the documentation of
+ * empathy_dispatcher_find_requestable_channel_classes() for a detailed
+ * description of this function.
+ */
+void
+empathy_dispatcher_find_requestable_channel_classes_async
+ (EmpathyDispatcher *dispatcher,
+ TpConnection *connection,
+ const gchar *channel_type,
+ guint handle_type,
+ EmpathyDispatcherFindChannelClassCb callback,
+ gpointer user_data,
+ const char *first_property_name,
+ ...)
+{
+ va_list var_args;
+ GArray *properties;
+ FindChannelRequest *request;
+ EmpathyDispatcherPriv *priv;
+ guint source_id;
+
+ g_return_if_fail (EMPATHY_IS_DISPATCHER (dispatcher));
+ g_return_if_fail (TP_IS_CONNECTION (connection));
+ g_return_if_fail (channel_type != NULL);
+ g_return_if_fail (handle_type != 0);
+
+ priv = GET_PRIV (dispatcher);
+
+ va_start (var_args, first_property_name);
+
+ properties = setup_varargs (var_args, channel_type, first_property_name);
+
+ va_end (var_args);
+
+ /* append another request for this connection */
+ request = g_slice_new0 (FindChannelRequest);
+ request->dispatcher = dispatcher;
+ request->channel_type = g_strdup (channel_type);
+ request->handle_type = handle_type;
+ request->connection = connection;
+ request->callback = callback;
+ request->user_data = user_data;
+ request->properties = properties;
+
+ source_id = g_idle_add (find_channel_class_idle_cb, request);
+
+ g_hash_table_insert (priv->request_channel_class_async_ids,
+ request, GUINT_TO_POINTER (source_id));
+}
diff --git a/libempathy/empathy-dispatcher.h b/libempathy/empathy-dispatcher.h
index fb7c6fe35..d6c83f6c1 100644
--- a/libempathy/empathy-dispatcher.h
+++ b/libempathy/empathy-dispatcher.h
@@ -58,6 +58,8 @@ struct _EmpathyDispatcherClass
typedef void (EmpathyDispatcherRequestCb) (
EmpathyDispatchOperation *dispatch, const GError *error,
gpointer user_data);
+typedef void (EmpathyDispatcherFindChannelClassCb) (
+ GList *channel_classes, gpointer user_data);
GType empathy_dispatcher_get_type (void) G_GNUC_CONST;
@@ -83,8 +85,16 @@ void empathy_dispatcher_join_muc (TpConnection *connection,
const gchar *roomname, EmpathyDispatcherRequestCb *callback,
gpointer user_data);
-GStrv empathy_dispatcher_find_channel_class (EmpathyDispatcher *dispatcher,
- TpConnection *connection, const gchar *channel_type, guint handle_type);
+void empathy_dispatcher_find_requestable_channel_classes_async
+ (EmpathyDispatcher *dispatcher, TpConnection *connection,
+ const gchar *channel_type, guint handle_type,
+ EmpathyDispatcherFindChannelClassCb callback, gpointer user_data,
+ const char *first_property_name, ...);
+
+GList * empathy_dispatcher_find_requestable_channel_classes
+ (EmpathyDispatcher *dispatcher, TpConnection *connection,
+ const gchar *channel_type, guint handle_type,
+ const char *first_property_name, ...);
/* Get the dispatcher singleton */
EmpathyDispatcher * empathy_dispatcher_dup_singleton (void);
diff --git a/libempathy/empathy-ft-factory.c b/libempathy/empathy-ft-factory.c
new file mode 100644
index 000000000..5d54203fc
--- /dev/null
+++ b/libempathy/empathy-ft-factory.c
@@ -0,0 +1,242 @@
+/*
+ * empathy-ft-factory.c - Source for EmpathyFTFactory
+ * Copyright (C) 2009 Collabora Ltd.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Author: Cosimo Cecchi <cosimo.cecchi@collabora.co.uk>
+ */
+
+/* empathy-ft-factory.c */
+
+#include <glib.h>
+
+#include "empathy-ft-factory.h"
+#include "empathy-ft-handler.h"
+#include "empathy-marshal.h"
+#include "empathy-utils.h"
+
+/**
+ * SECTION:empathy-ft-factory
+ * @title:EmpathyFTFactory
+ * @short_description: creates #EmpathyFTHandler objects
+ * @include: libempathy/empathy-ft-factory.h
+ *
+ * #EmpathyFTFactory takes care of the creation of the #EmpathyFTHandler
+ * objects used for file transfer. As the creation of the handlers is
+ * async, a client will have to connect to the ::new-ft-handler signal
+ * to receive the handler.
+ * In case of an incoming file transfer, the handler will need the destination
+ * file before being useful; as this is usually decided by the user (e.g. with
+ * a file selector), a ::new-incoming-transfer is emitted by the factory when
+ * a destination file is needed, which can be set later with
+ * empathy_ft_factory_set_destination_for_incoming_handler().
+ */
+
+G_DEFINE_TYPE (EmpathyFTFactory, empathy_ft_factory, G_TYPE_OBJECT);
+
+enum {
+ NEW_FT_HANDLER,
+ NEW_INCOMING_TRANSFER,
+ LAST_SIGNAL
+};
+
+static EmpathyFTFactory *factory_singleton = NULL;
+static guint signals[LAST_SIGNAL] = { 0 };
+
+static GObject *
+do_constructor (GType type,
+ guint n_props,
+ GObjectConstructParam *props)
+{
+ GObject *retval;
+
+ if (factory_singleton != NULL) {
+ retval = g_object_ref (factory_singleton);
+ } else {
+ retval = G_OBJECT_CLASS (empathy_ft_factory_parent_class)->constructor
+ (type, n_props, props);
+
+ factory_singleton = EMPATHY_FT_FACTORY (retval);
+ g_object_add_weak_pointer (retval, (gpointer *) &factory_singleton);
+ }
+
+ return retval;
+}
+
+static void
+empathy_ft_factory_class_init (EmpathyFTFactoryClass *klass)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+ object_class->constructor = do_constructor;
+
+ /**
+ * EmpathyFTFactory::new-ft-handler
+ * @factory: the object which received the signal
+ * @handler: the handler made available by the factory
+ * @error: a #GError or %NULL
+ *
+ * The signal is emitted when a new #EmpathyFTHandler is available.
+ * Note that @handler is never %NULL even if @error is set, as you might want
+ * to display the error in an UI; in that case, the handler won't support
+ * any transfer.
+ */
+ signals[NEW_FT_HANDLER] =
+ g_signal_new ("new-ft-handler",
+ G_TYPE_FROM_CLASS (klass),
+ G_SIGNAL_RUN_LAST, 0,
+ NULL, NULL,
+ _empathy_marshal_VOID__OBJECT_POINTER,
+ G_TYPE_NONE, 2, EMPATHY_TYPE_FT_HANDLER, G_TYPE_POINTER);
+
+ /**
+ * EmpathyFTFactory::new-incoming-transfer
+ * @factory: the object which received the signal
+ * @handler: the incoming handler being constructed
+ * @error: a #GError or %NULL
+ *
+ * The signal is emitted when a new incoming #EmpathyFTHandler is being
+ * constructed, and needs a destination #GFile to be useful.
+ * Clients that connect to this signal will have to call
+ * empathy_ft_factory_set_destination_for_incoming_handler() when they
+ * have a #GFile.
+ * Note that @handler is never %NULL even if @error is set, as you might want
+ * to display the error in an UI; in that case, the handler won't support
+ * any transfer.
+ */
+ signals[NEW_INCOMING_TRANSFER] =
+ g_signal_new ("new-incoming-transfer",
+ G_TYPE_FROM_CLASS (klass),
+ G_SIGNAL_RUN_LAST, 0,
+ NULL, NULL,
+ _empathy_marshal_VOID__OBJECT_POINTER,
+ G_TYPE_NONE, 2, EMPATHY_TYPE_FT_HANDLER, G_TYPE_POINTER);
+}
+
+static void
+empathy_ft_factory_init (EmpathyFTFactory *self)
+{
+ /* do nothing */
+}
+
+static void
+ft_handler_outgoing_ready_cb (EmpathyFTHandler *handler,
+ GError *error,
+ gpointer user_data)
+{
+ EmpathyFTFactory *factory = user_data;
+
+ g_signal_emit (factory, signals[NEW_FT_HANDLER], 0, handler, error);
+}
+
+static void
+ft_handler_incoming_ready_cb (EmpathyFTHandler *handler,
+ GError *error,
+ gpointer user_data)
+{
+ EmpathyFTFactory *factory = user_data;
+
+ g_signal_emit (factory, signals[NEW_INCOMING_TRANSFER], 0, handler, error);
+}
+
+/* public methods */
+
+/**
+ * empathy_ft_factory_dup_singleton:
+ *
+ * Gives the caller a reference to the #EmpathyFTFactory singleton,
+ * (creating it if necessary).
+ *
+ * Return value: an #EmpathyFTFactory object
+ */
+EmpathyFTFactory *
+empathy_ft_factory_dup_singleton (void)
+{
+ return g_object_new (EMPATHY_TYPE_FT_FACTORY, NULL);
+}
+
+/**
+ * empathy_ft_factory_new_transfer_outgoing:
+ * @factory: an #EmpathyFTFactory
+ * @contact: the #EmpathyContact destination of the transfer
+ * @source: the #GFile to be transferred to @contact
+ *
+ * Trigger the creation of an #EmpathyFTHandler object to send @source to
+ * the specified @contact.
+ */
+void
+empathy_ft_factory_new_transfer_outgoing (EmpathyFTFactory *factory,
+ EmpathyContact *contact,
+ GFile *source)
+{
+ g_return_if_fail (EMPATHY_IS_FT_FACTORY (factory));
+ g_return_if_fail (EMPATHY_IS_CONTACT (contact));
+ g_return_if_fail (G_IS_FILE (source));
+
+ empathy_ft_handler_new_outgoing (contact, source,
+ ft_handler_outgoing_ready_cb, factory);
+}
+
+/**
+ * empathy_ft_factory_claim_channel:
+ * @factory: an #EmpathyFTFactory
+ * @operation: the #EmpathyDispatchOperation wrapping the channel
+ *
+ * Let the @factory claim the channel, starting the creation of a new
+ * incoming #EmpathyFTHandler.
+ */
+void
+empathy_ft_factory_claim_channel (EmpathyFTFactory *factory,
+ EmpathyDispatchOperation *operation)
+{
+ EmpathyTpFile *tp_file;
+
+ g_return_if_fail (EMPATHY_IS_FT_FACTORY (factory));
+ g_return_if_fail (EMPATHY_IS_DISPATCH_OPERATION (operation));
+
+ /* own a reference to the EmpathyTpFile */
+ tp_file = EMPATHY_TP_FILE
+ ((empathy_dispatch_operation_get_channel_wrapper (operation)));
+
+ empathy_ft_handler_new_incoming (tp_file, ft_handler_incoming_ready_cb,
+ factory);
+
+ empathy_dispatch_operation_claim (operation);
+}
+
+/**
+ * empathy_ft_factory_set_destination_for_incoming_handler:
+ * @factory: an #EmpathyFTFactory
+ * @handler: the #EmpathyFTHandler to set the destination of
+ * @destination: the #GFile destination of the transfer
+ *
+ * Sets @destination as destination file for the transfer. After the call of
+ * this method, the ::new-ft-handler will be emitted for the incoming handler.
+ */
+void
+empathy_ft_factory_set_destination_for_incoming_handler (
+ EmpathyFTFactory *factory,
+ EmpathyFTHandler *handler,
+ GFile *destination)
+{
+ g_return_if_fail (EMPATHY_IS_FT_FACTORY (factory));
+ g_return_if_fail (EMPATHY_IS_FT_HANDLER (handler));
+ g_return_if_fail (G_IS_FILE (destination));
+
+ empathy_ft_handler_incoming_set_destination (handler, destination);
+
+ g_signal_emit (factory, signals[NEW_FT_HANDLER], 0, handler, NULL);
+}
diff --git a/libempathy/empathy-ft-factory.h b/libempathy/empathy-ft-factory.h
new file mode 100644
index 000000000..cffb73301
--- /dev/null
+++ b/libempathy/empathy-ft-factory.h
@@ -0,0 +1,77 @@
+/*
+ * empathy-ft-factory.h - Header for EmpathyFTFactory
+ * Copyright (C) 2009 Collabora Ltd.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Author: Cosimo Cecchi <cosimo.cecchi@collabora.co.uk>
+ */
+
+/* empathy-ft-factory.h */
+
+#ifndef __EMPATHY_FT_FACTORY_H__
+#define __EMPATHY_FT_FACTORY_H__
+
+#include <glib-object.h>
+#include <gio/gio.h>
+
+#include "empathy-contact.h"
+#include "empathy-ft-handler.h"
+#include "empathy-dispatch-operation.h"
+
+G_BEGIN_DECLS
+
+#define EMPATHY_TYPE_FT_FACTORY empathy_ft_factory_get_type()
+#define EMPATHY_FT_FACTORY(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST ((obj), \
+ EMPATHY_TYPE_FT_FACTORY, EmpathyFTFactory))
+#define EMPATHY_FT_FACTORY_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST ((klass), \
+ EMPATHY_TYPE_FT_FACTORY, EmpathyFTFactoryClass))
+#define EMPATHY_IS_FT_FACTORY(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE ((obj), EMPATHY_TYPE_FT_FACTORY))
+#define EMPATHY_IS_FT_FACTORY_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_TYPE ((klass), EMPATHY_TYPE_FT_FACTORY))
+#define EMPATHY_FT_FACTORY_GET_CLASS(obj) \
+ (G_TYPE_INSTANCE_GET_CLASS ((obj), \
+ EMPATHY_TYPE_FT_FACTORY, EmpathyFTFactoryClass))
+
+typedef struct {
+ GObject parent;
+ gpointer priv;
+} EmpathyFTFactory;
+
+typedef struct {
+ GObjectClass parent_class;
+} EmpathyFTFactoryClass;
+
+GType empathy_ft_factory_get_type (void);
+
+/* public methods */
+EmpathyFTFactory* empathy_ft_factory_dup_singleton (void);
+void empathy_ft_factory_new_transfer_outgoing (EmpathyFTFactory *factory,
+ EmpathyContact *contact,
+ GFile *source);
+void empathy_ft_factory_claim_channel (EmpathyFTFactory *factory,
+ EmpathyDispatchOperation *operation);
+void empathy_ft_factory_set_destination_for_incoming_handler (
+ EmpathyFTFactory *factory,
+ EmpathyFTHandler *handler,
+ GFile *destination);
+
+G_END_DECLS
+
+#endif /* __EMPATHY_FT_FACTORY_H__ */
+
diff --git a/libempathy/empathy-ft-handler.c b/libempathy/empathy-ft-handler.c
new file mode 100644
index 000000000..ba81fd4c7
--- /dev/null
+++ b/libempathy/empathy-ft-handler.c
@@ -0,0 +1,1642 @@
+/*
+ * empathy-ft-handler.c - Source for EmpathyFTHandler
+ * Copyright (C) 2009 Collabora Ltd.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Author: Cosimo Cecchi <cosimo.cecchi@collabora.co.uk>
+ */
+
+/* empathy-ft-handler.c */
+
+#include <glib.h>
+#include <glib/gi18n.h>
+#include <telepathy-glib/util.h>
+#include <telepathy-glib/dbus.h>
+
+#include "empathy-ft-handler.h"
+#include "empathy-tp-contact-factory.h"
+#include "empathy-dispatcher.h"
+#include "empathy-marshal.h"
+#include "empathy-time.h"
+#include "empathy-utils.h"
+
+#define DEBUG_FLAG EMPATHY_DEBUG_FT
+#include "empathy-debug.h"
+
+/**
+ * SECTION:empathy-ft-handler
+ * @title: EmpathyFTHandler
+ * @short_description: an object representing a File Transfer
+ * @include: libempathy/empathy-ft-handler
+ *
+ * #EmpathyFTHandler is the object which represents a File Transfer with all
+ * its properties.
+ * The creation of an #EmpathyFTHandler is done with
+ * empathy_ft_handler_new_outgoing() or empathy_ft_handler_new_incoming(),
+ * even though clients should not need to call them directly, as
+ * #EmpathyFTFactory does it for them. Remember that for the file transfer
+ * to work with an incoming handler,
+ * empathy_ft_handler_incoming_set_destination() should be called after
+ * empathy_ft_handler_new_incoming(). #EmpathyFTFactory does this
+ * automatically.
+ * It's important to note that, as the creation of the handlers is async, once
+ * an handler is created, it already has all the interesting properties set,
+ * like filename, total bytes, content type and so on, making it useful
+ * to be displayed in an UI.
+ * The transfer API works like a state machine; it has three signals,
+ * ::transfer-started, ::transfer-progress, ::transfer-done, which will be
+ * emitted in the relevant phases.
+ * In addition, if the handler is created with checksumming enabled,
+ * other three signals (::hashing-started, ::hashing-progress, ::hashing-done)
+ * will be emitted before or after the transfer, depending on the direction
+ * (respectively outgoing and incoming) of the handler.
+ * At any time between the call to empathy_ft_handler_start_transfer() and
+ * the last signal, a ::transfer-error can be emitted, indicating that an
+ * error has happened in the operation. The message of the error is localized
+ * to use in an UI.
+ */
+
+G_DEFINE_TYPE (EmpathyFTHandler, empathy_ft_handler, G_TYPE_OBJECT)
+
+#define GET_PRIV(obj) EMPATHY_GET_PRIV (obj, EmpathyFTHandler)
+
+#define BUFFER_SIZE 4096
+
+enum {
+ PROP_TP_FILE = 1,
+ PROP_G_FILE,
+ PROP_CONTACT,
+ PROP_CONTENT_TYPE,
+ PROP_DESCRIPTION,
+ PROP_FILENAME,
+ PROP_MODIFICATION_TIME,
+ PROP_TOTAL_BYTES,
+ PROP_TRANSFERRED_BYTES
+};
+
+enum {
+ HASHING_STARTED,
+ HASHING_PROGRESS,
+ HASHING_DONE,
+ TRANSFER_STARTED,
+ TRANSFER_PROGRESS,
+ TRANSFER_DONE,
+ TRANSFER_ERROR,
+ LAST_SIGNAL
+};
+
+typedef struct {
+ GInputStream *stream;
+ GError *error /* comment to make the style checker happy */;
+ guchar *buffer;
+ GChecksum *checksum;
+ gssize total_read;
+ guint64 total_bytes;
+ EmpathyFTHandler *handler;
+} HashingData;
+
+typedef struct {
+ EmpathyFTHandlerReadyCallback callback;
+ gpointer user_data;
+ EmpathyFTHandler *handler;
+} CallbacksData;
+
+/* private data */
+typedef struct {
+ gboolean dispose_run;
+
+ GFile *gfile;
+ EmpathyTpFile *tpfile;
+ GCancellable *cancellable;
+ gboolean use_hash;
+
+ EmpathyDispatcher *dispatcher;
+
+ /* request for the new transfer */
+ GHashTable *request;
+
+ /* transfer properties */
+ EmpathyContact *contact;
+ gchar *content_type;
+ gchar *filename;
+ gchar *description;
+ guint64 total_bytes;
+ guint64 transferred_bytes;
+ guint64 mtime;
+ gchar *content_hash;
+ TpFileHashType content_hash_type;
+
+ /* time and speed */
+ gdouble speed;
+ guint remaining_time;
+ time_t last_update_time;
+
+ gboolean is_completed;
+} EmpathyFTHandlerPriv;
+
+static guint signals[LAST_SIGNAL] = { 0 };
+
+static gboolean do_hash_job_incoming (GIOSchedulerJob *job,
+ GCancellable *cancellable, gpointer user_data);
+
+/* GObject implementations */
+static void
+do_get_property (GObject *object,
+ guint property_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ EmpathyFTHandlerPriv *priv = GET_PRIV (object);
+
+ switch (property_id)
+ {
+ case PROP_CONTACT:
+ g_value_set_object (value, priv->contact);
+ break;
+ case PROP_CONTENT_TYPE:
+ g_value_set_string (value, priv->content_type);
+ break;
+ case PROP_DESCRIPTION:
+ g_value_set_string (value, priv->description);
+ break;
+ case PROP_FILENAME:
+ g_value_set_string (value, priv->filename);
+ break;
+ case PROP_MODIFICATION_TIME:
+ g_value_set_uint64 (value, priv->mtime);
+ break;
+ case PROP_TOTAL_BYTES:
+ g_value_set_uint64 (value, priv->total_bytes);
+ break;
+ case PROP_TRANSFERRED_BYTES:
+ g_value_set_uint64 (value, priv->transferred_bytes);
+ break;
+ case PROP_G_FILE:
+ g_value_set_object (value, priv->gfile);
+ break;
+ case PROP_TP_FILE:
+ g_value_set_object (value, priv->tpfile);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+ }
+}
+
+static void
+do_set_property (GObject *object,
+ guint property_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ EmpathyFTHandlerPriv *priv = GET_PRIV (object);
+
+ switch (property_id)
+ {
+ case PROP_CONTACT:
+ priv->contact = g_value_dup_object (value);
+ break;
+ case PROP_CONTENT_TYPE:
+ priv->content_type = g_value_dup_string (value);
+ break;
+ case PROP_DESCRIPTION:
+ priv->description = g_value_dup_string (value);
+ break;
+ case PROP_FILENAME:
+ priv->filename = g_value_dup_string (value);
+ break;
+ case PROP_MODIFICATION_TIME:
+ priv->mtime = g_value_get_uint64 (value);
+ break;
+ case PROP_TOTAL_BYTES:
+ priv->total_bytes = g_value_get_uint64 (value);
+ break;
+ case PROP_TRANSFERRED_BYTES:
+ priv->transferred_bytes = g_value_get_uint64 (value);
+ break;
+ case PROP_G_FILE:
+ priv->gfile = g_value_dup_object (value);
+ break;
+ case PROP_TP_FILE:
+ priv->tpfile = g_value_dup_object (value);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+ }
+}
+
+static void
+do_dispose (GObject *object)
+{
+ EmpathyFTHandlerPriv *priv = GET_PRIV (object);
+
+ if (priv->dispose_run)
+ return;
+
+ priv->dispose_run = TRUE;
+
+ if (priv->contact != NULL) {
+ g_object_unref (priv->contact);
+ priv->contact = NULL;
+ }
+
+ if (priv->gfile != NULL) {
+ g_object_unref (priv->gfile);
+ priv->gfile = NULL;
+ }
+
+ if (priv->tpfile != NULL) {
+ empathy_tp_file_close (priv->tpfile);
+ g_object_unref (priv->tpfile);
+ priv->tpfile = NULL;
+ }
+
+ if (priv->cancellable != NULL) {
+ g_object_unref (priv->cancellable);
+ priv->cancellable = NULL;
+ }
+
+ if (priv->request != NULL)
+ {
+ g_hash_table_unref (priv->request);
+ priv->request = NULL;
+ }
+
+ if (priv->dispatcher != NULL)
+ {
+ g_object_unref (priv->dispatcher);
+ priv->dispatcher = NULL;
+ }
+
+ G_OBJECT_CLASS (empathy_ft_handler_parent_class)->dispose (object);
+}
+
+static void
+do_finalize (GObject *object)
+{
+ EmpathyFTHandlerPriv *priv = GET_PRIV (object);
+
+ DEBUG ("%p", object);
+
+ g_free (priv->content_type);
+ priv->content_type = NULL;
+
+ g_free (priv->filename);
+ priv->filename = NULL;
+
+ g_free (priv->description);
+ priv->description = NULL;
+
+ g_free (priv->content_hash);
+ priv->content_hash = NULL;
+
+ G_OBJECT_CLASS (empathy_ft_handler_parent_class)->finalize (object);
+}
+
+static void
+empathy_ft_handler_class_init (EmpathyFTHandlerClass *klass)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
+ GParamSpec *param_spec;
+
+ g_type_class_add_private (klass, sizeof (EmpathyFTHandlerPriv));
+
+ object_class->get_property = do_get_property;
+ object_class->set_property = do_set_property;
+ object_class->dispose = do_dispose;
+ object_class->finalize = do_finalize;
+
+ /* properties */
+
+ /**
+ * EmpathyFTHandler:contact:
+ *
+ * The remote #EmpathyContact for the transfer
+ */
+ param_spec = g_param_spec_object ("contact",
+ "contact", "The remote contact",
+ EMPATHY_TYPE_CONTACT,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_CONSTRUCT_ONLY);
+ g_object_class_install_property (object_class, PROP_CONTACT, param_spec);
+
+ /**
+ * EmpathyFTHandler:content-type:
+ *
+ * The content type of the file being transferred
+ */
+ param_spec = g_param_spec_string ("content-type",
+ "content-type", "The content type of the file", NULL,
+ G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
+ g_object_class_install_property (object_class,
+ PROP_CONTENT_TYPE, param_spec);
+
+ /**
+ * EmpathyFTHandler:description:
+ *
+ * The description of the file being transferred
+ */
+ param_spec = g_param_spec_string ("description",
+ "description", "The description of the file", NULL,
+ G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
+ g_object_class_install_property (object_class,
+ PROP_DESCRIPTION, param_spec);
+
+ /**
+ * EmpathyFTHandler:filename:
+ *
+ * The name of the file being transferred
+ */
+ param_spec = g_param_spec_string ("filename",
+ "filename", "The name of the file", NULL,
+ G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
+ g_object_class_install_property (object_class,
+ PROP_FILENAME, param_spec);
+
+ /**
+ * EmpathyFTHandler:modification-time:
+ *
+ * The modification time of the file being transferred
+ */
+ param_spec = g_param_spec_uint64 ("modification-time",
+ "modification-time", "The mtime of the file", 0,
+ G_MAXUINT64, 0, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
+ g_object_class_install_property (object_class,
+ PROP_MODIFICATION_TIME, param_spec);
+
+ /**
+ * EmpathyFTHandler:total-bytes:
+ *
+ * The size (in bytes) of the file being transferred
+ */
+ param_spec = g_param_spec_uint64 ("total-bytes",
+ "total-bytes", "The size of the file", 0,
+ G_MAXUINT64, 0, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
+ g_object_class_install_property (object_class,
+ PROP_TOTAL_BYTES, param_spec);
+
+ /**
+ * EmpathyFTHandler:transferred-bytes:
+ *
+ * The number of the bytes already transferred
+ */
+ param_spec = g_param_spec_uint64 ("transferred-bytes",
+ "transferred-bytes", "The number of bytes already transferred", 0,
+ G_MAXUINT64, 0, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
+ g_object_class_install_property (object_class,
+ PROP_TRANSFERRED_BYTES, param_spec);
+
+ /**
+ * EmpathyFTHandler:gfile:
+ *
+ * The #GFile object where the transfer actually happens
+ */
+ param_spec = g_param_spec_object ("gfile",
+ "gfile", "The GFile we're handling",
+ G_TYPE_FILE,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
+ g_object_class_install_property (object_class, PROP_G_FILE, param_spec);
+
+ /**
+ * EmpathyFTHandler:tp-file:
+ *
+ * The underlying #EmpathyTpFile managing the transfer
+ */
+ param_spec = g_param_spec_object ("tp-file",
+ "tp-file", "The file's channel wrapper",
+ EMPATHY_TYPE_TP_FILE,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_CONSTRUCT_ONLY);
+ g_object_class_install_property (object_class, PROP_TP_FILE, param_spec);
+
+ /* signals */
+
+ /**
+ * EmpathyFTHandler::transfer-started
+ * @handler: the object which has received the signal
+ * @tp_file: the #EmpathyTpFile for which the transfer has started
+ *
+ * This signal is emitted when the actual transfer starts.
+ */
+ signals[TRANSFER_STARTED] =
+ g_signal_new ("transfer-started", G_TYPE_FROM_CLASS (klass),
+ G_SIGNAL_RUN_LAST, 0, NULL, NULL,
+ g_cclosure_marshal_VOID__OBJECT,
+ G_TYPE_NONE,
+ 1, EMPATHY_TYPE_TP_FILE);
+
+ /**
+ * EmpathyFTHandler::transfer-done
+ * @handler: the object which has received the signal
+ * @tp_file: the #EmpathyTpFile for which the transfer has started
+ *
+ * This signal will be emitted when the actual transfer is completed
+ * successfully.
+ */
+ signals[TRANSFER_DONE] =
+ g_signal_new ("transfer-done", G_TYPE_FROM_CLASS (klass),
+ G_SIGNAL_RUN_LAST, 0, NULL, NULL,
+ g_cclosure_marshal_VOID__OBJECT,
+ G_TYPE_NONE,
+ 1, EMPATHY_TYPE_TP_FILE);
+
+ /**
+ * EmpathyFTHandler::transfer-error
+ * @handler: the object which has received the signal
+ * @error: a #GError
+ *
+ * This signal can be emitted anytime between the call to
+ * empathy_ft_handler_start_transfer() and the last expected signal
+ * (::transfer-done or ::hashing-done), and it's guaranteed to be the last
+ * signal coming from the handler, meaning that no other operation will
+ * take place after this signal.
+ */
+ signals[TRANSFER_ERROR] =
+ g_signal_new ("transfer-error", G_TYPE_FROM_CLASS (klass),
+ G_SIGNAL_RUN_LAST, 0, NULL, NULL,
+ g_cclosure_marshal_VOID__POINTER,
+ G_TYPE_NONE,
+ 1, G_TYPE_POINTER);
+
+ /**
+ * EmpathyFTHandler::transfer-progress
+ * @handler: the object which has received the signal
+ * @current_bytes: the bytes currently transferred
+ * @total_bytes: the total bytes of the handler
+ * @remaining_time: the number of seconds remaining for the transfer
+ * to be completed
+ * @speed: the current speed of the transfer (in KB/s)
+ *
+ * This signal is emitted to notify clients of the progress of the
+ * transfer.
+ */
+ signals[TRANSFER_PROGRESS] =
+ g_signal_new ("transfer-progress", G_TYPE_FROM_CLASS (klass),
+ G_SIGNAL_RUN_LAST, 0, NULL, NULL,
+ _empathy_marshal_VOID__UINT64_UINT64_UINT_DOUBLE,
+ G_TYPE_NONE,
+ 4, G_TYPE_UINT64, G_TYPE_UINT64, G_TYPE_UINT, G_TYPE_DOUBLE);
+
+ /**
+ * EmpathyFTHandler::hashing-started
+ * @handler: the object which has received the signal
+ *
+ * This signal is emitted when the hashing operation of the handler
+ * is started. Note that this might happen or not, depending on the CM
+ * and remote contact capabilities. Clients shoud use
+ * empathy_ft_handler_get_use_hash() before calling
+ * empathy_ft_handler_start_transfer() to know whether they should connect
+ * to this signal.
+ */
+ signals[HASHING_STARTED] =
+ g_signal_new ("hashing-started", G_TYPE_FROM_CLASS (klass),
+ G_SIGNAL_RUN_LAST, 0, NULL, NULL,
+ g_cclosure_marshal_VOID__VOID,
+ G_TYPE_NONE, 0);
+
+ /**
+ * EmpathyFTHandler::hashing-progress
+ * @handler: the object which has received the signal
+ * @current_bytes: the bytes currently hashed
+ * @total_bytes: the total bytes of the handler
+ *
+ * This signal is emitted to notify clients of the progress of the
+ * hashing operation.
+ */
+ signals[HASHING_PROGRESS] =
+ g_signal_new ("hashing-progress", G_TYPE_FROM_CLASS (klass),
+ G_SIGNAL_RUN_LAST, 0, NULL, NULL,
+ _empathy_marshal_VOID__UINT64_UINT64,
+ G_TYPE_NONE,
+ 2, G_TYPE_UINT64, G_TYPE_UINT64);
+
+ /**
+ * EmpathyFTHandler::hashing-done
+ * @handler: the object which has received the signal
+ *
+ * This signal is emitted when the hashing operation of the handler
+ * is completed.
+ */
+ signals[HASHING_DONE] =
+ g_signal_new ("hashing-done", G_TYPE_FROM_CLASS (klass),
+ G_SIGNAL_RUN_LAST, 0, NULL, NULL,
+ g_cclosure_marshal_VOID__VOID,
+ G_TYPE_NONE, 0);
+}
+
+static void
+empathy_ft_handler_init (EmpathyFTHandler *self)
+{
+ EmpathyFTHandlerPriv *priv = G_TYPE_INSTANCE_GET_PRIVATE (self,
+ EMPATHY_TYPE_FT_HANDLER, EmpathyFTHandlerPriv);
+
+ self->priv = priv;
+ priv->cancellable = g_cancellable_new ();
+ priv->dispatcher = empathy_dispatcher_dup_singleton ();
+}
+
+/* private functions */
+
+static void
+hash_data_free (HashingData *data)
+{
+ g_free (data->buffer);
+
+ if (data->stream != NULL)
+ g_object_unref (data->stream);
+
+ if (data->checksum != NULL)
+ g_checksum_free (data->checksum);
+
+ if (data->error != NULL)
+ g_error_free (data->error);
+
+ if (data->handler != NULL)
+ g_object_unref (data->handler);
+
+ g_slice_free (HashingData, data);
+}
+
+static GChecksumType
+tp_file_hash_to_g_checksum (TpFileHashType type)
+{
+ GChecksumType retval;
+
+ switch (type)
+ {
+ case TP_FILE_HASH_TYPE_MD5:
+ retval = G_CHECKSUM_MD5;
+ break;
+ case TP_FILE_HASH_TYPE_SHA1:
+ retval = G_CHECKSUM_SHA1;
+ break;
+ case TP_FILE_HASH_TYPE_SHA256:
+ retval = G_CHECKSUM_SHA256;
+ break;
+ default:
+ g_assert_not_reached ();
+ break;
+ }
+
+ return retval;
+}
+
+static void
+check_hash_incoming (EmpathyFTHandler *handler)
+{
+ HashingData *hash_data;
+ EmpathyFTHandlerPriv *priv = GET_PRIV (handler);
+
+ if (!EMP_STR_EMPTY (priv->content_hash))
+ {
+ hash_data = g_slice_new0 (HashingData);
+ hash_data->total_bytes = priv->total_bytes;
+ hash_data->handler = g_object_ref (handler);
+ hash_data->checksum = g_checksum_new
+ (tp_file_hash_to_g_checksum (priv->content_hash_type));
+
+ g_signal_emit (handler, signals[HASHING_STARTED], 0);
+
+ g_io_scheduler_push_job (do_hash_job_incoming, hash_data, NULL,
+ G_PRIORITY_DEFAULT, priv->cancellable);
+ }
+}
+
+static void
+emit_error_signal (EmpathyFTHandler *handler,
+ const GError *error)
+{
+ EmpathyFTHandlerPriv *priv = GET_PRIV (handler);
+
+ if (!g_cancellable_is_cancelled (priv->cancellable))
+ g_cancellable_cancel (priv->cancellable);
+
+ g_signal_emit (handler, signals[TRANSFER_ERROR], 0, error);
+}
+
+static void
+ft_transfer_operation_callback (EmpathyTpFile *tp_file,
+ const GError *error,
+ gpointer user_data)
+{
+ EmpathyFTHandler *handler = user_data;
+ EmpathyFTHandlerPriv *priv = GET_PRIV (handler);
+
+ DEBUG ("Transfer operation callback, error %p", error);
+
+ if (error != NULL)
+ {
+ emit_error_signal (handler, error);
+ }
+ else
+ {
+ priv->is_completed = TRUE;
+ g_signal_emit (handler, signals[TRANSFER_DONE], 0, tp_file);
+
+ empathy_tp_file_close (tp_file);
+
+ if (empathy_ft_handler_is_incoming (handler) && priv->use_hash)
+ {
+ check_hash_incoming (handler);
+ }
+ }
+}
+
+static void
+update_remaining_time_and_speed (EmpathyFTHandler *handler,
+ guint64 transferred_bytes)
+{
+ EmpathyFTHandlerPriv *priv = GET_PRIV (handler);
+ time_t elapsed_time, current_time;
+ guint64 transferred, last_transferred_bytes;
+ gdouble speed;
+ gint remaining_time;
+
+ last_transferred_bytes = priv->transferred_bytes;
+ priv->transferred_bytes = transferred_bytes;
+
+ current_time = empathy_time_get_current ();
+ elapsed_time = current_time - priv->last_update_time;
+
+ if (elapsed_time >= 1)
+ {
+ transferred = transferred_bytes - last_transferred_bytes;
+ speed = (gdouble) transferred / (gdouble) elapsed_time;
+ remaining_time = (priv->total_bytes - priv->transferred_bytes) / speed;
+ priv->speed = speed;
+ priv->remaining_time = remaining_time;
+ priv->last_update_time = current_time;
+ }
+}
+
+static void
+ft_transfer_progress_callback (EmpathyTpFile *tp_file,
+ guint64 transferred_bytes,
+ gpointer user_data)
+{
+ EmpathyFTHandler *handler = user_data;
+ EmpathyFTHandlerPriv *priv = GET_PRIV (handler);
+
+ if (empathy_ft_handler_is_cancelled (handler))
+ return;
+
+ if (transferred_bytes == 0)
+ {
+ priv->last_update_time = empathy_time_get_current ();
+ g_signal_emit (handler, signals[TRANSFER_STARTED], 0, tp_file);
+ }
+
+ if (priv->transferred_bytes != transferred_bytes)
+ {
+ update_remaining_time_and_speed (handler, transferred_bytes);
+
+ g_signal_emit (handler, signals[TRANSFER_PROGRESS], 0,
+ transferred_bytes, priv->total_bytes, priv->remaining_time,
+ priv->speed);
+ }
+}
+
+static void
+ft_handler_create_channel_cb (EmpathyDispatchOperation *operation,
+ const GError *error,
+ gpointer user_data)
+{
+ EmpathyFTHandler *handler = user_data;
+ EmpathyFTHandlerPriv *priv = GET_PRIV (handler);
+ GError *my_error = (GError *) error;
+
+ DEBUG ("Dispatcher create channel CB");
+
+ if (my_error == NULL)
+ {
+ g_cancellable_set_error_if_cancelled (priv->cancellable, &my_error);
+ }
+
+ if (my_error != NULL)
+ {
+ emit_error_signal (handler, my_error);
+
+ if (my_error != error)
+ g_clear_error (&my_error);
+
+ return;
+ }
+
+ priv->tpfile = g_object_ref
+ (empathy_dispatch_operation_get_channel_wrapper (operation));
+
+ empathy_tp_file_offer (priv->tpfile, priv->gfile, priv->cancellable,
+ ft_transfer_progress_callback, handler,
+ ft_transfer_operation_callback, handler);
+
+ empathy_dispatch_operation_claim (operation);
+}
+
+static void
+ft_handler_push_to_dispatcher (EmpathyFTHandler *handler)
+{
+ TpConnection *connection;
+ EmpathyFTHandlerPriv *priv = GET_PRIV (handler);
+
+ DEBUG ("Pushing request to the dispatcher");
+
+ connection = empathy_contact_get_connection (priv->contact);
+
+ /* I want to own a reference to the request, and destroy it later */
+ empathy_dispatcher_create_channel (priv->dispatcher, connection,
+ g_hash_table_ref (priv->request), ft_handler_create_channel_cb, handler);
+}
+
+static void
+ft_handler_populate_outgoing_request (EmpathyFTHandler *handler)
+{
+ guint contact_handle;
+ GHashTable *request;
+ GValue *value;
+ EmpathyFTHandlerPriv *priv = GET_PRIV (handler);
+
+ request = priv->request = g_hash_table_new_full (g_str_hash, g_str_equal,
+ NULL, (GDestroyNotify) tp_g_value_slice_free);
+
+ contact_handle = empathy_contact_get_handle (priv->contact);
+
+ /* org.freedesktop.Telepathy.Channel.ChannelType */
+ value = tp_g_value_slice_new_string (TP_IFACE_CHANNEL_TYPE_FILE_TRANSFER);
+ g_hash_table_insert (request, TP_IFACE_CHANNEL ".ChannelType", value);
+
+ /* org.freedesktop.Telepathy.Channel.TargetHandleType */
+ value = tp_g_value_slice_new_uint (TP_HANDLE_TYPE_CONTACT);
+ g_hash_table_insert (request, TP_IFACE_CHANNEL ".TargetHandleType", value);
+
+ /* org.freedesktop.Telepathy.Channel.TargetHandle */
+ value = tp_g_value_slice_new_uint (contact_handle);
+ g_hash_table_insert (request, TP_IFACE_CHANNEL ".TargetHandle", value);
+
+ /* org.freedesktop.Telepathy.Channel.Type.FileTransfer.ContentType */
+ value = tp_g_value_slice_new_string (priv->content_type);
+ g_hash_table_insert (request,
+ TP_IFACE_CHANNEL_TYPE_FILE_TRANSFER ".ContentType", value);
+
+ /* org.freedesktop.Telepathy.Channel.Type.FileTransfer.Filename */
+ value = tp_g_value_slice_new_string (priv->filename);
+ g_hash_table_insert (request,
+ TP_IFACE_CHANNEL_TYPE_FILE_TRANSFER ".Filename", value);
+
+ /* org.freedesktop.Telepathy.Channel.Type.FileTransfer.Size */
+ value = tp_g_value_slice_new_uint64 (priv->total_bytes);
+ g_hash_table_insert (request,
+ TP_IFACE_CHANNEL_TYPE_FILE_TRANSFER ".Size", value);
+
+ /* org.freedesktop.Telepathy.Channel.Type.FileTransfer.Date */
+ value = tp_g_value_slice_new_uint64 ((guint64) priv->mtime);
+ g_hash_table_insert (request,
+ TP_IFACE_CHANNEL_TYPE_FILE_TRANSFER ".Date", value);
+}
+
+static gboolean
+hash_job_done (gpointer user_data)
+{
+ HashingData *hash_data = user_data;
+ EmpathyFTHandler *handler = hash_data->handler;
+ EmpathyFTHandlerPriv *priv;
+ GError *error = NULL;
+ GValue *value;
+
+ DEBUG ("Closing stream after hashing.");
+
+ priv = GET_PRIV (handler);
+
+ if (hash_data->error != NULL)
+ {
+ error = hash_data->error;
+ goto cleanup;
+ }
+
+ DEBUG ("Got file hash %s", g_checksum_get_string (hash_data->checksum));
+
+ if (empathy_ft_handler_is_incoming (handler))
+ {
+ if (g_strcmp0 (g_checksum_get_string (hash_data->checksum),
+ priv->content_hash))
+ {
+ DEBUG ("Hash mismatch when checking incoming handler: "
+ "received %s, calculated %s", priv->content_hash,
+ g_checksum_get_string (hash_data->checksum));
+
+ error = g_error_new_literal (EMPATHY_FT_ERROR_QUARK,
+ EMPATHY_FT_ERROR_HASH_MISMATCH,
+ _("The hash of the received file and the "
+ "sent one do not match"));
+ goto cleanup;
+ }
+ else
+ {
+ DEBUG ("Hash verification matched, received %s, calculated %s",
+ priv->content_hash,
+ g_checksum_get_string (hash_data->checksum));
+ }
+ }
+ else
+ {
+ /* set the checksum in the request...
+ * org.freedesktop.Telepathy.Channel.Type.FileTransfer.ContentHash
+ */
+ value = tp_g_value_slice_new_string
+ (g_checksum_get_string (hash_data->checksum));
+ g_hash_table_insert (priv->request,
+ TP_IFACE_CHANNEL_TYPE_FILE_TRANSFER ".ContentHash", value);
+ }
+
+cleanup:
+
+ if (error != NULL)
+ {
+ emit_error_signal (handler, error);
+ g_clear_error (&error);
+ }
+ else
+ {
+ g_signal_emit (handler, signals[HASHING_DONE], 0);
+
+ if (!empathy_ft_handler_is_incoming (handler))
+ /* the request is complete now, push it to the dispatcher */
+ ft_handler_push_to_dispatcher (handler);
+ }
+
+ hash_data_free (hash_data);
+
+ return FALSE;
+}
+
+static gboolean
+emit_hashing_progress (gpointer user_data)
+{
+ HashingData *hash_data = user_data;
+
+ g_signal_emit (hash_data->handler, signals[HASHING_PROGRESS], 0,
+ (guint64) hash_data->total_read, (guint64) hash_data->total_bytes);
+
+ return FALSE;
+}
+
+static gboolean
+do_hash_job (GIOSchedulerJob *job,
+ GCancellable *cancellable,
+ gpointer user_data)
+{
+ HashingData *hash_data = user_data;
+ gssize bytes_read;
+ EmpathyFTHandlerPriv *priv;
+ GError *error = NULL;
+
+ priv = GET_PRIV (hash_data->handler);
+
+again:
+ if (hash_data->buffer == NULL)
+ hash_data->buffer = g_malloc0 (BUFFER_SIZE);
+
+ bytes_read = g_input_stream_read (hash_data->stream, hash_data->buffer,
+ BUFFER_SIZE, cancellable, &error);
+ if (error != NULL)
+ goto out;
+
+ hash_data->total_read += bytes_read;
+
+ /* we now have the chunk */
+ if (bytes_read > 0)
+ {
+ g_checksum_update (hash_data->checksum, hash_data->buffer, bytes_read);
+ g_io_scheduler_job_send_to_mainloop_async (job, emit_hashing_progress,
+ hash_data, NULL);
+
+ g_free (hash_data->buffer);
+ hash_data->buffer = NULL;
+
+ goto again;
+ }
+ else
+ {
+ g_input_stream_close (hash_data->stream, cancellable, &error);
+ }
+
+out:
+ if (error != NULL)
+ hash_data->error = error;
+
+ g_io_scheduler_job_send_to_mainloop_async (job, hash_job_done,
+ hash_data, NULL);
+
+ return FALSE;
+}
+
+static gboolean
+do_hash_job_incoming (GIOSchedulerJob *job,
+ GCancellable *cancellable,
+ gpointer user_data)
+{
+ HashingData *hash_data = user_data;
+ EmpathyFTHandler *handler = hash_data->handler;
+ EmpathyFTHandlerPriv *priv = GET_PRIV (handler);
+ GError *error = NULL;
+
+ DEBUG ("checking integrity for incoming handler");
+
+ /* need to get the stream first */
+ hash_data->stream =
+ G_INPUT_STREAM (g_file_read (priv->gfile, cancellable, &error));
+
+ if (error != NULL)
+ {
+ hash_data->error = error;
+ g_io_scheduler_job_send_to_mainloop_async (job, hash_job_done,
+ hash_data, NULL);
+ return FALSE;
+ }
+
+ return do_hash_job (job, cancellable, user_data);
+}
+
+static void
+ft_handler_read_async_cb (GObject *source,
+ GAsyncResult *res,
+ gpointer user_data)
+{
+ GFileInputStream *stream;
+ GError *error = NULL;
+ HashingData *hash_data;
+ GValue *value;
+ EmpathyFTHandler *handler = user_data;
+ EmpathyFTHandlerPriv *priv = GET_PRIV (handler);
+
+ DEBUG ("GFile read async CB.");
+
+ stream = g_file_read_finish (priv->gfile, res, &error);
+ if (error != NULL)
+ {
+ emit_error_signal (handler, error);
+ g_clear_error (&error);
+
+ return;
+ }
+
+ hash_data = g_slice_new0 (HashingData);
+ hash_data->stream = G_INPUT_STREAM (stream);
+ hash_data->total_bytes = priv->total_bytes;
+ hash_data->handler = g_object_ref (handler);
+ /* FIXME: MD5 is the only ContentHashType supported right now */
+ hash_data->checksum = g_checksum_new (G_CHECKSUM_MD5);
+
+ /* org.freedesktop.Telepathy.Channel.Type.FileTransfer.ContentHashType */
+ value = tp_g_value_slice_new_uint (TP_FILE_HASH_TYPE_MD5);
+ g_hash_table_insert (priv->request,
+ TP_IFACE_CHANNEL_TYPE_FILE_TRANSFER ".ContentHashType", value);
+
+ g_signal_emit (handler, signals[HASHING_STARTED], 0);
+
+ g_io_scheduler_push_job (do_hash_job, hash_data, NULL,
+ G_PRIORITY_DEFAULT, priv->cancellable);
+}
+
+static void
+callbacks_data_free (gpointer user_data)
+{
+ CallbacksData *data = user_data;
+
+ if (data->handler != NULL)
+ g_object_unref (data->handler);
+
+ g_slice_free (CallbacksData, data);
+}
+
+static void
+set_content_hash_type_from_classes (EmpathyFTHandler *handler,
+ GList *classes)
+{
+ GValueArray *class;
+ GValue *v;
+ GList *l;
+ GArray *possible_values;
+ guint value;
+ GHashTable *fprops;
+ gboolean valid;
+ EmpathyFTHandlerPriv *priv = GET_PRIV (handler);
+
+ possible_values = g_array_new (TRUE, TRUE, sizeof (guint));
+
+ for (l = classes; l != NULL; l = l->next)
+ {
+ class = l->data;
+ v = g_value_array_get_nth (class, 0);
+ fprops = g_value_get_boxed (v);
+
+ value = tp_asv_get_uint32
+ (fprops, TP_IFACE_CHANNEL_TYPE_FILE_TRANSFER ".ContentHashType",
+ &valid);
+
+ if (valid)
+ g_array_append_val (possible_values, value);
+ }
+
+ if (possible_values->len == 0)
+ {
+ /* there are no channel classes with hash support, disable it. */
+ priv->use_hash = FALSE;
+ priv->content_hash_type = TP_FILE_HASH_TYPE_NONE;
+
+ goto out;
+ }
+
+ priv->use_hash = TRUE;
+
+ if (possible_values->len == 1)
+ {
+ priv->content_hash_type = g_array_index (possible_values, guint, 0);
+ }
+ else
+ {
+ /* order the array and pick the first non zero, so that MD5
+ * is the preferred value.
+ */
+ g_array_sort (possible_values, empathy_uint_compare);
+
+ if (g_array_index (possible_values, guint, 0) == 0)
+ priv->content_hash_type = g_array_index (possible_values, guint, 1);
+ else
+ priv->content_hash_type = g_array_index (possible_values, guint, 0);
+ }
+
+out:
+ g_array_free (possible_values, TRUE);
+
+ DEBUG ("Hash enabled %s; setting content hash type as %u",
+ priv->use_hash ? "True" : "False", priv->content_hash_type);
+}
+
+static void
+find_ft_channel_classes_cb (GList *channel_classes,
+ gpointer user_data)
+{
+ CallbacksData *data = user_data;
+ EmpathyFTHandler *handler = data->handler;
+ EmpathyFTHandlerPriv *priv = GET_PRIV (handler);
+ GError *myerr = NULL;
+
+ if (channel_classes == NULL)
+ {
+ g_set_error_literal (&myerr, EMPATHY_FT_ERROR_QUARK,
+ EMPATHY_FT_ERROR_NOT_SUPPORTED,
+ _("File transfer not supported by remote contact"));
+
+ if (!g_cancellable_is_cancelled (priv->cancellable))
+ g_cancellable_cancel (priv->cancellable);
+
+ data->callback (handler, myerr, data->user_data);
+ g_clear_error (&myerr);
+ }
+ else
+ {
+ /* set whether we support hash and the type of it */
+ set_content_hash_type_from_classes (handler, channel_classes);
+
+ /* get back to the caller now */
+ data->callback (handler, NULL, data->user_data);
+ }
+
+ callbacks_data_free (data);
+}
+
+static void
+ft_handler_complete_request (EmpathyFTHandler *handler)
+{
+ EmpathyFTHandlerPriv *priv = GET_PRIV (handler);
+
+ /* populate the request table with all the known properties */
+ ft_handler_populate_outgoing_request (handler);
+
+ if (priv->use_hash)
+ /* start hashing the file */
+ g_file_read_async (priv->gfile, G_PRIORITY_DEFAULT,
+ priv->cancellable, ft_handler_read_async_cb, handler);
+ else
+ /* push directly the handler to the dispatcher */
+ ft_handler_push_to_dispatcher (handler);
+}
+
+static void
+ft_handler_gfile_ready_cb (GObject *source,
+ GAsyncResult *res,
+ CallbacksData *cb_data)
+{
+ GFileInfo *info;
+ GError *error = NULL;
+ GTimeVal mtime;
+ EmpathyFTHandlerPriv *priv = GET_PRIV (cb_data->handler);
+
+ DEBUG ("Got GFileInfo.");
+
+ info = g_file_query_info_finish (priv->gfile, res, &error);
+
+ if (error != NULL)
+ goto out;
+
+ priv->content_type = g_strdup (g_file_info_get_content_type (info));
+ priv->filename = g_strdup (g_file_info_get_display_name (info));
+ priv->total_bytes = g_file_info_get_size (info);
+ g_file_info_get_modification_time (info, &mtime);
+ priv->mtime = mtime.tv_sec;
+ priv->transferred_bytes = 0;
+ priv->description = NULL;
+
+ g_object_unref (info);
+
+out:
+ if (error != NULL)
+ {
+ if (!g_cancellable_is_cancelled (priv->cancellable))
+ g_cancellable_cancel (priv->cancellable);
+
+ cb_data->callback (cb_data->handler, error, cb_data->user_data);
+ g_error_free (error);
+
+ callbacks_data_free (cb_data);
+ }
+ else
+ {
+ /* see if FT/hashing are allowed */
+ empathy_dispatcher_find_requestable_channel_classes_async
+ (priv->dispatcher, empathy_contact_get_connection (priv->contact),
+ TP_IFACE_CHANNEL_TYPE_FILE_TRANSFER, TP_HANDLE_TYPE_CONTACT,
+ find_ft_channel_classes_cb, cb_data,
+ TP_IFACE_CHANNEL_TYPE_FILE_TRANSFER ".ContentHashType", NULL);
+ }
+}
+
+static void
+contact_factory_contact_cb (EmpathyTpContactFactory *factory,
+ EmpathyContact *contact,
+ const GError *error,
+ gpointer user_data,
+ GObject *weak_object)
+{
+ CallbacksData *cb_data = user_data;
+ EmpathyFTHandler *handler = EMPATHY_FT_HANDLER (weak_object);
+ EmpathyFTHandlerPriv *priv = GET_PRIV (handler);
+
+ if (error != NULL)
+ {
+ if (!g_cancellable_is_cancelled (priv->cancellable))
+ g_cancellable_cancel (priv->cancellable);
+
+ cb_data->callback (handler, (GError *) error, cb_data->user_data);
+ callbacks_data_free (cb_data);
+ return;
+ }
+
+ priv->contact = contact;
+
+ cb_data->callback (handler, NULL, cb_data->user_data);
+}
+
+static void
+channel_get_all_properties_cb (TpProxy *proxy,
+ GHashTable *properties,
+ const GError *error,
+ gpointer user_data,
+ GObject *weak_object)
+{
+ CallbacksData *cb_data = user_data;
+ EmpathyFTHandler *handler = EMPATHY_FT_HANDLER (weak_object);
+ EmpathyFTHandlerPriv *priv = GET_PRIV (handler);
+ EmpathyTpContactFactory *c_factory;
+ TpHandle c_handle;
+
+ if (error != NULL)
+ {
+ if (!g_cancellable_is_cancelled (priv->cancellable))
+ g_cancellable_cancel (priv->cancellable);
+
+ cb_data->callback (handler, (GError *) error, cb_data->user_data);
+
+ callbacks_data_free (cb_data);
+ return;
+ }
+
+ priv->total_bytes = g_value_get_uint64 (
+ g_hash_table_lookup (properties, "Size"));
+
+ priv->transferred_bytes = g_value_get_uint64 (
+ g_hash_table_lookup (properties, "TransferredBytes"));
+
+ priv->filename = g_value_dup_string (
+ g_hash_table_lookup (properties, "Filename"));
+
+ priv->content_hash = g_value_dup_string (
+ g_hash_table_lookup (properties, "ContentHash"));
+
+ priv->content_hash_type = g_value_get_uint (
+ g_hash_table_lookup (properties, "ContentHashType"));
+
+ priv->content_type = g_value_dup_string (
+ g_hash_table_lookup (properties, "ContentType"));
+
+ priv->description = g_value_dup_string (
+ g_hash_table_lookup (properties, "Description"));
+
+ c_factory = empathy_tp_contact_factory_dup_singleton
+ (tp_channel_borrow_connection (TP_CHANNEL (proxy)));
+ c_handle = tp_channel_get_handle (TP_CHANNEL (proxy), NULL);
+ empathy_tp_contact_factory_get_from_handle (c_factory, c_handle,
+ contact_factory_contact_cb, cb_data, callbacks_data_free,
+ G_OBJECT (handler));
+
+ g_object_unref (c_factory);
+}
+
+/* public methods */
+
+/**
+ * empathy_ft_handler_new_outgoing:
+ * @contact: the #EmpathyContact to send @source to
+ * @source: the #GFile to send
+ * @callback: callback to be called when the handler has been created
+ * @user_data: user data to be passed to @callback
+ *
+ * Triggers the creation of a new #EmpathyFTHandler for an outgoing transfer.
+ */
+void
+empathy_ft_handler_new_outgoing (EmpathyContact *contact,
+ GFile *source,
+ EmpathyFTHandlerReadyCallback callback,
+ gpointer user_data)
+{
+ EmpathyFTHandler *handler;
+ CallbacksData *data;
+ EmpathyFTHandlerPriv *priv;
+
+ DEBUG ("New handler outgoing");
+
+ g_return_if_fail (EMPATHY_IS_CONTACT (contact));
+ g_return_if_fail (G_IS_FILE (source));
+
+ handler = g_object_new (EMPATHY_TYPE_FT_HANDLER,
+ "contact", contact, "gfile", source, NULL);
+
+ priv = GET_PRIV (handler);
+
+ data = g_slice_new0 (CallbacksData);
+ data->callback = callback;
+ data->user_data = user_data;
+ data->handler = g_object_ref (handler);
+
+ /* start collecting info about the file */
+ g_file_query_info_async (priv->gfile,
+ G_FILE_ATTRIBUTE_STANDARD_DISPLAY_NAME ","
+ G_FILE_ATTRIBUTE_STANDARD_SIZE ","
+ G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE ","
+ G_FILE_ATTRIBUTE_TIME_MODIFIED,
+ G_FILE_QUERY_INFO_NONE, G_PRIORITY_DEFAULT,
+ NULL, (GAsyncReadyCallback) ft_handler_gfile_ready_cb, data);
+}
+
+/**
+ * empathy_ft_handler_new_incoming:
+ * @tp_file: the #EmpathyTpFile wrapping the incoming channel
+ * @callback: callback to be called when the handler has been created
+ * @user_data: user data to be passed to @callback
+ *
+ * Triggers the creation of a new #EmpathyFTHandler for an incoming transfer.
+ * Note that for the handler to be useful, you will have to set a destination
+ * file with empathy_ft_handler_incoming_set_destination() after the handler
+ * is ready.
+ */
+void
+empathy_ft_handler_new_incoming (EmpathyTpFile *tp_file,
+ EmpathyFTHandlerReadyCallback callback,
+ gpointer user_data)
+{
+ EmpathyFTHandler *handler;
+ TpChannel *channel;
+ CallbacksData *data;
+
+ g_return_if_fail (EMPATHY_IS_TP_FILE (tp_file));
+
+ handler = g_object_new (EMPATHY_TYPE_FT_HANDLER,
+ "tp-file", tp_file, NULL);
+
+ g_object_get (tp_file, "channel", &channel, NULL);
+
+ data = g_slice_new0 (CallbacksData);
+ data->callback = callback;
+ data->user_data = user_data;
+ data->handler = g_object_ref (handler);
+
+ tp_cli_dbus_properties_call_get_all (channel,
+ -1, TP_IFACE_CHANNEL_TYPE_FILE_TRANSFER,
+ channel_get_all_properties_cb, data, NULL, G_OBJECT (handler));
+}
+
+/**
+ * empathy_ft_handler_start_transfer:
+ * @handler: an #EmpathyFTHandler
+ *
+ * Starts the transfer machinery. After this call, the transfer and hashing
+ * signals will be emitted by the handler.
+ */
+void
+empathy_ft_handler_start_transfer (EmpathyFTHandler *handler)
+{
+ EmpathyFTHandlerPriv *priv;
+
+ g_return_if_fail (EMPATHY_IS_FT_HANDLER (handler));
+
+ priv = GET_PRIV (handler);
+
+ if (priv->tpfile == NULL)
+ {
+ ft_handler_complete_request (handler);
+ }
+ else
+ {
+ /* TODO: add support for resume. */
+ empathy_tp_file_accept (priv->tpfile, 0, priv->gfile, priv->cancellable,
+ ft_transfer_progress_callback, handler,
+ ft_transfer_operation_callback, handler);
+ }
+}
+
+/**
+ * empathy_ft_handler_cancel_transfer:
+ * @handler: an #EmpathyFTHandler
+ *
+ * Cancels an ongoing handler operation. Note that this doesn't destroy
+ * the object, which will keep all the properties, altough it won't be able
+ * to do any more I/O.
+ */
+void
+empathy_ft_handler_cancel_transfer (EmpathyFTHandler *handler)
+{
+ EmpathyFTHandlerPriv *priv;
+
+ g_return_if_fail (EMPATHY_IS_FT_HANDLER (handler));
+
+ priv = GET_PRIV (handler);
+
+ /* if we don't have an EmpathyTpFile, we are hashing, so
+ * we can just cancel the GCancellable to stop it.
+ */
+ if (priv->tpfile == NULL)
+ g_cancellable_cancel (priv->cancellable);
+ else
+ empathy_tp_file_cancel (priv->tpfile);
+}
+
+/**
+ * empathy_ft_handler_incoming_set_destination:
+ * @handler: an #EmpathyFTHandler
+ * @destination: the #GFile where the transfer should be saved
+ *
+ * Sets the destination of the incoming handler to be @destination.
+ * Note that calling this method is mandatory before starting the transfer
+ * for incoming handlers.
+ */
+void
+empathy_ft_handler_incoming_set_destination (EmpathyFTHandler *handler,
+ GFile *destination)
+{
+ EmpathyFTHandlerPriv *priv;
+
+ g_return_if_fail (EMPATHY_IS_FT_HANDLER (handler));
+ g_return_if_fail (G_IS_FILE (destination));
+
+ priv = GET_PRIV (handler);
+
+ g_object_set (handler, "gfile", destination, NULL);
+
+ /* check if hash is supported. if it isn't, set use_hash to FALSE
+ * anyway, so that clients won't be expecting us to checksum.
+ */
+ if (EMP_STR_EMPTY (priv->content_hash) ||
+ priv->content_hash_type == TP_FILE_HASH_TYPE_NONE)
+ priv->use_hash = FALSE;
+ else
+ priv->use_hash = TRUE;
+}
+
+/**
+ * empathy_ft_handler_get_filename:
+ * @handler: an #EmpathyFTHandler
+ *
+ * Returns the name of the file being transferred.
+ *
+ * Return value: the name of the file being transferred
+ */
+const char *
+empathy_ft_handler_get_filename (EmpathyFTHandler *handler)
+{
+ EmpathyFTHandlerPriv *priv;
+
+ g_return_val_if_fail (EMPATHY_IS_FT_HANDLER (handler), NULL);
+
+ priv = GET_PRIV (handler);
+
+ return priv->filename;
+}
+
+/**
+ * empathy_ft_handler_get_content_type:
+ * @handler: an #EmpathyFTHandler
+ *
+ * Returns the content type of the file being transferred.
+ *
+ * Return value: the content type of the file being transferred
+ */
+const char *
+empathy_ft_handler_get_content_type (EmpathyFTHandler *handler)
+{
+ EmpathyFTHandlerPriv *priv;
+
+ g_return_val_if_fail (EMPATHY_IS_FT_HANDLER (handler), NULL);
+
+ priv = GET_PRIV (handler);
+
+ return priv->content_type;
+}
+
+/**
+ * empathy_ft_handler_get_contact:
+ * @handler: an #EmpathyFTHandler
+ *
+ * Returns the remote #EmpathyContact at the other side of the transfer.
+ *
+ * Return value: the remote #EmpathyContact for @handler
+ */
+EmpathyContact *
+empathy_ft_handler_get_contact (EmpathyFTHandler *handler)
+{
+ EmpathyFTHandlerPriv *priv;
+
+ g_return_val_if_fail (EMPATHY_IS_FT_HANDLER (handler), NULL);
+
+ priv = GET_PRIV (handler);
+
+ return priv->contact;
+}
+
+/**
+ * empathy_ft_handler_get_gfile:
+ * @handler: an #EmpathyFTHandler
+ *
+ * Returns the #GFile where the transfer is being read/saved.
+ *
+ * Return value: the #GFile where the transfer is being read/saved
+ */
+GFile *
+empathy_ft_handler_get_gfile (EmpathyFTHandler *handler)
+{
+ EmpathyFTHandlerPriv *priv;
+
+ g_return_val_if_fail (EMPATHY_IS_FT_HANDLER (handler), NULL);
+
+ priv = GET_PRIV (handler);
+
+ return priv->gfile;
+}
+
+/**
+ * empathy_ft_handler_get_use_hash:
+ * @handler: an #EmpathyFTHandler
+ *
+ * Returns whether @handler has checksumming enabled. This can depend on
+ * the CM and the remote contact capabilities.
+ *
+ * Return value: %TRUE if the handler has checksumming enabled,
+ * %FALSE otherwise.
+ */
+gboolean
+empathy_ft_handler_get_use_hash (EmpathyFTHandler *handler)
+{
+ EmpathyFTHandlerPriv *priv;
+
+ g_return_val_if_fail (EMPATHY_IS_FT_HANDLER (handler), FALSE);
+
+ priv = GET_PRIV (handler);
+
+ return priv->use_hash;
+}
+
+/**
+ * empathy_ft_handler_is_incoming:
+ * @handler: an #EmpathyFTHandler
+ *
+ * Returns whether @handler is incoming or outgoing.
+ *
+ * Return value: %TRUE if the handler is incoming, %FALSE otherwise.
+ */
+gboolean
+empathy_ft_handler_is_incoming (EmpathyFTHandler *handler)
+{
+ EmpathyFTHandlerPriv *priv;
+
+ g_return_val_if_fail (EMPATHY_IS_FT_HANDLER (handler), FALSE);
+
+ priv = GET_PRIV (handler);
+
+ if (priv->tpfile == NULL)
+ return FALSE;
+
+ return empathy_tp_file_is_incoming (priv->tpfile);
+}
+
+/**
+ * empathy_ft_handler_get_transferred_bytes:
+ * @handler: an #EmpathyFTHandler
+ *
+ * Returns the number of bytes already transferred by the handler.
+ *
+ * Return value: the number of bytes already transferred by the handler.
+ */
+guint64
+empathy_ft_handler_get_transferred_bytes (EmpathyFTHandler *handler)
+{
+ EmpathyFTHandlerPriv *priv;
+
+ g_return_val_if_fail (EMPATHY_IS_FT_HANDLER (handler), 0);
+
+ priv = GET_PRIV (handler);
+
+ return priv->transferred_bytes;
+}
+
+/**
+ * empathy_ft_handler_get_total_bytes:
+ * @handler: an #EmpathyFTHandler
+ *
+ * Returns the total size of the file being transferred by the handler.
+ *
+ * Return value: a number of bytes indicating the total size of the file being
+ * transferred by the handler.
+ */
+guint64
+empathy_ft_handler_get_total_bytes (EmpathyFTHandler *handler)
+{
+ EmpathyFTHandlerPriv *priv;
+
+ g_return_val_if_fail (EMPATHY_IS_FT_HANDLER (handler), 0);
+
+ priv = GET_PRIV (handler);
+
+ return priv->total_bytes;
+}
+
+/**
+ * empathy_ft_handler_is_completed:
+ * @handler: an #EmpathyFTHandler
+ *
+ * Returns whether the transfer for @handler has been completed succesfully.
+ *
+ * Return value: %TRUE if the handler has been transferred correctly, %FALSE
+ * otherwise
+ */
+gboolean
+empathy_ft_handler_is_completed (EmpathyFTHandler *handler)
+{
+ EmpathyFTHandlerPriv *priv;
+
+ g_return_val_if_fail (EMPATHY_IS_FT_HANDLER (handler), FALSE);
+
+ priv = GET_PRIV (handler);
+
+ return priv->is_completed;
+}
+
+/**
+ * empathy_ft_handler_is_cancelled:
+ * @handler: an #EmpathyFTHandler
+ *
+ * Returns whether the transfer for @handler has been cancelled or has stopped
+ * due to an error.
+ *
+ * Return value: %TRUE if the transfer for @handler has been cancelled
+ * or has stopped due to an error, %FALSE otherwise.
+ */
+gboolean
+empathy_ft_handler_is_cancelled (EmpathyFTHandler *handler)
+{
+ EmpathyFTHandlerPriv *priv;
+
+ g_return_val_if_fail (EMPATHY_IS_FT_HANDLER (handler), FALSE);
+
+ priv = GET_PRIV (handler);
+
+ return g_cancellable_is_cancelled (priv->cancellable);
+}
diff --git a/libempathy/empathy-ft-handler.h b/libempathy/empathy-ft-handler.h
new file mode 100644
index 000000000..7d4153611
--- /dev/null
+++ b/libempathy/empathy-ft-handler.h
@@ -0,0 +1,100 @@
+/*
+ * empathy-ft-handler.h - Header for EmpathyFTHandler
+ * Copyright (C) 2009 Collabora Ltd.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Author: Cosimo Cecchi <cosimo.cecchi@collabora.co.uk>
+ */
+
+/* empathy-ft-handler.h */
+
+#ifndef __EMPATHY_FT_HANDLER_H__
+#define __EMPATHY_FT_HANDLER_H__
+
+#include <glib-object.h>
+#include <gio/gio.h>
+
+#include "empathy-tp-file.h"
+#include "empathy-contact.h"
+
+G_BEGIN_DECLS
+
+#define EMPATHY_TYPE_FT_HANDLER empathy_ft_handler_get_type()
+#define EMPATHY_FT_HANDLER(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST ((obj), \
+ EMPATHY_TYPE_FT_HANDLER, EmpathyFTHandler))
+#define EMPATHY_FT_HANDLER_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST ((klass), \
+ EMPATHY_TYPE_FT_HANDLER, EmpathyFTHandlerClass))
+#define EMPATHY_IS_FT_HANDLER(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE ((obj), EMPATHY_TYPE_FT_HANDLER))
+#define EMPATHY_IS_FT_HANDLER_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_TYPE ((klass), EMPATHY_TYPE_FT_HANDLER))
+#define EMPATHY_FT_HANDLER_GET_CLASS(obj) \
+ (G_TYPE_INSTANCE_GET_CLASS ((obj), \
+ EMPATHY_TYPE_FT_HANDLER, EmpathyFTHandlerClass))
+
+typedef struct {
+ GObject parent;
+ gpointer priv;
+} EmpathyFTHandler;
+
+typedef struct {
+ GObjectClass parent_class;
+} EmpathyFTHandlerClass;
+
+/**
+ * EmpathyFTHandlerReadyCallback:
+ * @handler: the handler which is now ready
+ * @error: a #GError if the operation failed, or %NULL
+ * @user_data: user data passed to the callback
+ */
+typedef void (* EmpathyFTHandlerReadyCallback) (EmpathyFTHandler *handler,
+ GError *error,
+ gpointer user_data);
+
+GType empathy_ft_handler_get_type (void);
+
+/* public methods */
+void empathy_ft_handler_new_outgoing (EmpathyContact *contact,
+ GFile *source,
+ EmpathyFTHandlerReadyCallback callback,
+ gpointer user_data);
+
+void empathy_ft_handler_new_incoming (EmpathyTpFile *tp_file,
+ EmpathyFTHandlerReadyCallback callback,
+ gpointer user_data);
+void empathy_ft_handler_incoming_set_destination (EmpathyFTHandler *handler,
+ GFile *destination);
+
+void empathy_ft_handler_start_transfer (EmpathyFTHandler *handler);
+void empathy_ft_handler_cancel_transfer (EmpathyFTHandler *handler);
+
+/* properties of the transfer */
+const char * empathy_ft_handler_get_filename (EmpathyFTHandler *handler);
+const char * empathy_ft_handler_get_content_type (EmpathyFTHandler *handler);
+EmpathyContact * empathy_ft_handler_get_contact (EmpathyFTHandler *handler);
+GFile * empathy_ft_handler_get_gfile (EmpathyFTHandler *handler);
+gboolean empathy_ft_handler_get_use_hash (EmpathyFTHandler *handler);
+gboolean empathy_ft_handler_is_incoming (EmpathyFTHandler *handler);
+guint64 empathy_ft_handler_get_transferred_bytes (EmpathyFTHandler *handler);
+guint64 empathy_ft_handler_get_total_bytes (EmpathyFTHandler *handler);
+gboolean empathy_ft_handler_is_completed (EmpathyFTHandler *handler);
+gboolean empathy_ft_handler_is_cancelled (EmpathyFTHandler *handler);
+
+G_END_DECLS
+
+#endif /* __EMPATHY_FT_HANDLER_H__ */
diff --git a/libempathy/empathy-idle.c b/libempathy/empathy-idle.c
index eeb183892..92ab9f39f 100644
--- a/libempathy/empathy-idle.c
+++ b/libempathy/empathy-idle.c
@@ -15,7 +15,7 @@
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- *
+ *
* Authors: Xavier Claessens <xclaesse@gmail.com>
*/
@@ -31,7 +31,7 @@
#include <libmissioncontrol/mc-enum-types.h>
#include "empathy-idle.h"
-#include "empathy-utils.h"
+#include "empathy-utils.h"
#define DEBUG_FLAG EMPATHY_DEBUG_OTHER
#include "empathy-debug.h"
@@ -45,14 +45,14 @@ typedef struct {
DBusGProxy *gs_proxy;
DBusGProxy *nm_proxy;
- McPresence state;
+ TpConnectionPresenceType state;
gchar *status;
- McPresence flash_state;
+ TpConnectionPresenceType flash_state;
gboolean auto_away;
gboolean use_nm;
- McPresence away_saved_state;
- McPresence nm_saved_state;
+ TpConnectionPresenceType away_saved_state;
+ TpConnectionPresenceType nm_saved_state;
gchar *nm_saved_status;
gboolean is_idle;
@@ -83,7 +83,7 @@ static EmpathyIdle * idle_singleton = NULL;
static void
idle_presence_changed_cb (MissionControl *mc,
- McPresence state,
+ TpConnectionPresenceType state,
gchar *status,
EmpathyIdle *idle)
{
@@ -112,7 +112,7 @@ idle_ext_away_cb (EmpathyIdle *idle)
priv = GET_PRIV (idle);
DEBUG ("Going to extended autoaway");
- empathy_idle_set_state (idle, MC_PRESENCE_EXTENDED_AWAY);
+ empathy_idle_set_state (idle, TP_CONNECTION_PRESENCE_TYPE_EXTENDED_AWAY);
priv->ext_away_timeout = 0;
return FALSE;
@@ -160,9 +160,9 @@ idle_session_idle_changed_cb (DBusGProxy *gs_proxy,
is_idle ? "yes" : "no");
if (!priv->auto_away ||
- (priv->nm_saved_state == MC_PRESENCE_UNSET &&
- (priv->state <= MC_PRESENCE_OFFLINE ||
- priv->state == MC_PRESENCE_HIDDEN))) {
+ (priv->nm_saved_state == TP_CONNECTION_PRESENCE_TYPE_UNSET &&
+ (priv->state <= TP_CONNECTION_PRESENCE_TYPE_OFFLINE ||
+ priv->state == TP_CONNECTION_PRESENCE_TYPE_HIDDEN))) {
/* We don't want to go auto away OR we explicitely asked to be
* offline, nothing to do here */
priv->is_idle = is_idle;
@@ -170,12 +170,12 @@ idle_session_idle_changed_cb (DBusGProxy *gs_proxy,
}
if (is_idle && !priv->is_idle) {
- McPresence new_state;
+ TpConnectionPresenceType new_state;
/* We are now idle */
idle_ext_away_start (idle);
- if (priv->nm_saved_state != MC_PRESENCE_UNSET) {
+ if (priv->nm_saved_state != TP_CONNECTION_PRESENCE_TYPE_UNSET) {
/* We are disconnected, when coming back from away
* we want to restore the presence before the
* disconnection. */
@@ -184,9 +184,9 @@ idle_session_idle_changed_cb (DBusGProxy *gs_proxy,
priv->away_saved_state = priv->state;
}
- new_state = MC_PRESENCE_AWAY;
- if (priv->state == MC_PRESENCE_EXTENDED_AWAY) {
- new_state = MC_PRESENCE_EXTENDED_AWAY;
+ new_state = TP_CONNECTION_PRESENCE_TYPE_AWAY;
+ if (priv->state == TP_CONNECTION_PRESENCE_TYPE_EXTENDED_AWAY) {
+ new_state = TP_CONNECTION_PRESENCE_TYPE_EXTENDED_AWAY;
}
DEBUG ("Going to autoaway. Saved state=%d, new state=%d",
@@ -198,9 +198,9 @@ idle_session_idle_changed_cb (DBusGProxy *gs_proxy,
idle_ext_away_stop (idle);
- if (priv->away_saved_state == MC_PRESENCE_AWAY ||
- priv->away_saved_state == MC_PRESENCE_EXTENDED_AWAY) {
- priv->away_saved_state = MC_PRESENCE_AVAILABLE;
+ if (priv->away_saved_state == TP_CONNECTION_PRESENCE_TYPE_AWAY ||
+ priv->away_saved_state == TP_CONNECTION_PRESENCE_TYPE_EXTENDED_AWAY) {
+ priv->away_saved_state = TP_CONNECTION_PRESENCE_TYPE_AVAILABLE;
new_status = NULL;
} else {
new_status = priv->status;
@@ -213,7 +213,7 @@ idle_session_idle_changed_cb (DBusGProxy *gs_proxy,
priv->away_saved_state,
new_status);
- priv->away_saved_state = MC_PRESENCE_UNSET;
+ priv->away_saved_state = TP_CONNECTION_PRESENCE_TYPE_UNSET;
}
priv->is_idle = is_idle;
@@ -230,7 +230,8 @@ idle_nm_state_change_cb (DBusGProxy *proxy,
priv = GET_PRIV (idle);
- if (!priv->use_nm) {
+ if (!priv->use_nm
+ || priv->nm_saved_state == TP_CONNECTION_PRESENCE_TYPE_UNSET) {
return;
}
@@ -248,7 +249,7 @@ idle_nm_state_change_cb (DBusGProxy *proxy,
priv->nm_saved_state = priv->state;
g_free (priv->nm_saved_status);
priv->nm_saved_status = g_strdup (priv->status);
- empathy_idle_set_state (idle, MC_PRESENCE_OFFLINE);
+ empathy_idle_set_state (idle, TP_CONNECTION_PRESENCE_TYPE_OFFLINE);
}
else if (!old_nm_connected && new_nm_connected) {
/* We are now connected */
@@ -257,7 +258,7 @@ idle_nm_state_change_cb (DBusGProxy *proxy,
empathy_idle_set_presence (idle,
priv->nm_saved_state,
priv->nm_saved_status);
- priv->nm_saved_state = MC_PRESENCE_UNSET;
+ priv->nm_saved_state = TP_CONNECTION_PRESENCE_TYPE_UNSET;
g_free (priv->nm_saved_status);
priv->nm_saved_status = NULL;
}
@@ -382,11 +383,11 @@ empathy_idle_class_init (EmpathyIdleClass *klass)
g_object_class_install_property (object_class,
PROP_STATE,
- g_param_spec_enum ("state",
+ g_param_spec_uint ("state",
"state",
"state",
- MC_TYPE_PRESENCE,
- MC_PRESENCE_AVAILABLE,
+ 0, NUM_TP_CONNECTION_PRESENCE_TYPES,
+ TP_CONNECTION_PRESENCE_TYPE_UNSET,
G_PARAM_READWRITE));
g_object_class_install_property (object_class,
PROP_STATUS,
@@ -397,11 +398,11 @@ empathy_idle_class_init (EmpathyIdleClass *klass)
G_PARAM_READWRITE));
g_object_class_install_property (object_class,
PROP_FLASH_STATE,
- g_param_spec_enum ("flash-state",
+ g_param_spec_uint ("flash-state",
"flash-state",
"flash-state",
- MC_TYPE_PRESENCE,
- MC_PRESENCE_UNSET,
+ 0, NUM_TP_CONNECTION_PRESENCE_TYPES,
+ TP_CONNECTION_PRESENCE_TYPE_UNSET,
G_PARAM_READWRITE));
g_object_class_install_property (object_class,
@@ -423,6 +424,32 @@ empathy_idle_class_init (EmpathyIdleClass *klass)
g_type_class_add_private (object_class, sizeof (EmpathyIdlePriv));
}
+static TpConnectionPresenceType
+empathy_idle_get_actual_presence (EmpathyIdle *idle, GError **error)
+{
+ McPresence presence;
+ EmpathyIdlePriv *priv = GET_PRIV (idle);
+
+ presence = mission_control_get_presence_actual (priv->mc, error);
+
+ switch (presence) {
+ case MC_PRESENCE_OFFLINE:
+ return TP_CONNECTION_PRESENCE_TYPE_OFFLINE;
+ case MC_PRESENCE_AVAILABLE:
+ return TP_CONNECTION_PRESENCE_TYPE_AVAILABLE;
+ case MC_PRESENCE_AWAY:
+ return TP_CONNECTION_PRESENCE_TYPE_AWAY;
+ case MC_PRESENCE_EXTENDED_AWAY:
+ return TP_CONNECTION_PRESENCE_TYPE_EXTENDED_AWAY;
+ case MC_PRESENCE_HIDDEN:
+ return TP_CONNECTION_PRESENCE_TYPE_HIDDEN;
+ case MC_PRESENCE_DO_NOT_DISTURB:
+ return TP_CONNECTION_PRESENCE_TYPE_BUSY;
+ default:
+ return TP_CONNECTION_PRESENCE_TYPE_UNSET;
+ }
+}
+
static void
empathy_idle_init (EmpathyIdle *idle)
{
@@ -434,11 +461,11 @@ empathy_idle_init (EmpathyIdle *idle)
idle->priv = priv;
priv->is_idle = FALSE;
priv->mc = empathy_mission_control_dup_singleton ();
- priv->state = mission_control_get_presence_actual (priv->mc, &error);
+ priv->state = empathy_idle_get_actual_presence (idle, &error);
if (error) {
DEBUG ("Error getting actual presence: %s", error->message);
- priv->state = MC_PRESENCE_UNSET;
+ priv->state = TP_CONNECTION_PRESENCE_TYPE_UNSET;
g_clear_error (&error);
}
priv->status = mission_control_get_presence_message_actual (priv->mc, &error);
@@ -502,7 +529,7 @@ empathy_idle_dup_singleton (void)
return g_object_new (EMPATHY_TYPE_IDLE, NULL);
}
-McPresence
+TpConnectionPresenceType
empathy_idle_get_state (EmpathyIdle *idle)
{
EmpathyIdlePriv *priv;
@@ -514,7 +541,7 @@ empathy_idle_get_state (EmpathyIdle *idle)
void
empathy_idle_set_state (EmpathyIdle *idle,
- McPresence state)
+ TpConnectionPresenceType state)
{
EmpathyIdlePriv *priv;
@@ -548,7 +575,7 @@ empathy_idle_set_status (EmpathyIdle *idle,
empathy_idle_set_presence (idle, priv->state, status);
}
-McPresence
+TpConnectionPresenceType
empathy_idle_get_flash_state (EmpathyIdle *idle)
{
EmpathyIdlePriv *priv;
@@ -560,7 +587,7 @@ empathy_idle_get_flash_state (EmpathyIdle *idle)
void
empathy_idle_set_flash_state (EmpathyIdle *idle,
- McPresence state)
+ TpConnectionPresenceType state)
{
EmpathyIdlePriv *priv;
@@ -568,15 +595,49 @@ empathy_idle_set_flash_state (EmpathyIdle *idle,
priv->flash_state = state;
- if (state == MC_PRESENCE_UNSET) {
+ if (state == TP_CONNECTION_PRESENCE_TYPE_UNSET) {
}
g_object_notify (G_OBJECT (idle), "flash-state");
}
+static void
+empathy_idle_do_set_presence (EmpathyIdle *idle,
+ TpConnectionPresenceType state,
+ const gchar *status)
+{
+ McPresence mc_state = MC_PRESENCE_UNSET;
+ EmpathyIdlePriv *priv = GET_PRIV (idle);
+
+ switch (state) {
+ case TP_CONNECTION_PRESENCE_TYPE_OFFLINE:
+ mc_state = MC_PRESENCE_OFFLINE;
+ break;
+ case TP_CONNECTION_PRESENCE_TYPE_AVAILABLE:
+ mc_state = MC_PRESENCE_AVAILABLE;
+ break;
+ case TP_CONNECTION_PRESENCE_TYPE_AWAY:
+ mc_state = MC_PRESENCE_AWAY;
+ break;
+ case TP_CONNECTION_PRESENCE_TYPE_EXTENDED_AWAY:
+ mc_state = MC_PRESENCE_EXTENDED_AWAY;
+ break;
+ case TP_CONNECTION_PRESENCE_TYPE_HIDDEN:
+ mc_state = MC_PRESENCE_HIDDEN;
+ break;
+ case TP_CONNECTION_PRESENCE_TYPE_BUSY:
+ mc_state = MC_PRESENCE_DO_NOT_DISTURB;
+ break;
+ default:
+ g_assert_not_reached ();
+ }
+
+ mission_control_set_presence (priv->mc, mc_state, status, NULL, NULL);
+}
+
void
empathy_idle_set_presence (EmpathyIdle *idle,
- McPresence state,
+ TpConnectionPresenceType state,
const gchar *status)
{
EmpathyIdlePriv *priv;
@@ -608,7 +669,7 @@ empathy_idle_set_presence (EmpathyIdle *idle,
return;
}
- mission_control_set_presence (priv->mc, state, status, NULL, NULL);
+ empathy_idle_do_set_presence (idle, state, status);
}
gboolean
@@ -669,10 +730,10 @@ empathy_idle_set_use_nm (EmpathyIdle *idle,
idle_nm_state_change_cb (priv->nm_proxy, nm_status, idle);
} else {
priv->nm_connected = TRUE;
- if (priv->nm_saved_state != MC_PRESENCE_UNSET) {
+ if (priv->nm_saved_state != TP_CONNECTION_PRESENCE_TYPE_UNSET) {
empathy_idle_set_state (idle, priv->nm_saved_state);
}
- priv->nm_saved_state = MC_PRESENCE_UNSET;
+ priv->nm_saved_state = TP_CONNECTION_PRESENCE_TYPE_UNSET;
}
g_object_notify (G_OBJECT (idle), "use-nm");
diff --git a/libempathy/empathy-idle.h b/libempathy/empathy-idle.h
index 7296f7cd4..0f7f23deb 100644
--- a/libempathy/empathy-idle.h
+++ b/libempathy/empathy-idle.h
@@ -49,17 +49,17 @@ struct _EmpathyIdleClass {
GType empathy_idle_get_type (void) G_GNUC_CONST;
EmpathyIdle *empathy_idle_dup_singleton (void);
-McPresence empathy_idle_get_state (EmpathyIdle *idle);
+TpConnectionPresenceType empathy_idle_get_state (EmpathyIdle *idle);
void empathy_idle_set_state (EmpathyIdle *idle,
- McPresence state);
+ TpConnectionPresenceType state);
const gchar *empathy_idle_get_status (EmpathyIdle *idle);
void empathy_idle_set_status (EmpathyIdle *idle,
const gchar *status);
-McPresence empathy_idle_get_flash_state (EmpathyIdle *idle);
+TpConnectionPresenceType empathy_idle_get_flash_state (EmpathyIdle *idle);
void empathy_idle_set_flash_state (EmpathyIdle *idle,
- McPresence state);
+ TpConnectionPresenceType state);
void empathy_idle_set_presence (EmpathyIdle *idle,
- McPresence state,
+ TpConnectionPresenceType state,
const gchar *status);
gboolean empathy_idle_get_auto_away (EmpathyIdle *idle);
void empathy_idle_set_auto_away (EmpathyIdle *idle,
diff --git a/libempathy/empathy-irc-network-manager.c b/libempathy/empathy-irc-network-manager.c
index ce1f90b23..ad726800a 100644
--- a/libempathy/empathy-irc-network-manager.c
+++ b/libempathy/empathy-irc-network-manager.c
@@ -611,7 +611,7 @@ irc_network_manager_file_parse (EmpathyIrcNetworkManager *self,
irc_network_manager_parse_irc_network (self, node, user_defined);
}
- xmlFreeDoc(doc);
+ xmlFreeDoc (doc);
xmlFreeParserCtxt (ctxt);
return TRUE;
diff --git a/libempathy/empathy-irc-network.c b/libempathy/empathy-irc-network.c
index 2f433e4ef..9b75f0e82 100644
--- a/libempathy/empathy-irc-network.c
+++ b/libempathy/empathy-irc-network.c
@@ -13,8 +13,8 @@
*
* You should have received a copy of the GNU General Public
* License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301 USA
*
* Authors: Guillaume Desmottes <gdesmott@gnome.org>
*/
diff --git a/libempathy/empathy-location.h b/libempathy/empathy-location.h
new file mode 100644
index 000000000..0feb0e527
--- /dev/null
+++ b/libempathy/empathy-location.h
@@ -0,0 +1,57 @@
+/*
+ * Copyright (C) 2008, 2009 Collabora Ltd.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Authors: Pierre-Luc Beaudoin <pierre-luc.beaudoin@collabora.co.uk>
+ */
+
+#ifndef __EMPATHY_LOCATION_H__
+#define __EMPATHY_LOCATION_H__
+
+#include <glib.h>
+
+G_BEGIN_DECLS
+
+/* These keys come from the Telepathy-Spec 0.7.20 */
+#define EMPATHY_LOCATION_COUNTRY_CODE "countrycode"
+#define EMPATHY_LOCATION_COUNTRY "country"
+#define EMPATHY_LOCATION_REGION "region"
+#define EMPATHY_LOCATION_LOCALITY "locality"
+#define EMPATHY_LOCATION_AREA "area"
+#define EMPATHY_LOCATION_POSTAL_CODE "postalcode"
+#define EMPATHY_LOCATION_STREET "street"
+#define EMPATHY_LOCATION_BUILDING "building"
+#define EMPATHY_LOCATION_FLOOR "floor"
+#define EMPATHY_LOCATION_ROOM "room"
+#define EMPATHY_LOCATION_TEXT "text"
+#define EMPATHY_LOCATION_DESCRIPTION "description"
+#define EMPATHY_LOCATION_URI "uri"
+#define EMPATHY_LOCATION_LAT "lat"
+#define EMPATHY_LOCATION_LON "lon"
+#define EMPATHY_LOCATION_ALT "alt"
+#define EMPATHY_LOCATION_ACCURACY "accuracy"
+#define EMPATHY_LOCATION_ACCURACY_LEVEL "accuracy-level"
+#define EMPATHY_LOCATION_ERROR "error"
+#define EMPATHY_LOCATION_VERTICAL_ERROR_M "vertical-error-m"
+#define EMPATHY_LOCATION_HORIZONTAL_ERROR_M "horizontal-error-m"
+#define EMPATHY_LOCATION_SPEED "speed"
+#define EMPATHY_LOCATION_BEARING "bearing"
+#define EMPATHY_LOCATION_CLIMB "climb"
+#define EMPATHY_LOCATION_TIMESTAMP "timestamp"
+
+G_END_DECLS
+
+#endif /* __EMPATHY_LOCATION_H__ */
diff --git a/libempathy/empathy-log-manager.c b/libempathy/empathy-log-manager.c
index e2423ebf2..b4c1f1a92 100644
--- a/libempathy/empathy-log-manager.c
+++ b/libempathy/empathy-log-manager.c
@@ -15,8 +15,8 @@
*
* You should have received a copy of the GNU General Public
* License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301 USA
*
* Authors: Xavier Claessens <xclaesse@gmail.com>
*/
diff --git a/libempathy/empathy-log-manager.h b/libempathy/empathy-log-manager.h
index f6a9290bd..da7be4a43 100644
--- a/libempathy/empathy-log-manager.h
+++ b/libempathy/empathy-log-manager.h
@@ -15,8 +15,8 @@
*
* You should have received a copy of the GNU General Public
* License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301 USA
*
* Authors: Xavier Claessens <xclaesse@gmail.com>
*/
diff --git a/libempathy/empathy-log-store-empathy.c b/libempathy/empathy-log-store-empathy.c
index b74b5e177..94f4d1457 100644
--- a/libempathy/empathy-log-store-empathy.c
+++ b/libempathy/empathy-log-store-empathy.c
@@ -15,8 +15,8 @@
*
* You should have received a copy of the GNU General Public
* License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301 USA
*
* Authors: Xavier Claessens <xclaesse@gmail.com>
* Jonny Lamb <jonny.lamb@collabora.co.uk>
diff --git a/libempathy/empathy-log-store-empathy.h b/libempathy/empathy-log-store-empathy.h
index 3bc9997c0..e77076a5b 100644
--- a/libempathy/empathy-log-store-empathy.h
+++ b/libempathy/empathy-log-store-empathy.h
@@ -15,8 +15,8 @@
*
* You should have received a copy of the GNU General Public
* License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301 USA
*
* Authors: Xavier Claessens <xclaesse@gmail.com>
* Jonny Lamb <jonny.lamb@collabora.co.uk>
diff --git a/libempathy/empathy-log-store.c b/libempathy/empathy-log-store.c
index ba5a9a09d..21a881559 100644
--- a/libempathy/empathy-log-store.c
+++ b/libempathy/empathy-log-store.c
@@ -14,8 +14,8 @@
*
* You should have received a copy of the GNU General Public
* License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301 USA
*
* Authors: Jonny Lamb <jonny.lamb@collabora.co.uk>
*/
diff --git a/libempathy/empathy-log-store.h b/libempathy/empathy-log-store.h
index 6a253b21b..db698c4b0 100644
--- a/libempathy/empathy-log-store.h
+++ b/libempathy/empathy-log-store.h
@@ -14,8 +14,8 @@
*
* You should have received a copy of the GNU General Public
* License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301 USA
*
* Authors: Jonny Lamb <jonny.lamb@collabora.co.uk>
*/
diff --git a/libempathy/empathy-message.c b/libempathy/empathy-message.c
index 6d74c0722..d020b72e4 100644
--- a/libempathy/empathy-message.c
+++ b/libempathy/empathy-message.c
@@ -15,8 +15,8 @@
*
* You should have received a copy of the GNU General Public
* License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301 USA
*
* Authors: Mikael Hallendal <micke@imendio.com>
* Xavier Claessens <xclaesse@gmail.com>
diff --git a/libempathy/empathy-message.h b/libempathy/empathy-message.h
index 280150923..2172c9784 100644
--- a/libempathy/empathy-message.h
+++ b/libempathy/empathy-message.h
@@ -15,8 +15,8 @@
*
* You should have received a copy of the GNU General Public
* License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301 USA
*
* Authors: Mikael Hallendal <micke@imendio.com>
* Xavier Claessens <xclaesse@gmail.com>
diff --git a/libempathy/empathy-status-presets.c b/libempathy/empathy-status-presets.c
index e7b8804ad..9f9a2030b 100644
--- a/libempathy/empathy-status-presets.c
+++ b/libempathy/empathy-status-presets.c
@@ -14,8 +14,8 @@
*
* You should have received a copy of the GNU General Public
* License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301 USA
*
* Author: Martyn Russell <martyn@imendio.com>
*/
@@ -46,23 +46,23 @@
typedef struct {
gchar *status;
- McPresence state;
+ TpConnectionPresenceType state;
} StatusPreset;
-static StatusPreset *status_preset_new (McPresence state,
+static StatusPreset *status_preset_new (TpConnectionPresenceType state,
const gchar *status);
static void status_preset_free (StatusPreset *status);
static void status_presets_file_parse (const gchar *filename);
-const gchar * status_presets_get_state_as_str (McPresence state);
+const gchar * status_presets_get_state_as_str (TpConnectionPresenceType state);
static gboolean status_presets_file_save (void);
-static void status_presets_set_default (McPresence state,
+static void status_presets_set_default (TpConnectionPresenceType state,
const gchar *status);
static GList *presets = NULL;
static StatusPreset *default_preset = NULL;
static StatusPreset *
-status_preset_new (McPresence state,
+status_preset_new (TpConnectionPresenceType state,
const gchar *status)
{
StatusPreset *preset;
@@ -104,7 +104,7 @@ status_presets_file_parse (const gchar *filename)
if (!empathy_xml_validate (doc, STATUS_PRESETS_DTD_FILENAME)) {
g_warning ("Failed to validate file:'%s'", filename);
- xmlFreeDoc(doc);
+ xmlFreeDoc (doc);
xmlFreeParserCtxt (ctxt);
return;
}
@@ -116,7 +116,7 @@ status_presets_file_parse (const gchar *filename)
while (node) {
if (strcmp ((gchar *) node->name, "status") == 0 ||
strcmp ((gchar *) node->name, "default") == 0) {
- McPresence state;
+ TpConnectionPresenceType state;
gchar *status;
gchar *state_str;
StatusPreset *preset;
@@ -153,7 +153,7 @@ status_presets_file_parse (const gchar *filename)
/* Use the default if not set */
if (!default_preset) {
- status_presets_set_default (MC_PRESENCE_OFFLINE, NULL);
+ status_presets_set_default (TP_CONNECTION_PRESENCE_TYPE_OFFLINE, NULL);
}
DEBUG ("Parsed %d status presets", g_list_length (presets));
@@ -195,10 +195,10 @@ status_presets_file_save (void)
GList *l;
gchar *dir;
gchar *file;
- gint count[LAST_MC_PRESENCE];
+ gint count[NUM_TP_CONNECTION_PRESENCE_TYPES];
gint i;
- for (i = 0; i < LAST_MC_PRESENCE; i++) {
+ for (i = 0; i < NUM_TP_CONNECTION_PRESENCE_TYPES; i++) {
count[i] = 0;
}
@@ -215,7 +215,7 @@ status_presets_file_save (void)
xmlNodePtr subnode;
xmlChar *state;
- state = (gchar*) empathy_presence_to_str (default_preset->state);
+ state = (gchar *) empathy_presence_to_str (default_preset->state);
subnode = xmlNewTextChild (root, NULL, "default",
default_preset->status);
@@ -228,7 +228,7 @@ status_presets_file_save (void)
xmlChar *state;
sp = l->data;
- state = (gchar*) empathy_presence_to_str (sp->state);
+ state = (gchar *) empathy_presence_to_str (sp->state);
count[sp->state]++;
if (count[sp->state] > STATUS_PRESETS_MAX_EACH) {
@@ -253,7 +253,7 @@ status_presets_file_save (void)
}
GList *
-empathy_status_presets_get (McPresence state,
+empathy_status_presets_get (TpConnectionPresenceType state,
gint max_number)
{
GList *list = NULL;
@@ -282,7 +282,7 @@ empathy_status_presets_get (McPresence state,
}
void
-empathy_status_presets_set_last (McPresence state,
+empathy_status_presets_set_last (TpConnectionPresenceType state,
const gchar *status)
{
GList *l;
@@ -323,7 +323,7 @@ empathy_status_presets_set_last (McPresence state,
}
void
-empathy_status_presets_remove (McPresence state,
+empathy_status_presets_remove (TpConnectionPresenceType state,
const gchar *status)
{
StatusPreset *preset;
@@ -350,16 +350,16 @@ empathy_status_presets_reset (void)
presets = NULL;
- status_presets_set_default (MC_PRESENCE_AVAILABLE, NULL);
+ status_presets_set_default (TP_CONNECTION_PRESENCE_TYPE_AVAILABLE, NULL);
status_presets_file_save ();
}
-McPresence
+TpConnectionPresenceType
empathy_status_presets_get_default_state (void)
{
if (!default_preset) {
- return MC_PRESENCE_OFFLINE;
+ return TP_CONNECTION_PRESENCE_TYPE_OFFLINE;
}
return default_preset->state;
@@ -377,7 +377,7 @@ empathy_status_presets_get_default_status (void)
}
static void
-status_presets_set_default (McPresence state,
+status_presets_set_default (TpConnectionPresenceType state,
const gchar *status)
{
if (default_preset) {
@@ -388,7 +388,7 @@ status_presets_set_default (McPresence state,
}
void
-empathy_status_presets_set_default (McPresence state,
+empathy_status_presets_set_default (TpConnectionPresenceType state,
const gchar *status)
{
status_presets_set_default (state, status);
diff --git a/libempathy/empathy-status-presets.h b/libempathy/empathy-status-presets.h
index 06b6c7912..335dbcfcb 100644
--- a/libempathy/empathy-status-presets.h
+++ b/libempathy/empathy-status-presets.h
@@ -14,8 +14,8 @@
*
* You should have received a copy of the GNU General Public
* License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301 USA
*
* Author: Martyn Russell <martyn@imendio.com>
*/
@@ -23,21 +23,21 @@
#ifndef __EMPATHY_STATUS_PRESETS_H__
#define __EMPATHY_STATUS_PRESETS_H__
-#include <libmissioncontrol/mission-control.h>
+#include <telepathy-glib/enums.h>
G_BEGIN_DECLS
void empathy_status_presets_get_all (void);
-GList * empathy_status_presets_get (McPresence state,
+GList * empathy_status_presets_get (TpConnectionPresenceType state,
gint max_number);
-void empathy_status_presets_set_last (McPresence state,
+void empathy_status_presets_set_last (TpConnectionPresenceType state,
const gchar *status);
-void empathy_status_presets_remove (McPresence state,
+void empathy_status_presets_remove (TpConnectionPresenceType state,
const gchar *status);
void empathy_status_presets_reset (void);
-McPresence empathy_status_presets_get_default_state (void);
+TpConnectionPresenceType empathy_status_presets_get_default_state (void);
const gchar * empathy_status_presets_get_default_status (void);
-void empathy_status_presets_set_default (McPresence state,
+void empathy_status_presets_set_default (TpConnectionPresenceType state,
const gchar *status);
void empathy_status_presets_clear_default (void);
diff --git a/libempathy/empathy-time.c b/libempathy/empathy-time.c
index 9eec8adc0..64350404c 100644
--- a/libempathy/empathy-time.c
+++ b/libempathy/empathy-time.c
@@ -14,8 +14,8 @@
*
* You should have received a copy of the GNU General Public
* License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301 USA
*
* Authors: Richard Hult <richard@imendio.com>
*/
@@ -25,6 +25,7 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+#include <glib/gi18n.h>
#include "empathy-time.h"
@@ -122,3 +123,42 @@ empathy_time_to_string_local (time_t t,
return g_strdup (stamp);
}
+gchar *
+empathy_time_to_string_relative (time_t then)
+{
+ time_t now;
+ gint seconds;
+
+ now = time (NULL);
+ seconds = now - then;
+
+ if (seconds > 0) {
+ if (seconds < 60) {
+ return g_strdup_printf (ngettext ("%d second ago",
+ "%d seconds ago", seconds), seconds);
+ }
+ else if (seconds < (60 * 60)) {
+ seconds /= 60;
+ return g_strdup_printf (ngettext ("%d minute ago",
+ "%d minutes ago", seconds), seconds);
+ }
+ else if (seconds < (60 * 60 * 24)) {
+ seconds /= 60 * 60;
+ return g_strdup_printf (ngettext ("%d hour ago",
+ "%d hours ago", seconds), seconds);
+ }
+ else if (seconds < (60 * 60 * 24 * 7)) {
+ seconds /= 60 * 60 * 24;
+ return g_strdup_printf (ngettext ("%d day ago",
+ "%d days ago", seconds), seconds);
+ }
+ else {
+ seconds /= 60 * 60 * 24 * 30;
+ return g_strdup_printf (ngettext ("%d month ago",
+ "%d months ago", seconds), seconds);
+ }
+ }
+ else {
+ return g_strdup (_("in the future"));
+ }
+}
diff --git a/libempathy/empathy-time.h b/libempathy/empathy-time.h
index ce520cdf9..2875d2f9f 100644
--- a/libempathy/empathy-time.h
+++ b/libempathy/empathy-time.h
@@ -14,8 +14,8 @@
*
* You should have received a copy of the GNU General Public
* License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301 USA
*/
#ifndef __EMPATHY_TIME_H__
@@ -40,6 +40,7 @@ gchar *empathy_time_to_string_utc (time_t t,
const gchar *format);
gchar *empathy_time_to_string_local (time_t t,
const gchar *format);
+gchar *empathy_time_to_string_relative (time_t t);
G_END_DECLS
diff --git a/libempathy/empathy-tp-call.c b/libempathy/empathy-tp-call.c
index a5c0003c5..2971e0ffc 100644
--- a/libempathy/empathy-tp-call.c
+++ b/libempathy/empathy-tp-call.c
@@ -317,9 +317,13 @@ tp_call_update_status (EmpathyTpCall *call)
}
void
-empathy_tp_call_to (EmpathyTpCall *call, EmpathyContact *contact)
+empathy_tp_call_to (EmpathyTpCall *call, EmpathyContact *contact,
+ gboolean audio, gboolean video)
{
EmpathyTpCallPriv *priv = GET_PRIV (call);
+ EmpathyCapabilities capabilities = 0;
+
+ g_assert (audio || video);
priv->contact = g_object_ref (contact);
priv->is_incoming = FALSE;
@@ -327,7 +331,13 @@ empathy_tp_call_to (EmpathyTpCall *call, EmpathyContact *contact)
g_object_notify (G_OBJECT (call), "is-incoming");
g_object_notify (G_OBJECT (call), "contact");
g_object_notify (G_OBJECT (call), "status");
- tp_call_request_streams_for_capabilities (call, EMPATHY_CAPABILITIES_AUDIO);
+
+ if (video)
+ capabilities |= EMPATHY_CAPABILITIES_VIDEO;
+ if (audio)
+ capabilities |= EMPATHY_CAPABILITIES_AUDIO;
+
+ tp_call_request_streams_for_capabilities (call, capabilities);
}
static void
@@ -351,7 +361,7 @@ tp_call_async_cb (TpProxy *proxy,
GObject *call)
{
if (error)
- DEBUG ("Error %s: %s", (gchar*) user_data, error->message);
+ DEBUG ("Error %s: %s", (gchar *) user_data, error->message);
}
static GObject *
diff --git a/libempathy/empathy-tp-call.h b/libempathy/empathy-tp-call.h
index 081773423..406ed1c3f 100644
--- a/libempathy/empathy-tp-call.h
+++ b/libempathy/empathy-tp-call.h
@@ -76,7 +76,8 @@ GType empathy_tp_call_get_type (void) G_GNUC_CONST;
EmpathyTpCall *empathy_tp_call_new (TpChannel *channel);
void empathy_tp_call_close (EmpathyTpCall *call);
-void empathy_tp_call_to (EmpathyTpCall *call, EmpathyContact *contact);
+void empathy_tp_call_to (EmpathyTpCall *call, EmpathyContact *contact,
+ gboolean audio, gboolean video);
void empathy_tp_call_accept_incoming_call (EmpathyTpCall *call);
void empathy_tp_call_request_video_stream_direction (EmpathyTpCall *call,
diff --git a/libempathy/empathy-tp-chat.c b/libempathy/empathy-tp-chat.c
index 54e08d071..794e3e3b7 100644
--- a/libempathy/empathy-tp-chat.c
+++ b/libempathy/empathy-tp-chat.c
@@ -15,7 +15,7 @@
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- *
+ *
* Authors: Xavier Claessens <xclaesse@gmail.com>
*/
@@ -108,7 +108,7 @@ tp_chat_async_cb (TpChannel *proxy,
GObject *weak_object)
{
if (error) {
- DEBUG ("Error %s: %s", (gchar*) user_data, error->message);
+ DEBUG ("Error %s: %s", (gchar *) user_data, error->message);
}
}
@@ -275,7 +275,7 @@ tp_chat_received_cb (TpChannel *channel,
if (priv->listing_pending_messages) {
return;
}
-
+
DEBUG ("Message received: %s", message_body);
if (message_flags & TP_CHANNEL_TEXT_MESSAGE_FLAG_NON_TEXT_CONTENT &&
@@ -694,7 +694,7 @@ tp_chat_dispose (GObject *object)
g_object_unref (priv->factory);
priv->factory = NULL;
- if (priv->user != NULL);
+ if (priv->user != NULL)
g_object_unref (priv->user);
priv->user = NULL;
@@ -753,6 +753,10 @@ tp_chat_check_if_ready (EmpathyTpChat *chat)
DEBUG ("Ready!");
+ tp_cli_channel_type_text_connect_to_received (priv->channel,
+ tp_chat_received_cb,
+ NULL, NULL,
+ G_OBJECT (chat), NULL);
priv->listing_pending_messages = TRUE;
tp_cli_channel_type_text_call_list_pending_messages (priv->channel, -1,
FALSE,
@@ -760,10 +764,6 @@ tp_chat_check_if_ready (EmpathyTpChat *chat)
NULL, NULL,
G_OBJECT (chat));
- tp_cli_channel_type_text_connect_to_received (priv->channel,
- tp_chat_received_cb,
- NULL, NULL,
- G_OBJECT (chat), NULL);
tp_cli_channel_type_text_connect_to_sent (priv->channel,
tp_chat_sent_cb,
NULL, NULL,
@@ -867,7 +867,7 @@ tp_chat_got_added_contacts_cb (EmpathyTpContactFactory *factory,
priv->members = g_list_prepend (priv->members,
g_object_ref (contact));
g_signal_emit_by_name (chat, "members-changed",
- contact, NULL, 0, NULL, FALSE);
+ contact, NULL, 0, NULL, TRUE);
}
}
@@ -911,7 +911,7 @@ tp_chat_group_members_changed_cb (TpChannel *self,
/* Request added contacts */
if (added->len > 0) {
empathy_tp_contact_factory_get_from_handles (priv->factory,
- added->len, (TpHandle*) added->data,
+ added->len, (TpHandle *) added->data,
tp_chat_got_added_contacts_cb, NULL, NULL,
G_OBJECT (chat));
}
@@ -995,7 +995,7 @@ tp_chat_constructor (GType type,
members = tp_channel_group_get_members (priv->channel);
handles = tp_intset_to_array (members);
empathy_tp_contact_factory_get_from_handles (priv->factory,
- handles->len, (TpHandle*) handles->data,
+ handles->len, (TpHandle *) handles->data,
tp_chat_got_added_contacts_cb, NULL, NULL, chat);
g_signal_connect (priv->channel, "group-members-changed",
@@ -1360,7 +1360,7 @@ empathy_tp_chat_acknowledge_messages (EmpathyTpChat *chat,
g_return_if_fail (EMPATHY_IS_TP_CHAT (chat));
g_return_if_fail (priv->ready);
- length = g_list_length ((GList *)messages);
+ length = g_list_length ((GList *) messages);
if (length == 0)
return;
diff --git a/libempathy/empathy-tp-chat.h b/libempathy/empathy-tp-chat.h
index fadc5f636..f7d2b58a1 100644
--- a/libempathy/empathy-tp-chat.h
+++ b/libempathy/empathy-tp-chat.h
@@ -56,7 +56,7 @@ GType empathy_tp_chat_get_type (void) G_GNUC_CONST;
EmpathyTpChat *empathy_tp_chat_new (TpChannel *channel);
void empathy_tp_chat_close (EmpathyTpChat *chat);
const gchar * empathy_tp_chat_get_id (EmpathyTpChat *chat);
-EmpathyContact*empathy_tp_chat_get_remote_contact (EmpathyTpChat *chat);
+EmpathyContact *empathy_tp_chat_get_remote_contact (EmpathyTpChat *chat);
TpChannel * empathy_tp_chat_get_channel (EmpathyTpChat *chat);
TpConnection * empathy_tp_chat_get_connection (EmpathyTpChat *chat);
gboolean empathy_tp_chat_is_ready (EmpathyTpChat *chat);
diff --git a/libempathy/empathy-tp-contact-factory.c b/libempathy/empathy-tp-contact-factory.c
index 7735b0f1a..96fdfda68 100644
--- a/libempathy/empathy-tp-contact-factory.c
+++ b/libempathy/empathy-tp-contact-factory.c
@@ -15,7 +15,7 @@
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- *
+ *
* Authors: Xavier Claessens <xclaesse@gmail.com>
*/
@@ -25,11 +25,16 @@
#include <telepathy-glib/util.h>
#include <telepathy-glib/gtypes.h>
+#include <telepathy-glib/dbus.h>
+#if HAVE_GEOCLUE
+#include <geoclue/geoclue-geocode.h>
+#endif
#include <extensions/extensions.h>
#include "empathy-tp-contact-factory.h"
#include "empathy-utils.h"
+#include "empathy-location.h"
#define DEBUG_FLAG EMPATHY_DEBUG_TP | EMPATHY_DEBUG_CONTACT
#include "empathy-debug.h"
@@ -46,6 +51,7 @@ typedef struct {
guint avatar_max_height;
guint avatar_max_size;
gboolean can_request_ft;
+ gboolean can_request_st;
} EmpathyTpContactFactoryPriv;
G_DEFINE_TYPE (EmpathyTpContactFactory, empathy_tp_contact_factory, G_TYPE_OBJECT);
@@ -122,6 +128,17 @@ tp_contact_factory_set_aliases_cb (TpConnection *connection,
}
static void
+tp_contact_factory_set_location_cb (TpProxy *proxy,
+ const GError *error,
+ gpointer user_data,
+ GObject *weak_object)
+{
+ if (error != NULL) {
+ DEBUG ("Error setting location: %s", error->message);
+ }
+}
+
+static void
tp_contact_factory_set_avatar_cb (TpConnection *connection,
const gchar *token,
const GError *error,
@@ -379,6 +396,177 @@ tp_contact_factory_got_capabilities (EmpathyTpContactFactory *tp_factory,
g_ptr_array_free (capabilities, TRUE);
}
+#if HAVE_GEOCLUE
+#define GEOCODE_SERVICE "org.freedesktop.Geoclue.Providers.Yahoo"
+#define GEOCODE_PATH "/org/freedesktop/Geoclue/Providers/Yahoo"
+
+/* This callback is called by geoclue when it found a position
+ * for the given address. A position is necessary for a contact
+ * to show up on the map
+ */
+static void
+geocode_cb (GeoclueGeocode *geocode,
+ GeocluePositionFields fields,
+ double latitude,
+ double longitude,
+ double altitude,
+ GeoclueAccuracy *accuracy,
+ GError *error,
+ gpointer contact)
+{
+ GValue *new_value;
+ GHashTable *location;
+
+ location = empathy_contact_get_location (EMPATHY_CONTACT (contact));
+
+ if (error != NULL) {
+ DEBUG ("Error geocoding location : %s", error->message);
+ g_object_unref (geocode);
+ g_object_unref (contact);
+ return;
+ }
+
+ if (fields & GEOCLUE_POSITION_FIELDS_LATITUDE) {
+ new_value = tp_g_value_slice_new_double (latitude);
+ g_hash_table_replace (location, g_strdup (EMPATHY_LOCATION_LAT),
+ new_value);
+ DEBUG ("\t - Latitude: %f", latitude);
+ }
+ if (fields & GEOCLUE_POSITION_FIELDS_LONGITUDE) {
+ new_value = tp_g_value_slice_new_double (longitude);
+ g_hash_table_replace (location, g_strdup (EMPATHY_LOCATION_LON),
+ new_value);
+ DEBUG ("\t - Longitude: %f", longitude);
+ }
+ if (fields & GEOCLUE_POSITION_FIELDS_ALTITUDE) {
+ new_value = tp_g_value_slice_new_double (altitude);
+ g_hash_table_replace (location, g_strdup (EMPATHY_LOCATION_ALT),
+ new_value);
+ DEBUG ("\t - Altitude: %f", altitude);
+ }
+
+ /* Don't change the accuracy as we used an address to get this position */
+ g_object_notify (contact, "location");
+ g_object_unref (geocode);
+ g_object_unref (contact);
+}
+#endif
+
+#if HAVE_GEOCLUE
+static gchar *
+get_dup_string (GHashTable *location,
+ gchar *key)
+{
+ GValue *value;
+
+ value = g_hash_table_lookup (location, key);
+ if (value != NULL)
+ return g_value_dup_string (value);
+
+ return NULL;
+}
+#endif
+
+static void
+tp_contact_factory_geocode (EmpathyContact *contact)
+{
+#if HAVE_GEOCLUE
+ static GeoclueGeocode *geocode;
+ gchar *str;
+ GHashTable *address;
+ GValue* value;
+ GHashTable *location;
+
+ location = empathy_contact_get_location (contact);
+ if (location == NULL)
+ return;
+
+ value = g_hash_table_lookup (location, EMPATHY_LOCATION_LAT);
+ if (value != NULL)
+ return;
+
+ if (geocode == NULL) {
+ geocode = geoclue_geocode_new (GEOCODE_SERVICE, GEOCODE_PATH);
+ g_object_add_weak_pointer (G_OBJECT (geocode), (gpointer *) &geocode);
+ }
+ else
+ g_object_ref (geocode);
+
+ address = geoclue_address_details_new ();
+
+ str = get_dup_string (location, EMPATHY_LOCATION_COUNTRY);
+ if (str != NULL)
+ g_hash_table_insert (address, g_strdup ("country"), str);
+
+ str = get_dup_string (location, EMPATHY_LOCATION_POSTAL_CODE);
+ if (str != NULL)
+ g_hash_table_insert (address, g_strdup ("postalcode"), str);
+
+ str = get_dup_string (location, EMPATHY_LOCATION_LOCALITY);
+ if (str != NULL)
+ g_hash_table_insert (address, g_strdup ("locality"), str);
+
+ str = get_dup_string (location, EMPATHY_LOCATION_STREET);
+ if (str != NULL)
+ g_hash_table_insert (address, g_strdup ("street"), str);
+
+ g_object_ref (contact);
+ geoclue_geocode_address_to_position_async (geocode, address,
+ geocode_cb, contact);
+
+ g_hash_table_unref (address);
+#endif
+}
+
+static void
+tp_contact_factory_update_location (EmpathyTpContactFactory *tp_factory,
+ guint handle,
+ GHashTable *location)
+{
+ EmpathyContact *contact;
+ GHashTable *new_location;
+
+ contact = tp_contact_factory_find_by_handle (tp_factory, handle);
+
+ if (contact == NULL)
+ return;
+
+ new_location = g_hash_table_new_full (g_str_hash, g_str_equal,
+ (GDestroyNotify) g_free, (GDestroyNotify) tp_g_value_slice_free);
+ tp_g_hash_table_update (new_location, location, (GBoxedCopyFunc) g_strdup,
+ (GBoxedCopyFunc) tp_g_value_slice_dup);
+ empathy_contact_set_location (contact, new_location);
+ g_hash_table_unref (new_location);
+
+ tp_contact_factory_geocode (contact);
+}
+
+static void
+tp_contact_factory_got_locations (TpProxy *tp_proxy,
+ GHashTable *locations,
+ const GError *error,
+ gpointer user_data,
+ GObject *weak_object)
+{
+ GHashTableIter iter;
+ gpointer key, value;
+ EmpathyTpContactFactory *tp_factory;
+
+ tp_factory = EMPATHY_TP_CONTACT_FACTORY (user_data);
+ if (error != NULL) {
+ DEBUG ("Error: %s", error->message);
+ return;
+ }
+
+ g_hash_table_iter_init (&iter, locations);
+ while (g_hash_table_iter_next (&iter, &key, &value)) {
+ guint handle = GPOINTER_TO_INT (key);
+ GHashTable *location = value;
+
+ tp_contact_factory_update_location (tp_factory, handle, location);
+ }
+}
+
static void
tp_contact_factory_capabilities_changed_cb (TpConnection *connection,
const GPtrArray *capabilities,
@@ -410,6 +598,17 @@ tp_contact_factory_capabilities_changed_cb (TpConnection *connection,
}
static void
+tp_contact_factory_location_updated_cb (TpProxy *proxy,
+ guint handle,
+ GHashTable *location,
+ gpointer user_data,
+ GObject *weak_object)
+{
+ EmpathyTpContactFactory *tp_factory = EMPATHY_TP_CONTACT_FACTORY (weak_object);
+ tp_contact_factory_update_location (tp_factory, handle, location);
+}
+
+static void
get_requestable_channel_classes_cb (TpProxy *connection,
const GValue *value,
const GError *error,
@@ -420,6 +619,7 @@ get_requestable_channel_classes_cb (TpProxy *connection,
EmpathyTpContactFactoryPriv *priv = GET_PRIV (self);
GPtrArray *classes;
guint i;
+ GList *l;
if (error != NULL) {
DEBUG ("Error: %s", error->message);
@@ -431,39 +631,46 @@ get_requestable_channel_classes_cb (TpProxy *connection,
GValueArray *class_struct;
GHashTable *fixed_prop;
GValue *chan_type, *handle_type;
- GList *l;
class_struct = g_ptr_array_index (classes, i);
fixed_prop = g_value_get_boxed (g_value_array_get_nth (class_struct, 0));
- chan_type = g_hash_table_lookup (fixed_prop,
- TP_IFACE_CHANNEL ".ChannelType");
- if (chan_type == NULL ||
- tp_strdiff (g_value_get_string (chan_type),
- TP_IFACE_CHANNEL_TYPE_FILE_TRANSFER)) {
- continue;
- }
-
handle_type = g_hash_table_lookup (fixed_prop,
TP_IFACE_CHANNEL ".TargetHandleType");
if (handle_type == NULL ||
- g_value_get_uint (handle_type) != TP_HANDLE_TYPE_CONTACT) {
+ g_value_get_uint (handle_type) != TP_HANDLE_TYPE_CONTACT)
continue;
- }
- /* We can request file transfer channel to contacts. */
- priv->can_request_ft = TRUE;
+ chan_type = g_hash_table_lookup (fixed_prop,
+ TP_IFACE_CHANNEL ".ChannelType");
+ if (chan_type == NULL)
+ continue;
- /* Update the capabilities of all contacts */
- for (l = priv->contacts; l != NULL; l = g_list_next (l)) {
- EmpathyContact *contact = l->data;
- EmpathyCapabilities caps;
+ if (!tp_strdiff (g_value_get_string (chan_type),
+ TP_IFACE_CHANNEL_TYPE_FILE_TRANSFER))
+ priv->can_request_ft = TRUE;
+ else if (!tp_strdiff (g_value_get_string (chan_type),
+ TP_IFACE_CHANNEL_TYPE_STREAM_TUBE))
+ priv->can_request_st = TRUE;
+ }
- caps = empathy_contact_get_capabilities (contact);
- empathy_contact_set_capabilities (contact, caps |
- EMPATHY_CAPABILITIES_FT);
- }
- break;
+ if (!priv->can_request_ft && !priv->can_request_st)
+ return ;
+
+ /* Update the capabilities of all contacts */
+ for (l = priv->contacts; l != NULL; l = g_list_next (l)) {
+ EmpathyContact *contact = l->data;
+ EmpathyCapabilities caps;
+
+ caps = empathy_contact_get_capabilities (contact);
+
+ if (priv->can_request_ft)
+ caps |= EMPATHY_CAPABILITIES_FT;
+
+ if (priv->can_request_st)
+ caps |= EMPATHY_CAPABILITIES_STREAM_TUBE;
+
+ empathy_contact_set_capabilities (contact, caps);
}
}
@@ -504,10 +711,11 @@ tp_contact_factory_add_contact (EmpathyTpContactFactory *tp_factory,
EmpathyTpContactFactoryPriv *priv = GET_PRIV (tp_factory);
TpHandle self_handle;
TpHandle handle;
- GArray handles = {(gchar*) &handle, 1};
+ GArray handles = {(gchar *) &handle, 1};
GHashTable *tokens;
GPtrArray *capabilities;
GError *error = NULL;
+ EmpathyCapabilities caps;
/* Keep a weak ref to that contact */
g_object_weak_ref (G_OBJECT (contact),
@@ -520,16 +728,20 @@ tp_contact_factory_add_contact (EmpathyTpContactFactory *tp_factory,
g_object_ref (tp_factory),
g_object_unref);
+ caps = empathy_contact_get_capabilities (contact);
+
/* Set the FT capability */
if (priv->can_request_ft) {
- EmpathyCapabilities caps;
-
- caps = empathy_contact_get_capabilities (contact);
caps |= EMPATHY_CAPABILITIES_FT;
+ }
- empathy_contact_set_capabilities (contact, caps);
+ /* Set the Stream Tube capability */
+ if (priv->can_request_st) {
+ caps |= EMPATHY_CAPABILITIES_STREAM_TUBE;
}
+ empathy_contact_set_capabilities (contact, caps);
+
/* Set is-user property. Note that it could still be the handle is
* different from the connection's self handle, in the case the handle
* comes from a group interface. */
@@ -556,6 +768,17 @@ tp_contact_factory_add_contact (EmpathyTpContactFactory *tp_factory,
tp_contact_factory_got_capabilities (tp_factory, capabilities, error);
g_clear_error (&error);
+ if (tp_proxy_has_interface_by_id (TP_PROXY (priv->connection),
+ EMP_IFACE_QUARK_CONNECTION_INTERFACE_LOCATION)) {
+ emp_cli_connection_interface_location_call_get_locations (TP_PROXY (priv->connection),
+ -1,
+ &handles,
+ tp_contact_factory_got_locations,
+ tp_factory,
+ NULL,
+ NULL);
+ }
+
DEBUG ("Contact added: %s (%d)",
empathy_contact_get_id (contact),
empathy_contact_get_handle (contact));
@@ -918,7 +1141,7 @@ empathy_tp_contact_factory_set_avatar (EmpathyTpContactFactory *tp_factory,
if (data && size > 0 && size < G_MAXUINT) {
GArray avatar;
- avatar.data = (gchar*) data;
+ avatar.data = (gchar *) data;
avatar.len = size;
DEBUG ("Setting avatar on connection %s",
@@ -943,6 +1166,24 @@ empathy_tp_contact_factory_set_avatar (EmpathyTpContactFactory *tp_factory,
}
}
+void
+empathy_tp_contact_factory_set_location (EmpathyTpContactFactory *tp_factory,
+ GHashTable *location)
+{
+ EmpathyTpContactFactoryPriv *priv = GET_PRIV (tp_factory);
+
+ g_return_if_fail (EMPATHY_IS_TP_CONTACT_FACTORY (tp_factory));
+
+ DEBUG ("Setting location");
+
+ emp_cli_connection_interface_location_call_set_location (TP_PROXY (priv->connection),
+ -1,
+ location,
+ tp_contact_factory_set_location_cb,
+ NULL, NULL,
+ G_OBJECT (tp_factory));
+}
+
static void
tp_contact_factory_get_property (GObject *object,
guint param_id,
@@ -1049,6 +1290,12 @@ tp_contact_factory_constructor (GType type,
NULL);
+ emp_cli_connection_interface_location_connect_to_location_updated (TP_PROXY (priv->connection),
+ tp_contact_factory_location_updated_cb,
+ NULL, NULL,
+ G_OBJECT (tp_factory),
+ NULL);
+
/* FIXME: This should be moved to TpConnection */
tp_cli_connection_interface_avatars_call_get_avatar_requirements (priv->connection,
-1,
@@ -1158,6 +1405,7 @@ empathy_tp_contact_factory_init (EmpathyTpContactFactory *tp_factory)
tp_factory->priv = priv;
priv->can_request_ft = FALSE;
+ priv->can_request_st = FALSE;
}
static GHashTable *factories = NULL;
diff --git a/libempathy/empathy-tp-contact-factory.h b/libempathy/empathy-tp-contact-factory.h
index 91ff2f9e7..ed11bf7e4 100644
--- a/libempathy/empathy-tp-contact-factory.h
+++ b/libempathy/empathy-tp-contact-factory.h
@@ -108,7 +108,8 @@ void empathy_tp_contact_factory_set_avatar (EmpathyTpC
const gchar *data,
gsize size,
const gchar *mime_type);
-
+void empathy_tp_contact_factory_set_location (EmpathyTpContactFactory *tp_factory,
+ GHashTable *location);
G_END_DECLS
#endif /* __EMPATHY_TP_CONTACT_FACTORY_H__ */
diff --git a/libempathy/empathy-tp-contact-list.c b/libempathy/empathy-tp-contact-list.c
index dd160224c..116b8cf71 100644
--- a/libempathy/empathy-tp-contact-list.c
+++ b/libempathy/empathy-tp-contact-list.c
@@ -16,7 +16,7 @@
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- *
+ *
* Authors: Xavier Claessens <xclaesse@gmail.com>
*/
@@ -336,7 +336,7 @@ tp_contact_list_got_added_members_cb (EmpathyTpContactFactory *factory,
/* This contact is now member, implicitly accept pending. */
if (g_hash_table_lookup (priv->pendings, GUINT_TO_POINTER (handle))) {
- GArray handles = {(gchar*) &handle, 1};
+ GArray handles = {(gchar *) &handle, 1};
tp_cli_channel_interface_group_call_add_members (priv->publish,
-1, &handles, NULL, NULL, NULL, NULL, NULL);
@@ -370,7 +370,7 @@ tp_contact_list_got_local_pending_cb (EmpathyTpContactFactory *factory,
handle = empathy_contact_get_handle (contact);
if (g_hash_table_lookup (priv->members, GUINT_TO_POINTER (handle))) {
- GArray handles = {(gchar*) &handle, 1};
+ GArray handles = {(gchar *) &handle, 1};
/* This contact is already member, auto accept. */
tp_cli_channel_interface_group_call_add_members (priv->publish,
@@ -446,7 +446,7 @@ tp_contact_list_publish_group_members_changed_cb (TpChannel *channel,
* member, otherwise add in pendings. */
if (local_pending->len > 0) {
empathy_tp_contact_factory_get_from_handles (priv->factory,
- local_pending->len, (TpHandle*) local_pending->data,
+ local_pending->len, (TpHandle *) local_pending->data,
tp_contact_list_got_local_pending_cb, NULL, NULL,
G_OBJECT (list));
}
@@ -520,7 +520,7 @@ tp_contact_list_subscribe_group_members_changed_cb (TpChannel *channel,
/* We now get the presence of those contacts, add them to members */
if (added->len > 0) {
empathy_tp_contact_factory_get_from_handles (priv->factory,
- added->len, (TpHandle*) added->data,
+ added->len, (TpHandle *) added->data,
tp_contact_list_got_added_members_cb, NULL, NULL,
G_OBJECT (list));
}
@@ -531,11 +531,11 @@ tp_contact_list_subscribe_group_members_changed_cb (TpChannel *channel,
g_array_index (added, TpHandle, i));
}
- /* We want those contacts in our contact list but we don't get their
+ /* We want those contacts in our contact list but we don't get their
* presence yet. Add to members anyway. */
if (remote_pending->len > 0) {
empathy_tp_contact_factory_get_from_handles (priv->factory,
- remote_pending->len, (TpHandle*) remote_pending->data,
+ remote_pending->len, (TpHandle *) remote_pending->data,
tp_contact_list_got_added_members_cb, NULL, NULL,
G_OBJECT (list));
}
diff --git a/libempathy/empathy-tp-contact-list.h b/libempathy/empathy-tp-contact-list.h
index c6cf6cb4a..0167b6a69 100644
--- a/libempathy/empathy-tp-contact-list.h
+++ b/libempathy/empathy-tp-contact-list.h
@@ -16,7 +16,7 @@
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- *
+ *
* Authors: Xavier Claessens <xclaesse@gmail.com>
*/
diff --git a/libempathy/empathy-tp-file.c b/libempathy/empathy-tp-file.c
index 913c27bbf..3a5826868 100644
--- a/libempathy/empathy-tp-file.c
+++ b/libempathy/empathy-tp-file.c
@@ -1,6 +1,5 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
/*
- * Copyright (C) 2007-2008 Collabora Ltd.
+ * Copyright (C) 2007-2009 Collabora Ltd.
* Copyright (C) 2007 Marco Barisione <marco@barisione.org>
*
* This library is free software; you can redistribute it and/or
@@ -19,12 +18,14 @@
*
* Authors: Marco Barisione <marco@barisione.org>
* Jonny Lamb <jonny.lamb@collabora.co.uk>
+ * Cosimo Cecchi <cosimo.cecchi@collabora.co.uk>
*/
#include <config.h>
#include <string.h>
#include <unistd.h>
+#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>
@@ -39,359 +40,167 @@
#include <telepathy-glib/util.h>
#include "empathy-tp-file.h"
-#include "empathy-tp-contact-factory.h"
#include "empathy-marshal.h"
#include "empathy-time.h"
#include "empathy-utils.h"
-#include "extensions/extensions.h"
-
#define DEBUG_FLAG EMPATHY_DEBUG_FT
#include "empathy-debug.h"
/**
* SECTION:empathy-tp-file
- * @short_description: File channel
- * @see_also: #EmpathyTpFile, #EmpathyContact, empathy_dispatcher_send_file()
- * @include: libempthy/empathy-tp-file.h
- *
- * The #EmpathyTpFile object represents a Telepathy file channel.
- */
-
-/**
- * EMPATHY_TP_FILE_UNKNOWN_SIZE:
+ * @title: EmpathyTpFile
+ * @short_description: Object which represents a Telepathy file channel
+ * @include: libempathy/empathy-tp-file.h
*
- * Value used for the "size" or "estimated-size" properties when the size of
- * the transferred file is unknown.
+ * #EmpathyTpFile is an object which represents a Telepathy file channel.
+ * Usually, clients do not need to deal with #EmpathyTpFile objects directly,
+ * and are supposed to use #EmpathyFTHandler and #EmpathyFTFactory for
+ * transferring files using libempathy.
*/
-/* Functions to copy the content of a GInputStream to a GOutputStream */
-
-#define N_BUFFERS 2
-#define BUFFER_SIZE 4096
+/* EmpathyTpFile object */
typedef struct {
- GInputStream *in;
- GOutputStream *out;
- GCancellable *cancellable;
- char *buff[N_BUFFERS]; /* the temporary buffers */
- gsize count[N_BUFFERS]; /* how many bytes are used in the buffers */
- gboolean is_full[N_BUFFERS]; /* whether the buffers contain data */
- gint curr_read; /* index of the buffer used for reading */
- gint curr_write; /* index of the buffer used for writing */
- gboolean is_reading; /* we are reading */
- gboolean is_writing; /* we are writing */
- guint n_closed; /* number of streams that have been closed */
- gint ref_count;
-} CopyData;
-
-static void schedule_next (CopyData *copy);
-
-static void
-copy_data_unref (CopyData *copy)
-{
- if (--copy->ref_count == 0)
- {
- gint i;
-
- /* Free the data only if both the input and output streams have
- * been closed. */
- copy->n_closed++;
- if (copy->n_closed < 2)
- return;
+ TpChannel *channel;
+ gboolean ready;
- if (copy->in != NULL)
- g_object_unref (copy->in);
+ GInputStream *in_stream;
+ GOutputStream *out_stream;
- if (copy->out != NULL)
- g_object_unref (copy->out);
+ /* org.freedesktop.Telepathy.Channel.Type.FileTransfer D-Bus properties */
+ TpFileTransferState state;
+ TpFileTransferStateChangeReason state_change_reason;
- for (i = 0; i < N_BUFFERS; i++)
- g_free (copy->buff[i]);
+ /* transfer properties */
+ gboolean incoming;
+ time_t start_time;
+ GArray *unix_socket_path;
+ guint64 offset;
- g_object_unref (copy->cancellable);
- g_free (copy);
- }
-}
+ /* GCancellable we're passed when offering/accepting the transfer */
+ GCancellable *cancellable;
-static void
-io_error (CopyData *copy,
- GError *error)
-{
- g_cancellable_cancel (copy->cancellable);
+ /* callbacks for the operation */
+ EmpathyTpFileProgressCallback progress_callback;
+ gpointer progress_user_data;
+ EmpathyTpFileOperationCallback op_callback;
+ gpointer op_user_data;
- if (error == NULL)
- g_warning ("I/O error");
- else if (error->domain == G_IO_ERROR && error->code == G_IO_ERROR_CANCELLED)
- ; /* Ignore cancellations */
- else
- g_warning ("I/O error: %d: %s\n", error->code, error->message);
+ gboolean is_closed;
- if (copy->in != NULL)
- g_input_stream_close (copy->in, NULL, NULL);
+ gboolean dispose_run;
+} EmpathyTpFilePriv;
- if (copy->out != NULL)
- g_output_stream_close (copy->out, NULL, NULL);
+enum {
+ PROP_0,
+ PROP_CHANNEL,
+ PROP_INCOMING
+};
- copy_data_unref (copy);
-}
+#define GET_PRIV(obj) EMPATHY_GET_PRIV (obj, EmpathyTpFile)
-static void
-close_done (GObject *source_object,
- GAsyncResult *res,
- gpointer user_data)
-{
- CopyData *copy = user_data;
+G_DEFINE_TYPE (EmpathyTpFile, empathy_tp_file, G_TYPE_OBJECT);
- g_object_unref (source_object);
- copy_data_unref (copy);
-}
+/* private functions */
static void
-write_done_cb (GObject *source_object,
- GAsyncResult *res,
- gpointer user_data)
+tp_file_get_state_cb (TpProxy *proxy,
+ const GValue *value,
+ const GError *error,
+ gpointer user_data,
+ GObject *weak_object)
{
- CopyData *copy = user_data;
- gssize count_write;
- GError *error = NULL;
-
- count_write = g_output_stream_write_finish (copy->out, res, &error);
+ EmpathyTpFilePriv *priv = GET_PRIV (weak_object);
- if (count_write <= 0)
+ if (error != NULL)
{
- io_error (copy, error);
- g_error_free (error);
+ /* set a default value for the state */
+ priv->state = TP_FILE_TRANSFER_STATE_NONE;
return;
}
- copy->is_full[copy->curr_write] = FALSE;
- copy->curr_write = (copy->curr_write + 1) % N_BUFFERS;
- copy->is_writing = FALSE;
-
- schedule_next (copy);
+ priv->state = g_value_get_uint (value);
}
static void
-read_done_cb (GObject *source_object,
- GAsyncResult *res,
- gpointer user_data)
+tp_file_invalidated_cb (TpProxy *proxy,
+ guint domain,
+ gint code,
+ gchar *message,
+ EmpathyTpFile *tp_file)
{
- CopyData *copy = user_data;
- gssize count_read;
- GError *error = NULL;
-
- count_read = g_input_stream_read_finish (copy->in, res, &error);
-
- if (count_read == 0)
- {
- g_input_stream_close_async (copy->in, 0, copy->cancellable,
- close_done, copy);
- copy->in = NULL;
- }
- else if (count_read < 0)
- {
- io_error (copy, error);
- g_error_free (error);
- return;
- }
-
- copy->count[copy->curr_read] = count_read;
- copy->is_full[copy->curr_read] = TRUE;
- copy->curr_read = (copy->curr_read + 1) % N_BUFFERS;
- copy->is_reading = FALSE;
-
- schedule_next (copy);
-}
+ EmpathyTpFilePriv *priv = GET_PRIV (tp_file);
-static void
-schedule_next (CopyData *copy)
-{
- if (copy->in != NULL &&
- !copy->is_reading &&
- !copy->is_full[copy->curr_read])
- {
- /* We are not reading and the current buffer is empty, so
- * start an async read. */
- copy->is_reading = TRUE;
- g_input_stream_read_async (copy->in,
- copy->buff[copy->curr_read],
- BUFFER_SIZE, 0, copy->cancellable,
- read_done_cb, copy);
- }
+ DEBUG ("Channel invalidated: %s", message);
- if (!copy->is_writing &&
- copy->is_full[copy->curr_write])
+ if (priv->state != TP_FILE_TRANSFER_STATE_COMPLETED &&
+ priv->state != TP_FILE_TRANSFER_STATE_CANCELLED)
{
- if (copy->count[copy->curr_write] == 0)
- {
- /* The last read on the buffer read 0 bytes, this
- * means that we got an EOF, so we can close
- * the output channel. */
- g_output_stream_close_async (copy->out, 0,
- copy->cancellable,
- close_done, copy);
- copy->out = NULL;
- }
- else
- {
- /* We are not writing and the current buffer contains
- * data, so start an async write. */
- copy->is_writing = TRUE;
- g_output_stream_write_async (copy->out,
- copy->buff[copy->curr_write],
- copy->count[copy->curr_write],
- 0, copy->cancellable,
- write_done_cb, copy);
- }
+ /* The channel is not in a finished state, an error occured */
+ priv->state = TP_FILE_TRANSFER_STATE_CANCELLED;
+ priv->state_change_reason =
+ TP_FILE_TRANSFER_STATE_CHANGE_REASON_LOCAL_ERROR;
}
}
static void
-copy_stream (GInputStream *in,
- GOutputStream *out,
- GCancellable *cancellable)
+ft_operation_close_clean (EmpathyTpFile *tp_file)
{
- CopyData *copy;
- gint i;
-
- g_return_if_fail (in != NULL);
- g_return_if_fail (out != NULL);
+ EmpathyTpFilePriv *priv = GET_PRIV (tp_file);
- copy = g_new0 (CopyData, 1);
- copy->in = g_object_ref (in);
- copy->out = g_object_ref (out);
- copy->ref_count = 1;
+ if (priv->is_closed)
+ return;
- if (cancellable != NULL)
- copy->cancellable = g_object_ref (cancellable);
- else
- copy->cancellable = g_cancellable_new ();
+ DEBUG ("FT operation close clean");
- for (i = 0; i < N_BUFFERS; i++)
- copy->buff[i] = g_malloc (BUFFER_SIZE);
+ priv->is_closed = TRUE;
- schedule_next (copy);
+ if (priv->op_callback != NULL)
+ priv->op_callback (tp_file, NULL, priv->op_user_data);
}
-/* EmpathyTpFile object */
-
-struct _EmpathyTpFilePriv {
- EmpathyTpContactFactory *factory;
- MissionControl *mc;
- TpChannel *channel;
- gboolean ready;
-
- EmpathyContact *contact;
- GInputStream *in_stream;
- GOutputStream *out_stream;
-
- /* org.freedesktop.Telepathy.Channel.Type.FileTransfer D-Bus properties */
- TpFileTransferState state;
- gchar *content_type;
- gchar *filename;
- guint64 size;
- TpFileHashType content_hash_type;
- gchar *content_hash;
- gchar *description;
- guint64 transferred_bytes;
-
- gboolean incoming;
- TpFileTransferStateChangeReason state_change_reason;
- time_t start_time;
- GValue *socket_address;
- GCancellable *cancellable;
-};
+static void
+ft_operation_close_with_error (EmpathyTpFile *tp_file,
+ GError *error)
+{
+ EmpathyTpFilePriv *priv = GET_PRIV (tp_file);
-enum {
- PROP_0,
- PROP_CHANNEL,
- PROP_STATE,
- PROP_INCOMING,
- PROP_READY,
- PROP_FILENAME,
- PROP_SIZE,
- PROP_CONTENT_TYPE,
- PROP_TRANSFERRED_BYTES,
- PROP_CONTENT_HASH_TYPE,
- PROP_CONTENT_HASH,
-};
+ if (priv->is_closed)
+ return;
-G_DEFINE_TYPE (EmpathyTpFile, empathy_tp_file, G_TYPE_OBJECT);
+ DEBUG ("FT operation close with error %s", error->message);
-static void
-empathy_tp_file_init (EmpathyTpFile *tp_file)
-{
- EmpathyTpFilePriv *priv;
+ priv->is_closed = TRUE;
- priv = G_TYPE_INSTANCE_GET_PRIVATE ((tp_file),
- EMPATHY_TYPE_TP_FILE, EmpathyTpFilePriv);
+ /* close the channel if it's not cancelled already */
+ if (priv->state != TP_FILE_TRANSFER_STATE_CANCELLED)
+ empathy_tp_file_cancel (tp_file);
- tp_file->priv = priv;
+ if (priv->op_callback != NULL)
+ priv->op_callback (tp_file, error, priv->op_user_data);
}
static void
-tp_file_invalidated_cb (TpProxy *proxy,
- guint domain,
- gint code,
- gchar *message,
- EmpathyTpFile *tp_file)
+splice_stream_ready_cb (GObject *source,
+ GAsyncResult *res,
+ gpointer user_data)
{
- DEBUG ("Channel invalidated: %s", message);
+ EmpathyTpFile *tp_file;
+ GError *error = NULL;
- if (tp_file->priv->state != TP_FILE_TRANSFER_STATE_COMPLETED &&
- tp_file->priv->state != TP_FILE_TRANSFER_STATE_CANCELLED)
- {
- /* The channel is not in a finished state, an error occured */
- tp_file->priv->state = TP_FILE_TRANSFER_STATE_CANCELLED;
- tp_file->priv->state_change_reason =
- TP_FILE_TRANSFER_STATE_CHANGE_REASON_LOCAL_ERROR;
- g_object_notify (G_OBJECT (tp_file), "state");
- }
-}
+ tp_file = user_data;
-static void
-tp_file_finalize (GObject *object)
-{
- EmpathyTpFile *tp_file = EMPATHY_TP_FILE (object);
+ g_output_stream_splice_finish (G_OUTPUT_STREAM (source), res, &error);
- if (tp_file->priv->channel)
- {
- g_signal_handlers_disconnect_by_func (tp_file->priv->channel,
- tp_file_invalidated_cb, object);
- g_object_unref (tp_file->priv->channel);
- tp_file->priv->channel = NULL;
- }
+ DEBUG ("Splice stream ready cb, error %p", error);
- if (tp_file->priv->factory)
+ if (error != NULL)
{
- g_object_unref (tp_file->priv->factory);
- }
- if (tp_file->priv->mc)
- {
- g_object_unref (tp_file->priv->mc);
+ ft_operation_close_with_error (tp_file, error);
+ g_clear_error (&error);
+ return;
}
-
- g_free (tp_file->priv->filename);
- if (tp_file->priv->socket_address != NULL)
- tp_g_value_slice_free (tp_file->priv->socket_address);
- g_free (tp_file->priv->description);
- g_free (tp_file->priv->content_hash);
- g_free (tp_file->priv->content_type);
-
- if (tp_file->priv->in_stream)
- g_object_unref (tp_file->priv->in_stream);
-
- if (tp_file->priv->out_stream)
- g_object_unref (tp_file->priv->out_stream);
-
- if (tp_file->priv->contact)
- g_object_unref (tp_file->priv->contact);
-
- if (tp_file->priv->cancellable)
- g_object_unref (tp_file->priv->cancellable);
-
- G_OBJECT_CLASS (empathy_tp_file_parent_class)->finalize (object);
}
static void
@@ -399,41 +208,66 @@ tp_file_start_transfer (EmpathyTpFile *tp_file)
{
gint fd;
struct sockaddr_un addr;
- GArray *array;
+ GError *error = NULL;
+ EmpathyTpFilePriv *priv = GET_PRIV (tp_file);
fd = socket (PF_UNIX, SOCK_STREAM, 0);
if (fd < 0)
{
+ int code = errno;
+
+ error = g_error_new_literal (EMPATHY_FT_ERROR_QUARK,
+ EMPATHY_FT_ERROR_SOCKET, g_strerror (code));
+
DEBUG ("Failed to create socket, closing channel");
- empathy_tp_file_cancel (tp_file);
+
+ ft_operation_close_with_error (tp_file, error);
+ g_clear_error (&error);
+
return;
}
- array = g_value_get_boxed (tp_file->priv->socket_address);
-
memset (&addr, 0, sizeof (addr));
addr.sun_family = AF_UNIX;
- strncpy (addr.sun_path, array->data, array->len);
+ strncpy (addr.sun_path, priv->unix_socket_path->data,
+ priv->unix_socket_path->len);
if (connect (fd, (struct sockaddr*) &addr, sizeof (addr)) < 0)
{
+ int code = errno;
+
+ error = g_error_new_literal (EMPATHY_FT_ERROR_QUARK,
+ EMPATHY_FT_ERROR_SOCKET, g_strerror (code));
+
DEBUG ("Failed to connect socket, closing channel");
- empathy_tp_file_cancel (tp_file);
+
+ ft_operation_close_with_error (tp_file, error);
close (fd);
+ g_clear_error (&error);
+
return;
}
DEBUG ("Start the transfer");
- tp_file->priv->start_time = empathy_time_get_current ();
- tp_file->priv->cancellable = g_cancellable_new ();
- if (tp_file->priv->incoming)
+ priv->start_time = empathy_time_get_current ();
+
+ /* notify we're starting a transfer */
+ if (priv->progress_callback != NULL)
+ priv->progress_callback (tp_file, 0, priv->progress_user_data);
+
+ if (priv->incoming)
{
GInputStream *socket_stream;
socket_stream = g_unix_input_stream_new (fd, TRUE);
- copy_stream (socket_stream, tp_file->priv->out_stream,
- tp_file->priv->cancellable);
+
+ g_output_stream_splice_async (priv->out_stream, socket_stream,
+ G_OUTPUT_STREAM_SPLICE_CLOSE_SOURCE |
+ G_OUTPUT_STREAM_SPLICE_CLOSE_TARGET,
+ G_PRIORITY_DEFAULT, priv->cancellable,
+ splice_stream_ready_cb, tp_file);
+
g_object_unref (socket_stream);
}
else
@@ -441,250 +275,347 @@ tp_file_start_transfer (EmpathyTpFile *tp_file)
GOutputStream *socket_stream;
socket_stream = g_unix_output_stream_new (fd, TRUE);
- copy_stream (tp_file->priv->in_stream, socket_stream,
- tp_file->priv->cancellable);
+
+ g_output_stream_splice_async (socket_stream, priv->in_stream,
+ G_OUTPUT_STREAM_SPLICE_CLOSE_SOURCE |
+ G_OUTPUT_STREAM_SPLICE_CLOSE_TARGET,
+ G_PRIORITY_DEFAULT, priv->cancellable,
+ splice_stream_ready_cb, tp_file);
+
g_object_unref (socket_stream);
}
}
+static GError *
+error_from_state_change_reason (TpFileTransferStateChangeReason reason)
+{
+ const char *string;
+ GError *retval = NULL;
+
+ string = NULL;
+
+ switch (reason)
+ {
+ case TP_FILE_TRANSFER_STATE_CHANGE_REASON_NONE:
+ string = _("No reason was specified");
+ break;
+ case TP_FILE_TRANSFER_STATE_CHANGE_REASON_REQUESTED:
+ string = _("The change in state was requested");
+ break;
+ case TP_FILE_TRANSFER_STATE_CHANGE_REASON_LOCAL_STOPPED:
+ string = _("You canceled the file transfer");
+ break;
+ case TP_FILE_TRANSFER_STATE_CHANGE_REASON_REMOTE_STOPPED:
+ string = _("The other participant canceled the file transfer");
+ break;
+ case TP_FILE_TRANSFER_STATE_CHANGE_REASON_LOCAL_ERROR:
+ string = _("Error while trying to transfer the file");
+ break;
+ case TP_FILE_TRANSFER_STATE_CHANGE_REASON_REMOTE_ERROR:
+ string = _("The other participant is unable to transfer the file");
+ break;
+ default:
+ string = _("Unknown reason");
+ break;
+ }
+
+ retval = g_error_new_literal (EMPATHY_FT_ERROR_QUARK,
+ EMPATHY_FT_ERROR_TP_ERROR, string);
+
+ return retval;
+}
+
static void
-tp_file_state_changed_cb (TpChannel *channel,
- guint state,
- guint reason,
- gpointer user_data,
- GObject *weak_object)
+tp_file_state_changed_cb (TpChannel *proxy,
+ guint state,
+ guint reason,
+ gpointer user_data,
+ GObject *weak_object)
{
- EmpathyTpFile *tp_file = EMPATHY_TP_FILE (weak_object);
+ EmpathyTpFilePriv *priv = GET_PRIV (weak_object);
+ GError *error = NULL;
- if (state == tp_file->priv->state)
+ if (state == priv->state)
return;
DEBUG ("File transfer state changed:\n"
- "\tfilename = %s, old state = %u, state = %u, reason = %u\n"
+ "old state = %u, state = %u, reason = %u\n"
"\tincoming = %s, in_stream = %s, out_stream = %s",
- tp_file->priv->filename, tp_file->priv->state, state, reason,
- tp_file->priv->incoming ? "yes" : "no",
- tp_file->priv->in_stream ? "present" : "not present",
- tp_file->priv->out_stream ? "present" : "not present");
+ priv->state, state, reason,
+ priv->incoming ? "yes" : "no",
+ priv->in_stream ? "present" : "not present",
+ priv->out_stream ? "present" : "not present");
+
+ priv->state = state;
+ priv->state_change_reason = reason;
/* If the channel is open AND we have the socket path, we can start the
* transfer. The socket path could be NULL if we are not doing the actual
- * data transfer but are just an observer for the channel. */
+ * data transfer but are just an observer for the channel.
+ */
if (state == TP_FILE_TRANSFER_STATE_OPEN &&
- tp_file->priv->socket_address != NULL)
- tp_file_start_transfer (tp_file);
+ priv->unix_socket_path != NULL)
+ tp_file_start_transfer (EMPATHY_TP_FILE (weak_object));
- tp_file->priv->state = state;
- tp_file->priv->state_change_reason = reason;
+ if (state == TP_FILE_TRANSFER_STATE_COMPLETED)
+ ft_operation_close_clean (EMPATHY_TP_FILE (weak_object));
- g_object_notify (G_OBJECT (tp_file), "state");
+ if (state == TP_FILE_TRANSFER_STATE_CANCELLED)
+ {
+ error = error_from_state_change_reason (priv->state_change_reason);
+ ft_operation_close_with_error (EMPATHY_TP_FILE (weak_object), error);
+ g_clear_error (&error);
+ }
}
static void
-tp_file_transferred_bytes_changed_cb (TpChannel *channel,
- guint64 count,
- gpointer user_data,
- GObject *weak_object)
+tp_file_transferred_bytes_changed_cb (TpChannel *proxy,
+ guint64 count,
+ gpointer user_data,
+ GObject *weak_object)
{
- EmpathyTpFile *tp_file = EMPATHY_TP_FILE (weak_object);
+ EmpathyTpFilePriv *priv = GET_PRIV (weak_object);
- if (tp_file->priv->transferred_bytes == count)
+ /* don't notify for 0 bytes count */
+ if (count == 0)
return;
- tp_file->priv->transferred_bytes = count;
- g_object_notify (G_OBJECT (tp_file), "transferred-bytes");
+ /* notify clients */
+ if (priv->progress_callback != NULL)
+ priv->progress_callback (EMPATHY_TP_FILE (weak_object),
+ count, priv->progress_user_data);
}
static void
-tp_file_check_if_ready (EmpathyTpFile *tp_file)
+ft_operation_provide_or_accept_file_cb (TpChannel *proxy,
+ const GValue *address,
+ const GError *error,
+ gpointer user_data,
+ GObject *weak_object)
{
- if (tp_file->priv->ready || tp_file->priv->contact == NULL ||
- tp_file->priv->state == 0)
- return;
+ EmpathyTpFile *tp_file = EMPATHY_TP_FILE (weak_object);
+ GError *myerr = NULL;
+ EmpathyTpFilePriv *priv = GET_PRIV (tp_file);
- tp_file->priv->ready = TRUE;
- g_object_notify (G_OBJECT (tp_file), "ready");
-}
+ g_cancellable_set_error_if_cancelled (priv->cancellable, &myerr);
-static void
-tp_file_got_contact_cb (EmpathyTpContactFactory *factory,
- EmpathyContact *contact,
- const GError *error,
- gpointer user_data,
- GObject *weak_object)
-{
- EmpathyTpFile *tp_file = EMPATHY_TP_FILE (weak_object);
+ if (error != NULL)
+ {
+ if (myerr != NULL)
+ {
+ /* if we were both cancelled and failed when calling the method,
+ * report the method error.
+ */
+ g_clear_error (&myerr);
+ myerr = g_error_copy (error);
+ }
+ }
- if (error)
+ if (myerr != NULL)
{
DEBUG ("Error: %s", error->message);
- empathy_tp_file_close (tp_file);
+ ft_operation_close_with_error (tp_file, myerr);
+ g_clear_error (&myerr);
return;
}
- tp_file->priv->contact = g_object_ref (contact);
- tp_file_check_if_ready (tp_file);
+ if (G_VALUE_TYPE (address) == DBUS_TYPE_G_UCHAR_ARRAY)
+ {
+ priv->unix_socket_path = g_value_dup_boxed (address);
+ }
+ else if (G_VALUE_TYPE (address) == G_TYPE_STRING)
+ {
+ /* Old bugged version of telepathy-salut used to store the address
+ * as a 's' instead of an 'ay' */
+ const gchar *path;
+
+ path = g_value_get_string (address);
+ priv->unix_socket_path = g_array_sized_new (TRUE, FALSE, sizeof (gchar),
+ strlen (path));
+ g_array_insert_vals (priv->unix_socket_path, 0, path, strlen (path));
+ }
+
+ DEBUG ("Got unix socket path: %s", priv->unix_socket_path->data);
+
+ /* if the channel is already open, start the transfer now, otherwise,
+ * wait for the state change signal.
+ */
+ if (priv->state == TP_FILE_TRANSFER_STATE_OPEN)
+ tp_file_start_transfer (tp_file);
}
static void
-tp_file_get_all_cb (TpProxy *proxy,
- GHashTable *properties,
- const GError *error,
- gpointer user_data,
- GObject *file_obj)
+file_read_async_cb (GObject *source,
+ GAsyncResult *res,
+ gpointer user_data)
{
- EmpathyTpFile *tp_file = EMPATHY_TP_FILE (file_obj);
+ GValue nothing = { 0 };
+ EmpathyTpFile *tp_file = user_data;
+ EmpathyTpFilePriv *priv;
+ GFileInputStream *in_stream;
+ GError *error = NULL;
+
+ priv = GET_PRIV (tp_file);
- if (error)
+ in_stream = g_file_read_finish (G_FILE (source), res, &error);
+
+ if (error != NULL)
{
- DEBUG ("Error: %s", error->message);
- tp_cli_channel_call_close (tp_file->priv->channel, -1, NULL, NULL, NULL,
- NULL);
+ ft_operation_close_with_error (tp_file, error);
+ g_clear_error (&error);
return;
}
- tp_file->priv->size = g_value_get_uint64 (
- g_hash_table_lookup (properties, "Size"));
- g_object_notify (file_obj, "size");
+ priv->in_stream = G_INPUT_STREAM (in_stream);
- tp_file->priv->state = g_value_get_uint (
- g_hash_table_lookup (properties, "State"));
- g_object_notify (file_obj, "state");
+ g_value_init (&nothing, G_TYPE_STRING);
+ g_value_set_static_string (&nothing, "");
- tp_file->priv->transferred_bytes = g_value_get_uint64 (
- g_hash_table_lookup (properties, "TransferredBytes"));
- g_object_notify (file_obj, "transferred-bytes");
+ tp_cli_channel_type_file_transfer_call_provide_file (
+ priv->channel, -1,
+ TP_SOCKET_ADDRESS_TYPE_UNIX, TP_SOCKET_ACCESS_CONTROL_LOCALHOST,
+ &nothing, ft_operation_provide_or_accept_file_cb,
+ NULL, NULL, G_OBJECT (tp_file));
+}
- tp_file->priv->filename = g_value_dup_string (
- g_hash_table_lookup (properties, "Filename"));
- g_object_notify (file_obj, "filename");
+static void
+file_replace_async_cb (GObject *source,
+ GAsyncResult *res,
+ gpointer user_data)
+{
+ GValue nothing = { 0 };
+ EmpathyTpFile *tp_file = user_data;
+ EmpathyTpFilePriv *priv;
+ GError *error = NULL;
+ GFileOutputStream *out_stream;
- tp_file->priv->content_hash = g_value_dup_string (
- g_hash_table_lookup (properties, "ContentHash"));
- g_object_notify (file_obj, "content-hash");
+ priv = GET_PRIV (tp_file);
- tp_file->priv->content_hash_type = g_value_get_uint (
- g_hash_table_lookup (properties, "ContentHashType"));
- g_object_notify (file_obj, "content-hash-type");
+ out_stream = g_file_replace_finish (G_FILE (source), res, &error);
- tp_file->priv->content_type = g_value_dup_string (
- g_hash_table_lookup (properties, "ContentType"));
- g_object_notify (file_obj, "content-type");
+ if (error != NULL)
+ {
+ ft_operation_close_with_error (tp_file, error);
+ g_clear_error (&error);
- tp_file->priv->description = g_value_dup_string (
- g_hash_table_lookup (properties, "Description"));
+ return;
+ }
+
+ priv->out_stream = G_OUTPUT_STREAM (out_stream);
- tp_file_check_if_ready (tp_file);
+ g_value_init (&nothing, G_TYPE_STRING);
+ g_value_set_static_string (&nothing, "");
+
+ tp_cli_channel_type_file_transfer_call_accept_file (priv->channel,
+ -1, TP_SOCKET_ADDRESS_TYPE_UNIX, TP_SOCKET_ACCESS_CONTROL_LOCALHOST,
+ &nothing, priv->offset,
+ ft_operation_provide_or_accept_file_cb, NULL, NULL, G_OBJECT (tp_file));
}
static void
-tp_file_get_requested_cb (TpProxy *proxy,
- const GValue *requested,
- const GError *error,
- gpointer user_data,
- GObject *weak_object)
+channel_closed_cb (TpChannel *proxy,
+ const GError *error,
+ gpointer user_data,
+ GObject *weak_object)
{
EmpathyTpFile *tp_file = EMPATHY_TP_FILE (weak_object);
+ EmpathyTpFilePriv *priv = GET_PRIV (tp_file);
+ gboolean cancel = GPOINTER_TO_INT (user_data);
- if (error)
- {
- DEBUG ("Error: %s", error->message);
- tp_cli_channel_call_close (tp_file->priv->channel, -1, NULL, NULL, NULL,
- NULL);
- return;
- }
+ DEBUG ("Channel is closed, should cancel %s", cancel ? "True" : "False");
+
+ if (priv->cancellable != NULL &&
+ !g_cancellable_is_cancelled (priv->cancellable) && cancel)
+ g_cancellable_cancel (priv->cancellable);
+}
+
+static void
+close_channel_internal (EmpathyTpFile *tp_file,
+ gboolean cancel)
+{
+ EmpathyTpFilePriv *priv = GET_PRIV (tp_file);
- tp_file->priv->incoming = !g_value_get_boolean (requested);
- g_object_notify (G_OBJECT (tp_file), "incoming");
+ DEBUG ("Closing channel, should cancel %s", cancel ?
+ "True" : "False");
- tp_file_check_if_ready (tp_file);
+ tp_cli_channel_call_close (priv->channel, -1,
+ channel_closed_cb, GINT_TO_POINTER (cancel), NULL, G_OBJECT (tp_file));
}
-static GObject *
-tp_file_constructor (GType type,
- guint n_props,
- GObjectConstructParam *props)
+/* GObject methods */
+
+static void
+empathy_tp_file_init (EmpathyTpFile *tp_file)
{
- GObject *file_obj;
- EmpathyTpFile *tp_file;
- TpHandle handle;
- TpConnection *connection;
+ EmpathyTpFilePriv *priv;
- file_obj = G_OBJECT_CLASS (empathy_tp_file_parent_class)->constructor (type,
- n_props, props);
+ priv = G_TYPE_INSTANCE_GET_PRIVATE ((tp_file),
+ EMPATHY_TYPE_TP_FILE, EmpathyTpFilePriv);
- tp_file = EMPATHY_TP_FILE (file_obj);
+ tp_file->priv = priv;
+}
- connection = tp_channel_borrow_connection (tp_file->priv->channel);
- tp_file->priv->factory = empathy_tp_contact_factory_dup_singleton (connection);
- tp_file->priv->mc = empathy_mission_control_dup_singleton ();
- tp_file->priv->state_change_reason =
- TP_FILE_TRANSFER_STATE_CHANGE_REASON_NONE;
+static void
+do_dispose (GObject *object)
+{
+ EmpathyTpFilePriv *priv = GET_PRIV (object);
- g_signal_connect (tp_file->priv->channel, "invalidated",
- G_CALLBACK (tp_file_invalidated_cb), tp_file);
+ if (priv->dispose_run)
+ return;
- tp_cli_channel_type_file_transfer_connect_to_file_transfer_state_changed (
- tp_file->priv->channel, tp_file_state_changed_cb, NULL, NULL,
- G_OBJECT (tp_file), NULL);
+ priv->dispose_run = TRUE;
- tp_cli_channel_type_file_transfer_connect_to_transferred_bytes_changed (
- tp_file->priv->channel, tp_file_transferred_bytes_changed_cb,
- NULL, NULL, G_OBJECT (tp_file), NULL);
+ if (priv->channel != NULL)
+ {
+ g_signal_handlers_disconnect_by_func (priv->channel,
+ tp_file_invalidated_cb, object);
+ g_object_unref (priv->channel);
+ priv->channel = NULL;
+ }
- tp_cli_dbus_properties_call_get (tp_file->priv->channel, -1,
- TP_IFACE_CHANNEL, "Requested",
- tp_file_get_requested_cb, NULL, NULL, file_obj);
+ if (priv->in_stream != NULL)
+ g_object_unref (priv->in_stream);
- tp_cli_dbus_properties_call_get_all (tp_file->priv->channel, -1,
- TP_IFACE_CHANNEL_TYPE_FILE_TRANSFER,
- tp_file_get_all_cb, NULL, NULL, file_obj);
+ if (priv->out_stream != NULL)
+ g_object_unref (priv->out_stream);
- handle = tp_channel_get_handle (tp_file->priv->channel, NULL);
- empathy_tp_contact_factory_get_from_handle (tp_file->priv->factory,
- handle, tp_file_got_contact_cb, NULL, NULL, file_obj);
+ if (priv->cancellable != NULL)
+ g_object_unref (priv->cancellable);
- return file_obj;
+ G_OBJECT_CLASS (empathy_tp_file_parent_class)->dispose (object);
}
static void
-tp_file_get_property (GObject *object,
- guint param_id,
- GValue *value,
- GParamSpec *pspec)
+do_finalize (GObject *object)
{
- EmpathyTpFile *tp_file;
+ EmpathyTpFilePriv *priv = GET_PRIV (object);
- tp_file = EMPATHY_TP_FILE (object);
+ DEBUG ("%p", object);
+
+ if (priv->unix_socket_path != NULL)
+ {
+ g_array_free (priv->unix_socket_path, TRUE);
+ priv->unix_socket_path = NULL;
+ }
+
+ G_OBJECT_CLASS (empathy_tp_file_parent_class)->finalize (object);
+}
+
+static void
+do_get_property (GObject *object,
+ guint param_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ EmpathyTpFilePriv *priv = GET_PRIV (object);
switch (param_id)
{
case PROP_CHANNEL:
- g_value_set_object (value, tp_file->priv->channel);
+ g_value_set_object (value, priv->channel);
break;
case PROP_INCOMING:
- g_value_set_boolean (value, tp_file->priv->incoming);
- break;
- case PROP_STATE:
- g_value_set_uint (value, tp_file->priv->state);
- break;
- case PROP_CONTENT_TYPE:
- g_value_set_string (value, tp_file->priv->content_type);
- break;
- case PROP_FILENAME:
- g_value_set_string (value, tp_file->priv->filename);
- break;
- case PROP_SIZE:
- g_value_set_uint64 (value, tp_file->priv->size);
- break;
- case PROP_CONTENT_HASH_TYPE:
- g_value_set_uint (value, tp_file->priv->content_hash_type);
- break;
- case PROP_CONTENT_HASH:
- g_value_set_string (value, tp_file->priv->content_hash);
- break;
- case PROP_TRANSFERRED_BYTES:
- g_value_set_uint64 (value, tp_file->priv->transferred_bytes);
+ g_value_set_boolean (value, priv->incoming);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
@@ -693,56 +624,19 @@ tp_file_get_property (GObject *object,
}
static void
-tp_file_channel_set_dbus_property (gpointer proxy,
- const gchar *property,
- const GValue *value)
+do_set_property (GObject *object,
+ guint param_id,
+ const GValue *value,
+ GParamSpec *pspec)
{
- DEBUG ("Setting %s property", property);
- tp_cli_dbus_properties_call_set (TP_PROXY (proxy), -1,
- TP_IFACE_CHANNEL_TYPE_FILE_TRANSFER, property, value,
- NULL, NULL, NULL, NULL);
-}
-
-static void
-tp_file_set_property (GObject *object,
- guint param_id,
- const GValue *value,
- GParamSpec *pspec)
-{
- EmpathyTpFile *tp_file = (EmpathyTpFile *) object;
+ EmpathyTpFilePriv *priv = GET_PRIV (object);
switch (param_id)
{
case PROP_CHANNEL:
- tp_file->priv->channel = g_object_ref (g_value_get_object (value));
- break;
- case PROP_STATE:
- tp_file->priv->state = g_value_get_uint (value);
+ priv->channel = g_object_ref (g_value_get_object (value));
break;
case PROP_INCOMING:
- tp_file->priv->incoming = g_value_get_boolean (value);
- break;
- case PROP_FILENAME:
- g_free (tp_file->priv->filename);
- tp_file->priv->filename = g_value_dup_string (value);
- tp_file_channel_set_dbus_property (tp_file->priv->channel,
- "Filename", value);
- break;
- case PROP_SIZE:
- tp_file->priv->size = g_value_get_uint64 (value);
- tp_file_channel_set_dbus_property (tp_file->priv->channel,
- "Size", value);
- break;
- case PROP_CONTENT_TYPE:
- tp_file_channel_set_dbus_property (tp_file->priv->channel,
- "ContentType", value);
- g_free (tp_file->priv->content_type);
- tp_file->priv->content_type = g_value_dup_string (value);
- break;
- case PROP_CONTENT_HASH:
- tp_file_channel_set_dbus_property (tp_file->priv->channel,
- "ContentHash", value);
- g_free (tp_file->priv->content_hash);
- tp_file->priv->content_hash = g_value_dup_string (value);
+ priv->incoming = g_value_get_boolean (value);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
@@ -750,398 +644,241 @@ tp_file_set_property (GObject *object,
};
}
-static GHashTable *ft_table = NULL;
-
static void
-tp_file_weak_notify_cb (gpointer channel,
- GObject *tp_file)
-{
- g_hash_table_remove (ft_table, channel);
-}
-
-/**
- * empathy_tp_file_new:
- * @channel: a Telepathy channel
- *
- * Creates a new #EmpathyTpFile wrapping @channel, or return a new ref to an
- * existing #EmpathyTpFile for that channel.
- *
- * Returns: a new #EmpathyTpFile
- */
-EmpathyTpFile *
-empathy_tp_file_new (TpChannel *channel)
+do_constructed (GObject *object)
{
EmpathyTpFile *tp_file;
+ EmpathyTpFilePriv *priv;
- g_return_val_if_fail (TP_IS_CHANNEL (channel), NULL);
-
- if (ft_table != NULL)
- {
- tp_file = g_hash_table_lookup (ft_table, channel);
- if (tp_file != NULL) {
- return g_object_ref (tp_file);
- }
- }
- else
- ft_table = g_hash_table_new_full (empathy_proxy_hash,
- empathy_proxy_equal, (GDestroyNotify) g_object_unref, NULL);
+ tp_file = EMPATHY_TP_FILE (object);
+ priv = GET_PRIV (tp_file);
- tp_file = g_object_new (EMPATHY_TYPE_TP_FILE,
- "channel", channel,
- NULL);
+ g_signal_connect (priv->channel, "invalidated",
+ G_CALLBACK (tp_file_invalidated_cb), tp_file);
- g_hash_table_insert (ft_table, g_object_ref (channel), tp_file);
- g_object_weak_ref (G_OBJECT (tp_file), tp_file_weak_notify_cb, channel);
+ tp_cli_channel_type_file_transfer_connect_to_file_transfer_state_changed (
+ priv->channel, tp_file_state_changed_cb, NULL, NULL, object, NULL);
- return tp_file;
-}
+ tp_cli_channel_type_file_transfer_connect_to_transferred_bytes_changed (
+ priv->channel, tp_file_transferred_bytes_changed_cb,
+ NULL, NULL, object, NULL);
-/**
- * empathy_tp_file_get_channel
- * @tp_file: an #EmpathyTpFile
- *
- * Returns the Telepathy file transfer channel
- *
- * Returns: the #TpChannel
- */
-TpChannel *
-empathy_tp_file_get_channel (EmpathyTpFile *tp_file)
-{
- g_return_val_if_fail (EMPATHY_IS_TP_FILE (tp_file), NULL);
+ tp_cli_dbus_properties_call_get (priv->channel,
+ -1, TP_IFACE_CHANNEL_TYPE_FILE_TRANSFER, "State", tp_file_get_state_cb,
+ NULL, NULL, object);
- return tp_file->priv->channel;
+ priv->state_change_reason =
+ TP_FILE_TRANSFER_STATE_CHANGE_REASON_NONE;
}
static void
-tp_file_method_cb (TpChannel *channel,
- const GValue *address,
- const GError *error,
- gpointer user_data,
- GObject *weak_object)
+empathy_tp_file_class_init (EmpathyTpFileClass *klass)
{
- EmpathyTpFile *tp_file = (EmpathyTpFile *) weak_object;
- GArray *array;
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
- if (error)
- {
- DEBUG ("Error: %s", error->message);
- empathy_tp_file_cancel (tp_file);
- return;
- }
+ object_class->finalize = do_finalize;
+ object_class->dispose = do_dispose;
+ object_class->constructed = do_constructed;
+ object_class->get_property = do_get_property;
+ object_class->set_property = do_set_property;
- if (G_VALUE_TYPE (address) == DBUS_TYPE_G_UCHAR_ARRAY)
- {
- tp_file->priv->socket_address = tp_g_value_slice_dup (address);
- }
- else if (G_VALUE_TYPE (address) == G_TYPE_STRING)
- {
- /* Old bugged version of telepathy-salut used to store the address
- * as a 's' instead of an 'ay' */
- const gchar *path;
+ /* Construct-only properties */
- path = g_value_get_string (address);
- array = g_array_sized_new (TRUE, FALSE, sizeof (gchar), strlen (path));
- g_array_insert_vals (array, 0, path, strlen (path));
+ /**
+ * EmpathyTpFile:channel:
+ *
+ * The #TpChannel requested for the file transfer.
+ */
+ g_object_class_install_property (object_class,
+ PROP_CHANNEL,
+ g_param_spec_object ("channel",
+ "telepathy channel",
+ "The file transfer channel",
+ TP_TYPE_CHANNEL,
+ G_PARAM_READWRITE |
+ G_PARAM_CONSTRUCT_ONLY));
- tp_file->priv->socket_address = tp_g_value_slice_new (
- DBUS_TYPE_G_UCHAR_ARRAY);
- g_value_set_boxed (tp_file->priv->socket_address, array);
+ /**
+ * EmpathyTpFile:incoming:
+ *
+ * %TRUE if the transfer is incoming, %FALSE if it's outgoing.
+ */
+ g_object_class_install_property (object_class,
+ PROP_INCOMING,
+ g_param_spec_boolean ("incoming",
+ "direction of transfer",
+ "The direction of the file being transferred",
+ FALSE,
+ G_PARAM_READWRITE |
+ G_PARAM_CONSTRUCT_ONLY));
- g_array_free (array, TRUE);
- }
- else
- {
- DEBUG ("Wrong address type: %s", G_VALUE_TYPE_NAME (address));
- empathy_tp_file_cancel (tp_file);
- return;
- }
+ g_type_class_add_private (object_class, sizeof (EmpathyTpFilePriv));
+}
- array = g_value_get_boxed (tp_file->priv->socket_address);
- DEBUG ("Got unix socket path: %s", array->data);
+/* public methods */
- if (tp_file->priv->state == TP_FILE_TRANSFER_STATE_OPEN)
- tp_file_start_transfer (tp_file);
+/**
+ * empathy_tp_file_new:
+ * @channel: a #TpChannel
+ * @incoming: whether the file transfer is incoming or not
+ *
+ * Creates a new #EmpathyTpFile wrapping @channel, with the direction
+ * specified by @incoming. The returned #EmpathyTpFile should be unrefed
+ * with g_object_unref() when finished with.
+ *
+ * Return value: a new #EmpathyTpFile
+ */
+EmpathyTpFile *
+empathy_tp_file_new (TpChannel *channel,
+ gboolean incoming)
+{
+ EmpathyTpFile *tp_file;
+
+ g_return_val_if_fail (TP_IS_CHANNEL (channel), NULL);
+
+ tp_file = g_object_new (EMPATHY_TYPE_TP_FILE,
+ "channel", channel, "incoming", incoming,
+ NULL);
+
+ return tp_file;
}
/**
* empathy_tp_file_accept:
- * @tp_file: an #EmpathyTpFile
- * @offset: position where to start the transfer
- * @gfile: a #GFile where to write transfered data
- * @error: a #GError set if there is an error when opening @gfile
+ * @tp_file: an incoming #EmpathyTpFile
+ * @offset: the offset of @gfile where we should start writing
+ * @gfile: the destination #GFile for the transfer
+ * @cancellable: a #GCancellable
+ * @progress_callback: function to callback with progress information
+ * @progress_user_data: user_data to pass to @progress_callback
+ * @op_callback: function to callback when the transfer ends
+ * @op_user_data: user_data to pass to @op_callback
*
- * Accepts a file transfer that's in the "local pending" state (i.e.
- * TP_FILE_TRANSFER_STATE_LOCAL_PENDING).
+ * Accepts an incoming file transfer, saving the result into @gfile.
+ * The callback @op_callback will be called both when the transfer is
+ * successful and in case of an error. Note that cancelling @cancellable,
+ * closes the socket of the file operation in progress, but doesn't
+ * guarantee that the transfer channel will be closed as well. Thus,
+ * empathy_tp_file_cancel() or empathy_tp_file_close() should be used to
+ * actually cancel an ongoing #EmpathyTpFile.
*/
void
empathy_tp_file_accept (EmpathyTpFile *tp_file,
- guint64 offset,
- GFile *gfile,
- GError **error)
+ guint64 offset,
+ GFile *gfile,
+ GCancellable *cancellable,
+ EmpathyTpFileProgressCallback progress_callback,
+ gpointer progress_user_data,
+ EmpathyTpFileOperationCallback op_callback,
+ gpointer op_user_data)
{
- GValue nothing = { 0 };
+ EmpathyTpFilePriv *priv = GET_PRIV (tp_file);
g_return_if_fail (EMPATHY_IS_TP_FILE (tp_file));
g_return_if_fail (G_IS_FILE (gfile));
+ g_return_if_fail (G_IS_CANCELLABLE (cancellable));
- tp_file->priv->out_stream = G_OUTPUT_STREAM (g_file_replace (gfile, NULL,
- FALSE, 0, NULL, error));
- if (error && *error)
- return;
-
- g_free (tp_file->priv->filename);
- tp_file->priv->filename = g_file_get_basename (gfile);
- g_object_notify (G_OBJECT (tp_file), "filename");
-
- DEBUG ("Accepting file: filename=%s", tp_file->priv->filename);
+ priv->cancellable = g_object_ref (cancellable);
+ priv->progress_callback = progress_callback;
+ priv->progress_user_data = progress_user_data;
+ priv->op_callback = op_callback;
+ priv->op_user_data = op_user_data;
+ priv->offset = offset;
- g_value_init (&nothing, G_TYPE_STRING);
- g_value_set_static_string (&nothing, "");
-
- tp_cli_channel_type_file_transfer_call_accept_file (tp_file->priv->channel,
- -1, TP_SOCKET_ADDRESS_TYPE_UNIX, TP_SOCKET_ACCESS_CONTROL_LOCALHOST,
- &nothing, offset, tp_file_method_cb, NULL, NULL, G_OBJECT (tp_file));
+ g_file_replace_async (gfile, NULL, FALSE, G_FILE_CREATE_NONE,
+ G_PRIORITY_DEFAULT, cancellable, file_replace_async_cb, tp_file);
}
+
/**
* empathy_tp_file_offer:
- * @tp_file: an #EmpathyTpFile
- * @gfile: a #GFile where to read the data to transfer
- * @error: a #GError set if there is an error when opening @gfile
+ * @tp_file: an outgoing #EmpathyTpFile
+ * @gfile: the source #GFile for the transfer
+ * @cancellable: a #GCancellable
+ * @progress_callback: function to callback with progress information
+ * @progress_user_data: user_data to pass to @progress_callback
+ * @op_callback: function to callback when the transfer ends
+ * @op_user_data: user_data to pass to @op_callback
*
- * Offers a file transfer that's in the "not offered" state (i.e.
- * TP_FILE_TRANSFER_STATE_NOT_OFFERED).
+ * Offers an outgoing file transfer, reading data from @gfile.
+ * The callback @op_callback will be called both when the transfer is
+ * successful and in case of an error. Note that cancelling @cancellable,
+ * closes the socket of the file operation in progress, but doesn't
+ * guarantee that the transfer channel will be closed as well. Thus,
+ * empathy_tp_file_cancel() or empathy_tp_file_close() should be used to
+ * actually cancel an ongoing #EmpathyTpFile.
*/
void
-empathy_tp_file_offer (EmpathyTpFile *tp_file, GFile *gfile, GError **error)
+empathy_tp_file_offer (EmpathyTpFile *tp_file,
+ GFile *gfile,
+ GCancellable *cancellable,
+ EmpathyTpFileProgressCallback progress_callback,
+ gpointer progress_user_data,
+ EmpathyTpFileOperationCallback op_callback,
+ gpointer op_user_data)
{
- GValue nothing = { 0 };
+ EmpathyTpFilePriv *priv = GET_PRIV (tp_file);
g_return_if_fail (EMPATHY_IS_TP_FILE (tp_file));
+ g_return_if_fail (G_IS_FILE (gfile));
+ g_return_if_fail (G_IS_CANCELLABLE (cancellable));
- tp_file->priv->in_stream = G_INPUT_STREAM (g_file_read (gfile, NULL, error));
- if (error && *error)
- return;
-
- g_value_init (&nothing, G_TYPE_STRING);
- g_value_set_static_string (&nothing, "");
-
- tp_cli_channel_type_file_transfer_call_provide_file (tp_file->priv->channel,
- -1, TP_SOCKET_ADDRESS_TYPE_UNIX, TP_SOCKET_ACCESS_CONTROL_LOCALHOST,
- &nothing, tp_file_method_cb, NULL, NULL, G_OBJECT (tp_file));
-}
-
-EmpathyContact *
-empathy_tp_file_get_contact (EmpathyTpFile *tp_file)
-{
- g_return_val_if_fail (EMPATHY_IS_TP_FILE (tp_file), NULL);
- return tp_file->priv->contact;
-}
+ priv->cancellable = g_object_ref (cancellable);
+ priv->progress_callback = progress_callback;
+ priv->progress_user_data = progress_user_data;
+ priv->op_callback = op_callback;
+ priv->op_user_data = op_user_data;
-const gchar *
-empathy_tp_file_get_filename (EmpathyTpFile *tp_file)
-{
- g_return_val_if_fail (EMPATHY_IS_TP_FILE (tp_file), NULL);
- return tp_file->priv->filename;
+ g_file_read_async (gfile, G_PRIORITY_DEFAULT, cancellable,
+ file_read_async_cb, tp_file);
}
+/**
+ * empathy_tp_file_is_incoming:
+ * @tp_file: an #EmpathyTpFile
+ *
+ * Returns whether @tp_file is incoming.
+ *
+ * Return value: %TRUE if the @tp_file is incoming, otherwise %FALSE
+ */
gboolean
empathy_tp_file_is_incoming (EmpathyTpFile *tp_file)
{
- g_return_val_if_fail (EMPATHY_IS_TP_FILE (tp_file), FALSE);
- return tp_file->priv->incoming;
-}
-
-TpFileTransferState
-empathy_tp_file_get_state (EmpathyTpFile *tp_file,
- TpFileTransferStateChangeReason *reason)
-{
- g_return_val_if_fail (EMPATHY_IS_TP_FILE (tp_file),
- TP_FILE_TRANSFER_STATE_NONE);
-
- if (reason != NULL)
- *reason = tp_file->priv->state_change_reason;
-
- return tp_file->priv->state;
-}
-
-guint64
-empathy_tp_file_get_size (EmpathyTpFile *tp_file)
-{
- g_return_val_if_fail (EMPATHY_IS_TP_FILE (tp_file),
- EMPATHY_TP_FILE_UNKNOWN_SIZE);
- return tp_file->priv->size;
-}
-
-guint64
-empathy_tp_file_get_transferred_bytes (EmpathyTpFile *tp_file)
-{
- g_return_val_if_fail (EMPATHY_IS_TP_FILE (tp_file), 0);
- return tp_file->priv->transferred_bytes;
-}
-
-gint
-empathy_tp_file_get_remaining_time (EmpathyTpFile *tp_file)
-{
- time_t curr_time, elapsed_time;
- gdouble time_per_byte;
- gdouble remaining_time;
-
- g_return_val_if_fail (EMPATHY_IS_TP_FILE (tp_file), -1);
-
- if (tp_file->priv->size == EMPATHY_TP_FILE_UNKNOWN_SIZE)
- return -1;
-
- if (tp_file->priv->transferred_bytes == tp_file->priv->size)
- return 0;
+ EmpathyTpFilePriv *priv;
- curr_time = empathy_time_get_current ();
- elapsed_time = curr_time - tp_file->priv->start_time;
- time_per_byte = (gdouble) elapsed_time /
- (gdouble) tp_file->priv->transferred_bytes;
- remaining_time = time_per_byte * (tp_file->priv->size -
- tp_file->priv->transferred_bytes);
+ g_return_val_if_fail (EMPATHY_IS_TP_FILE (tp_file), FALSE);
- return (gint) remaining_time;
-}
+ priv = GET_PRIV (tp_file);
-const gchar *
-empathy_tp_file_get_content_type (EmpathyTpFile *tp_file)
-{
- g_return_val_if_fail (EMPATHY_IS_TP_FILE (tp_file), NULL);
- return tp_file->priv->content_type;
+ return priv->incoming;
}
+/**
+ * empathy_tp_file_cancel:
+ * @tp_file: an #EmpathyTpFile
+ *
+ * Cancels an ongoing #EmpathyTpFile, first closing the channel and then
+ * cancelling any I/O operation and closing the socket.
+ */
void
empathy_tp_file_cancel (EmpathyTpFile *tp_file)
{
g_return_if_fail (EMPATHY_IS_TP_FILE (tp_file));
- DEBUG ("Closing channel..");
- tp_cli_channel_call_close (tp_file->priv->channel, -1,
- NULL, NULL, NULL, NULL);
-
- if (tp_file->priv->cancellable != NULL)
- g_cancellable_cancel (tp_file->priv->cancellable);
+ close_channel_internal (tp_file, TRUE);
}
+/**
+ * empathy_tp_file_close:
+ * @tp_file: an #EmpathyTpFile
+ *
+ * Closes the channel for an ongoing #EmpathyTpFile. It's safe to call this
+ * method after the transfer has ended.
+ */
void
empathy_tp_file_close (EmpathyTpFile *tp_file)
{
- empathy_tp_file_cancel (tp_file);
-}
-
-gboolean
-empathy_tp_file_is_ready (EmpathyTpFile *tp_file)
-{
- g_return_val_if_fail (EMPATHY_IS_TP_FILE (tp_file), FALSE);
-
- return tp_file->priv->ready;
-}
-
-static void
-empathy_tp_file_class_init (EmpathyTpFileClass *klass)
-{
- GObjectClass *object_class = G_OBJECT_CLASS (klass);
-
- object_class->finalize = tp_file_finalize;
- object_class->constructor = tp_file_constructor;
- object_class->get_property = tp_file_get_property;
- object_class->set_property = tp_file_set_property;
-
- /* Construct-only properties */
- g_object_class_install_property (object_class,
- PROP_CHANNEL,
- g_param_spec_object ("channel",
- "telepathy channel",
- "The file transfer channel",
- TP_TYPE_CHANNEL,
- G_PARAM_READWRITE |
- G_PARAM_CONSTRUCT_ONLY));
-
- g_object_class_install_property (object_class,
- PROP_STATE,
- g_param_spec_uint ("state",
- "state of the transfer",
- "The file transfer state",
- 0,
- G_MAXUINT,
- G_MAXUINT,
- G_PARAM_READWRITE |
- G_PARAM_CONSTRUCT));
-
- g_object_class_install_property (object_class,
- PROP_INCOMING,
- g_param_spec_boolean ("incoming",
- "incoming",
- "Whether the transfer is incoming",
- FALSE,
- G_PARAM_READWRITE |
- G_PARAM_CONSTRUCT));
-
- g_object_class_install_property (object_class,
- PROP_READY,
- g_param_spec_boolean ("ready",
- "ready",
- "Whether the object is ready",
- FALSE,
- G_PARAM_READWRITE |
- G_PARAM_CONSTRUCT));
-
- g_object_class_install_property (object_class,
- PROP_FILENAME,
- g_param_spec_string ("filename",
- "name of the transfer",
- "The file transfer filename",
- "",
- G_PARAM_READWRITE));
-
- g_object_class_install_property (object_class,
- PROP_SIZE,
- g_param_spec_uint64 ("size",
- "size of the file",
- "The file transfer size",
- 0,
- G_MAXUINT64,
- G_MAXUINT64,
- G_PARAM_READWRITE));
-
- g_object_class_install_property (object_class,
- PROP_CONTENT_TYPE,
- g_param_spec_string ("content-type",
- "file transfer content-type",
- "The file transfer content-type",
- "",
- G_PARAM_READWRITE));
-
- g_object_class_install_property (object_class,
- PROP_CONTENT_HASH_TYPE,
- g_param_spec_uint ("content-hash-type",
- "file transfer hash type",
- "The type of the file transfer hash",
- 0,
- G_MAXUINT,
- 0,
- G_PARAM_READWRITE));
-
- g_object_class_install_property (object_class,
- PROP_CONTENT_HASH,
- g_param_spec_string ("content-hash",
- "file transfer hash",
- "The hash of the transfer's contents",
- "",
- G_PARAM_READWRITE));
-
- g_object_class_install_property (object_class,
- PROP_TRANSFERRED_BYTES,
- g_param_spec_uint64 ("transferred-bytes",
- "bytes transferred",
- "The number of bytes transferred",
- 0,
- G_MAXUINT64,
- 0,
- G_PARAM_READWRITE));
+ g_return_if_fail (EMPATHY_IS_TP_FILE (tp_file));
- g_type_class_add_private (object_class, sizeof (EmpathyTpFilePriv));
+ close_channel_internal (tp_file, FALSE);
}
-
diff --git a/libempathy/empathy-tp-file.h b/libempathy/empathy-tp-file.h
index 5f239c8e0..0d7d8efc0 100644
--- a/libempathy/empathy-tp-file.h
+++ b/libempathy/empathy-tp-file.h
@@ -1,6 +1,5 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
/*
- * Copyright (C) 2007-2008 Collabora Ltd.
+ * Copyright (C) 2007-2009 Collabora Ltd.
* Copyright (C) 2007 Marco Barisione <marco@barisione.org>
*
* This library is free software; you can redistribute it and/or
@@ -19,6 +18,7 @@
*
* Authors: Marco Barisione <marco@barisione.org>
* Jonny Lamb <jonny.lamb@collabora.co.uk>
+ * Cosimo Cecchi <cosimo.cecchi@collabora.co.uk>
*/
#ifndef __EMPATHY_TP_FILE_H__
@@ -29,59 +29,94 @@
#include <telepathy-glib/channel.h>
-#include "empathy-contact.h"
-
-#include <libmissioncontrol/mc-account.h>
-
G_BEGIN_DECLS
-#define EMPATHY_TP_FILE_UNKNOWN_SIZE G_MAXUINT64
-
-#define EMPATHY_TYPE_TP_FILE (empathy_tp_file_get_type ())
-#define EMPATHY_TP_FILE(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), EMPATHY_TYPE_TP_FILE, EmpathyTpFile))
-#define EMPATHY_TP_FILE_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), EMPATHY_TYPE_TP_FILE, EmpathyTpFileClass))
-#define EMPATHY_IS_TP_FILE(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), EMPATHY_TYPE_TP_FILE))
-#define EMPATHY_IS_TP_FILE_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), EMPATHY_TYPE_TP_FILE))
-#define EMPATHY_TP_FILE_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), EMPATHY_TYPE_TP_FILE, EmpathyTpFileClass))
+#define EMPATHY_TYPE_TP_FILE (empathy_tp_file_get_type ())
+#define EMPATHY_TP_FILE(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), \
+ EMPATHY_TYPE_TP_FILE, EmpathyTpFile))
+#define EMPATHY_TP_FILE_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), \
+ EMPATHY_TYPE_TP_FILE, EmpathyTpFileClass))
+#define EMPATHY_IS_TP_FILE(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), \
+ EMPATHY_TYPE_TP_FILE))
+#define EMPATHY_IS_TP_FILE_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), \
+ EMPATHY_TYPE_TP_FILE))
+#define EMPATHY_TP_FILE_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), \
+ EMPATHY_TYPE_TP_FILE, EmpathyTpFileClass))
+
+#define EMPATHY_FT_ERROR_QUARK g_quark_from_static_string ("EmpathyFTError")
+
+typedef enum {
+ EMPATHY_FT_ERROR_FAILED,
+ EMPATHY_FT_ERROR_HASH_MISMATCH,
+ EMPATHY_FT_ERROR_TP_ERROR,
+ EMPATHY_FT_ERROR_SOCKET,
+ EMPATHY_FT_ERROR_NOT_SUPPORTED
+} EmpathyFTErrorEnum;
typedef struct _EmpathyTpFile EmpathyTpFile;
-typedef struct _EmpathyTpFilePriv EmpathyTpFilePriv;
typedef struct _EmpathyTpFileClass EmpathyTpFileClass;
-struct _EmpathyTpFile
-{
- GObject parent;
-
- EmpathyTpFilePriv *priv;
+struct _EmpathyTpFile {
+ GObject parent;
+ gpointer priv;
};
-struct _EmpathyTpFileClass
-{
+struct _EmpathyTpFileClass {
GObjectClass parent_class;
};
+/* prototypes for operation callbacks */
+
+/**
+ * EmpathyTpFileProgressCallback:
+ * @tp_file: the #EmpathyTpFile being transferred
+ * @current_bytes: the bytes currently transferred by the operation
+ * @user_data: user data passed to the callback
+ **/
+typedef void (* EmpathyTpFileProgressCallback)
+ (EmpathyTpFile *tp_file,
+ guint64 current_bytes,
+ gpointer user_data);
+
+/**
+ * EmpathyTpFileOperationCallback:
+ * @tp_file: the #EmpathyTpFile that has been transferred
+ * @error: a #GError if the operation didn't succeed, %NULL otherwise
+ * @user_data: user data passed to the callback
+ **/
+typedef void (* EmpathyTpFileOperationCallback)
+ (EmpathyTpFile *tp_file,
+ const GError *error,
+ gpointer user_data);
+
GType empathy_tp_file_get_type (void) G_GNUC_CONST;
-EmpathyTpFile *empathy_tp_file_new (TpChannel *channel);
+/* public methods */
+
+EmpathyTpFile * empathy_tp_file_new (TpChannel *channel,
+ gboolean incoming);
+
+void empathy_tp_file_accept (EmpathyTpFile *tp_file,
+ guint64 offset,
+ GFile *gfile,
+ GCancellable *cancellable,
+ EmpathyTpFileProgressCallback progress_callback,
+ gpointer progress_user_data,
+ EmpathyTpFileOperationCallback op_callback,
+ gpointer op_user_data);
+
+void empathy_tp_file_offer (EmpathyTpFile *tp_file,
+ GFile *gfile,
+ GCancellable *cancellable,
+ EmpathyTpFileProgressCallback progress_callback,
+ gpointer progress_user_data,
+ EmpathyTpFileOperationCallback op_callback,
+ gpointer op_user_data);
-TpChannel *empathy_tp_file_get_channel (EmpathyTpFile *tp_file);
-void empathy_tp_file_accept (EmpathyTpFile *tp_file, guint64 offset,
- GFile *gfile, GError **error);
void empathy_tp_file_cancel (EmpathyTpFile *tp_file);
void empathy_tp_file_close (EmpathyTpFile *tp_file);
-void empathy_tp_file_offer (EmpathyTpFile *tp_file, GFile *gfile,
- GError **error);
-EmpathyContact *empathy_tp_file_get_contact (EmpathyTpFile *tp_file);
-const gchar *empathy_tp_file_get_filename (EmpathyTpFile *tp_file);
gboolean empathy_tp_file_is_incoming (EmpathyTpFile *tp_file);
-TpFileTransferState empathy_tp_file_get_state (
- EmpathyTpFile *tp_file, TpFileTransferStateChangeReason *reason);
-guint64 empathy_tp_file_get_size (EmpathyTpFile *tp_file);
-guint64 empathy_tp_file_get_transferred_bytes (EmpathyTpFile *tp_file);
-gint empathy_tp_file_get_remaining_time (EmpathyTpFile *tp_file);
-const gchar *empathy_tp_file_get_content_type (EmpathyTpFile *tp_file);
-gboolean empathy_tp_file_is_ready (EmpathyTpFile *tp_file);
G_END_DECLS
diff --git a/libempathy/empathy-tp-roomlist.c b/libempathy/empathy-tp-roomlist.c
index fc2526fd0..1b2e393d1 100644
--- a/libempathy/empathy-tp-roomlist.c
+++ b/libempathy/empathy-tp-roomlist.c
@@ -15,7 +15,7 @@
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- *
+ *
* Authors: Xavier Claessens <xclaesse@gmail.com>
*/
@@ -42,11 +42,13 @@ typedef struct {
TpChannel *channel;
McAccount *account;
gboolean is_listing;
+ gboolean start_requested;
} EmpathyTpRoomlistPriv;
enum {
NEW_ROOM,
DESTROY,
+ ERROR,
LAST_SIGNAL
};
@@ -236,25 +238,43 @@ tp_roomlist_invalidated_cb (TpChannel *channel,
}
static void
-tp_roomlist_request_channel_cb (TpConnection *connection,
- const gchar *object_path,
- const GError *error,
- gpointer user_data,
- GObject *list)
+call_list_rooms_cb (TpChannel *proxy,
+ const GError *error,
+ gpointer list,
+ GObject *weak_object)
+{
+ if (error != NULL) {
+ DEBUG ("Error listing rooms: %s", error->message);
+ g_signal_emit_by_name (list, "error::start", error);
+ }
+}
+
+static void
+stop_listing_cb (TpChannel *proxy,
+ const GError *error,
+ gpointer list,
+ GObject *weak_object)
+{
+ if (error != NULL) {
+ DEBUG ("Error on stop listing: %s", error->message);
+ g_signal_emit_by_name (list, "error::stop", error);
+ }
+}
+
+static void
+channel_ready_cb (TpChannel *channel,
+ const GError *error,
+ gpointer user_data)
{
+ EmpathyTpRoomlist *list = EMPATHY_TP_ROOMLIST (user_data);
EmpathyTpRoomlistPriv *priv = GET_PRIV (list);
- if (error) {
- DEBUG ("Error requesting channel: %s", error->message);
+ if (error != NULL) {
+ DEBUG ("Channel invalidated: %s", error->message);
+ g_signal_emit (list, signals[DESTROY], 0);
return;
}
- priv->channel = tp_channel_new (priv->connection, object_path,
- TP_IFACE_CHANNEL_TYPE_ROOM_LIST,
- TP_HANDLE_TYPE_NONE,
- 0, NULL);
- tp_channel_run_until_ready (priv->channel, NULL, NULL);
-
g_signal_connect (priv->channel, "invalidated",
G_CALLBACK (tp_roomlist_invalidated_cb),
list);
@@ -274,6 +294,33 @@ tp_roomlist_request_channel_cb (TpConnection *connection,
tp_roomlist_get_listing_rooms_cb,
NULL, NULL,
G_OBJECT (list));
+
+ if (priv->start_requested == TRUE) {
+ tp_cli_channel_type_room_list_call_list_rooms (priv->channel, -1,
+ call_list_rooms_cb, list, NULL, NULL);
+ priv->start_requested = FALSE;
+ }
+}
+
+static void
+tp_roomlist_request_channel_cb (TpConnection *connection,
+ const gchar *object_path,
+ const GError *error,
+ gpointer user_data,
+ GObject *list)
+{
+ EmpathyTpRoomlistPriv *priv = GET_PRIV (list);
+
+ if (error) {
+ DEBUG ("Error requesting channel: %s", error->message);
+ return;
+ }
+
+ priv->channel = tp_channel_new (priv->connection, object_path,
+ TP_IFACE_CHANNEL_TYPE_ROOM_LIST,
+ TP_HANDLE_TYPE_NONE,
+ 0, NULL);
+ tp_channel_call_when_ready (priv->channel, channel_ready_cb, list);
}
static void
@@ -408,6 +455,16 @@ empathy_tp_roomlist_class_init (EmpathyTpRoomlistClass *klass)
G_TYPE_NONE,
0);
+ signals[ERROR] =
+ g_signal_new ("error",
+ G_TYPE_FROM_CLASS (klass),
+ G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED,
+ 0,
+ NULL, NULL,
+ g_cclosure_marshal_VOID__POINTER,
+ G_TYPE_NONE,
+ 1, G_TYPE_POINTER);
+
g_type_class_add_private (object_class, sizeof (EmpathyTpRoomlistPriv));
}
@@ -418,6 +475,8 @@ empathy_tp_roomlist_init (EmpathyTpRoomlist *list)
EMPATHY_TYPE_TP_ROOMLIST, EmpathyTpRoomlistPriv);
list->priv = priv;
+ priv->start_requested = FALSE;
+ priv->is_listing = FALSE;
}
EmpathyTpRoomlist *
@@ -458,10 +517,12 @@ empathy_tp_roomlist_start (EmpathyTpRoomlist *list)
EmpathyTpRoomlistPriv *priv = GET_PRIV (list);
g_return_if_fail (EMPATHY_IS_TP_ROOMLIST (list));
- g_return_if_fail (TP_IS_CHANNEL (priv->channel));
-
- tp_cli_channel_type_room_list_call_list_rooms (priv->channel, -1,
- NULL, NULL, NULL, NULL);
+ if (priv->channel != NULL) {
+ tp_cli_channel_type_room_list_call_list_rooms (priv->channel, -1,
+ call_list_rooms_cb, list, NULL, NULL);
+ } else {
+ priv->start_requested = TRUE;
+ }
}
void
@@ -473,6 +534,6 @@ empathy_tp_roomlist_stop (EmpathyTpRoomlist *list)
g_return_if_fail (TP_IS_CHANNEL (priv->channel));
tp_cli_channel_type_room_list_call_stop_listing (priv->channel, -1,
- NULL, NULL, NULL, NULL);
+ stop_listing_cb, list, NULL, NULL);
}
diff --git a/libempathy/empathy-tp-tube.c b/libempathy/empathy-tp-tube.c
index 5979615ef..7b9b1889e 100644
--- a/libempathy/empathy-tp-tube.c
+++ b/libempathy/empathy-tp-tube.c
@@ -22,6 +22,7 @@
#include <config.h>
#include <telepathy-glib/connection.h>
+#include <telepathy-glib/proxy.h>
#include <telepathy-glib/util.h>
#include <extensions/extensions.h>
@@ -34,13 +35,14 @@
typedef struct {
TpSocketAddressType type;
- EmpatyTpTubeAcceptStreamTubeCb *callback;
+ EmpathyTpTubeAcceptStreamTubeCb *callback;
gpointer user_data;
} EmpathyTpTubeAcceptData;
static EmpathyTpTubeAcceptData *
new_empathy_tp_tube_accept_data (TpSocketAddressType type,
- EmpatyTpTubeAcceptStreamTubeCb *callback, gpointer user_data)
+ EmpathyTpTubeAcceptStreamTubeCb *callback,
+ gpointer user_data)
{
EmpathyTpTubeAcceptData *r;
@@ -59,11 +61,36 @@ free_empathy_tp_tube_accept_data (gpointer data)
}
+typedef struct {
+ EmpathyTpTubeReadyCb *callback;
+ gpointer user_data;
+ GDestroyNotify destroy;
+ GObject *weak_object;
+} ReadyCbData;
+
+/**
+ * SECTION:empathy-tp-tube
+ * @title:EmpathyTpTube
+ * @short_description: A wrapper around a Telepathy tube channel
+ * @include: libempathy/empathy-tp-tube.h
+ *
+ * #EmpathyTpTube is a convenient object wrapping a Telepathy tube channel.
+ */
+
+/**
+ * EmpathyTpTube:
+ * @parent: parent object
+ *
+ * An object wrapping a Telepathy tube channel.
+ */
+
#define GET_PRIV(obj) EMPATHY_GET_PRIV (obj, EmpathyTpTube)
typedef struct
{
TpChannel *channel;
- EmpTubeChannelState state;
+ TpTubeChannelState state;
+ gboolean ready;
+ GSList *ready_callbacks;
} EmpathyTpTubePriv;
enum
@@ -84,13 +111,17 @@ static guint signals[LAST_SIGNAL];
G_DEFINE_TYPE (EmpathyTpTube, empathy_tp_tube, G_TYPE_OBJECT)
static void
-tp_tube_state_changed_cb (TpProxy *proxy,
- EmpTubeChannelState state,
+tp_tube_state_changed_cb (TpChannel *channel,
+ TpTubeChannelState state,
gpointer user_data,
GObject *tube)
{
EmpathyTpTubePriv *priv = GET_PRIV (tube);
+ if (!priv->ready)
+ /* We didn't get the state yet */
+ return;
+
DEBUG ("Tube state changed");
priv->state = state;
@@ -98,11 +129,11 @@ tp_tube_state_changed_cb (TpProxy *proxy,
}
static void
-tp_tube_invalidated_cb (TpChannel *channel,
- GQuark domain,
- gint code,
- gchar *message,
- EmpathyTpTube *tube)
+tp_tube_invalidated_cb (TpChannel *channel,
+ GQuark domain,
+ gint code,
+ gchar *message,
+ EmpathyTpTube *tube)
{
DEBUG ("Channel invalidated: %s", message);
g_signal_emit (tube, signals[DESTROY], 0);
@@ -110,19 +141,19 @@ tp_tube_invalidated_cb (TpChannel *channel,
static void
tp_tube_async_cb (TpChannel *channel,
- const GError *error,
- gpointer user_data,
- GObject *tube)
+ const GError *error,
+ gpointer user_data,
+ GObject *tube)
{
if (error)
- DEBUG ("Error %s: %s", (gchar*) user_data, error->message);
+ DEBUG ("Error %s: %s", (gchar *) user_data, error->message);
}
static void
tp_tube_set_property (GObject *object,
- guint prop_id,
- const GValue *value,
- GParamSpec *pspec)
+ guint prop_id,
+ const GValue *value,
+ GParamSpec *pspec)
{
EmpathyTpTubePriv *priv = GET_PRIV (object);
@@ -139,9 +170,9 @@ tp_tube_set_property (GObject *object,
static void
tp_tube_get_property (GObject *object,
- guint prop_id,
- GValue *value,
- GParamSpec *pspec)
+ guint prop_id,
+ GValue *value,
+ GParamSpec *pspec)
{
EmpathyTpTubePriv *priv = GET_PRIV (object);
@@ -159,10 +190,116 @@ tp_tube_get_property (GObject *object,
}
}
+static void weak_object_notify (gpointer data,
+ GObject *old_object);
+
+static ReadyCbData *
+ready_cb_data_new (EmpathyTpTube *self,
+ EmpathyTpTubeReadyCb *callback,
+ gpointer user_data,
+ GDestroyNotify destroy,
+ GObject *weak_object)
+{
+ ReadyCbData *d = g_slice_new0 (ReadyCbData);
+ d->callback = callback;
+ d->user_data = user_data;
+ d->destroy = destroy;
+ d->weak_object = weak_object;
+
+ if (weak_object != NULL)
+ g_object_weak_ref (weak_object, weak_object_notify, self);
+
+ return d;
+}
+
+static void
+ready_cb_data_free (ReadyCbData *data,
+ EmpathyTpTube *self)
+{
+ if (data->destroy != NULL)
+ data->destroy (data->user_data);
+
+ if (data->weak_object != NULL)
+ g_object_weak_unref (data->weak_object,
+ weak_object_notify, self);
+
+ g_slice_free (ReadyCbData, data);
+}
+
+static void
+weak_object_notify (gpointer data,
+ GObject *old_object)
+{
+ EmpathyTpTube *self = EMPATHY_TP_TUBE (data);
+ EmpathyTpTubePriv *priv = GET_PRIV (self);
+ GSList *l, *ln;
+
+ for (l = priv->ready_callbacks ; l != NULL ; l = ln )
+ {
+ ReadyCbData *d = (ReadyCbData *) l->data;
+ ln = g_slist_next (l);
+
+ if (d->weak_object == old_object)
+ {
+ ready_cb_data_free (d, self);
+ priv->ready_callbacks = g_slist_delete_link (priv->ready_callbacks,
+ l);
+ }
+ }
+}
+
+
+static void
+tube_is_ready (EmpathyTpTube *self,
+ const GError *error)
+{
+ EmpathyTpTubePriv *priv = GET_PRIV (self);
+ GSList *l;
+
+ priv->ready = TRUE;
+
+ /* tube has to stay alive while we call the callbacks */
+ g_object_ref (self);
+ for (l = priv->ready_callbacks ; l != NULL ; l = g_slist_next (l))
+ {
+ ReadyCbData *data = (ReadyCbData *) l->data;
+
+ data->callback (self, error, data->user_data, data->weak_object);
+ ready_cb_data_free (data, self);
+ }
+ g_object_unref (self);
+
+ g_slist_free (priv->ready_callbacks);
+ priv->ready_callbacks = NULL;
+}
+
+static void
+got_tube_state_cb (TpProxy *proxy,
+ const GValue *out_value,
+ const GError *error,
+ gpointer user_data,
+ GObject *weak_object)
+{
+ EmpathyTpTube *self = EMPATHY_TP_TUBE (user_data);
+ EmpathyTpTubePriv *priv = GET_PRIV (self);
+
+ if (error != NULL)
+ {
+ DEBUG ("Error getting State property: %s", error->message);
+ }
+ else
+ {
+ priv->state = g_value_get_uint (out_value);
+ g_object_notify (G_OBJECT (self), "state");
+ }
+
+ tube_is_ready (self, error);
+}
+
static GObject *
tp_tube_constructor (GType type,
- guint n_props,
- GObjectConstructParam *props)
+ guint n_props,
+ GObjectConstructParam *props)
{
GObject *self;
EmpathyTpTubePriv *priv;
@@ -174,17 +311,25 @@ tp_tube_constructor (GType type,
g_signal_connect (priv->channel, "invalidated",
G_CALLBACK (tp_tube_invalidated_cb), self);
- emp_cli_channel_interface_tube_connect_to_tube_channel_state_changed (
- TP_PROXY (priv->channel), tp_tube_state_changed_cb, NULL, NULL,
+ priv->ready = FALSE;
+
+ tp_cli_channel_interface_tube_connect_to_tube_channel_state_changed (
+ priv->channel, tp_tube_state_changed_cb, NULL, NULL,
self, NULL);
+ tp_cli_dbus_properties_call_get (priv->channel, -1,
+ TP_IFACE_CHANNEL_INTERFACE_TUBE, "State", got_tube_state_cb,
+ self, NULL, G_OBJECT (self));
+
return self;
}
static void
tp_tube_finalize (GObject *object)
{
+ EmpathyTpTube *self = EMPATHY_TP_TUBE (object);
EmpathyTpTubePriv *priv = GET_PRIV (object);
+ GSList *l;
DEBUG ("Finalizing: %p", object);
@@ -197,6 +342,16 @@ tp_tube_finalize (GObject *object)
g_object_unref (priv->channel);
}
+ for (l = priv->ready_callbacks; l != NULL; l = g_slist_next (l))
+ {
+ ReadyCbData *d = (ReadyCbData *) l->data;
+
+ ready_cb_data_free (d, self);
+ }
+
+ g_slist_free (priv->ready_callbacks);
+ priv->ready_callbacks = NULL;
+
G_OBJECT_CLASS (empathy_tp_tube_parent_class)->finalize (object);
}
@@ -210,15 +365,30 @@ empathy_tp_tube_class_init (EmpathyTpTubeClass *klass)
object_class->set_property = tp_tube_set_property;
object_class->get_property = tp_tube_get_property;
+ /**
+ * EmpathyTpTube:channel:
+ *
+ * The #TpChannel wrapped by the tube object.
+ */
g_object_class_install_property (object_class, PROP_CHANNEL,
g_param_spec_object ("channel", "channel", "channel", TP_TYPE_CHANNEL,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS));
+ /**
+ * EmpathyTpTube:state:
+ *
+ * The state of the tube.
+ */
g_object_class_install_property (object_class, PROP_STATE,
g_param_spec_uint ("state", "state", "state",
- 0, NUM_EMP_TUBE_CHANNEL_STATES, 0,
+ 0, NUM_TP_TUBE_CHANNEL_STATES, 0,
G_PARAM_READABLE | G_PARAM_STATIC_NAME | G_PARAM_STATIC_STRINGS));
-
+ /**
+ * EmpathyTpTube::destroy:
+ * @self: the tube object
+ *
+ * Emitted when then tube has been invalidated.
+ */
signals[DESTROY] = g_signal_new ("destroy",
G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_LAST,
@@ -233,11 +403,19 @@ static void
empathy_tp_tube_init (EmpathyTpTube *tube)
{
EmpathyTpTubePriv *priv = G_TYPE_INSTANCE_GET_PRIVATE (tube,
- EMPATHY_TYPE_TP_TUBE, EmpathyTpTubePriv);
+ EMPATHY_TYPE_TP_TUBE, EmpathyTpTubePriv);
tube->priv = priv;
}
+/**
+ * empathy_tp_tube_new:
+ * @channel: a #TpChannel
+ *
+ * Creates a new #EmpathyTpTube.
+ *
+ * Return value: a new #EmpathyTpTube
+ */
EmpathyTpTube *
empathy_tp_tube_new (TpChannel *channel)
{
@@ -246,13 +424,27 @@ empathy_tp_tube_new (TpChannel *channel)
return g_object_new (EMPATHY_TYPE_TP_TUBE, "channel", channel, NULL);
}
+/**
+ * empathy_tp_tube_new_stream_tube:
+ * @contact: the #EmpathyContact to which the tube is offered
+ * @type: the type of the listening address of the local service. Either
+ * %TP_SOCKET_ADDRESS_TYPE_IPV4 or %TP_SOCKET_ADDRESS_TYPE_IPV6.
+ * @hostname: the address of the local service
+ * @port: the port of the local service
+ * @service: the service name of the tube
+ * @parameters: the parameters of the tube
+ *
+ * Creates and offers a new #EmpathyTpTube of ChannelType StreamTube.
+ *
+ * Return value: a new #EmpathyTpTube
+ */
EmpathyTpTube *
empathy_tp_tube_new_stream_tube (EmpathyContact *contact,
- TpSocketAddressType type,
- const gchar *hostname,
- guint port,
- const gchar *service,
- GHashTable *parameters)
+ TpSocketAddressType type,
+ const gchar *hostname,
+ guint port,
+ const gchar *service,
+ GHashTable *parameters)
{
TpConnection *connection;
TpChannel *channel;
@@ -277,7 +469,7 @@ empathy_tp_tube_new_stream_tube (EmpathyContact *contact,
/* org.freedesktop.Telepathy.Channel.ChannelType */
value = tp_g_value_slice_new (G_TYPE_STRING);
- g_value_set_string (value, EMP_IFACE_CHANNEL_TYPE_STREAM_TUBE);
+ g_value_set_string (value, TP_IFACE_CHANNEL_TYPE_STREAM_TUBE);
g_hash_table_insert (request, TP_IFACE_CHANNEL ".ChannelType", value);
/* org.freedesktop.Telepathy.Channel.TargetHandleType */
@@ -294,7 +486,7 @@ empathy_tp_tube_new_stream_tube (EmpathyContact *contact,
value = tp_g_value_slice_new (G_TYPE_STRING);
g_value_set_string (value, service);
g_hash_table_insert (request,
- EMP_IFACE_CHANNEL_TYPE_STREAM_TUBE ".Service", value);
+ TP_IFACE_CHANNEL_TYPE_STREAM_TUBE ".Service", value);
if (!tp_cli_connection_interface_requests_run_create_channel (connection, -1,
request, &object_path, &channel_properties, &error, NULL))
@@ -326,9 +518,8 @@ empathy_tp_tube_new_stream_tube (EmpathyContact *contact,
else
g_hash_table_ref (parameters);
- if (!emp_cli_channel_type_stream_tube_run_offer_stream_tube (
- TP_PROXY(channel), -1, type, address,
- TP_SOCKET_ACCESS_CONTROL_LOCALHOST, control_param, parameters,
+ if (!tp_cli_channel_type_stream_tube_run_offer (channel, -1, type, address,
+ TP_SOCKET_ACCESS_CONTROL_LOCALHOST, parameters,
&error, NULL))
{
DEBUG ("Couldn't offer tube: %s", error->message);
@@ -354,14 +545,14 @@ OUT:
}
static void
-tp_tube_accept_stream_cb (TpProxy *proxy,
- const GValue *address,
- const GError *error,
- gpointer user_data,
- GObject *weak_object)
+tp_tube_accept_stream_cb (TpChannel *channel,
+ const GValue *address,
+ const GError *error,
+ gpointer user_data,
+ GObject *weak_object)
{
EmpathyTpTube *tube = EMPATHY_TP_TUBE (weak_object);
- EmpathyTpTubeAcceptData *data = (EmpathyTpTubeAcceptData *)user_data;
+ EmpathyTpTubeAcceptData *data = (EmpathyTpTubeAcceptData *) user_data;
EmpathyTpTubeAddress eaddress;
eaddress.type = data->type;
@@ -390,9 +581,19 @@ tp_tube_accept_stream_cb (TpProxy *proxy,
data->callback (tube, &eaddress, NULL, data->user_data);
}
+/**
+ * empathy_tp_tube_accept_stream_tube:
+ * @tube: an #EmpathyTpTube
+ * @type: the type of address the connection manager should listen on
+ * @callback: called when the tube has been accepted
+ * @user_data: arbitrary user-supplied data passed to the callback
+ *
+ * Accepts @tube of ChannelType StreamTube and call @callback once it's done.
+ */
void
empathy_tp_tube_accept_stream_tube (EmpathyTpTube *tube,
- TpSocketAddressType type, EmpatyTpTubeAcceptStreamTubeCb *callback,
+ TpSocketAddressType type,
+ EmpathyTpTubeAcceptStreamTubeCb *callback,
gpointer user_data)
{
EmpathyTpTubePriv *priv = GET_PRIV (tube);
@@ -407,10 +608,62 @@ empathy_tp_tube_accept_stream_tube (EmpathyTpTube *tube,
data = new_empathy_tp_tube_accept_data (type, callback, user_data);
- emp_cli_channel_type_stream_tube_call_accept_stream_tube (
- TP_PROXY (priv->channel), -1, type, TP_SOCKET_ACCESS_CONTROL_LOCALHOST,
+ tp_cli_channel_type_stream_tube_call_accept (
+ priv->channel, -1, type, TP_SOCKET_ACCESS_CONTROL_LOCALHOST,
control_param, tp_tube_accept_stream_cb, data,
free_empathy_tp_tube_accept_data, G_OBJECT (tube));
tp_g_value_slice_free (control_param);
}
+
+/**
+ * EmpathyTpTubeReadyCb:
+ * @tube: an #EmpathyTpTube
+ * @error: %NULL on success, or the reason why the tube can't be ready
+ * @user_data: the @user_data passed to empathy_tp_tube_call_when_ready()
+ * @weak_object: the @weak_object passed to
+ * empathy_tp_tube_call_when_ready()
+ *
+ * Called as the result of empathy_tp_tube_call_when_ready(). If the
+ * tube's properties could be retrieved,
+ * @error is %NULL and @tube is considered to be ready. Otherwise, @error is
+ * non-%NULL and @tube is not ready.
+ */
+
+/**
+ * empathy_tp_tube_call_when_ready:
+ * @tube: an #EmpathyTpTube
+ * @callback: called when the tube becomes ready
+ * @user_data: arbitrary user-supplied data passed to the callback
+ * @destroy: called to destroy @user_data
+ * @weak_object: object to reference weakly; if it is destroyed, @callback
+ * will not be called, but @destroy will still be called
+ *
+ * If @tube is ready for use, call @callback immediately, then return.
+ * Otherwise, arrange for @callback to be called when @tube becomes
+ * ready for use.
+ */
+void
+empathy_tp_tube_call_when_ready (EmpathyTpTube *self,
+ EmpathyTpTubeReadyCb *callback,
+ gpointer user_data,
+ GDestroyNotify destroy,
+ GObject *weak_object)
+{
+ EmpathyTpTubePriv *priv = GET_PRIV (self);
+
+ g_return_if_fail (self != NULL);
+ g_return_if_fail (callback != NULL);
+
+ if (priv->ready)
+ {
+ callback (self, NULL, user_data, weak_object);
+ if (destroy != NULL)
+ destroy (user_data);
+ }
+ else
+ {
+ priv->ready_callbacks = g_slist_prepend (priv->ready_callbacks,
+ ready_cb_data_new (self, callback, user_data, destroy, weak_object));
+ }
+}
diff --git a/libempathy/empathy-tp-tube.h b/libempathy/empathy-tp-tube.h
index 8e63945e5..79cffa1a2 100644
--- a/libempathy/empathy-tp-tube.h
+++ b/libempathy/empathy-tp-tube.h
@@ -70,17 +70,34 @@ struct _EmpathyTpTubeClass {
GType empathy_tp_tube_get_type (void) G_GNUC_CONST;
EmpathyTpTube *empathy_tp_tube_new (TpChannel *channel);
EmpathyTpTube *empathy_tp_tube_new_stream_tube (EmpathyContact *contact,
- TpSocketAddressType type, const gchar *hostname, guint port,
- const gchar *service, GHashTable *parameters);
+ TpSocketAddressType type,
+ const gchar *hostname,
+ guint port,
+ const gchar *service,
+ GHashTable *parameters);
-typedef void (EmpatyTpTubeAcceptStreamTubeCb) (EmpathyTpTube *tube,
- const EmpathyTpTubeAddress *address, const GError *error,
+typedef void (EmpathyTpTubeAcceptStreamTubeCb) (EmpathyTpTube *tube,
+ const EmpathyTpTubeAddress *address,
+ const GError *error,
gpointer user_data);
void empathy_tp_tube_accept_stream_tube (EmpathyTpTube *tube,
- TpSocketAddressType type, EmpatyTpTubeAcceptStreamTubeCb *callback,
+ TpSocketAddressType type,
+ EmpathyTpTubeAcceptStreamTubeCb *callback,
gpointer user_data);
+typedef void (EmpathyTpTubeReadyCb)
+ (EmpathyTpTube *tube,
+ const GError *error,
+ gpointer user_data,
+ GObject *weak_object);
+
+void empathy_tp_tube_call_when_ready (EmpathyTpTube *tube,
+ EmpathyTpTubeReadyCb *callback,
+ gpointer user_data,
+ GDestroyNotify destroy,
+ GObject *weak_object);
+
G_END_DECLS
#endif /* __EMPATHY_TP_TUBE_H__ */
diff --git a/libempathy/empathy-tube-handler.c b/libempathy/empathy-tube-handler.c
index 18cda18b3..bbb7e11a6 100644
--- a/libempathy/empathy-tube-handler.c
+++ b/libempathy/empathy-tube-handler.c
@@ -14,7 +14,7 @@
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- *
+ *
* Authors: Xavier Claessens <xclaesse@gmail.com>
* Elliot Fairweather <elliot.fairweather@collabora.co.uk>
*/
@@ -59,15 +59,83 @@ typedef struct
gchar *channel;
guint handle_type;
guint handle;
+ EmpathyTpTube *tube;
} IdleData;
+static void
+tube_ready_cb (EmpathyTpTube *tube,
+ const GError *error,
+ gpointer user_data,
+ GObject *weak_object)
+{
+ IdleData *idle_data = user_data;
+
+ g_signal_emit (idle_data->thandler, signals[NEW_TUBE], 0, tube);
+}
+
+static void
+tube_ready_destroy_notify (gpointer data)
+{
+ IdleData *idle_data = data;
+
+ g_object_unref (idle_data->tube);
+ g_free (idle_data->bus_name);
+ g_free (idle_data->connection);
+ g_free (idle_data->channel);
+ g_slice_free (IdleData, idle_data);
+}
+
+static void
+channel_ready_cb (TpChannel *channel,
+ const GError *error,
+ gpointer data)
+{
+ IdleData *idle_data = data;
+
+ if (error != NULL)
+ {
+ DEBUG ("channel has been invalidated: %s", error->message);
+ tube_ready_destroy_notify (data);
+ g_object_unref (channel);
+ return;
+ }
+
+ idle_data->tube = empathy_tp_tube_new (channel);
+ empathy_tp_tube_call_when_ready (idle_data->tube, tube_ready_cb, idle_data,
+ tube_ready_destroy_notify, NULL);
+
+ g_object_unref (channel);
+}
+
+static void
+connection_ready_cb (TpConnection *connection,
+ const GError *error,
+ gpointer data)
+{
+ TpChannel *channel;
+ IdleData *idle_data = data;
+
+ if (error != NULL)
+ {
+ DEBUG ("connection has been invalidated: %s", error->message);
+ tube_ready_destroy_notify (data);
+ g_object_unref (connection);
+ return;
+ }
+
+ channel = tp_channel_new (connection, idle_data->channel,
+ TP_IFACE_CHANNEL_TYPE_TUBES, idle_data->handle_type,
+ idle_data->handle, NULL);
+ tp_channel_call_when_ready (channel, channel_ready_cb, idle_data);
+
+ g_object_unref (connection);
+}
+
static gboolean
tube_handler_handle_tube_idle_cb (gpointer data)
{
IdleData *idle_data = data;
TpConnection *connection;
- TpChannel *channel;
- EmpathyTpTube *tube;
static TpDBusDaemon *daemon = NULL;
DEBUG ("New tube to be handled");
@@ -77,33 +145,20 @@ tube_handler_handle_tube_idle_cb (gpointer data)
connection = tp_connection_new (daemon, idle_data->bus_name,
idle_data->connection, NULL);
- channel = tp_channel_new (connection, idle_data->channel,
- TP_IFACE_CHANNEL_TYPE_TUBES, idle_data->handle_type,
- idle_data->handle, NULL);
- tp_channel_run_until_ready (channel, NULL, NULL);
-
- tube = empathy_tp_tube_new (channel);
- g_signal_emit (idle_data->thandler, signals[NEW_TUBE], 0, tube);
-
- g_object_unref (tube);
- g_object_unref (channel);
- g_object_unref (connection);
- g_free (idle_data->bus_name);
- g_free (idle_data->connection);
- g_free (idle_data->channel);
- g_slice_free (IdleData, idle_data);
+ tp_connection_call_when_ready (connection,
+ connection_ready_cb, idle_data);
return FALSE;
}
static void
tube_handler_handle_tube (EmpSvcTubeHandler *self,
- const gchar *bus_name,
- const gchar *connection,
- const gchar *channel,
- guint handle_type,
- guint handle,
- DBusGMethodInvocation *context)
+ const gchar *bus_name,
+ const gchar *connection,
+ const gchar *channel,
+ guint handle_type,
+ guint handle,
+ DBusGMethodInvocation *context)
{
EmpathyTubeHandler *thandler = EMPATHY_TUBE_HANDLER (self);
IdleData *data;
@@ -144,7 +199,8 @@ empathy_tube_handler_init (EmpathyTubeHandler *thandler)
}
EmpathyTubeHandler *
-empathy_tube_handler_new (TpTubeType type, const gchar *service)
+empathy_tube_handler_new (TpTubeType type,
+ const gchar *service)
{
EmpathyTubeHandler *thandler = NULL;
DBusGProxy *proxy;
@@ -244,4 +300,3 @@ empathy_tube_handler_build_object_path (TpTubeType type,
return str;
}
-
diff --git a/libempathy/empathy-types.h b/libempathy/empathy-types.h
index b124924d4..7c633b166 100644
--- a/libempathy/empathy-types.h
+++ b/libempathy/empathy-types.h
@@ -15,7 +15,7 @@
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- *
+ *
* Authors: Cosimo Cecchi <cosimo.cecchi@collabora.co.uk>
*/
diff --git a/libempathy/empathy-utils.c b/libempathy/empathy-utils.c
index 210c35048..47746f536 100644
--- a/libempathy/empathy-utils.c
+++ b/libempathy/empathy-utils.c
@@ -15,8 +15,8 @@
*
* You should have received a copy of the GNU General Public
* License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301 USA
*
* Authors: Richard Hult <richard@imendio.com>
* Martyn Russell <martyn@imendio.com>
@@ -35,6 +35,7 @@
#include <telepathy-glib/connection.h>
#include <telepathy-glib/channel.h>
#include <telepathy-glib/dbus.h>
+#include <telepathy-glib/util.h>
#include "empathy-utils.h"
#include "empathy-contact-manager.h"
@@ -48,6 +49,28 @@
#define DEBUG_FLAG EMPATHY_DEBUG_OTHER
#include "empathy-debug.h"
+/* Translation between presence types and string */
+static struct {
+ gchar *name;
+ TpConnectionPresenceType type;
+} presence_types[] = {
+ { "available", TP_CONNECTION_PRESENCE_TYPE_AVAILABLE },
+ { "busy", TP_CONNECTION_PRESENCE_TYPE_BUSY },
+ { "away", TP_CONNECTION_PRESENCE_TYPE_AWAY },
+ { "ext_away", TP_CONNECTION_PRESENCE_TYPE_EXTENDED_AWAY },
+ { "hidden", TP_CONNECTION_PRESENCE_TYPE_HIDDEN },
+ { "offline", TP_CONNECTION_PRESENCE_TYPE_OFFLINE },
+ { "unset", TP_CONNECTION_PRESENCE_TYPE_UNSET },
+ { "unknown", TP_CONNECTION_PRESENCE_TYPE_UNKNOWN },
+ { "error", TP_CONNECTION_PRESENCE_TYPE_ERROR },
+ /* alternative names */
+ { "dnd", TP_CONNECTION_PRESENCE_TYPE_BUSY },
+ { "brb", TP_CONNECTION_PRESENCE_TYPE_AWAY },
+ { "xa", TP_CONNECTION_PRESENCE_TYPE_EXTENDED_AWAY },
+ { NULL, },
+};
+
+
void
empathy_init (void)
@@ -140,7 +163,7 @@ empathy_xml_validate (xmlDoc *doc,
}
xmlNodePtr
-empathy_xml_node_get_child (xmlNodePtr node,
+empathy_xml_node_get_child (xmlNodePtr node,
const gchar *child_name)
{
xmlNodePtr l;
@@ -158,7 +181,7 @@ empathy_xml_node_get_child (xmlNodePtr node,
}
xmlChar *
-empathy_xml_node_get_child_content (xmlNodePtr node,
+empathy_xml_node_get_child_content (xmlNodePtr node,
const gchar *child_name)
{
xmlNodePtr l;
@@ -175,7 +198,7 @@ empathy_xml_node_get_child_content (xmlNodePtr node,
}
xmlNodePtr
-empathy_xml_node_find_child_prop_value (xmlNodePtr node,
+empathy_xml_node_find_child_prop_value (xmlNodePtr node,
const gchar *prop_name,
const gchar *prop_value)
{
@@ -244,73 +267,51 @@ empathy_mission_control_dup_singleton (void)
}
const gchar *
-empathy_presence_get_default_message (McPresence presence)
+empathy_presence_get_default_message (TpConnectionPresenceType presence)
{
switch (presence) {
- case MC_PRESENCE_AVAILABLE:
+ case TP_CONNECTION_PRESENCE_TYPE_AVAILABLE:
return _("Available");
- case MC_PRESENCE_DO_NOT_DISTURB:
+ case TP_CONNECTION_PRESENCE_TYPE_BUSY:
return _("Busy");
- case MC_PRESENCE_AWAY:
- case MC_PRESENCE_EXTENDED_AWAY:
+ case TP_CONNECTION_PRESENCE_TYPE_AWAY:
+ case TP_CONNECTION_PRESENCE_TYPE_EXTENDED_AWAY:
return _("Away");
- case MC_PRESENCE_HIDDEN:
+ case TP_CONNECTION_PRESENCE_TYPE_HIDDEN:
return _("Hidden");
- case MC_PRESENCE_OFFLINE:
- case MC_PRESENCE_UNSET:
+ case TP_CONNECTION_PRESENCE_TYPE_OFFLINE:
return _("Offline");
- default:
- g_assert_not_reached ();
+ case TP_CONNECTION_PRESENCE_TYPE_UNSET:
+ case TP_CONNECTION_PRESENCE_TYPE_UNKNOWN:
+ case TP_CONNECTION_PRESENCE_TYPE_ERROR:
+ return NULL;
}
return NULL;
}
const gchar *
-empathy_presence_to_str (McPresence presence)
+empathy_presence_to_str (TpConnectionPresenceType presence)
{
- switch (presence) {
- case MC_PRESENCE_AVAILABLE:
- return "available";
- case MC_PRESENCE_DO_NOT_DISTURB:
- return "busy";
- case MC_PRESENCE_AWAY:
- return "away";
- case MC_PRESENCE_EXTENDED_AWAY:
- return "ext_away";
- case MC_PRESENCE_HIDDEN:
- return "hidden";
- case MC_PRESENCE_OFFLINE:
- return "offline";
- case MC_PRESENCE_UNSET:
- return "unset";
- default:
- g_assert_not_reached ();
- }
+ int i;
+
+ for (i = 0 ; presence_types[i].name != NULL; i++)
+ if (presence == presence_types[i].type)
+ return presence_types[i].name;
return NULL;
}
-McPresence
+TpConnectionPresenceType
empathy_presence_from_str (const gchar *str)
{
- if (strcmp (str, "available") == 0) {
- return MC_PRESENCE_AVAILABLE;
- } else if ((strcmp (str, "dnd") == 0) || (strcmp (str, "busy") == 0)) {
- return MC_PRESENCE_DO_NOT_DISTURB;
- } else if ((strcmp (str, "away") == 0) || (strcmp (str, "brb") == 0)) {
- return MC_PRESENCE_AWAY;
- } else if ((strcmp (str, "xa") == 0) || (strcmp (str, "ext_away") == 0)) {
- return MC_PRESENCE_EXTENDED_AWAY;
- } else if (strcmp (str, "hidden") == 0) {
- return MC_PRESENCE_HIDDEN;
- } else if (strcmp (str, "offline") == 0) {
- return MC_PRESENCE_OFFLINE;
- } else if (strcmp (str, "unset") == 0) {
- return MC_PRESENCE_UNSET;
- }
+ int i;
- return MC_PRESENCE_UNSET;
+ for (i = 0 ; presence_types[i].name != NULL; i++)
+ if (!tp_strdiff (str, presence_types[i].name))
+ return presence_types[i].type;
+
+ return TP_CONNECTION_PRESENCE_TYPE_UNSET;
}
gchar *
@@ -364,18 +365,25 @@ empathy_proxy_equal (gconstpointer a,
gboolean
empathy_check_available_state (void)
{
- McPresence presence;
+ TpConnectionPresenceType presence;
EmpathyIdle *idle;
idle = empathy_idle_dup_singleton ();
presence = empathy_idle_get_state (idle);
g_object_unref (idle);
- if (presence != MC_PRESENCE_AVAILABLE &&
- presence != MC_PRESENCE_UNSET) {
- return FALSE;
+ if (presence != TP_CONNECTION_PRESENCE_TYPE_AVAILABLE &&
+ presence != TP_CONNECTION_PRESENCE_TYPE_UNSET) {
+ return FALSE;
}
return TRUE;
}
+gint
+empathy_uint_compare (gconstpointer a,
+ gconstpointer b)
+{
+ return *(guint *) a - *(guint *) b;
+}
+
diff --git a/libempathy/empathy-utils.h b/libempathy/empathy-utils.h
index e6bcfebfc..de1437b9d 100644
--- a/libempathy/empathy-utils.h
+++ b/libempathy/empathy-utils.h
@@ -15,8 +15,8 @@
*
* You should have received a copy of the GNU General Public
* License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301 USA
*
* Authors: Richard Hult <richard@imendio.com>
* Martyn Russell <martyn@imendio.com>
@@ -37,7 +37,7 @@
#include "empathy-contact.h"
-#define EMPATHY_GET_PRIV(obj,type) ((type##Priv*) ((type*)obj)->priv)
+#define EMPATHY_GET_PRIV(obj,type) ((type##Priv *) ((type *) obj)->priv)
#define EMP_STR_EMPTY(x) ((x) == NULL || (x)[0] == '\0')
G_BEGIN_DECLS
@@ -69,15 +69,17 @@ guint empathy_account_hash (gconstpointer key);
gboolean empathy_account_equal (gconstpointer a,
gconstpointer b);
MissionControl *empathy_mission_control_dup_singleton (void);
-const gchar * empathy_presence_get_default_message (McPresence presence);
-const gchar * empathy_presence_to_str (McPresence presence);
-McPresence empathy_presence_from_str (const gchar *str);
+const gchar * empathy_presence_get_default_message (TpConnectionPresenceType presence);
+const gchar * empathy_presence_to_str (TpConnectionPresenceType presence);
+TpConnectionPresenceType empathy_presence_from_str (const gchar *str);
gchar * empathy_file_lookup (const gchar *filename,
const gchar *subdir);
gboolean empathy_proxy_equal (gconstpointer a,
gconstpointer b);
guint empathy_proxy_hash (gconstpointer key);
gboolean empathy_check_available_state (void);
+gint empathy_uint_compare (gconstpointer a,
+ gconstpointer b);
G_END_DECLS
diff --git a/libempathy/irc-networks.xml b/libempathy/irc-networks.xml
index 7a9d96bdc..4373eba93 100644
--- a/libempathy/irc-networks.xml
+++ b/libempathy/irc-networks.xml
@@ -213,6 +213,7 @@
</network>
<network name="FreeNode" id="freenode">
<servers>
+ <server ssl="FALSE" port="6667" address="chat.freenode.net"/>
<server ssl="FALSE" port="6667" address="irc.freenode.net"/>
</servers>
</network>
diff --git a/m4/shave.m4 b/m4/shave.m4
new file mode 100644
index 000000000..0a3509e59
--- /dev/null
+++ b/m4/shave.m4
@@ -0,0 +1,77 @@
+dnl Make automake/libtool output more friendly to humans
+dnl Damien Lespiau <damien.lespiau@gmail.com>
+dnl
+dnl SHAVE_INIT([shavedir],[default_mode])
+dnl
+dnl shavedir: the directory where the shave scripts are, it defaults to
+dnl $(top_builddir)
+dnl default_mode: (enable|disable) default shave mode. This parameter
+dnl controls shave's behaviour when no option has been
+dnl given to configure. It defaults to disable.
+dnl
+dnl * SHAVE_INIT should be called late in your configure.(ac|in) file (just
+dnl before AC_CONFIG_FILE/AC_OUTPUT is perfect. This macro rewrites CC and
+dnl LIBTOOL, you don't want the configure tests to have these variables
+dnl re-defined.
+dnl * This macro requires GNU make's -s option.
+
+AC_DEFUN([_SHAVE_ARG_ENABLE],
+[
+ AC_ARG_ENABLE([shave],
+ AS_HELP_STRING(
+ [--enable-shave],
+ [use shave to make the build pretty [[default=$1]]]),,
+ [enable_shave=$1]
+ )
+])
+
+AC_DEFUN([SHAVE_INIT],
+[
+ dnl you can tweak the default value of enable_shave
+ m4_if([$2], [enable], [_SHAVE_ARG_ENABLE(yes)], [_SHAVE_ARG_ENABLE(no)])
+
+ if test x"$enable_shave" = xyes; then
+ dnl where can we find the shave scripts?
+ m4_if([$1],,
+ [shavedir="$ac_pwd"],
+ [shavedir="$ac_pwd/$1"])
+ AC_SUBST(shavedir)
+
+ dnl make is now quiet
+ AC_SUBST([MAKEFLAGS], [-s])
+ AC_SUBST([AM_MAKEFLAGS], ['`test -z $V && echo -s`'])
+
+ dnl we need sed
+ AC_CHECK_PROG(SED,sed,sed,false)
+
+ dnl substitute libtool
+ SHAVE_SAVED_LIBTOOL=$LIBTOOL
+ LIBTOOL="${SHELL} ${shavedir}/shave-libtool '${SHAVE_SAVED_LIBTOOL}'"
+ AC_SUBST(LIBTOOL)
+
+ dnl substitute cc/cxx
+ SHAVE_SAVED_CC=$CC
+ SHAVE_SAVED_CXX=$CXX
+ SHAVE_SAVED_FC=$FC
+ SHAVE_SAVED_F77=$F77
+ SHAVE_SAVED_OBJC=$OBJC
+ CC="${SHELL} ${shavedir}/shave cc ${SHAVE_SAVED_CC}"
+ CXX="${SHELL} ${shavedir}/shave cxx ${SHAVE_SAVED_CXX}"
+ FC="${SHELL} ${shavedir}/shave fc ${SHAVE_SAVED_FC}"
+ F77="${SHELL} ${shavedir}/shave f77 ${SHAVE_SAVED_F77}"
+ OBJC="${SHELL} ${shavedir}/shave objc ${SHAVE_SAVED_OBJC}"
+ AC_SUBST(CC)
+ AC_SUBST(CXX)
+ AC_SUBST(FC)
+ AC_SUBST(F77)
+ AC_SUBST(OBJC)
+
+ V=@
+ else
+ V=1
+ fi
+ Q='$(V:1=)'
+ AC_SUBST(V)
+ AC_SUBST(Q)
+])
+
diff --git a/megaphone/data/Makefile.am b/megaphone/data/Makefile.am
index c2e378fae..875756cd0 100644
--- a/megaphone/data/Makefile.am
+++ b/megaphone/data/Makefile.am
@@ -1,3 +1,5 @@
+include $(top_srcdir)/tools/shave.mk
+
# Panel applet bonobo stuff
serverdir = $(libdir)/bonobo/servers
server_in_files = GNOME_Megaphone_Applet.server.in
@@ -21,7 +23,7 @@ megaphonebindir = $(libexecdir)
@INTLTOOL_SCHEMAS_RULE@
$(server_in_files): $(server_in_files:.server.in=.server.in.in)
- sed -e "s|\@LIBEXECDIR\@|$(megaphonebindir)|" $< > $@
+ $(QUIET_GEN)sed -e "s|\@LIBEXECDIR\@|$(megaphonebindir)|" $< > $@
DISTCLEANFILES = \
$(server_DATA) \
diff --git a/nothere/data/Makefile.am b/nothere/data/Makefile.am
index ce60c3cb2..730406577 100644
--- a/nothere/data/Makefile.am
+++ b/nothere/data/Makefile.am
@@ -1,3 +1,5 @@
+include $(top_srcdir)/tools/shave.mk
+
# Panel applet bonobo stuff
serverdir = $(libdir)/bonobo/servers
server_in_files = GNOME_NotHere_Applet.server.in
@@ -21,7 +23,7 @@ notherebindir = $(libexecdir)
@INTLTOOL_SCHEMAS_RULE@
$(server_in_files): $(server_in_files:.server.in=.server.in.in)
- sed -e "s|\@LIBEXECDIR\@|$(notherebindir)|" $< > $@
+ $(QUIET_GEN)sed -e "s|\@LIBEXECDIR\@|$(notherebindir)|" $< > $@
DISTCLEANFILES = \
$(server_DATA) \
diff --git a/po/LINGUAS b/po/LINGUAS
index f6f7b43f9..039fa077c 100644
--- a/po/LINGUAS
+++ b/po/LINGUAS
@@ -53,6 +53,7 @@ sq
sr
sr@latin
sv
+ta
th
tr
uk
diff --git a/po/POTFILES.in b/po/POTFILES.in
index 01b279d1a..e80a29c67 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -4,8 +4,11 @@
data/empathy.desktop.in.in
data/empathy.schemas.in
+libempathy/empathy-ft-handler.c
libempathy/empathy-tp-contact-list.c
+libempathy/empathy-tp-file.c
libempathy/empathy-utils.c
+libempathy/empathy-time.c
libempathy-gtk/empathy-account-chooser.c
libempathy-gtk/empathy-account-widget.c
@@ -37,8 +40,6 @@ libempathy-gtk/empathy-log-window.c
[type: gettext/glade]libempathy-gtk/empathy-log-window.ui
[type: gettext/glade]libempathy-gtk/empathy-new-message-dialog.ui
libempathy-gtk/empathy-presence-chooser.c
-libempathy-gtk/empathy-spell-dialog.c
-[type: gettext/glade]libempathy-gtk/empathy-spell-dialog.ui
libempathy-gtk/empathy-status-preset-dialog.c
[type: gettext/glade]libempathy-gtk/empathy-status-preset-dialog.ui
libempathy-gtk/empathy-theme-boxes.c
@@ -80,5 +81,7 @@ src/empathy-preferences.c
src/empathy-status-icon.c
[type: gettext/glade]src/empathy-status-icon.ui
src/empathy-tube-dispatch.c
+[type: gettext/glade]src/empathy-call-window-fullscreen.ui
+src/empathy-map-view.c
+[type: gettext/glade]src/empathy-map-view.ui
src/empathy-debug-dialog.c
-
diff --git a/po/es.po b/po/es.po
index 7e5b0c26d..f313ad790 100644
--- a/po/es.po
+++ b/po/es.po
@@ -8,8 +8,8 @@ msgstr ""
"Project-Id-Version: empathy.HEAD\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?"
"product=empathy&component=general\n"
-"POT-Creation-Date: 2009-04-21 15:44+0000\n"
-"PO-Revision-Date: 2009-04-21 21:02+0200\n"
+"POT-Creation-Date: 2009-06-02 18:22+0000\n"
+"PO-Revision-Date: 2009-06-03 19:57+0200\n"
"Last-Translator: Jorge González <jorgegonz@svn.gnome.org>\n"
"Language-Team: Español <gnome-es-list@gnome.org>\n"
"MIME-Version: 1.0\n"
@@ -70,129 +70,181 @@ msgid "Disable sounds when away"
msgstr "Desactivar los sonidos al ausentarse"
#: ../data/empathy.schemas.in.h:10
+msgid "Empathy can publish the user's location"
+msgstr "Empathy puede publicar la ubicación del usuario"
+
+#: ../data/empathy.schemas.in.h:11
+msgid "Empathy can use the GPS to guess the location"
+msgstr "Empathy puede usar el GPS para deducir la ubicación"
+
+#: ../data/empathy.schemas.in.h:12
+msgid "Empathy can use the cellular network to guess the location"
+msgstr "Empathy puede usar la red telefónica móvil para deducir la ubicación"
+
+#: ../data/empathy.schemas.in.h:13
+msgid "Empathy can use the network to guess the location"
+msgstr "Empathy puede usar la red para deducir la ubicación"
+
+#: ../data/empathy.schemas.in.h:14
msgid "Empathy default download folder"
msgstr "Carpeta de descargas predeterminada de Epiphany"
-#: ../data/empathy.schemas.in.h:11
+#: ../data/empathy.schemas.in.h:15
msgid "Empathy has asked about importing accounts"
msgstr "Empathy le ha preguntado acerca de importar cuentas"
-#: ../data/empathy.schemas.in.h:12
+#: ../data/empathy.schemas.in.h:16
msgid "Empathy should auto-connect on startup"
msgstr "Empathy se debería autoconectar al inicio"
-#: ../data/empathy.schemas.in.h:13
+#: ../data/empathy.schemas.in.h:17
+#| msgid "Empathy should auto-connect on startup"
+msgid "Empathy should reduce the location's accuracy"
+msgstr "Empathy debería reducir la precisión de la ubicación"
+
+#: ../data/empathy.schemas.in.h:18
msgid "Empathy should use the avatar of the contact as the chat window icon"
msgstr ""
"Empathy debería usar el avatar del contacto como icono de la ventana de chat"
-#: ../data/empathy.schemas.in.h:14
+#: ../data/empathy.schemas.in.h:19
msgid "Enable popup notifications for new messages"
msgstr "Activar notificaciones emergentes para mensajes nuevos"
-#: ../data/empathy.schemas.in.h:15
+#: ../data/empathy.schemas.in.h:20
msgid "Enable spell checker"
msgstr "Activar revisor ortográfico"
-#: ../data/empathy.schemas.in.h:16
+#: ../data/empathy.schemas.in.h:21
msgid "Hide main window"
msgstr "Ocultar la ventana principal"
-#: ../data/empathy.schemas.in.h:17
+#: ../data/empathy.schemas.in.h:22
msgid "Hide the main window."
msgstr "Ocultar la ventana principal."
-#: ../data/empathy.schemas.in.h:18
+#: ../data/empathy.schemas.in.h:23
msgid "NetworkManager should be used"
msgstr "Se debería usar NetworkManager"
-#: ../data/empathy.schemas.in.h:19
+#: ../data/empathy.schemas.in.h:24
msgid "Nick completed character"
msgstr "Carácter de completado de apodo"
-#: ../data/empathy.schemas.in.h:20
+#: ../data/empathy.schemas.in.h:25
msgid "Open new chats in separate windows"
msgstr "Abrir chats nuevos en ventanas separadas"
-#: ../data/empathy.schemas.in.h:21
+#: ../data/empathy.schemas.in.h:26
msgid "Play a sound for incoming messages"
msgstr "Reproducir un sonido cuando lleguen mensajes"
-#: ../data/empathy.schemas.in.h:22
+#: ../data/empathy.schemas.in.h:27
msgid "Play a sound for new conversations"
msgstr "Reproducir un sonido para conversaciones nuevas"
-#: ../data/empathy.schemas.in.h:23
+#: ../data/empathy.schemas.in.h:28
msgid "Play a sound for outgoing messages"
msgstr "Reproducir un sonido al enviar mensajes"
-#: ../data/empathy.schemas.in.h:24
+#: ../data/empathy.schemas.in.h:29
msgid "Play a sound when a contact logs in"
msgstr "Reproducir un sonido cuando un contacto inicie sesión"
-#: ../data/empathy.schemas.in.h:25
+#: ../data/empathy.schemas.in.h:30
msgid "Play a sound when a contact logs out"
msgstr "Reproducir un sonido cuando un contacto finalice su sesión"
-#: ../data/empathy.schemas.in.h:26
+#: ../data/empathy.schemas.in.h:31
msgid "Play a sound when we log in"
msgstr "Reproducir un sonido cuando inicio sesión"
-#: ../data/empathy.schemas.in.h:27
+#: ../data/empathy.schemas.in.h:32
msgid "Play a sound when we log out"
msgstr "Reproducir un sonido cuando finalizo una sesión"
-#: ../data/empathy.schemas.in.h:28
+#: ../data/empathy.schemas.in.h:33
msgid "Popup notifications if the chat isn't focused"
msgstr ""
"Mostrar notificaciones emergentes si la ventana de chat no tiene el foco"
-#: ../data/empathy.schemas.in.h:29
+#: ../data/empathy.schemas.in.h:34
msgid "Salut account is created"
msgstr "Se creó la cuenta Salut"
-#: ../data/empathy.schemas.in.h:30
+#: ../data/empathy.schemas.in.h:35
msgid "Show avatars"
msgstr "Mostrar avatares"
-#: ../data/empathy.schemas.in.h:31
+#: ../data/empathy.schemas.in.h:36
msgid "Show hint about closing the main window"
msgstr "Mostrar consejo sobre cómo cerrar la ventana principal"
-#: ../data/empathy.schemas.in.h:32
+#: ../data/empathy.schemas.in.h:37
msgid "Show offline contacts"
msgstr "Mostrar contactos no conectados"
-#: ../data/empathy.schemas.in.h:33
+#: ../data/empathy.schemas.in.h:38
msgid "Spell checking languages"
msgstr "Idiomas para revisión ortográfica"
-#: ../data/empathy.schemas.in.h:34
+#: ../data/empathy.schemas.in.h:39
msgid "The default folder to save file transfers in."
msgstr "La carpeta predeterminada donde guardar los archivos transferidos."
-#: ../data/empathy.schemas.in.h:35
+#: ../data/empathy.schemas.in.h:40
msgid "The last directory that an avatar image was chosen from."
msgstr "Último directorio del que fue elegido un avatar."
-#: ../data/empathy.schemas.in.h:36
+#: ../data/empathy.schemas.in.h:41
msgid "The theme that is used to display the conversation in chat windows."
msgstr ""
"El tema que se usará para mostrar la conversación en las ventanas de chat."
-#: ../data/empathy.schemas.in.h:37
+#: ../data/empathy.schemas.in.h:42
msgid "Use graphical smileys"
msgstr "Usar emoticonos gráficos"
-#: ../data/empathy.schemas.in.h:38
+#: ../data/empathy.schemas.in.h:43
msgid "Use notification sounds"
msgstr "Usar sonidos de notificación"
-#: ../data/empathy.schemas.in.h:39
+#: ../data/empathy.schemas.in.h:44
msgid "Use theme for chat rooms"
msgstr "Usar tema para salas de chat"
-#: ../data/empathy.schemas.in.h:40
+#: ../data/empathy.schemas.in.h:45
+#| msgid ""
+#| "Whether or not to show contacts that are offline in the contact list."
+msgid "Whether or not Empathy can publish the user's location to his contacts."
+msgstr ""
+"Indica si Empathy puede publicar la ubicación del usuario a sus contactos."
+
+#: ../data/empathy.schemas.in.h:46
+#| msgid ""
+#| "Whether or not Empathy should use the avatar of the contact as the chat "
+#| "window icon."
+msgid "Whether or not Empathy can use the GPS to guess the location."
+msgstr "Indica si Empathy puede usar el GPS para deducir la ubicación."
+
+#: ../data/empathy.schemas.in.h:47
+#| msgid ""
+#| "Whether or not Empathy should use the avatar of the contact as the chat "
+#| "window icon."
+msgid ""
+"Whether or not Empathy can use the cellular network to guess the location."
+msgstr ""
+"Indica si Empathy puede usar la red telefónica móvil para deducir la "
+"ubicación."
+
+#: ../data/empathy.schemas.in.h:48
+#| msgid ""
+#| "Whether or not Empathy should use the avatar of the contact as the chat "
+#| "window icon."
+msgid "Whether or not Empathy can use the network to guess the location."
+msgstr "Indica si Empathy puede usar la red para deducir la ubicación."
+
+#: ../data/empathy.schemas.in.h:49
msgid ""
"Whether or not Empathy has asked about importing accounts from other "
"programs."
@@ -200,7 +252,7 @@ msgstr ""
"Indica si Empathy ha preguntado acerca de importar cuentas de otros "
"programas."
-#: ../data/empathy.schemas.in.h:41
+#: ../data/empathy.schemas.in.h:50
msgid ""
"Whether or not Empathy should automatically log in to your accounts on "
"startup."
@@ -208,7 +260,18 @@ msgstr ""
"Indica si Empathy debe iniciar sesión en sus cuentas automáticamente al "
"inicio."
-#: ../data/empathy.schemas.in.h:42
+#: ../data/empathy.schemas.in.h:51
+#| msgid ""
+#| "Whether or not Empathy should use the avatar of the contact as the chat "
+#| "window icon."
+msgid ""
+"Whether or not Empathy should reduce the location's accuracy for privacy "
+"reasons."
+msgstr ""
+"Indica si Empathy debería reducir la precisión de la ubicación por motivos "
+"de privacidad."
+
+#: ../data/empathy.schemas.in.h:52
msgid ""
"Whether or not Empathy should use the avatar of the contact as the chat "
"window icon."
@@ -216,14 +279,14 @@ msgstr ""
"Indica si Empathy debería usar el avatar del contacto como el icono de la "
"ventana de chat."
-#: ../data/empathy.schemas.in.h:43
+#: ../data/empathy.schemas.in.h:53
msgid ""
"Whether or not the Salut account has been created on the first Empathy run."
msgstr ""
"Indica si la cuenta Salut se ha creado cuando ejecutó por primera vez "
"Empathy."
-#: ../data/empathy.schemas.in.h:44
+#: ../data/empathy.schemas.in.h:54
msgid ""
"Whether or not the network manager should be used to automatically "
"disconnect/reconnect."
@@ -231,7 +294,7 @@ msgstr ""
"Indica si se debe usar el gestor de la red para desconectarse/reconectarse "
"automáticamente."
-#: ../data/empathy.schemas.in.h:45
+#: ../data/empathy.schemas.in.h:55
msgid ""
"Whether or not to check words typed against the languages you want to check "
"with."
@@ -239,21 +302,21 @@ msgstr ""
"Indica si se deben revisar las palabras tecleadas con respecto a los idiomas "
"con los que quiere comprobarlo."
-#: ../data/empathy.schemas.in.h:46
+#: ../data/empathy.schemas.in.h:56
msgid ""
"Whether or not to convert smileys into graphical images in conversations."
msgstr ""
"Indica si se deben convertir los emoticonos en imágenes gráficas en las "
"conversaciones."
-#: ../data/empathy.schemas.in.h:47
+#: ../data/empathy.schemas.in.h:57
msgid ""
"Whether or not to play a sound to notify for contacts logging in the network."
msgstr ""
"Indica si se debe reproducir un sonido para notificar los inicios de sesión "
"de los contactos en la red."
-#: ../data/empathy.schemas.in.h:48
+#: ../data/empathy.schemas.in.h:58
msgid ""
"Whether or not to play a sound to notify for contacts logging off the "
"network."
@@ -261,40 +324,40 @@ msgstr ""
"Indica si se debe reproducir un sonido para notificar las finalizaciones de "
"sesión de los contactos en la red."
-#: ../data/empathy.schemas.in.h:49
+#: ../data/empathy.schemas.in.h:59
msgid "Whether or not to play a sound to notify for events."
msgstr "Indica si se debe reproducir un sonido para notificar eventos."
-#: ../data/empathy.schemas.in.h:50
+#: ../data/empathy.schemas.in.h:60
msgid "Whether or not to play a sound to notify for incoming messages."
msgstr ""
"Indica si se debe reproducir un sonido para notificar mensajes entrantes."
-#: ../data/empathy.schemas.in.h:51
+#: ../data/empathy.schemas.in.h:61
msgid "Whether or not to play a sound to notify for new conversations."
msgstr ""
"Indica si se debe reproducir un sonido para notificar conversaciones nuevas."
-#: ../data/empathy.schemas.in.h:52
+#: ../data/empathy.schemas.in.h:62
msgid "Whether or not to play a sound to notify for outgoing messages."
msgstr ""
"Indica si se debe reproducir un sonido para notificar mensajes salientes."
-#: ../data/empathy.schemas.in.h:53
+#: ../data/empathy.schemas.in.h:63
msgid "Whether or not to play a sound when logging in a network."
msgstr "Indica si se debe reproducir un sonido al iniciar sesión en una red."
-#: ../data/empathy.schemas.in.h:54
+#: ../data/empathy.schemas.in.h:64
msgid "Whether or not to play a sound when logging off a network."
msgstr "Indica si se debe reproducir un sonido al finalizar sesión en una red."
-#: ../data/empathy.schemas.in.h:55
+#: ../data/empathy.schemas.in.h:65
msgid "Whether or not to play sound notifications when away or busy."
msgstr ""
"Indica si se deben reproducir sonidos de notificaciones cuando se esté "
"ausente u ocupado."
-#: ../data/empathy.schemas.in.h:56
+#: ../data/empathy.schemas.in.h:66
msgid ""
"Whether or not to show a popup notification when receiving a new message "
"even if the chat is already opened, but not focused."
@@ -302,14 +365,14 @@ msgstr ""
"Indica si de deben mostrar notificaciones emergentes al recibir un mensaje "
"nuevo incluso si la ventana de chat ya está abierta pero no tiene el foco."
-#: ../data/empathy.schemas.in.h:57
+#: ../data/empathy.schemas.in.h:67
msgid ""
"Whether or not to show a popup notification when receiving a new message."
msgstr ""
"Indica si se deben mostrar notificaciones emergentes al recibir un mensaje "
"nuevo."
-#: ../data/empathy.schemas.in.h:58
+#: ../data/empathy.schemas.in.h:68
msgid ""
"Whether or not to show avatars for contacts in the contact list and chat "
"windows."
@@ -317,19 +380,19 @@ msgstr ""
"Indica si se debe mostrar los avatares para los contactos en la lista de "
"contactos y ventanas de chat."
-#: ../data/empathy.schemas.in.h:59
+#: ../data/empathy.schemas.in.h:69
msgid "Whether or not to show contacts that are offline in the contact list."
msgstr ""
"Indica si se debe mostrar los contactos que están desconectados en la lista "
"de contactos."
-#: ../data/empathy.schemas.in.h:60
+#: ../data/empathy.schemas.in.h:70
msgid "Whether or not to show popup notifications when away or busy."
msgstr ""
"Indica si se deben mostrar las notificaciones emergentes cuando se esté "
"ausente u ocupado."
-#: ../data/empathy.schemas.in.h:61
+#: ../data/empathy.schemas.in.h:71
msgid ""
"Whether or not to show the message dialog about closing the main window with "
"the 'x' button in the title bar."
@@ -337,15 +400,15 @@ msgstr ""
"Indica si se debe mostrar un mensaje de diálogo sobre cómo cerrar la ventana "
"principal con el botón 'x' en la barra de título."
-#: ../data/empathy.schemas.in.h:62
+#: ../data/empathy.schemas.in.h:72
msgid "Whether to show the contact list in compact mode or not."
msgstr "Indica si se debe mostrar la lista de contactos en modo compacto."
-#: ../data/empathy.schemas.in.h:63
+#: ../data/empathy.schemas.in.h:73
msgid "Whether to use the theme for chat rooms or not."
msgstr "Indica si se debe usar el tema para salas de chat."
-#: ../data/empathy.schemas.in.h:64
+#: ../data/empathy.schemas.in.h:74
msgid ""
"Which criterium to use when sorting the contact list. Default is to use sort "
"by the contact's name with the value \"name\". A value of \"state\" will "
@@ -355,36 +418,111 @@ msgstr ""
"predeterminado es ordenar por el nombre del contacto con el valor \"name"
"\" (nombre). Un valor \"state\" (estado) ordenará la lista por el estado."
-#: ../libempathy/empathy-tp-contact-list.c:732 ../src/empathy.c:271
+#: ../libempathy/empathy-ft-handler.c:838
+msgid "The hash of the received file and the sent one do not match"
+msgstr "El «hash» del archivo recibido y del enviado no coinciden"
+
+#: ../libempathy/empathy-ft-handler.c:1098
+msgid "File transfer not supported by remote contact"
+msgstr "El contacto remoto no soporta la transferencia de archivos"
+
+#: ../libempathy/empathy-tp-contact-list.c:727 ../src/empathy.c:286
msgid "People nearby"
msgstr "Gente cerca"
-#: ../libempathy/empathy-utils.c:252
+#: ../libempathy/empathy-tp-file.c:300
+msgid "No reason was specified"
+msgstr "No se especificó ninguna razón"
+
+#: ../libempathy/empathy-tp-file.c:303
+msgid "The change in state was requested"
+msgstr "Se requirió un cambio en el estado"
+
+#: ../libempathy/empathy-tp-file.c:306
+msgid "You canceled the file transfer"
+msgstr "Canceló la transferencia del archivo"
+
+#: ../libempathy/empathy-tp-file.c:309
+msgid "The other participant canceled the file transfer"
+msgstr "El otro participante canceló la transferencia del archivo"
+
+#: ../libempathy/empathy-tp-file.c:312
+msgid "Error while trying to transfer the file"
+msgstr "Error la intentar transferir el archivo"
+
+#: ../libempathy/empathy-tp-file.c:315
+msgid "The other participant is unable to transfer the file"
+msgstr "El otro participante no puede transferir el archivo"
+
+#: ../libempathy/empathy-tp-file.c:318
+msgid "Unknown reason"
+msgstr "Razón desconocida"
+
+#: ../libempathy/empathy-utils.c:274
msgid "Available"
msgstr "Disponible"
-#: ../libempathy/empathy-utils.c:254
+#: ../libempathy/empathy-utils.c:276
msgid "Busy"
msgstr "Ocupado"
-#: ../libempathy/empathy-utils.c:257
+#: ../libempathy/empathy-utils.c:279
msgid "Away"
msgstr "Ausente"
-#: ../libempathy/empathy-utils.c:259
+#: ../libempathy/empathy-utils.c:281
msgid "Hidden"
msgstr "Oculto"
-#: ../libempathy/empathy-utils.c:262
+#: ../libempathy/empathy-utils.c:283
msgid "Offline"
msgstr "Desconectado"
-#: ../libempathy-gtk/empathy-account-chooser.c:325
+#: ../libempathy/empathy-time.c:137
+#, c-format
+msgid "%d second ago"
+msgid_plural "%d seconds ago"
+msgstr[0] "hace %d segundo"
+msgstr[1] "hace %d segundos"
+
+#: ../libempathy/empathy-time.c:142
+#, c-format
+msgid "%d minute ago"
+msgid_plural "%d minutes ago"
+msgstr[0] "hace %d minuto"
+msgstr[1] "hace %d minutos"
+
+#: ../libempathy/empathy-time.c:147
+#, c-format
+msgid "%d hour ago"
+msgid_plural "%d hours ago"
+msgstr[0] "hace %d hora"
+msgstr[1] "hace %d horas"
+
+#: ../libempathy/empathy-time.c:152
+#, c-format
+msgid "%d day ago"
+msgid_plural "%d days ago"
+msgstr[0] "hace %d día"
+msgstr[1] "hace %d días"
+
+#: ../libempathy/empathy-time.c:157
+#, c-format
+msgid "%d month ago"
+msgid_plural "%d months ago"
+msgstr[0] "hace %d mes"
+msgstr[1] "hace %d meses"
+
+#: ../libempathy/empathy-time.c:162
+msgid "in the future"
+msgstr "en el futuro"
+
+#: ../libempathy-gtk/empathy-account-chooser.c:419
msgid "All"
msgstr "Todo"
#: ../libempathy-gtk/empathy-account-widget.c:302
-#: ../libempathy-gtk/empathy-account-widget.c:349
+#: ../libempathy-gtk/empathy-account-widget.c:354
#, c-format
msgid "%s:"
msgstr "%s:"
@@ -430,7 +568,7 @@ msgstr "_Puerto:"
#: ../libempathy-gtk/empathy-account-widget-jabber.ui.h:11
#: ../libempathy-gtk/empathy-account-widget-msn.ui.h:5
#: ../libempathy-gtk/empathy-account-widget-yahoo.ui.h:9
-#: ../src/empathy-new-chatroom-dialog.ui.h:8
+#: ../src/empathy-new-chatroom-dialog.ui.h:9
msgid "_Server:"
msgstr "_Servidor:"
@@ -449,7 +587,7 @@ msgstr "_UIN ICQ:"
msgid "_Charset:"
msgstr "Conjunto de _caracteres:"
-#: ../libempathy-gtk/empathy-account-widget-irc.c:244
+#: ../libempathy-gtk/empathy-account-widget-irc.c:241
msgid "New Network"
msgstr "Red nueva"
@@ -570,114 +708,118 @@ msgstr "_Ignorar invitaciones a conferencias y salas de chat"
msgid "_Room List locale:"
msgstr "Configuración de la lista de _salas:"
-#: ../libempathy-gtk/empathy-avatar-chooser.c:462
-#: ../libempathy-gtk/empathy-avatar-chooser.c:538
+#: ../libempathy-gtk/empathy-avatar-chooser.c:449
+#: ../libempathy-gtk/empathy-avatar-chooser.c:525
msgid "Couldn't convert image"
msgstr "No se pudo convertir la imagen"
-#: ../libempathy-gtk/empathy-avatar-chooser.c:463
+#: ../libempathy-gtk/empathy-avatar-chooser.c:450
msgid "None of the accepted image formats is supported on your system"
msgstr "Su sistema no soporta ninguno de los formatos de imagen aceptados"
-#: ../libempathy-gtk/empathy-avatar-chooser.c:957
+#: ../libempathy-gtk/empathy-avatar-chooser.c:933
msgid "Select Your Avatar Image"
msgstr "Seleccione su imagen de avatar"
-#: ../libempathy-gtk/empathy-avatar-chooser.c:960
+#: ../libempathy-gtk/empathy-avatar-chooser.c:936
msgid "No Image"
msgstr "Sin imagen"
-#: ../libempathy-gtk/empathy-avatar-chooser.c:1022
+#: ../libempathy-gtk/empathy-avatar-chooser.c:998
msgid "Images"
msgstr "Imágenes"
-#: ../libempathy-gtk/empathy-avatar-chooser.c:1026
+#: ../libempathy-gtk/empathy-avatar-chooser.c:1002
msgid "All Files"
msgstr "Todos los archivos"
-#: ../libempathy-gtk/empathy-avatar-image.c:294
+#: ../libempathy-gtk/empathy-avatar-image.c:324
msgid "Click to enlarge"
msgstr "Pulse para agrandar"
-#: ../libempathy-gtk/empathy-chat.c:180
+#: ../libempathy-gtk/empathy-chat.c:178
msgid "Failed to reconnect this chat"
msgstr "Falló al reconectar a este chat"
-#: ../libempathy-gtk/empathy-chat.c:398
+#: ../libempathy-gtk/empathy-chat.c:396
msgid "Unsupported command"
msgstr "Comando no soportado"
-#: ../libempathy-gtk/empathy-chat.c:533
+#: ../libempathy-gtk/empathy-chat.c:531
msgid "offline"
msgstr "desconectado"
-#: ../libempathy-gtk/empathy-chat.c:536
+#: ../libempathy-gtk/empathy-chat.c:534
msgid "invalid contact"
msgstr "contacto no válido"
-#: ../libempathy-gtk/empathy-chat.c:539
+#: ../libempathy-gtk/empathy-chat.c:537
msgid "permission denied"
msgstr "permiso denegado"
-#: ../libempathy-gtk/empathy-chat.c:542
+#: ../libempathy-gtk/empathy-chat.c:540
msgid "too long message"
msgstr "mensaje demasiado largo"
-#: ../libempathy-gtk/empathy-chat.c:545
+#: ../libempathy-gtk/empathy-chat.c:543
msgid "not implemented"
msgstr "no implementado"
-#: ../libempathy-gtk/empathy-chat.c:548
+#: ../libempathy-gtk/empathy-chat.c:546
msgid "unknown"
msgstr "desconocido"
-#: ../libempathy-gtk/empathy-chat.c:552
+#: ../libempathy-gtk/empathy-chat.c:550
#, c-format
msgid "Error sending message '%s': %s"
msgstr "Error al enviar el mensaje «%s»: %s"
-#: ../libempathy-gtk/empathy-chat.c:582
+#: ../libempathy-gtk/empathy-chat.c:580
#, c-format
msgid "Topic set to: %s"
msgstr "El tema se ha establecido a: %s"
-#: ../libempathy-gtk/empathy-chat.c:584
+#: ../libempathy-gtk/empathy-chat.c:582
msgid "No topic defined"
msgstr "No se ha definido el tema"
-#: ../libempathy-gtk/empathy-chat.c:977
+#: ../libempathy-gtk/empathy-chat.c:951
+msgid "(No Suggestions)"
+msgstr "(Sin sugerencias)"
+
+#: ../libempathy-gtk/empathy-chat.c:1005
msgid "Insert Smiley"
msgstr "Insertar emoticono"
#. send button
-#: ../libempathy-gtk/empathy-chat.c:995
-#: ../libempathy-gtk/empathy-ui-utils.c:1507
+#: ../libempathy-gtk/empathy-chat.c:1023
+#: ../libempathy-gtk/empathy-ui-utils.c:1453
msgid "_Send"
msgstr "E_nviar"
-#: ../libempathy-gtk/empathy-chat.c:1029
-msgid "_Check Word Spelling..."
-msgstr "_Comprobar ortografía…"
+#: ../libempathy-gtk/empathy-chat.c:1057
+msgid "_Spelling Suggestions"
+msgstr "_Sugerencias ortográficas"
-#: ../libempathy-gtk/empathy-chat.c:1147
+#: ../libempathy-gtk/empathy-chat.c:1171
#, c-format
msgid "%s has joined the room"
msgstr "%s ha entrado en la sala"
-#: ../libempathy-gtk/empathy-chat.c:1150
+#: ../libempathy-gtk/empathy-chat.c:1174
#, c-format
msgid "%s has left the room"
msgstr "%s ha dejado la sala"
-#: ../libempathy-gtk/empathy-chat.c:1265 ../src/empathy-call-window.c:756
+#: ../libempathy-gtk/empathy-chat.c:1289 ../src/empathy-call-window.c:1014
msgid "Disconnected"
msgstr "Desconectado"
-#: ../libempathy-gtk/empathy-chat.c:1660
+#: ../libempathy-gtk/empathy-chat.c:1700
msgid "Connected"
msgstr "Conectado"
-#: ../libempathy-gtk/empathy-chat.c:1710
+#: ../libempathy-gtk/empathy-chat.c:1750
#: ../libempathy-gtk/empathy-log-window.c:501
msgid "Conversation"
msgstr "Conversación"
@@ -700,23 +842,16 @@ msgstr "_Abrir enlace"
msgid "%A %B %d %Y"
msgstr "%A %d %B %Y"
-#: ../libempathy-gtk/empathy-contact-dialogs.c:181
-msgid "Personal Information"
-msgstr "Información personal"
-
-#: ../libempathy-gtk/empathy-contact-dialogs.c:184
+#: ../libempathy-gtk/empathy-contact-dialogs.c:179
+#: ../libempathy-gtk/empathy-contact-dialogs.c:238
msgid "Edit Contact Information"
msgstr "Editar información del contacto"
-#: ../libempathy-gtk/empathy-contact-dialogs.c:187
-msgid "Contact Information"
-msgstr "Información del contacto"
-
-#: ../libempathy-gtk/empathy-contact-dialogs.c:269
-msgid "I would like to add you to my contact list."
-msgstr "Me gustaría añadirte a mi lista de contactos."
+#: ../libempathy-gtk/empathy-contact-dialogs.c:289
+msgid "Personal Information"
+msgstr "Información personal"
-#: ../libempathy-gtk/empathy-contact-dialogs.c:293
+#: ../libempathy-gtk/empathy-contact-dialogs.c:392
msgid "New Contact"
msgstr "Contacto nuevo"
@@ -728,91 +863,198 @@ msgstr "Decidir _luego"
msgid "Subscription Request"
msgstr "Petición de suscripción"
-#: ../libempathy-gtk/empathy-contact-list-view.c:1255
+#: ../libempathy-gtk/empathy-contact-list-view.c:1378
#, c-format
msgid "Do you really want to remove the group '%s'?"
msgstr "¿Realmente quiere quitar el grupo «%s»?"
-#: ../libempathy-gtk/empathy-contact-list-view.c:1257
+#: ../libempathy-gtk/empathy-contact-list-view.c:1380
msgid "Removing group"
msgstr "Quitando grupo"
-#: ../libempathy-gtk/empathy-contact-list-view.c:1304
-#: ../libempathy-gtk/empathy-contact-list-view.c:1383
+#: ../libempathy-gtk/empathy-contact-list-view.c:1427
+#: ../libempathy-gtk/empathy-contact-list-view.c:1505
msgid "_Remove"
msgstr "_Quitar"
-#: ../libempathy-gtk/empathy-contact-list-view.c:1334
+#: ../libempathy-gtk/empathy-contact-list-view.c:1457
#, c-format
msgid "Do you really want to remove the contact '%s'?"
msgstr "¿Realmente quiere quitar el contacto «%s»?"
-#: ../libempathy-gtk/empathy-contact-list-view.c:1336
+#: ../libempathy-gtk/empathy-contact-list-view.c:1459
msgid "Removing contact"
msgstr "Quitando el contacto"
-#: ../libempathy-gtk/empathy-contact-list-view.c:1341
-msgid "Sorry, I don't want you in my contact list anymore."
-msgstr "Lo siento, no te quiero en mi lista de contactos."
-
-#: ../libempathy-gtk/empathy-contact-menu.c:130
+#: ../libempathy-gtk/empathy-contact-menu.c:135
#: ../src/empathy-main-window.ui.h:8
msgid "_Chat"
msgstr "_Chat"
-#: ../libempathy-gtk/empathy-contact-menu.c:161
-#| msgid "_Call"
+#: ../libempathy-gtk/empathy-contact-menu.c:166
msgctxt "menu item"
-msgid "_Call"
-msgstr "_Llamar"
+msgid "_Audio Call"
+msgstr "Llamada de _sonido"
-#: ../libempathy-gtk/empathy-contact-menu.c:200
-#: ../src/empathy-main-window.ui.h:17
+#: ../libempathy-gtk/empathy-contact-menu.c:198
+msgctxt "menu item"
+msgid "_Video Call"
+msgstr "Llamada de _vídeo"
+
+#: ../libempathy-gtk/empathy-contact-menu.c:237
msgid "_View Previous Conversations"
msgstr "_Ver conversaciones previas"
-#: ../libempathy-gtk/empathy-contact-menu.c:222
+#: ../libempathy-gtk/empathy-contact-menu.c:259
msgid "Send file"
msgstr "Enviar archivo"
-#: ../libempathy-gtk/empathy-contact-menu.c:250
+#: ../libempathy-gtk/empathy-contact-menu.c:287
msgid "Infor_mation"
msgstr "Infor_mación"
-#: ../libempathy-gtk/empathy-contact-menu.c:277
+#: ../libempathy-gtk/empathy-contact-menu.c:314
#: ../src/empathy-main-window.ui.h:10
msgid "_Edit"
msgstr "_Editar"
-#: ../libempathy-gtk/empathy-contact-menu.c:336
+#: ../libempathy-gtk/empathy-contact-menu.c:372
msgid "Inviting to this room"
msgstr "Invitando a esta sala"
-#: ../libempathy-gtk/empathy-contact-menu.c:367
+#: ../libempathy-gtk/empathy-contact-menu.c:403
msgid "_Invite to chatroom"
msgstr "_Invitar a la sala"
-#: ../libempathy-gtk/empathy-contact-selector.c:112
+#: ../libempathy-gtk/empathy-contact-selector.c:129
msgid "Select a contact"
msgstr "Seleccionar un contacto"
-#: ../libempathy-gtk/empathy-contact-widget.c:353
+#: ../libempathy-gtk/empathy-contact-widget.c:440
msgid "Save Avatar"
msgstr "Guardar avatar"
-#: ../libempathy-gtk/empathy-contact-widget.c:409
+#: ../libempathy-gtk/empathy-contact-widget.c:496
msgid "Unable to save avatar"
msgstr "No se pudo guardar el avatar"
-#: ../libempathy-gtk/empathy-contact-widget.c:904
+#: ../libempathy-gtk/empathy-contact-widget.c:979
msgid "Select"
msgstr "Seleccionar"
-#: ../libempathy-gtk/empathy-contact-widget.c:913
-#: ../src/empathy-main-window.c:882
+#: ../libempathy-gtk/empathy-contact-widget.c:988
+#: ../src/empathy-main-window.c:904
msgid "Group"
msgstr "Grupo"
+#: ../libempathy-gtk/empathy-contact-widget.c:1239
+msgid "Country ISO Code:"
+msgstr "Código ISO de país:"
+
+#: ../libempathy-gtk/empathy-contact-widget.c:1241
+msgid "Country:"
+msgstr "País:"
+
+#: ../libempathy-gtk/empathy-contact-widget.c:1243
+msgid "State:"
+msgstr "Estado:"
+
+#: ../libempathy-gtk/empathy-contact-widget.c:1245
+msgid "City:"
+msgstr "Ciudad:"
+
+#: ../libempathy-gtk/empathy-contact-widget.c:1247
+msgid "Area:"
+msgstr "Área:"
+
+#: ../libempathy-gtk/empathy-contact-widget.c:1249
+msgid "Postal Code:"
+msgstr "Código postal:"
+
+#: ../libempathy-gtk/empathy-contact-widget.c:1251
+msgid "Street:"
+msgstr "Calle:"
+
+#: ../libempathy-gtk/empathy-contact-widget.c:1253
+msgid "Building:"
+msgstr "Edificio:"
+
+#: ../libempathy-gtk/empathy-contact-widget.c:1255
+msgid "Floor:"
+msgstr "Planta:"
+
+#: ../libempathy-gtk/empathy-contact-widget.c:1257
+msgid "Room:"
+msgstr "Habitación:"
+
+#: ../libempathy-gtk/empathy-contact-widget.c:1259
+msgid "Text:"
+msgstr "Texto:"
+
+#: ../libempathy-gtk/empathy-contact-widget.c:1261
+msgid "Description:"
+msgstr "Descripción:"
+
+#: ../libempathy-gtk/empathy-contact-widget.c:1263
+msgid "URI:"
+msgstr "URI:"
+
+#: ../libempathy-gtk/empathy-contact-widget.c:1265
+msgid "Accuracy Level:"
+msgstr "Nivel de precisión:"
+
+#: ../libempathy-gtk/empathy-contact-widget.c:1267
+msgid "Error:"
+msgstr "Error:"
+
+#: ../libempathy-gtk/empathy-contact-widget.c:1269
+msgid "Vertical Error (meters):"
+msgstr "Error vertical (metros):"
+
+#: ../libempathy-gtk/empathy-contact-widget.c:1271
+msgid "Horizontal Error (meters):"
+msgstr "Error horizontal (metros):"
+
+#: ../libempathy-gtk/empathy-contact-widget.c:1273
+msgid "Speed:"
+msgstr "Velocidad:"
+
+#: ../libempathy-gtk/empathy-contact-widget.c:1275
+msgid "Bearing:"
+msgstr ""
+
+#: ../libempathy-gtk/empathy-contact-widget.c:1277
+msgid "Climb Speed:"
+msgstr ""
+
+#: ../libempathy-gtk/empathy-contact-widget.c:1279
+msgid "Last Updated on:"
+msgstr "Actualizado por última vez:"
+
+#: ../libempathy-gtk/empathy-contact-widget.c:1281
+msgid "Longitude:"
+msgstr "Longitud_"
+
+#: ../libempathy-gtk/empathy-contact-widget.c:1283
+msgid "Latitude:"
+msgstr "Latitud:"
+
+#: ../libempathy-gtk/empathy-contact-widget.c:1285
+msgid "Altitude:"
+msgstr "Altitud:"
+
+#: ../libempathy-gtk/empathy-contact-widget.c:1332
+msgid "<b>Location</b>"
+msgstr "<b>Ubicación</b>"
+
+#: ../libempathy-gtk/empathy-contact-widget.c:1345
+msgid "<b>Location</b>, "
+msgstr "<b>Ubicación</b>, "
+
+#: ../libempathy-gtk/empathy-contact-widget.c:1395
+msgid "%B %e, %Y at %R UTC"
+msgstr "%e de %B de %Y a las %R UTC"
+
#: ../libempathy-gtk/empathy-contact-widget.ui.h:1
msgid "<b>Client Information</b>"
msgstr "<b>Información del cliente</b>"
@@ -830,46 +1072,50 @@ msgid "<b>Groups</b>"
msgstr "<b>Grupos</b>"
#: ../libempathy-gtk/empathy-contact-widget.ui.h:5
+msgid "<b>Location</b> at (date)\t"
+msgstr "<b>Ubicación</b> en (fecha)\t"
+
+#: ../libempathy-gtk/empathy-contact-widget.ui.h:6
#: ../libempathy-gtk/empathy-new-message-dialog.ui.h:1
#: ../src/empathy-chatrooms-window.ui.h:1
#: ../src/empathy-new-chatroom-dialog.ui.h:1
msgid "Account:"
msgstr "Cuenta:"
-#: ../libempathy-gtk/empathy-contact-widget.ui.h:6
+#: ../libempathy-gtk/empathy-contact-widget.ui.h:7
msgid "Alias:"
msgstr "Apodo:"
-#: ../libempathy-gtk/empathy-contact-widget.ui.h:7
+#: ../libempathy-gtk/empathy-contact-widget.ui.h:8
msgid "Birthday:"
msgstr "Cumpleaños:"
-#: ../libempathy-gtk/empathy-contact-widget.ui.h:8
+#: ../libempathy-gtk/empathy-contact-widget.ui.h:9
msgid "Client:"
msgstr "Cliente:"
-#: ../libempathy-gtk/empathy-contact-widget.ui.h:9
+#: ../libempathy-gtk/empathy-contact-widget.ui.h:10
msgid "Email:"
msgstr "Correo-e:"
-#: ../libempathy-gtk/empathy-contact-widget.ui.h:10
+#: ../libempathy-gtk/empathy-contact-widget.ui.h:11
msgid "Fullname:"
msgstr "Nombre completo:"
#. Identifier to connect to Instant Messaging network
-#: ../libempathy-gtk/empathy-contact-widget.ui.h:12
+#: ../libempathy-gtk/empathy-contact-widget.ui.h:13
msgid "Identifier:"
msgstr "Identificador:"
-#: ../libempathy-gtk/empathy-contact-widget.ui.h:13
+#: ../libempathy-gtk/empathy-contact-widget.ui.h:14
msgid "Information requested..."
msgstr "Información solicitada…"
-#: ../libempathy-gtk/empathy-contact-widget.ui.h:14
+#: ../libempathy-gtk/empathy-contact-widget.ui.h:15
msgid "OS:"
msgstr "SO:"
-#: ../libempathy-gtk/empathy-contact-widget.ui.h:15
+#: ../libempathy-gtk/empathy-contact-widget.ui.h:16
msgid ""
"Select the groups you want this contact to appear in. Note that you can "
"select more than one group or no groups."
@@ -877,15 +1123,15 @@ msgstr ""
"Seleccione los grupos en los que quiere que este contacto aparezca, Note que "
"puede seleccionar más de un grupo o ningún grupo."
-#: ../libempathy-gtk/empathy-contact-widget.ui.h:16
+#: ../libempathy-gtk/empathy-contact-widget.ui.h:17
msgid "Version:"
msgstr "Versión:"
-#: ../libempathy-gtk/empathy-contact-widget.ui.h:17
+#: ../libempathy-gtk/empathy-contact-widget.ui.h:18
msgid "Web site:"
msgstr "Página web:"
-#: ../libempathy-gtk/empathy-contact-widget.ui.h:18
+#: ../libempathy-gtk/empathy-contact-widget.ui.h:19
msgid "_Add Group"
msgstr "_Añadir grupo"
@@ -952,66 +1198,58 @@ msgstr "Conversación nueva"
#. COL_DISPLAY_MARKUP
#. COL_STATUS_CUSTOMISABLE
#. COL_TYPE
-#: ../libempathy-gtk/empathy-presence-chooser.c:162
+#: ../libempathy-gtk/empathy-presence-chooser.c:172
msgid "Custom Message..."
msgstr "Mensaje personalizado…"
-#: ../libempathy-gtk/empathy-presence-chooser.c:217
+#: ../libempathy-gtk/empathy-presence-chooser.c:227
msgid "Edit Custom Messages..."
msgstr "Editar mensajes personalizados…"
-#: ../libempathy-gtk/empathy-presence-chooser.c:316
+#: ../libempathy-gtk/empathy-presence-chooser.c:326
msgid "Click to remove this status as a favorite"
msgstr "Pulse pare eliminar este estado de los favoritos"
-#: ../libempathy-gtk/empathy-presence-chooser.c:325
+#: ../libempathy-gtk/empathy-presence-chooser.c:335
msgid "Click to make this status a favorite"
msgstr "Pulse para hacer este estado uno favorito"
-#: ../libempathy-gtk/empathy-presence-chooser.c:359
+#: ../libempathy-gtk/empathy-presence-chooser.c:369
msgid "Set status"
msgstr "Establecer estado"
-#: ../libempathy-gtk/empathy-presence-chooser.c:766
+#: ../libempathy-gtk/empathy-presence-chooser.c:778
msgid "Set your presence and current status"
msgstr "Establecer su presencia y estado actual"
#. Custom messages
-#: ../libempathy-gtk/empathy-presence-chooser.c:987
+#: ../libempathy-gtk/empathy-presence-chooser.c:1013
msgid "Custom messages..."
msgstr "Mensajes personalizados…"
-#: ../libempathy-gtk/empathy-presence-chooser.ui.h:1
-msgid "Custom message"
-msgstr "Mensaje personalizado…"
+#: ../libempathy-gtk/empathy-status-preset-dialog.c:362
+msgid "Enter Custom Message"
+msgstr "Introducir mensaje personalizado"
-#: ../libempathy-gtk/empathy-presence-chooser.ui.h:2
-msgid "Message:"
-msgstr "Mensaje:"
+#: ../libempathy-gtk/empathy-status-preset-dialog.c:521
+msgid "Edit Custom Messages"
+msgstr "Editar mensajes personalizados"
-#: ../libempathy-gtk/empathy-presence-chooser.ui.h:3
-msgid "Save message"
-msgstr "Guardar mensaje"
+#: ../libempathy-gtk/empathy-status-preset-dialog.ui.h:1
+msgid "Add _New Preset"
+msgstr "Añadir esta_do guardado"
-#: ../libempathy-gtk/empathy-presence-chooser.ui.h:4
-msgid "Status:"
-msgstr "Estado:"
+#: ../libempathy-gtk/empathy-status-preset-dialog.ui.h:2
+msgid "Saved Presets"
+msgstr "Estados guardados"
-#: ../libempathy-gtk/empathy-spell-dialog.c:81
-msgid "Word"
-msgstr "Palabra"
+#: ../libempathy-gtk/empathy-status-preset-dialog.ui.h:3
+msgid "gtk-add"
+msgstr "gtk-add"
-#: ../libempathy-gtk/empathy-spell-dialog.c:255
-msgid "Suggestions for the word"
-msgstr "Sugerencias para la palabra"
-
-#: ../libempathy-gtk/empathy-spell-dialog.ui.h:1
-msgid "Spell Checker"
-msgstr "Corrector ortográfico"
-
-#: ../libempathy-gtk/empathy-spell-dialog.ui.h:2
-msgid "Suggestions for the word:"
-msgstr "Sugerencias para la palabra:"
+#: ../libempathy-gtk/empathy-status-preset-dialog.ui.h:4
+msgid "gtk-remove"
+msgstr "gtk-remove"
#: ../libempathy-gtk/empathy-theme-manager.c:60
msgid "Classic"
@@ -1029,51 +1267,56 @@ msgstr "Limpio"
msgid "Blue"
msgstr "Azul"
-#: ../libempathy-gtk/empathy-ui-utils.c:1354
+#: ../libempathy-gtk/empathy-ui-utils.c:1355
msgid "Unable to open URI"
msgstr "No se pudo abrir el URI"
-#: ../libempathy-gtk/empathy-ui-utils.c:1499
+#: ../libempathy-gtk/empathy-ui-utils.c:1445
msgid "Select a file"
msgstr "Seleccionar un archivo"
-#: ../libempathy-gtk/empathy-ui-utils.c:1535
+#: ../libempathy-gtk/empathy-ui-utils.c:1503
+#| msgid "Select a contact"
+msgid "Select a destination"
+msgstr "Seleccionar un destino"
+
+#: ../libempathy-gtk/empathy-ui-utils.c:1532
msgid "Received an instant message"
msgstr "Mensaje instantáneo recibido"
-#: ../libempathy-gtk/empathy-ui-utils.c:1537
+#: ../libempathy-gtk/empathy-ui-utils.c:1534
msgid "Sent an instant message"
msgstr "Enviar un mensaje instantáneo"
-#: ../libempathy-gtk/empathy-ui-utils.c:1539
+#: ../libempathy-gtk/empathy-ui-utils.c:1536
msgid "Incoming chat request"
msgstr "Solicitud de chat entrante"
-#: ../libempathy-gtk/empathy-ui-utils.c:1541
+#: ../libempathy-gtk/empathy-ui-utils.c:1538
msgid "Contact connected"
msgstr "Contacto conectado"
-#: ../libempathy-gtk/empathy-ui-utils.c:1543
+#: ../libempathy-gtk/empathy-ui-utils.c:1540
msgid "Contact disconnected"
msgstr "Contacto desconectado"
-#: ../libempathy-gtk/empathy-ui-utils.c:1545
+#: ../libempathy-gtk/empathy-ui-utils.c:1542
msgid "Connected to server"
msgstr "Conectado con el servidor"
-#: ../libempathy-gtk/empathy-ui-utils.c:1547
+#: ../libempathy-gtk/empathy-ui-utils.c:1544
msgid "Disconnected from server"
msgstr "Desconectado del servidor"
-#: ../libempathy-gtk/empathy-ui-utils.c:1549
+#: ../libempathy-gtk/empathy-ui-utils.c:1546
msgid "Incoming voice call"
msgstr "Llamada de voz entrante"
-#: ../libempathy-gtk/empathy-ui-utils.c:1551
+#: ../libempathy-gtk/empathy-ui-utils.c:1548
msgid "Outgoing voice call"
msgstr "Llamada de voz saliente"
-#: ../libempathy-gtk/empathy-ui-utils.c:1553
+#: ../libempathy-gtk/empathy-ui-utils.c:1550
msgid "Voice call ended"
msgstr "Finalizó la llamada de vz"
@@ -1263,7 +1506,7 @@ msgid "Megaphone"
msgstr "Megáfono"
#: ../megaphone/data/GNOME_Megaphone_Applet.server.in.in.h:2
-#: ../megaphone/src/megaphone-applet.c:417
+#: ../megaphone/src/megaphone-applet.c:527
msgid "Talk!"
msgstr "Hablar"
@@ -1277,15 +1520,15 @@ msgid "_Information"
msgstr "_Información"
#: ../megaphone/data/GNOME_Megaphone_Applet.xml.h:3
-#: ../src/empathy-main-window.ui.h:15
+#: ../src/empathy-main-window.ui.h:17
msgid "_Preferences"
-msgstr "_Preferencias"
+msgstr "Prefere_ncias"
-#: ../megaphone/src/megaphone-applet.c:255
+#: ../megaphone/src/megaphone-applet.c:168
msgid "Please configure a contact."
msgstr "Configure un contacto."
-#: ../megaphone/src/megaphone-applet.c:348
+#: ../megaphone/src/megaphone-applet.c:258
msgid "Select contact..."
msgstr "Seleccione un contacto…"
@@ -1298,23 +1541,23 @@ msgstr "Presencia"
msgid "Set your own presence"
msgstr "Establezca su propia presencia"
-#: ../src/empathy.c:430
+#: ../src/empathy.c:476
msgid "Don't connect on startup"
msgstr "No conectarse automáticamente al inicio"
-#: ../src/empathy.c:434
+#: ../src/empathy.c:480
msgid "Don't show the contact list on startup"
msgstr "No mostrar la lista de contactos al inicio"
-#: ../src/empathy.c:438
+#: ../src/empathy.c:484
msgid "Show the accounts dialog"
msgstr "Mostrar el diálogo de las cuentas"
-#: ../src/empathy.c:450
+#: ../src/empathy.c:496
msgid "- Empathy Instant Messenger"
msgstr "- Mensajería instantánea Empathy"
-#: ../src/empathy-about-dialog.c:83
+#: ../src/empathy-about-dialog.c:84
msgid ""
"Empathy is free software; you can redistribute it and/or modify it under the "
"terms of the GNU General Public License as published by the Free Software "
@@ -1326,7 +1569,7 @@ msgstr ""
"Foundation; ya sea en la versión 2 de la Licencia, o (a su elección) "
"cualquier versión posterior."
-#: ../src/empathy-about-dialog.c:87
+#: ../src/empathy-about-dialog.c:88
msgid ""
"Empathy is distributed in the hope that it will be useful, but WITHOUT ANY "
"WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS "
@@ -1338,7 +1581,7 @@ msgstr ""
"PARA UN PROPÓSITO PARTICULAR. Vea la Licencia Pública General de GNU para "
"más detalles."
-#: ../src/empathy-about-dialog.c:91
+#: ../src/empathy-about-dialog.c:92
msgid ""
"You should have received a copy of the GNU General Public License along with "
"Empathy; if not, write to the Free Software Foundation, Inc., 51 Franklin "
@@ -1348,11 +1591,11 @@ msgstr ""
"con Gossip ; si no, escriba a la Free Software Foundation, Inc., 51 Franklin "
"Street, Fifth Floor, Boston, MA 02110-130159 EE. UU."
-#: ../src/empathy-about-dialog.c:119
+#: ../src/empathy-about-dialog.c:120
msgid "An Instant Messaging client for GNOME"
msgstr "Un cliente de mensajería instantánea para GNOME"
-#: ../src/empathy-about-dialog.c:125
+#: ../src/empathy-about-dialog.c:126
msgid "translator-credits"
msgstr "Jorge González <jorgegonz@svn.gnome.org>, 2007-2009"
@@ -1365,12 +1608,12 @@ msgid "Accounts"
msgstr "Cuentas"
#. To translator: %s is the protocol name
-#: ../src/empathy-accounts-dialog.c:833
+#: ../src/empathy-accounts-dialog.c:834
#, c-format
msgid "New %s account"
msgstr "Cuenta de %s nueva"
-#: ../src/empathy-accounts-dialog.c:943
+#: ../src/empathy-accounts-dialog.c:944
#, c-format
msgid ""
"You are about to remove your %s account!\n"
@@ -1379,7 +1622,7 @@ msgstr ""
"Va a eliminar su cuenta %s\n"
"¿Seguro que quiere continuar?"
-#: ../src/empathy-accounts-dialog.c:949
+#: ../src/empathy-accounts-dialog.c:950
msgid ""
"Any associated conversations and chat rooms will NOT be removed if you "
"decide to proceed.\n"
@@ -1429,48 +1672,56 @@ msgid "Type:"
msgstr "Tipo:"
#: ../src/empathy-accounts-dialog.ui.h:10
-#| msgid "_Add Contact..."
msgid "_Add..."
msgstr "_Añadir…"
-#: ../src/empathy-call-window.c:319
+#: ../src/empathy-call-window.c:382
msgid "Contrast"
msgstr "Contraste"
-#: ../src/empathy-call-window.c:322
+#: ../src/empathy-call-window.c:385
msgid "Brightness"
msgstr "Brillo"
-#: ../src/empathy-call-window.c:325
+#: ../src/empathy-call-window.c:388
msgid "Gamma"
msgstr "Gamma"
-#: ../src/empathy-call-window.c:429
+#: ../src/empathy-call-window.c:492
msgid "Volume"
msgstr "Volumen"
-#: ../src/empathy-call-window.c:532
+#: ../src/empathy-call-window.c:638
msgid "_Sidebar"
msgstr "Barra _lateral"
-#: ../src/empathy-call-window.c:550
+#: ../src/empathy-call-window.c:657
msgid "Dialpad"
msgstr "Teclado de llamada"
-#: ../src/empathy-call-window.c:556
+#: ../src/empathy-call-window.c:663
msgid "Audio input"
msgstr "Entrada de sonido"
-#: ../src/empathy-call-window.c:560
+#: ../src/empathy-call-window.c:667
msgid "Video input"
msgstr "Entrada de vídeo"
-#: ../src/empathy-call-window.c:573
+#: ../src/empathy-call-window.c:691
msgid "Connecting..."
msgstr "Conectando…"
+#: ../src/empathy-call-window.c:730
+#, c-format
+msgid "Call with %s"
+msgstr "Llamar con %s"
+
+#: ../src/empathy-call-window.c:801
+msgid "Call"
+msgstr "Llamar"
+
#. Translators: number of minutes:seconds the caller has been connected
-#: ../src/empathy-call-window.c:837
+#: ../src/empathy-call-window.c:1096
#, c-format
msgid "Connected — %d:%02dm"
msgstr "Conectado — %d:%02dm"
@@ -1495,24 +1746,24 @@ msgstr "Vista preliminar de vídeo"
msgid "_Call"
msgstr "_Llamar"
-#: ../src/empathy-call-window.ui.h:6
+#: ../src/empathy-call-window.ui.h:6 ../src/empathy-main-window.ui.h:20
msgid "_View"
msgstr "_Ver"
-#: ../src/empathy-chat-window.c:308
+#: ../src/empathy-chat-window.c:331
#, c-format
msgid "Conversations (%d)"
msgstr "Conversaciones (%d)"
-#: ../src/empathy-chat-window.c:413
+#: ../src/empathy-chat-window.c:436
msgid "Topic:"
msgstr "Tema:"
-#: ../src/empathy-chat-window.c:418
+#: ../src/empathy-chat-window.c:441
msgid "Typing a message."
msgstr "Tecleando un mensaje."
-#: ../src/empathy-chat-window.c:889 ../src/empathy-event-manager.c:429
+#: ../src/empathy-chat-window.c:900 ../src/empathy-event-manager.c:429
#, c-format
msgid "New message from %s"
msgstr "Nuevo mensaje de %s"
@@ -1550,59 +1801,58 @@ msgstr "_Rechazar"
msgid "_Answer"
msgstr "Re_spuesta"
-#: ../src/empathy-event-manager.c:516
+#: ../src/empathy-event-manager.c:507
#, c-format
msgid "Incoming call from %s"
msgstr "Llamada entrante de %s"
-#: ../src/empathy-event-manager.c:564
+#: ../src/empathy-event-manager.c:547
#, c-format
msgid "%s is offering you an invitation"
msgstr "%s le está ofreciendo una invitación"
-#: ../src/empathy-event-manager.c:570
+#: ../src/empathy-event-manager.c:553
msgid "An external application will be started to handle it."
msgstr "Se iniciará una aplicación externa para manejarla."
-#: ../src/empathy-event-manager.c:575
+#: ../src/empathy-event-manager.c:558
msgid "You don't have the needed external application to handle it."
msgstr "No tiene la aplicación externa necesaria para manejarla."
-#: ../src/empathy-event-manager.c:698
+#: ../src/empathy-event-manager.c:685
msgid "Room invitation"
msgstr "Invitación a una sala"
-#: ../src/empathy-event-manager.c:701
+#: ../src/empathy-event-manager.c:688
#, c-format
msgid "%s is inviting you to join %s"
msgstr "%s le está invitando a unirse a %s"
-#. Decline button
-#: ../src/empathy-event-manager.c:709 ../src/empathy-ft-manager.c:1031
+#: ../src/empathy-event-manager.c:696
msgid "_Decline"
msgstr "_Rechazar"
-#: ../src/empathy-event-manager.c:714
-#: ../src/empathy-new-chatroom-dialog.ui.h:6
+#: ../src/empathy-event-manager.c:701
+#: ../src/empathy-new-chatroom-dialog.ui.h:7
msgid "_Join"
msgstr "_Unirse"
-#: ../src/empathy-event-manager.c:744
+#: ../src/empathy-event-manager.c:740
#, c-format
msgid "%s invited you to join %s"
msgstr "%s le ha invitado a unirse a %s"
-#: ../src/empathy-event-manager.c:867
+#: ../src/empathy-event-manager.c:766
#, c-format
msgid "Incoming file transfer from %s"
msgstr "Transferencia de archivo entrante de %s"
-#: ../src/empathy-event-manager.c:961
+#: ../src/empathy-event-manager.c:946
#, c-format
msgid "Subscription requested by %s"
msgstr "Petición de suscripción de %s"
-#: ../src/empathy-event-manager.c:965
+#: ../src/empathy-event-manager.c:950
#, c-format
msgid ""
"\n"
@@ -1612,152 +1862,112 @@ msgstr ""
"Mensaje: %s"
#. Translators: time left, when it is more than one hour
-#: ../src/empathy-ft-manager.c:114
+#: ../src/empathy-ft-manager.c:101
#, c-format
msgid "%u:%02u.%02u"
msgstr "%u:%02u.%02u"
#. Translators: time left, when is is less than one hour
-#: ../src/empathy-ft-manager.c:117
+#: ../src/empathy-ft-manager.c:104
#, c-format
msgid "%02u.%02u"
msgstr "%02u.%02u"
-#: ../src/empathy-ft-manager.c:166
-msgid "No reason was specified"
-msgstr "No se especificó ninguna razón"
-
-#: ../src/empathy-ft-manager.c:168
-msgid "The change in state was requested"
-msgstr "Se requirió un cambio en el estado"
-
-#: ../src/empathy-ft-manager.c:170
-msgid "You canceled the file transfer"
-msgstr "Canceló la transferencia del archivo"
-
-#: ../src/empathy-ft-manager.c:172
-msgid "The other participant canceled the file transfer"
-msgstr "El otro participante canceló la transferencia del archivo"
-
-#: ../src/empathy-ft-manager.c:174
-msgid "Error while trying to transfer the file"
-msgstr "Error la intentar transferir el archivo"
+#: ../src/empathy-ft-manager.c:180
+msgctxt "file transfer percent"
+msgid "Unknown"
+msgstr "Desconocido"
-#: ../src/empathy-ft-manager.c:176
-msgid "The other participant is unable to transfer the file"
-msgstr "El otro participante no puede transferir el archivo"
+#: ../src/empathy-ft-manager.c:275
+#, c-format
+msgid "%s of %s at %s/s"
+msgstr "%s de %s en %s/s"
-#: ../src/empathy-ft-manager.c:178
-msgid "Unknown reason"
-msgstr "Razón desconocida"
+#: ../src/empathy-ft-manager.c:276
+#, c-format
+#| msgid "%s of %s at %s/s"
+msgid "%s of %s"
+msgstr "%s de %s"
#. translators: first %s is filename, second %s is the contact name
-#: ../src/empathy-ft-manager.c:226
+#: ../src/empathy-ft-manager.c:307
#, c-format
msgid "Receiving \"%s\" from %s"
msgstr "Recibiendo «%s» de %s"
#. translators: first %s is filename, second %s is the contact name
-#: ../src/empathy-ft-manager.c:229
+#: ../src/empathy-ft-manager.c:310
#, c-format
msgid "Sending \"%s\" to %s"
msgstr "Enviando «%s» a %s"
-#: ../src/empathy-ft-manager.c:239
-msgctxt "file size"
-msgid "Unknown"
-msgstr "Desconocido"
-
-#. translators: first %s is the transferred size, second %s is
-#. * the total file size
-#: ../src/empathy-ft-manager.c:247
+#. translators: first %s is filename, second %s
+#. * is the contact name
+#: ../src/empathy-ft-manager.c:340
#, c-format
-msgid "%s of %s"
-msgstr "%s de %s"
+#| msgid "Receiving \"%s\" from %s"
+msgid "Error receiving \"%s\" from %s"
+msgstr "Error al recibir «%s» de %s"
-#: ../src/empathy-ft-manager.c:254
-msgid "Waiting for the other participant's response"
-msgstr "Esperando la respuesta del otro participante"
+#: ../src/empathy-ft-manager.c:343
+msgid "Error receiving a file"
+msgstr "Error al recibir un archivo"
-#: ../src/empathy-ft-manager.c:264
+#: ../src/empathy-ft-manager.c:348
+#, c-format
+#| msgid "Sending \"%s\" to %s"
+msgid "Error sending \"%s\" to %s"
+msgstr "Error al enviar «%s» a %s"
+
+#: ../src/empathy-ft-manager.c:351
+#| msgid "Error sending message '%s': %s"
+msgid "Error sending a file"
+msgstr "Error al enviar un archivo"
+
+#. translators: first %s is filename, second %s
+#. * is the contact name
+#: ../src/empathy-ft-manager.c:490
#, c-format
msgid "\"%s\" received from %s"
msgstr "«%s» recibido de %s"
-#: ../src/empathy-ft-manager.c:270
+#. translators: first %s is filename, second %s
+#. * is the contact name
+#: ../src/empathy-ft-manager.c:495
#, c-format
msgid "\"%s\" sent to %s"
msgstr "«%s» enviado a %s"
-#: ../src/empathy-ft-manager.c:273
+#: ../src/empathy-ft-manager.c:498
msgid "File transfer completed"
msgstr "Transferencia de archivo completada"
-#: ../src/empathy-ft-manager.c:282
-#, c-format
-msgid "\"%s\" receiving from %s"
-msgstr "«%s» recibiendo de %s"
+#: ../src/empathy-ft-manager.c:617 ../src/empathy-ft-manager.c:784
+msgid "Waiting for the other participant's response"
+msgstr "Esperando la respuesta del otro participante"
-#: ../src/empathy-ft-manager.c:288
+#: ../src/empathy-ft-manager.c:643 ../src/empathy-ft-manager.c:681
#, c-format
-msgid "\"%s\" sending to %s"
-msgstr "«%s» enviando a %s"
+msgid "Checking integrity of \"%s\""
+msgstr "Comprobando la integridad de «%s»"
-#: ../src/empathy-ft-manager.c:291
+#: ../src/empathy-ft-manager.c:646 ../src/empathy-ft-manager.c:684
#, c-format
-msgid "File transfer canceled: %s"
-msgstr "Transferencia de archivo cancelada: %s"
-
-#: ../src/empathy-ft-manager.c:306
-msgctxt "remaining time"
-msgid "Unknown"
-msgstr "Desconocido"
+msgid "Hashing \"%s\""
+msgstr "Obteniendo el «hash» de «%s»"
-#: ../src/empathy-ft-manager.c:366
-msgctxt "file transfer percent"
-msgid "Unknown"
-msgstr "Desconocido"
-
-#: ../src/empathy-ft-manager.c:662
+#: ../src/empathy-ft-manager.c:1024
msgid "%"
msgstr "%"
-#: ../src/empathy-ft-manager.c:674
+#: ../src/empathy-ft-manager.c:1036
msgid "File"
msgstr "Archivo"
-#: ../src/empathy-ft-manager.c:696
+#: ../src/empathy-ft-manager.c:1058
msgid "Remaining"
msgstr "Restantes"
-#: ../src/empathy-ft-manager.c:894
-msgid "Cannot save file to this location"
-msgstr "No se puede guardar el archivo en esta ubicación"
-
-#: ../src/empathy-ft-manager.c:940
-msgid "Save file as..."
-msgstr "Guardar archivo como…"
-
-#: ../src/empathy-ft-manager.c:1010
-msgid "unknown size"
-msgstr "tamaño desconocido"
-
-#: ../src/empathy-ft-manager.c:1016
-#, c-format
-msgid "%s would like to send you a file"
-msgstr "%s quiere enviarle un archivo"
-
-#. Translators: the first %s is the file name, the second %s is the file size
-#: ../src/empathy-ft-manager.c:1022
-#, c-format
-msgid "Do you want to accept the file \"%s\" (%s)?"
-msgstr "¿Quiere aceptar el archivo «%s» (%s)?"
-
-#. Accept button
-#: ../src/empathy-ft-manager.c:1040
-msgid "_Accept"
-msgstr "_Aceptar"
-
#: ../src/empathy-ft-manager.ui.h:1
msgid "File transfers"
msgstr "Transferencias de archivos"
@@ -1793,71 +2003,71 @@ msgstr ""
msgid "Import Accounts"
msgstr "Importar cuentas"
-#: ../src/empathy-main-window.c:393
+#: ../src/empathy-main-window.c:394
msgid "_Edit account"
msgstr "_Editar cuenta"
-#: ../src/empathy-main-window.c:496
+#: ../src/empathy-main-window.c:497
msgid "No error specified"
msgstr "No se especificó el error"
-#: ../src/empathy-main-window.c:499
+#: ../src/empathy-main-window.c:500
msgid "Network error"
msgstr "Error de red"
-#: ../src/empathy-main-window.c:502
+#: ../src/empathy-main-window.c:503
msgid "Authentication failed"
msgstr "Falló la autenticación"
-#: ../src/empathy-main-window.c:505
+#: ../src/empathy-main-window.c:506
msgid "Encryption error"
msgstr "Error de cifrado"
-#: ../src/empathy-main-window.c:508
+#: ../src/empathy-main-window.c:509
msgid "Name in use"
msgstr "Nombre en uso"
-#: ../src/empathy-main-window.c:511
+#: ../src/empathy-main-window.c:512
msgid "Certificate not provided"
msgstr "No se proporcionó el certificado"
-#: ../src/empathy-main-window.c:514
+#: ../src/empathy-main-window.c:515
msgid "Certificate untrusted"
msgstr "Certificado sin confianza"
-#: ../src/empathy-main-window.c:517
+#: ../src/empathy-main-window.c:518
msgid "Certificate expired"
msgstr "El certificado ha expirado"
-#: ../src/empathy-main-window.c:520
+#: ../src/empathy-main-window.c:521
msgid "Certificate not activated"
msgstr "El certificado no está activado"
-#: ../src/empathy-main-window.c:523
+#: ../src/empathy-main-window.c:524
msgid "Certificate hostname mismatch"
msgstr "El nombre del equipo del certificado no coincide"
-#: ../src/empathy-main-window.c:526
+#: ../src/empathy-main-window.c:527
msgid "Certificate fingerprint mismatch"
msgstr "La huella del certificado no coincide"
-#: ../src/empathy-main-window.c:529
+#: ../src/empathy-main-window.c:530
msgid "Certificate self-signed"
msgstr "Certificado firmado consigo mismo"
-#: ../src/empathy-main-window.c:532
+#: ../src/empathy-main-window.c:533
msgid "Certificate error"
msgstr "Error del certificado"
-#: ../src/empathy-main-window.c:535
+#: ../src/empathy-main-window.c:536
msgid "Unknown error"
msgstr "Error desconocido"
-#: ../src/empathy-main-window.c:865
+#: ../src/empathy-main-window.c:887
msgid "Contact"
msgstr "Contacto"
-#: ../src/empathy-main-window.c:1205
+#: ../src/empathy-main-window.c:1211
msgid "Show and edit accounts"
msgstr "Mostrar y editar cuentas"
@@ -1866,21 +2076,22 @@ msgid "Contact List"
msgstr "Lista de contactos"
#: ../src/empathy-main-window.ui.h:2
+#| msgid "Show Contacts on a Map"
+msgid "Contacts on a _Map"
+msgstr "Contactos en el _mapa"
+
+#: ../src/empathy-main-window.ui.h:3
msgid "Context"
msgstr "Contexto"
-#: ../src/empathy-main-window.ui.h:3
+#: ../src/empathy-main-window.ui.h:4
msgid "Join _Favorites"
msgstr "Unirse a _favoritas"
-#: ../src/empathy-main-window.ui.h:4
+#: ../src/empathy-main-window.ui.h:5
msgid "Manage Favorites"
msgstr "Gestionar favoritos"
-#: ../src/empathy-main-window.ui.h:5
-msgid "Show _Offline Contacts"
-msgstr "Mostrar contactos _desconectados"
-
#: ../src/empathy-main-window.ui.h:6
msgid "_Accounts"
msgstr "_Cuentas"
@@ -1894,34 +2105,49 @@ msgid "_Contents"
msgstr "Índ_ice"
#: ../src/empathy-main-window.ui.h:11
+#| msgid "File transfers"
+msgid "_File Transfers"
+msgstr "_Transferencias de archivos"
+
+#: ../src/empathy-main-window.ui.h:12
msgid "_Help"
msgstr "Ay_uda"
-#: ../src/empathy-main-window.ui.h:12
+#: ../src/empathy-main-window.ui.h:13
msgid "_Join..."
msgstr "_Unirse…"
-#: ../src/empathy-main-window.ui.h:13 ../src/empathy-status-icon.ui.h:2
+#: ../src/empathy-main-window.ui.h:14 ../src/empathy-status-icon.ui.h:2
msgid "_New Conversation..."
msgstr "_Conversación nueva…"
-#: ../src/empathy-main-window.ui.h:14
+#: ../src/empathy-main-window.ui.h:15
+#| msgid "Show _Offline Contacts"
+msgid "_Offline Contacts"
+msgstr "Contactos _desconectados"
+
+#: ../src/empathy-main-window.ui.h:16
msgid "_Personal Information"
msgstr "Información p_ersonal"
-#: ../src/empathy-main-window.ui.h:16
+#: ../src/empathy-main-window.ui.h:18
+#| msgid "Previous Conversations"
+msgid "_Previous Conversations"
+msgstr "Conversaciones an_teriores"
+
+#: ../src/empathy-main-window.ui.h:19
msgid "_Room"
msgstr "_Sala"
-#: ../src/empathy-new-chatroom-dialog.c:313
+#: ../src/empathy-new-chatroom-dialog.c:332
msgid "Chat Room"
msgstr "Sala de chat"
-#: ../src/empathy-new-chatroom-dialog.c:328
+#: ../src/empathy-new-chatroom-dialog.c:348
msgid "Members"
msgstr "Miembros"
-#: ../src/empathy-new-chatroom-dialog.c:447
+#: ../src/empathy-new-chatroom-dialog.c:492
#, c-format
msgctxt ""
"Room/Join's roomlist tooltip. Parametersare a channel name, yes/no, yes/no "
@@ -1937,24 +2163,36 @@ msgstr ""
"Contraseña necesaria: %s\n"
"Miembros: %s"
-#: ../src/empathy-new-chatroom-dialog.c:449
-#: ../src/empathy-new-chatroom-dialog.c:450
+#: ../src/empathy-new-chatroom-dialog.c:494
+#: ../src/empathy-new-chatroom-dialog.c:495
msgid "Yes"
msgstr "Sí"
-#: ../src/empathy-new-chatroom-dialog.c:449
-#: ../src/empathy-new-chatroom-dialog.c:450
+#: ../src/empathy-new-chatroom-dialog.c:494
+#: ../src/empathy-new-chatroom-dialog.c:495
msgid "No"
msgstr "No"
+#: ../src/empathy-new-chatroom-dialog.c:522
+msgid "Could not start room listing"
+msgstr "No se pudo iniciar la lista de la sala"
+
+#: ../src/empathy-new-chatroom-dialog.c:532
+msgid "Could not stop room listing"
+msgstr "No se pudo parar la lista de la sala"
+
#: ../src/empathy-new-chatroom-dialog.ui.h:2
+msgid "Couldn't load room list"
+msgstr "No se pudo cargar la lista de la sala"
+
+#: ../src/empathy-new-chatroom-dialog.ui.h:3
msgid ""
"Enter the room name to join here or click on one or more rooms in the list."
msgstr ""
"Introduzca el nombre de la sala a la que unirse o pulse una o más salas de "
"la lista."
-#: ../src/empathy-new-chatroom-dialog.ui.h:3
+#: ../src/empathy-new-chatroom-dialog.ui.h:4
msgid ""
"Enter the server which hosts the room, or leave it empty if the room is on "
"the current account's server"
@@ -1962,47 +2200,47 @@ msgstr ""
"Introduzca el servidor que aloja la sala o déjelo vacío si la sala está en "
"la cuenta del servidor actual"
-#: ../src/empathy-new-chatroom-dialog.ui.h:4
+#: ../src/empathy-new-chatroom-dialog.ui.h:5
msgid "Join Room"
msgstr "Unirse a sala"
-#: ../src/empathy-new-chatroom-dialog.ui.h:5
+#: ../src/empathy-new-chatroom-dialog.ui.h:6
msgid "Room List"
msgstr "Lista de salas"
-#: ../src/empathy-new-chatroom-dialog.ui.h:7
+#: ../src/empathy-new-chatroom-dialog.ui.h:8
msgid "_Room:"
msgstr "_Sala:"
-#: ../src/empathy-preferences.c:156
+#: ../src/empathy-preferences.c:162
msgid "Message received"
msgstr "Mensaje recibido"
-#: ../src/empathy-preferences.c:157
+#: ../src/empathy-preferences.c:163
msgid "Message sent"
msgstr "Mensaje enviado"
-#: ../src/empathy-preferences.c:158
+#: ../src/empathy-preferences.c:164
msgid "New conversation"
msgstr "Conversación nueva"
-#: ../src/empathy-preferences.c:159
+#: ../src/empathy-preferences.c:165
msgid "Contact goes online"
msgstr "El contacto se conecta"
-#: ../src/empathy-preferences.c:160
+#: ../src/empathy-preferences.c:166
msgid "Contact goes offline"
msgstr "El contacto se desconecta"
-#: ../src/empathy-preferences.c:161
+#: ../src/empathy-preferences.c:167
msgid "Account connected"
msgstr "Cuenta conectada"
-#: ../src/empathy-preferences.c:162
+#: ../src/empathy-preferences.c:168
msgid "Account disconnected"
msgstr "Cuenta desconectada"
-#: ../src/empathy-preferences.c:397
+#: ../src/empathy-preferences.c:435
msgid "Language"
msgstr "Idioma"
@@ -2023,10 +2261,27 @@ msgid "<b>Enable spell checking for languages:</b>"
msgstr "<b>Activar la revisión ortográfica para idiomas:</b>"
#: ../src/empathy-preferences.ui.h:5
+#| msgid "<b>Settings</b>"
+msgid "<b>Geoclue Settings</b>"
+msgstr "<b>Configuración de Geoclue</b>"
+
+#: ../src/empathy-preferences.ui.h:6
msgid "<b>Play sound for events</b>"
msgstr "<b>Reproducir sonido para eventos</b>"
-#: ../src/empathy-preferences.ui.h:6
+#: ../src/empathy-preferences.ui.h:7
+#| msgid "<b>Advanced</b>"
+msgid "<b>Privacy</b>"
+msgstr "<b>Privacidad</b>"
+
+#: ../src/empathy-preferences.ui.h:8
+msgid ""
+"<small>Reduced location accuracy means that nothing more precise than your "
+"city, state and country will be published. GPS coordinates will have a "
+"random value added (&#xB1;0.25&#xB0;).</small>"
+msgstr ""
+
+#: ../src/empathy-preferences.ui.h:9
msgid ""
"<small>The list of languages reflects only the languages for which you have "
"a dictionary installed.</small>"
@@ -2034,88 +2289,113 @@ msgstr ""
"<small>La lista de idiomas refleja sólo los idiomas para los cuales tiene un "
"diccionario instalado.</small>"
-#: ../src/empathy-preferences.ui.h:7
+#: ../src/empathy-preferences.ui.h:10
+msgid "Allow _GPS usage"
+msgstr "Permitir el usso de _GPS"
+
+#: ../src/empathy-preferences.ui.h:11
+msgid "Allow _cellphone usage"
+msgstr "Permitir el uso de teléfono _móvil"
+
+#: ../src/empathy-preferences.ui.h:12
+msgid "Allow _network usage"
+msgstr "Permitir el uso de la _red"
+
+#: ../src/empathy-preferences.ui.h:13
msgid "Automatically _connect on startup "
msgstr "_Conectarse automáticamente al inicio"
-#: ../src/empathy-preferences.ui.h:8
+#: ../src/empathy-preferences.ui.h:14
msgid "Avatars are user chosen images shown in the contact list"
msgstr ""
"Los avatares son imágenes elegidas por el usuario que se muestran en la "
"lista de contactos"
-#: ../src/empathy-preferences.ui.h:9
+#: ../src/empathy-preferences.ui.h:15
msgid "Chat Th_eme:"
msgstr "_Tema del chat:"
-#: ../src/empathy-preferences.ui.h:10
+#: ../src/empathy-preferences.ui.h:16
msgid "Disable notifications when _away or busy"
msgstr "Desactivar notificaciones al _ausentarse o estar ocupado"
-#: ../src/empathy-preferences.ui.h:11
+#: ../src/empathy-preferences.ui.h:17
msgid "Disable sounds when _away or busy"
msgstr "Desactivar sonidos al _ausentarse o estar ocupado"
-#: ../src/empathy-preferences.ui.h:12
+#: ../src/empathy-preferences.ui.h:18
msgid "Enable notifications when the _chat is not focused"
msgstr "Activar notificaciones cuando el _chat no tenga el foco"
-#: ../src/empathy-preferences.ui.h:13
+#: ../src/empathy-preferences.ui.h:19
msgid "General"
msgstr "General"
-#: ../src/empathy-preferences.ui.h:14
+#: ../src/empathy-preferences.ui.h:20
+#| msgid "<b>Location</b>"
+msgid "Location"
+msgstr "Ubicación"
+
+#: ../src/empathy-preferences.ui.h:21
msgid "Notifications"
msgstr "Notificaciones"
-#: ../src/empathy-preferences.ui.h:15
+#: ../src/empathy-preferences.ui.h:22
msgid "Preferences"
msgstr "Preferencias"
-#: ../src/empathy-preferences.ui.h:16
+#: ../src/empathy-preferences.ui.h:23
msgid "Show _avatars"
msgstr "Mostrar _avatares"
-#: ../src/empathy-preferences.ui.h:17
+#: ../src/empathy-preferences.ui.h:24
msgid "Show _smileys as images"
msgstr "Mostrar los _emoticonos como imágenes"
-#: ../src/empathy-preferences.ui.h:18
+#: ../src/empathy-preferences.ui.h:25
msgid "Show co_mpact contact list"
msgstr "Mostrar lista de contactos co_mpacta"
-#: ../src/empathy-preferences.ui.h:19
+#: ../src/empathy-preferences.ui.h:26
msgid "Sort by _name"
msgstr "Ordenar por _nombre"
-#: ../src/empathy-preferences.ui.h:20
+#: ../src/empathy-preferences.ui.h:27
msgid "Sort by s_tate"
msgstr "Ordenar por es_tado"
-#: ../src/empathy-preferences.ui.h:21
+#: ../src/empathy-preferences.ui.h:28
msgid "Sounds"
msgstr "Sonidos"
-#: ../src/empathy-preferences.ui.h:22
+#: ../src/empathy-preferences.ui.h:29
msgid "Spell Checking"
msgstr "Revisión ortográfica"
-#: ../src/empathy-preferences.ui.h:23
+#: ../src/empathy-preferences.ui.h:30
msgid "Themes"
msgstr "Temas"
-#: ../src/empathy-preferences.ui.h:24
+#: ../src/empathy-preferences.ui.h:31
msgid "_Enable bubble notifications"
msgstr "_Activar notificaciones de burbuja"
-#: ../src/empathy-preferences.ui.h:25
+#: ../src/empathy-preferences.ui.h:32
msgid "_Enable sound notifications"
msgstr "_Activar notificaciones de sonido"
-#: ../src/empathy-preferences.ui.h:26
+#: ../src/empathy-preferences.ui.h:33
msgid "_Open new chats in separate windows"
msgstr "_Abrir charlas nuevas en ventanas separadas"
+#: ../src/empathy-preferences.ui.h:34
+msgid "_Publish location to my contacts"
+msgstr "_Publicar mi ubicación a mis contactos"
+
+#: ../src/empathy-preferences.ui.h:35
+msgid "_Reduce location accuracy"
+msgstr "_Reducir la precisión de la ubicación"
+
#: ../src/empathy-status-icon.ui.h:1
msgid "Status"
msgstr "Estado"
@@ -2142,6 +2422,90 @@ msgstr ""
"Se le ha ofrecido una invitación para el servicio %s pero no tiene la "
"aplicación necesaria para manejarla"
+#: ../src/empathy-call-window-fullscreen.ui.h:1
+msgid "gtk-leave-fullscreen"
+msgstr "gtk-leave-fullscreen"
+
+#: ../src/empathy-map-view.ui.h:1
+msgid "Contact Map View"
+msgstr "Vista del mapa de contactos"
+
+#~ msgctxt "file size"
+#~ msgid "Unknown"
+#~ msgstr "Desconocido"
+
+#~ msgid "\"%s\" receiving from %s"
+#~ msgstr "«%s» recibiendo de %s"
+
+#~ msgid "\"%s\" sending to %s"
+#~ msgstr "«%s» enviando a %s"
+
+#~ msgid "File transfer canceled: %s"
+#~ msgstr "Transferencia de archivo cancelada: %s"
+
+#~ msgctxt "remaining time"
+#~ msgid "Stalled"
+#~ msgstr "Parado"
+
+#~ msgctxt "remaining time"
+#~ msgid "Unknown"
+#~ msgstr "Desconocido"
+
+#~ msgid "Cannot save file to this location"
+#~ msgstr "No se puede guardar el archivo en esta ubicación"
+
+#~ msgid "Save file as..."
+#~ msgstr "Guardar archivo como…"
+
+#~ msgid "unknown size"
+#~ msgstr "tamaño desconocido"
+
+#~ msgid "%s would like to send you a file"
+#~ msgstr "%s quiere enviarle un archivo"
+
+#~ msgid "Do you want to accept the file \"%s\" (%s)?"
+#~ msgstr "¿Quiere aceptar el archivo «%s» (%s)?"
+
+#~ msgid "_Accept"
+#~ msgstr "_Aceptar"
+
+#~ msgid "Show _File Transfers"
+#~ msgstr "Mostrar transferencias de _archivos"
+
+#~ msgid "I would like to add you to my contact list."
+#~ msgstr "Me gustaría añadirte a mi lista de contactos."
+
+#~ msgid "Sorry, I don't want you in my contact list anymore."
+#~ msgstr "Lo siento, no te quiero en mi lista de contactos."
+
+#~ msgctxt "menu item"
+#~ msgid "_Call"
+#~ msgstr "_Llamar"
+
+#~ msgid "_Check Word Spelling..."
+#~ msgstr "_Comprobar ortografía…"
+
+#~ msgid "Contact Information"
+#~ msgstr "Información del contacto"
+
+#~ msgid "Custom message"
+#~ msgstr "Mensaje personalizado…"
+
+#~ msgid "Message:"
+#~ msgstr "Mensaje:"
+
+#~ msgid "Word"
+#~ msgstr "Palabra"
+
+#~ msgid "Suggestions for the word"
+#~ msgstr "Sugerencias para la palabra"
+
+#~ msgid "Spell Checker"
+#~ msgstr "Corrector ortográfico"
+
+#~ msgid "Suggestions for the word:"
+#~ msgstr "Sugerencias para la palabra:"
+
#~ msgid "Forget password and clear the entry."
#~ msgstr "Olvidar la contraseña y limpiar la entrada."
@@ -2257,9 +2621,6 @@ msgstr ""
#~ msgid "Closing this window will end the call in progress."
#~ msgstr "Cerrar esta ventana finalizará la llamada en progreso."
-#~ msgid "_End Call"
-#~ msgstr "_Finalizar llamada"
-
#~ msgid "Empathy Call"
#~ msgstr "Llamada de Empathy"
@@ -2323,15 +2684,9 @@ msgstr ""
#~ "Indica si se debe mostrar una ventana emergente cuando un contacto vuelva "
#~ "a estar disponible."
-#~ msgid "gtk-clear"
-#~ msgstr "gtk-clear"
-
#~ msgid "gtk-cancel"
#~ msgstr "gtk-cancel"
-#~ msgid "gtk-ok"
-#~ msgstr "gtk-ok"
-
#~ msgid "Invitation Error"
#~ msgstr "Error en la invitación"
diff --git a/po/hu.po b/po/hu.po
index 6cfacd8df..f590827d3 100644
--- a/po/hu.po
+++ b/po/hu.po
@@ -149,7 +149,7 @@ msgstr "Salut fiók létrehozva"
#: ../data/empathy.schemas.in.h:30
msgid "Show avatars"
-msgstr "Avatarok mutatása"
+msgstr "Avatarok megjelenítése"
#: ../data/empathy.schemas.in.h:31
msgid "Show hint about closing the main window"
@@ -157,7 +157,7 @@ msgstr "Tanács megjelenítése a főablak bezárásakor"
#: ../data/empathy.schemas.in.h:32
msgid "Show offline contacts"
-msgstr "Kilépett partnerek mutatása"
+msgstr "Kilépett partnerek megjelenítése"
#: ../data/empathy.schemas.in.h:33
msgid "Spell checking languages"
@@ -288,7 +288,7 @@ msgstr ""
#: ../data/empathy.schemas.in.h:59
msgid "Whether or not to show contacts that are offline in the contact list."
-msgstr "Kilépett partnerek mutatása a partnerlistában."
+msgstr "Kilépett partnerek megjelenítése a partnerlistában."
#: ../data/empathy.schemas.in.h:60
msgid "Whether or not to show popup notifications when away or busy."
@@ -1920,7 +1920,7 @@ msgstr "Kedvencek kezelése"
#: ../src/empathy-main-window.glade.h:6
msgid "Show _Offline Contacts"
-msgstr "Kilé_pett partnerek mutatása"
+msgstr "Kilé_pett partnerek megjelenítése"
#: ../src/empathy-main-window.glade.h:7
msgid "_Accounts"
@@ -2089,7 +2089,7 @@ msgstr "_Hangulatjelek képekké alakítása"
#: ../src/empathy-preferences.glade.h:18
msgid "Show co_mpact contact list"
-msgstr "_Tömör partnerlista mutatása"
+msgstr "_Tömör partnerlista megjelenítése"
#: ../src/empathy-preferences.glade.h:19
msgid "Sort by _name"
diff --git a/po/it.po b/po/it.po
index b56a3ed6a..f1bfcf141 100644
--- a/po/it.po
+++ b/po/it.po
@@ -11,8 +11,8 @@ msgstr ""
"Project-Id-Version: Empathy\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?"
"product=empathy&component=general\n"
-"POT-Creation-Date: 2009-02-24 17:39+0000\n"
-"PO-Revision-Date: 2009-02-25 22:03+0100\n"
+"POT-Creation-Date: 2009-04-29 10:56+0000\n"
+"PO-Revision-Date: 2009-05-01 11:50+0200\n"
"Last-Translator: Milo Casagrande <milo@ubuntu.com>\n"
"Language-Team: Italian <tp@lists.linux.it>\n"
"MIME-Version: 1.0\n"
@@ -348,453 +348,435 @@ msgstr ""
"L'ordinamento predefinito è quello secondo il nome del contatto con il "
"valore \"name\". Il valore \"state\" ordina in base allo stato del contatto."
-#: ../libempathy/empathy-tp-contact-list.c:731 ../src/empathy.c:269
+#: ../libempathy/empathy-tp-contact-list.c:727 ../src/empathy.c:278
msgid "People nearby"
msgstr "Persone nelle vicinanze"
-#: ../libempathy/empathy-utils.c:252
+#: ../libempathy/empathy-utils.c:251
msgid "Available"
msgstr "Disponibile"
-#: ../libempathy/empathy-utils.c:254
+#: ../libempathy/empathy-utils.c:253
msgid "Busy"
msgstr "Occupato"
-#: ../libempathy/empathy-utils.c:257
+#: ../libempathy/empathy-utils.c:256
msgid "Away"
msgstr "Assente"
-#: ../libempathy/empathy-utils.c:259
+#: ../libempathy/empathy-utils.c:258
msgid "Hidden"
msgstr "Nascosto"
-#: ../libempathy/empathy-utils.c:262
+#: ../libempathy/empathy-utils.c:261
msgid "Offline"
msgstr "Fuori rete"
-#: ../libempathy-gtk/empathy-account-chooser.c:326
+#: ../libempathy-gtk/empathy-account-chooser.c:419
msgid "All"
msgstr "Tutti"
#: ../libempathy-gtk/empathy-account-widget.c:302
-#: ../libempathy-gtk/empathy-account-widget.c:347
+#: ../libempathy-gtk/empathy-account-widget.c:349
#, c-format
msgid "%s:"
msgstr "%s:"
-#: ../libempathy-gtk/empathy-account-widget-aim.glade.h:1
-#: ../libempathy-gtk/empathy-account-widget-generic.glade.h:1
-#: ../libempathy-gtk/empathy-account-widget-groupwise.glade.h:1
-#: ../libempathy-gtk/empathy-account-widget-icq.glade.h:1
-#: ../libempathy-gtk/empathy-account-widget-jabber.glade.h:1
-#: ../libempathy-gtk/empathy-account-widget-msn.glade.h:1
-#: ../libempathy-gtk/empathy-account-widget-salut.glade.h:1
-#: ../libempathy-gtk/empathy-account-widget-sip.glade.h:1
-#: ../libempathy-gtk/empathy-account-widget-yahoo.glade.h:1
+#: ../libempathy-gtk/empathy-account-widget-aim.ui.h:1
+#: ../libempathy-gtk/empathy-account-widget-generic.ui.h:1
+#: ../libempathy-gtk/empathy-account-widget-groupwise.ui.h:1
+#: ../libempathy-gtk/empathy-account-widget-icq.ui.h:1
+#: ../libempathy-gtk/empathy-account-widget-jabber.ui.h:1
+#: ../libempathy-gtk/empathy-account-widget-msn.ui.h:1
+#: ../libempathy-gtk/empathy-account-widget-salut.ui.h:1
+#: ../libempathy-gtk/empathy-account-widget-sip.ui.h:1
+#: ../libempathy-gtk/empathy-account-widget-yahoo.ui.h:1
msgid "<b>Advanced</b>"
msgstr "<b>Avanzato</b>"
-# (ndt) suggerimento
-#: ../libempathy-gtk/empathy-account-widget-aim.glade.h:2
-#: ../libempathy-gtk/empathy-account-widget-groupwise.glade.h:2
-#: ../libempathy-gtk/empathy-account-widget-icq.glade.h:2
-#: ../libempathy-gtk/empathy-account-widget-jabber.glade.h:3
-#: ../libempathy-gtk/empathy-account-widget-msn.glade.h:2
-#: ../libempathy-gtk/empathy-account-widget-sip.glade.h:4
-#: ../libempathy-gtk/empathy-account-widget-yahoo.glade.h:2
-msgid "Forget password and clear the entry."
-msgstr "Dimentica la password e azzera la voce."
-
-#: ../libempathy-gtk/empathy-account-widget-aim.glade.h:3
-#: ../libempathy-gtk/empathy-account-widget-groupwise.glade.h:4
-#: ../libempathy-gtk/empathy-account-widget-icq.glade.h:4
-#: ../libempathy-gtk/empathy-account-widget-jabber.glade.h:5
-#: ../libempathy-gtk/empathy-account-widget-msn.glade.h:4
-#: ../libempathy-gtk/empathy-account-widget-sip.glade.h:5
-#: ../libempathy-gtk/empathy-account-widget-yahoo.glade.h:3
+#: ../libempathy-gtk/empathy-account-widget-aim.ui.h:2
+#: ../libempathy-gtk/empathy-account-widget-groupwise.ui.h:3
+#: ../libempathy-gtk/empathy-account-widget-icq.ui.h:3
+#: ../libempathy-gtk/empathy-account-widget-jabber.ui.h:4
+#: ../libempathy-gtk/empathy-account-widget-msn.ui.h:3
+#: ../libempathy-gtk/empathy-account-widget-sip.ui.h:4
+#: ../libempathy-gtk/empathy-account-widget-yahoo.ui.h:2
msgid "Pass_word:"
msgstr "Pass_word:"
# (ndt) come in pidgin ;)
-#: ../libempathy-gtk/empathy-account-widget-aim.glade.h:4
+#: ../libempathy-gtk/empathy-account-widget-aim.ui.h:3
msgid "Screen _Name:"
msgstr "_Nominativo pubblico:"
-#: ../libempathy-gtk/empathy-account-widget-aim.glade.h:5
-#: ../libempathy-gtk/empathy-account-widget-groupwise.glade.h:5
-#: ../libempathy-gtk/empathy-account-widget-icq.glade.h:6
-#: ../libempathy-gtk/empathy-account-widget-jabber.glade.h:11
-#: ../libempathy-gtk/empathy-account-widget-msn.glade.h:5
-#: ../libempathy-gtk/empathy-account-widget-yahoo.glade.h:8
+#: ../libempathy-gtk/empathy-account-widget-aim.ui.h:4
+#: ../libempathy-gtk/empathy-account-widget-groupwise.ui.h:4
+#: ../libempathy-gtk/empathy-account-widget-icq.ui.h:5
+#: ../libempathy-gtk/empathy-account-widget-jabber.ui.h:10
+#: ../libempathy-gtk/empathy-account-widget-msn.ui.h:4
+#: ../libempathy-gtk/empathy-account-widget-yahoo.ui.h:7
msgid "_Port:"
msgstr "_Porta:"
-#: ../libempathy-gtk/empathy-account-widget-aim.glade.h:6
-#: ../libempathy-gtk/empathy-account-widget-groupwise.glade.h:6
-#: ../libempathy-gtk/empathy-account-widget-icq.glade.h:7
-#: ../libempathy-gtk/empathy-account-widget-jabber.glade.h:12
-#: ../libempathy-gtk/empathy-account-widget-msn.glade.h:6
-#: ../libempathy-gtk/empathy-account-widget-yahoo.glade.h:10
-#: ../src/empathy-new-chatroom-dialog.glade.h:10
+#: ../libempathy-gtk/empathy-account-widget-aim.ui.h:5
+#: ../libempathy-gtk/empathy-account-widget-groupwise.ui.h:5
+#: ../libempathy-gtk/empathy-account-widget-icq.ui.h:6
+#: ../libempathy-gtk/empathy-account-widget-jabber.ui.h:11
+#: ../libempathy-gtk/empathy-account-widget-msn.ui.h:5
+#: ../libempathy-gtk/empathy-account-widget-yahoo.ui.h:9
+#: ../src/empathy-new-chatroom-dialog.ui.h:8
msgid "_Server:"
msgstr "_Server:"
-#: ../libempathy-gtk/empathy-account-widget-groupwise.glade.h:3
-#: ../libempathy-gtk/empathy-account-widget-jabber.glade.h:4
-#: ../libempathy-gtk/empathy-account-widget-msn.glade.h:3
+#: ../libempathy-gtk/empathy-account-widget-groupwise.ui.h:2
+#: ../libempathy-gtk/empathy-account-widget-jabber.ui.h:3
+#: ../libempathy-gtk/empathy-account-widget-msn.ui.h:2
msgid "Login I_D:"
msgstr "I_D accesso:"
-#: ../libempathy-gtk/empathy-account-widget-icq.glade.h:3
+#: ../libempathy-gtk/empathy-account-widget-icq.ui.h:2
msgid "ICQ _UIN:"
msgstr "_UIN ICQ:"
-#: ../libempathy-gtk/empathy-account-widget-icq.glade.h:5
-#: ../libempathy-gtk/empathy-account-widget-yahoo.glade.h:6
+#: ../libempathy-gtk/empathy-account-widget-icq.ui.h:4
+#: ../libempathy-gtk/empathy-account-widget-yahoo.ui.h:5
msgid "_Charset:"
msgstr "C_odifica caratteri:"
-#: ../libempathy-gtk/empathy-account-widget-irc.c:245
+#: ../libempathy-gtk/empathy-account-widget-irc.c:241
msgid "New Network"
msgstr "Nuova rete"
-#: ../libempathy-gtk/empathy-account-widget-irc.glade.h:1
+#: ../libempathy-gtk/empathy-account-widget-irc.ui.h:1
msgid "<b>Network</b>"
msgstr "<b>Rete</b>"
-#: ../libempathy-gtk/empathy-account-widget-irc.glade.h:2
+#: ../libempathy-gtk/empathy-account-widget-irc.ui.h:2
msgid "<b>Servers</b>"
msgstr "<b>Server</b>"
-#: ../libempathy-gtk/empathy-account-widget-irc.glade.h:3
+#: ../libempathy-gtk/empathy-account-widget-irc.ui.h:3
msgid "Charset:"
msgstr "Codifica caratteri:"
-#: ../libempathy-gtk/empathy-account-widget-irc.glade.h:4
-msgid "Create a new IRC network"
-msgstr "Crea una nuova rete IRC"
-
-#: ../libempathy-gtk/empathy-account-widget-irc.glade.h:5
-msgid "Edit the selected IRC network"
-msgstr "Modifica la rete IRC selezionata"
-
-#: ../libempathy-gtk/empathy-account-widget-irc.glade.h:6
+#: ../libempathy-gtk/empathy-account-widget-irc.ui.h:4
msgid "Network"
msgstr "Rete"
-#: ../libempathy-gtk/empathy-account-widget-irc.glade.h:7
+#: ../libempathy-gtk/empathy-account-widget-irc.ui.h:5
msgid "Network:"
msgstr "Rete:"
-#: ../libempathy-gtk/empathy-account-widget-irc.glade.h:8
+#: ../libempathy-gtk/empathy-account-widget-irc.ui.h:6
msgid "Nickname:"
msgstr "Soprannome:"
-#: ../libempathy-gtk/empathy-account-widget-irc.glade.h:9
+#: ../libempathy-gtk/empathy-account-widget-irc.ui.h:7
msgid "Password:"
msgstr "Password:"
-#: ../libempathy-gtk/empathy-account-widget-irc.glade.h:10
+#: ../libempathy-gtk/empathy-account-widget-irc.ui.h:8
msgid "Quit message:"
msgstr "Messaggio di uscita:"
-#: ../libempathy-gtk/empathy-account-widget-irc.glade.h:11
+#: ../libempathy-gtk/empathy-account-widget-irc.ui.h:9
msgid "Real name:"
msgstr "Nome reale:"
-# (ndt) suggerimento
-#: ../libempathy-gtk/empathy-account-widget-irc.glade.h:12
-msgid "Remove the selected IRC network"
-msgstr "Rimuove la rete IRC selezionata"
-
-#: ../libempathy-gtk/empathy-account-widget-jabber.glade.h:2
+#: ../libempathy-gtk/empathy-account-widget-jabber.ui.h:2
msgid "<b>Override server settings</b>"
msgstr "<b>Scavalcare impostazioni server</b>"
-#: ../libempathy-gtk/empathy-account-widget-jabber.glade.h:6
+#: ../libempathy-gtk/empathy-account-widget-jabber.ui.h:5
msgid "Pri_ority:"
msgstr "Pri_orità:"
-#: ../libempathy-gtk/empathy-account-widget-jabber.glade.h:7
+#: ../libempathy-gtk/empathy-account-widget-jabber.ui.h:6
msgid "Reso_urce:"
msgstr "_Risorsa:"
# (ndt) opzione
-#: ../libempathy-gtk/empathy-account-widget-jabber.glade.h:8
+#: ../libempathy-gtk/empathy-account-widget-jabber.ui.h:7
msgid "Use old SS_L"
msgstr "_Usare vecchio SSL"
# (ndt) opzione
-#: ../libempathy-gtk/empathy-account-widget-jabber.glade.h:9
+#: ../libempathy-gtk/empathy-account-widget-jabber.ui.h:8
msgid "_Encryption required (TLS/SSL)"
msgstr "Richiesta _cifratura (TLS/SSL)"
# (ndt) opzione
-#: ../libempathy-gtk/empathy-account-widget-jabber.glade.h:10
+#: ../libempathy-gtk/empathy-account-widget-jabber.ui.h:9
msgid "_Ignore SSL certificate errors"
msgstr "_Ignorare errori certificati SSL"
-#: ../libempathy-gtk/empathy-account-widget-salut.glade.h:2
+#: ../libempathy-gtk/empathy-account-widget-salut.ui.h:2
msgid "_Email:"
msgstr "_Email:"
-#: ../libempathy-gtk/empathy-account-widget-salut.glade.h:3
+#: ../libempathy-gtk/empathy-account-widget-salut.ui.h:3
msgid "_First Name:"
msgstr "_Nome:"
-#: ../libempathy-gtk/empathy-account-widget-salut.glade.h:4
+#: ../libempathy-gtk/empathy-account-widget-salut.ui.h:4
msgid "_Jabber ID:"
msgstr "I_D Jabber:"
-#: ../libempathy-gtk/empathy-account-widget-salut.glade.h:5
+#: ../libempathy-gtk/empathy-account-widget-salut.ui.h:5
msgid "_Last Name:"
msgstr "C_ognome:"
-#: ../libempathy-gtk/empathy-account-widget-salut.glade.h:6
-#: ../src/empathy-chatrooms-window.glade.h:8
+#: ../libempathy-gtk/empathy-account-widget-salut.ui.h:6
msgid "_Nickname:"
msgstr "_Soprannome:"
# (ndt) dovrebbe essere il nome visualizzato con l'account
-#: ../libempathy-gtk/empathy-account-widget-salut.glade.h:7
+#: ../libempathy-gtk/empathy-account-widget-salut.ui.h:7
msgid "_Published Name:"
msgstr "Nome _visibile:"
# (ndt) opzione
#. look up the DNS SRV record at the service's domain for the host name of a STUN server.
-#: ../libempathy-gtk/empathy-account-widget-sip.glade.h:3
+#: ../libempathy-gtk/empathy-account-widget-sip.ui.h:3
msgid "Discover STUN"
msgstr "Rilevare STUN"
-#: ../libempathy-gtk/empathy-account-widget-sip.glade.h:6
+#: ../libempathy-gtk/empathy-account-widget-sip.ui.h:5
msgid "STUN Server:"
msgstr "Server STUN:"
-#: ../libempathy-gtk/empathy-account-widget-sip.glade.h:7
+#: ../libempathy-gtk/empathy-account-widget-sip.ui.h:6
msgid "STUN port:"
msgstr "Porta STUN:"
-#: ../libempathy-gtk/empathy-account-widget-sip.glade.h:8
+#: ../libempathy-gtk/empathy-account-widget-sip.ui.h:7
msgid "_Username:"
msgstr "_Nome utente:"
# (ndt) opzione
-#: ../libempathy-gtk/empathy-account-widget-yahoo.glade.h:4
+#: ../libempathy-gtk/empathy-account-widget-yahoo.ui.h:3
msgid "Use _Yahoo Japan"
msgstr "Usare _Yahoo Giappone"
-#: ../libempathy-gtk/empathy-account-widget-yahoo.glade.h:5
+#: ../libempathy-gtk/empathy-account-widget-yahoo.ui.h:4
msgid "Yahoo I_D:"
msgstr "I_D Yahoo:"
-#: ../libempathy-gtk/empathy-account-widget-yahoo.glade.h:7
+#: ../libempathy-gtk/empathy-account-widget-yahoo.ui.h:6
msgid "_Ignore conference and chatroom invitations"
msgstr "I_gnorare conferenze e inviti per canali"
-#: ../libempathy-gtk/empathy-account-widget-yahoo.glade.h:9
+#: ../libempathy-gtk/empathy-account-widget-yahoo.ui.h:8
msgid "_Room List locale:"
msgstr "_Nazione elenco canali:"
-#: ../libempathy-gtk/empathy-avatar-chooser.c:462
-#: ../libempathy-gtk/empathy-avatar-chooser.c:537
+#: ../libempathy-gtk/empathy-avatar-chooser.c:449
+#: ../libempathy-gtk/empathy-avatar-chooser.c:525
msgid "Couldn't convert image"
msgstr "Impossibile convertire l'immagine"
-#: ../libempathy-gtk/empathy-avatar-chooser.c:463
+#: ../libempathy-gtk/empathy-avatar-chooser.c:450
msgid "None of the accepted image formats is supported on your system"
msgstr "Nessuno dei formati di immagine accettati è supportato dal sistema"
# (ndt) titolo dialogo
-#: ../libempathy-gtk/empathy-avatar-chooser.c:956
+#: ../libempathy-gtk/empathy-avatar-chooser.c:933
msgid "Select Your Avatar Image"
msgstr "Selezione immagine"
-#: ../libempathy-gtk/empathy-avatar-chooser.c:959
+#: ../libempathy-gtk/empathy-avatar-chooser.c:936
msgid "No Image"
msgstr "Nessuna immagine"
-#: ../libempathy-gtk/empathy-avatar-chooser.c:1021
+#: ../libempathy-gtk/empathy-avatar-chooser.c:998
msgid "Images"
msgstr "Immagini"
-#: ../libempathy-gtk/empathy-avatar-chooser.c:1025
+#: ../libempathy-gtk/empathy-avatar-chooser.c:1002
msgid "All Files"
msgstr "Tutti i file"
-#: ../libempathy-gtk/empathy-avatar-image.c:294
+#: ../libempathy-gtk/empathy-avatar-image.c:324
msgid "Click to enlarge"
msgstr "Clic per ingrandire"
-#: ../libempathy-gtk/empathy-chat.c:507
+#: ../libempathy-gtk/empathy-chat.c:178
+msgid "Failed to reconnect this chat"
+msgstr ""
+
+#: ../libempathy-gtk/empathy-chat.c:396
+msgid "Unsupported command"
+msgstr ""
+
+#: ../libempathy-gtk/empathy-chat.c:531
msgid "offline"
msgstr "fuori rete"
-#: ../libempathy-gtk/empathy-chat.c:510
+#: ../libempathy-gtk/empathy-chat.c:534
msgid "invalid contact"
msgstr "contatto non valido"
-#: ../libempathy-gtk/empathy-chat.c:513
+#: ../libempathy-gtk/empathy-chat.c:537
msgid "permission denied"
msgstr "permesso negato"
-#: ../libempathy-gtk/empathy-chat.c:516
+#: ../libempathy-gtk/empathy-chat.c:540
msgid "too long message"
msgstr "messaggio troppo lungo"
-#: ../libempathy-gtk/empathy-chat.c:519
+#: ../libempathy-gtk/empathy-chat.c:543
msgid "not implemented"
msgstr "non implementato"
-#: ../libempathy-gtk/empathy-chat.c:522
+#: ../libempathy-gtk/empathy-chat.c:546
msgid "unknown"
msgstr "sconosciuto"
-#: ../libempathy-gtk/empathy-chat.c:526
+#: ../libempathy-gtk/empathy-chat.c:550
#, c-format
msgid "Error sending message '%s': %s"
msgstr "Errore nell'inviare il messaggio «%s»: %s"
-#: ../libempathy-gtk/empathy-chat.c:556
+#: ../libempathy-gtk/empathy-chat.c:580
#, c-format
msgid "Topic set to: %s"
msgstr "Argomento impostato a: %s"
-#: ../libempathy-gtk/empathy-chat.c:558
+#: ../libempathy-gtk/empathy-chat.c:582
msgid "No topic defined"
msgstr "Nessun argomento definito"
-#: ../libempathy-gtk/empathy-chat.c:973
+#: ../libempathy-gtk/empathy-chat.c:951
+msgid "(No Suggestions)"
+msgstr ""
+
+#: ../libempathy-gtk/empathy-chat.c:1005
msgid "Insert Smiley"
msgstr "Inserisci faccina"
#. send button
-#: ../libempathy-gtk/empathy-chat.c:991
-#: ../libempathy-gtk/empathy-ui-utils.c:1538
+#: ../libempathy-gtk/empathy-chat.c:1023
+#: ../libempathy-gtk/empathy-ui-utils.c:1507
msgid "_Send"
msgstr "_Invia"
-#: ../libempathy-gtk/empathy-chat.c:1025
-msgid "_Check Word Spelling..."
-msgstr "_Controllo ortografico..."
+#: ../libempathy-gtk/empathy-chat.c:1057
+msgid "_Spelling Suggestions"
+msgstr ""
-#: ../libempathy-gtk/empathy-chat.c:1131
+#: ../libempathy-gtk/empathy-chat.c:1171
#, c-format
msgid "%s has joined the room"
msgstr "%s è entrato nel canale"
-#: ../libempathy-gtk/empathy-chat.c:1134
+#: ../libempathy-gtk/empathy-chat.c:1174
#, c-format
msgid "%s has left the room"
msgstr "%s è uscito dal canale"
-#: ../libempathy-gtk/empathy-chat.c:1248 ../src/empathy-call-window.c:548
+#: ../libempathy-gtk/empathy-chat.c:1289 ../src/empathy-call-window.c:811
msgid "Disconnected"
msgstr "Disconnesso"
-#: ../libempathy-gtk/empathy-chat.c:1644
+#: ../libempathy-gtk/empathy-chat.c:1700
msgid "Connected"
msgstr "Connesso"
-#: ../libempathy-gtk/empathy-chat.c:1694
-#: ../libempathy-gtk/empathy-log-window.c:505
+#: ../libempathy-gtk/empathy-chat.c:1750
+#: ../libempathy-gtk/empathy-log-window.c:501
msgid "Conversation"
msgstr "Conversazione"
-#: ../libempathy-gtk/empathy-chat.glade.h:1
+#: ../libempathy-gtk/empathy-chat.ui.h:1
msgid "<b>Topic:</b>"
msgstr "<b>Argomento:</b>"
-#: ../libempathy-gtk/empathy-chat.glade.h:2
-msgid "Group Chat"
-msgstr "Chat di gruppo"
-
-#: ../libempathy-gtk/empathy-chat-text-view.c:340
+#: ../libempathy-gtk/empathy-chat-text-view.c:323
msgid "_Copy Link Address"
msgstr "_Copia indirizzo collegamento"
-#: ../libempathy-gtk/empathy-chat-text-view.c:348
+#: ../libempathy-gtk/empathy-chat-text-view.c:331
msgid "_Open Link"
msgstr "Apri c_ollegamento"
# (ndt) domenica 01 ottobre 2007
#. Translators: timestamp displayed between conversations in
#. * chat windows (strftime format string)
-#: ../libempathy-gtk/empathy-chat-text-view.c:441
+#: ../libempathy-gtk/empathy-chat-text-view.c:424
msgid "%A %B %d %Y"
msgstr "%A %d %B %Y"
-#: ../libempathy-gtk/empathy-contact-dialogs.c:180
-msgid "Personal Information"
-msgstr "Informazioni personali"
-
# (ndt) titolo dialogo
-#: ../libempathy-gtk/empathy-contact-dialogs.c:183
+#: ../libempathy-gtk/empathy-contact-dialogs.c:179
+#: ../libempathy-gtk/empathy-contact-dialogs.c:237
msgid "Edit Contact Information"
msgstr "Modifica informazioni contatto"
-#: ../libempathy-gtk/empathy-contact-dialogs.c:186
-msgid "Contact Information"
-msgstr "Informazioni contatto"
+#: ../libempathy-gtk/empathy-contact-dialogs.c:288
+msgid "Personal Information"
+msgstr "Informazioni personali"
-#: ../libempathy-gtk/empathy-contact-dialogs.c:267
+#: ../libempathy-gtk/empathy-contact-dialogs.c:368
msgid "I would like to add you to my contact list."
msgstr "Vorrei aggiungerti al mio elenco contatti."
-#: ../libempathy-gtk/empathy-contact-dialogs.c:291
+#: ../libempathy-gtk/empathy-contact-dialogs.c:392
msgid "New Contact"
msgstr "Nuovo contatto"
# (ndt) pulsante
-#: ../libempathy-gtk/empathy-contact-dialogs.glade.h:1
+#: ../libempathy-gtk/empathy-contact-dialogs.ui.h:1
msgid "Decide _Later"
msgstr "_Decidi successivamente"
# (ndt) titolo dialogo
-#: ../libempathy-gtk/empathy-contact-dialogs.glade.h:2
+#: ../libempathy-gtk/empathy-contact-dialogs.ui.h:2
msgid "Subscription Request"
msgstr "Richiesta di sottoscrizione"
-#: ../libempathy-gtk/empathy-contact-list-view.c:1249
+#: ../libempathy-gtk/empathy-contact-list-view.c:1315
#, c-format
msgid "Do you really want to remove the group '%s'?"
msgstr "Rimuovere veramente il gruppo «%s»?"
-#: ../libempathy-gtk/empathy-contact-list-view.c:1251
+#: ../libempathy-gtk/empathy-contact-list-view.c:1317
msgid "Removing group"
msgstr "Rimozione gruppo"
-#: ../libempathy-gtk/empathy-contact-list-view.c:1298
-#: ../libempathy-gtk/empathy-contact-list-view.c:1377
+#: ../libempathy-gtk/empathy-contact-list-view.c:1364
+#: ../libempathy-gtk/empathy-contact-list-view.c:1443
msgid "_Remove"
msgstr "Ri_muovi"
-#: ../libempathy-gtk/empathy-contact-list-view.c:1328
+#: ../libempathy-gtk/empathy-contact-list-view.c:1394
#, c-format
msgid "Do you really want to remove the contact '%s'?"
msgstr "Rimuovere veramente il contatto «%s»?"
-#: ../libempathy-gtk/empathy-contact-list-view.c:1330
+#: ../libempathy-gtk/empathy-contact-list-view.c:1396
msgid "Removing contact"
msgstr "Rimozione contatto"
# (ndt) dovrebbe essere il messaggio che viene inviato quando si
# rimuove un contatto dall'elenco
-#: ../libempathy-gtk/empathy-contact-list-view.c:1335
+#: ../libempathy-gtk/empathy-contact-list-view.c:1401
msgid "Sorry, I don't want you in my contact list anymore."
msgstr "Mi spiace, non voglio più averti tra i miei contatti."
#: ../libempathy-gtk/empathy-contact-menu.c:130
-#: ../src/empathy-main-window.glade.h:9
+#: ../src/empathy-main-window.ui.h:9
msgid "_Chat"
msgstr "_Chat"
#: ../libempathy-gtk/empathy-contact-menu.c:161
-#: ../src/empathy-call-window.glade.h:5
+#, fuzzy
+#| msgid "_Call"
+msgctxt "menu item"
msgid "_Call"
msgstr "C_hiama"
#: ../libempathy-gtk/empathy-contact-menu.c:200
-#: ../src/empathy-main-window.glade.h:17
+#: ../src/empathy-main-window.ui.h:18
msgid "_View Previous Conversations"
msgstr "Conversazioni _precedenti"
@@ -807,7 +789,7 @@ msgid "Infor_mation"
msgstr "Infor_mazioni"
#: ../libempathy-gtk/empathy-contact-menu.c:277
-#: ../src/empathy-chat-window.glade.h:14 ../src/empathy-main-window.glade.h:11
+#: ../src/empathy-main-window.ui.h:11
msgid "_Edit"
msgstr "_Modifica"
@@ -817,95 +799,90 @@ msgstr "_Modifica"
msgid "Inviting to this room"
msgstr "Invio invito per questa stanza"
-#: ../libempathy-gtk/empathy-contact-menu.c:369
+#: ../libempathy-gtk/empathy-contact-menu.c:367
msgid "_Invite to chatroom"
msgstr "_Invita nella stanza"
-#: ../libempathy-gtk/empathy-contact-selector.c:111
+#: ../libempathy-gtk/empathy-contact-selector.c:129
msgid "Select a contact"
msgstr "Seleziona un contatto"
-#: ../libempathy-gtk/empathy-contact-widget.c:358
+#: ../libempathy-gtk/empathy-contact-widget.c:413
msgid "Save Avatar"
msgstr "Salva immagine"
-#: ../libempathy-gtk/empathy-contact-widget.c:414
+#: ../libempathy-gtk/empathy-contact-widget.c:469
msgid "Unable to save avatar"
msgstr "Impossibile salvare l'immagine"
# (ndt) nome di una colonna
-#: ../libempathy-gtk/empathy-contact-widget.c:895
+#: ../libempathy-gtk/empathy-contact-widget.c:952
msgid "Select"
msgstr "Selezione"
-#: ../libempathy-gtk/empathy-contact-widget.c:904
-#: ../src/empathy-main-window.c:991
+#: ../libempathy-gtk/empathy-contact-widget.c:961
+#: ../src/empathy-main-window.c:894
msgid "Group"
msgstr "Gruppo"
-#: ../libempathy-gtk/empathy-contact-widget.glade.h:1
+#: ../libempathy-gtk/empathy-contact-widget.ui.h:1
msgid "<b>Client Information</b>"
msgstr "<b>Informazioni client</b>"
-#: ../libempathy-gtk/empathy-contact-widget.glade.h:2
+#: ../libempathy-gtk/empathy-contact-widget.ui.h:2
msgid "<b>Contact Details</b>"
msgstr "<b>Dettagli contatto</b>"
-#: ../libempathy-gtk/empathy-contact-widget.glade.h:3
+#: ../libempathy-gtk/empathy-contact-widget.ui.h:3
msgid "<b>Contact</b>"
msgstr "<b>Contatto</b>"
-#: ../libempathy-gtk/empathy-contact-widget.glade.h:4
+#: ../libempathy-gtk/empathy-contact-widget.ui.h:4
msgid "<b>Groups</b>"
msgstr "<b>Gruppi</b>"
-#: ../libempathy-gtk/empathy-contact-widget.glade.h:5
-#: ../libempathy-gtk/empathy-new-message-dialog.glade.h:1
-#: ../src/empathy-chatrooms-window.glade.h:1
-#: ../src/empathy-new-chatroom-dialog.glade.h:1
+#: ../libempathy-gtk/empathy-contact-widget.ui.h:5
+#: ../libempathy-gtk/empathy-new-message-dialog.ui.h:1
+#: ../src/empathy-chatrooms-window.ui.h:1
+#: ../src/empathy-new-chatroom-dialog.ui.h:1
msgid "Account:"
msgstr "Account:"
-#: ../libempathy-gtk/empathy-contact-widget.glade.h:6
+#: ../libempathy-gtk/empathy-contact-widget.ui.h:6
msgid "Alias:"
msgstr "Pseudonimo:"
-#: ../libempathy-gtk/empathy-contact-widget.glade.h:7
+#: ../libempathy-gtk/empathy-contact-widget.ui.h:7
msgid "Birthday:"
msgstr "Compleanno:"
-#: ../libempathy-gtk/empathy-contact-widget.glade.h:8
+#: ../libempathy-gtk/empathy-contact-widget.ui.h:8
msgid "Client:"
msgstr "Client:"
-# (ndt) titolo dialogo
-#: ../libempathy-gtk/empathy-contact-widget.glade.h:9
-msgid "Contact information"
-msgstr "Informazioni contatto"
-
-#: ../libempathy-gtk/empathy-contact-widget.glade.h:10
+#: ../libempathy-gtk/empathy-contact-widget.ui.h:9
msgid "Email:"
msgstr "Email:"
-#: ../libempathy-gtk/empathy-contact-widget.glade.h:11
+#: ../libempathy-gtk/empathy-contact-widget.ui.h:10
msgid "Fullname:"
msgstr "Nome:"
#. Identifier to connect to Instant Messaging network
-#: ../libempathy-gtk/empathy-contact-widget.glade.h:13
+#: ../libempathy-gtk/empathy-contact-widget.ui.h:12
msgid "Identifier:"
msgstr "Identificatore:"
-#: ../libempathy-gtk/empathy-contact-widget.glade.h:14
+#: ../libempathy-gtk/empathy-contact-widget.ui.h:13
msgid "Information requested..."
msgstr "Informazione richiesta..."
# (ndt) sistema operativo
-#: ../libempathy-gtk/empathy-contact-widget.glade.h:15
+#: ../libempathy-gtk/empathy-contact-widget.ui.h:14
msgid "OS:"
msgstr "SO:"
-#: ../libempathy-gtk/empathy-contact-widget.glade.h:16
+#: ../libempathy-gtk/empathy-contact-widget.ui.h:15
msgid ""
"Select the groups you want this contact to appear in. Note that you can "
"select more than one group or no groups."
@@ -913,119 +890,149 @@ msgstr ""
"Selezionare il gruppo in cui inserire questo contatto. È possibile "
"selezionarne più di uno oppure nessuno."
-#: ../libempathy-gtk/empathy-contact-widget.glade.h:17
+#: ../libempathy-gtk/empathy-contact-widget.ui.h:16
msgid "Version:"
msgstr "Versione:"
-#: ../libempathy-gtk/empathy-contact-widget.glade.h:18
+#: ../libempathy-gtk/empathy-contact-widget.ui.h:17
msgid "Web site:"
msgstr "Sito web:"
# (ndt) pulsante
-#: ../libempathy-gtk/empathy-contact-widget.glade.h:19
+#: ../libempathy-gtk/empathy-contact-widget.ui.h:18
msgid "_Add Group"
msgstr "A_ggiungi gruppo"
-#: ../libempathy-gtk/empathy-irc-network-dialog.c:284
+#: ../libempathy-gtk/empathy-irc-network-dialog.c:283
msgid "new server"
msgstr "nuovo server"
-#: ../libempathy-gtk/empathy-irc-network-dialog.c:513
+#: ../libempathy-gtk/empathy-irc-network-dialog.c:510
msgid "Server"
msgstr "Server"
-#: ../libempathy-gtk/empathy-irc-network-dialog.c:528
+#: ../libempathy-gtk/empathy-irc-network-dialog.c:525
msgid "Port"
msgstr "Porta"
-#: ../libempathy-gtk/empathy-irc-network-dialog.c:541
+#: ../libempathy-gtk/empathy-irc-network-dialog.c:538
msgid "SSL"
msgstr "SSL"
-#: ../libempathy-gtk/empathy-log-window.c:498
-#: ../src/empathy-import-dialog.c:277
+#: ../libempathy-gtk/empathy-log-window.c:494
+#: ../src/empathy-import-dialog.c:281
msgid "Account"
msgstr "Account"
-#: ../libempathy-gtk/empathy-log-window.c:515
+#: ../libempathy-gtk/empathy-log-window.c:511
msgid "Date"
msgstr "Data"
-#. Tab Label
-#: ../libempathy-gtk/empathy-log-window.glade.h:2
+#: ../libempathy-gtk/empathy-log-window.ui.h:1
msgid "Conversations"
msgstr "Conversazioni"
-#: ../libempathy-gtk/empathy-log-window.glade.h:3
+#: ../libempathy-gtk/empathy-log-window.ui.h:2
msgid "Previous Conversations"
msgstr "Conversazioni precedenti"
-#. Tab Label
-#: ../libempathy-gtk/empathy-log-window.glade.h:5
+#: ../libempathy-gtk/empathy-log-window.ui.h:3
msgid "Search"
msgstr "Cerca"
# (ndt) questo è prima di una casella di testo
# in cui inserire il criterio di ricerca
-#. Searching *for* something
-#: ../libempathy-gtk/empathy-log-window.glade.h:7
+#: ../libempathy-gtk/empathy-log-window.ui.h:4
msgid "_For:"
msgstr "_Per:"
-#: ../libempathy-gtk/empathy-new-message-dialog.glade.h:2
+#: ../libempathy-gtk/empathy-new-message-dialog.ui.h:2
msgid "C_all"
msgstr "C_hiama"
-#: ../libempathy-gtk/empathy-new-message-dialog.glade.h:3
+#: ../libempathy-gtk/empathy-new-message-dialog.ui.h:3
msgid "C_hat"
msgstr "_Chat"
-#: ../libempathy-gtk/empathy-new-message-dialog.glade.h:4
+#: ../libempathy-gtk/empathy-new-message-dialog.ui.h:4
msgid "Contact ID:"
msgstr "ID contatto:"
-#: ../libempathy-gtk/empathy-new-message-dialog.glade.h:5
+#: ../libempathy-gtk/empathy-new-message-dialog.ui.h:5
msgid "New Conversation"
msgstr "Nuova conversazione"
+#. COL_STATE_ICON_NAME
+#. COL_STATE
+#. COL_STATUS_TEXT
+#. COL_DISPLAY_MARKUP
+#. COL_STATUS_CUSTOMISABLE
+#. COL_TYPE
+#: ../libempathy-gtk/empathy-presence-chooser.c:169
+#, fuzzy
+#| msgid "Custom messages..."
+msgid "Custom Message..."
+msgstr "Messaggi personalizzati..."
+
+#: ../libempathy-gtk/empathy-presence-chooser.c:225
+#, fuzzy
+#| msgid "Custom messages..."
+msgid "Edit Custom Messages..."
+msgstr "Messaggi personalizzati..."
+
+#: ../libempathy-gtk/empathy-presence-chooser.c:324
+msgid "Click to remove this status as a favorite"
+msgstr ""
+
+#: ../libempathy-gtk/empathy-presence-chooser.c:333
+msgid "Click to make this status a favorite"
+msgstr ""
+
+#: ../libempathy-gtk/empathy-presence-chooser.c:367
+#, fuzzy
+#| msgid "Status"
+msgid "Set status"
+msgstr "Stato"
+
+#: ../libempathy-gtk/empathy-presence-chooser.c:776
+msgid "Set your presence and current status"
+msgstr ""
+
#. Custom messages
-#: ../libempathy-gtk/empathy-presence-chooser.c:685
+#: ../libempathy-gtk/empathy-presence-chooser.c:1011
msgid "Custom messages..."
msgstr "Messaggi personalizzati..."
-#: ../libempathy-gtk/empathy-presence-chooser.glade.h:1
-msgid "Custom message"
+#: ../libempathy-gtk/empathy-status-preset-dialog.c:360
+#, fuzzy
+#| msgid "Custom message"
+msgid "Enter Custom Message"
msgstr "Messaggio personalizzato"
-#: ../libempathy-gtk/empathy-presence-chooser.glade.h:2
-msgid "Message:"
-msgstr "Messaggio:"
+#: ../libempathy-gtk/empathy-status-preset-dialog.c:482
+#, fuzzy
+#| msgid "Custom message"
+msgid "Edit Custom Messages"
+msgstr "Messaggio personalizzato"
+
+#: ../libempathy-gtk/empathy-status-preset-dialog.ui.h:1
+msgid "Add _New Preset"
+msgstr ""
# (ndt) opzione
-#: ../libempathy-gtk/empathy-presence-chooser.glade.h:3
-msgid "Save message"
+#: ../libempathy-gtk/empathy-status-preset-dialog.ui.h:2
+#, fuzzy
+#| msgid "Save message"
+msgid "Saved Presets"
msgstr "Salvare messaggio"
-#: ../libempathy-gtk/empathy-presence-chooser.glade.h:4
-msgid "Status:"
-msgstr "Stato:"
-
-#: ../libempathy-gtk/empathy-spell-dialog.c:88
-msgid "Word"
-msgstr "Parola"
-
-#: ../libempathy-gtk/empathy-spell-dialog.c:265
-msgid "Suggestions for the word"
-msgstr "Suggerimenti per la parola"
-
-# (ndt) titolo finestra in cui ci sono le parole controllate
-#: ../libempathy-gtk/empathy-spell-dialog.glade.h:1
-msgid "Spell Checker"
-msgstr "Controllo ortografico"
+#: ../libempathy-gtk/empathy-status-preset-dialog.ui.h:3
+msgid "gtk-add"
+msgstr ""
-#: ../libempathy-gtk/empathy-spell-dialog.glade.h:2
-msgid "Suggestions for the word:"
-msgstr "Suggerimenti per la parola:"
+#: ../libempathy-gtk/empathy-status-preset-dialog.ui.h:4
+msgid "gtk-remove"
+msgstr ""
#: ../libempathy-gtk/empathy-theme-manager.c:60
msgid "Classic"
@@ -1043,53 +1050,53 @@ msgstr "Pulito"
msgid "Blue"
msgstr "Blu"
-#: ../libempathy-gtk/empathy-ui-utils.c:1385
+#: ../libempathy-gtk/empathy-ui-utils.c:1354
msgid "Unable to open URI"
msgstr "Impossibile aprire l'URI"
# (ndt) titolo
-#: ../libempathy-gtk/empathy-ui-utils.c:1530
+#: ../libempathy-gtk/empathy-ui-utils.c:1499
msgid "Select a file"
msgstr "Seleziona un file"
# (ndt) dovrebbero essere gli eventi sonori
-#: ../libempathy-gtk/empathy-ui-utils.c:1566
+#: ../libempathy-gtk/empathy-ui-utils.c:1535
msgid "Received an instant message"
msgstr "Messaggio istantaneo ricevuto"
-#: ../libempathy-gtk/empathy-ui-utils.c:1568
+#: ../libempathy-gtk/empathy-ui-utils.c:1537
msgid "Sent an instant message"
msgstr "Messaggio istantaneo inviato"
-#: ../libempathy-gtk/empathy-ui-utils.c:1570
+#: ../libempathy-gtk/empathy-ui-utils.c:1539
msgid "Incoming chat request"
msgstr "Richiesta di conversazione in arrivo"
-#: ../libempathy-gtk/empathy-ui-utils.c:1572
+#: ../libempathy-gtk/empathy-ui-utils.c:1541
msgid "Contact connected"
msgstr "Contatto connesso"
-#: ../libempathy-gtk/empathy-ui-utils.c:1574
+#: ../libempathy-gtk/empathy-ui-utils.c:1543
msgid "Contact disconnected"
msgstr "Contatto disconnesso"
-#: ../libempathy-gtk/empathy-ui-utils.c:1576
+#: ../libempathy-gtk/empathy-ui-utils.c:1545
msgid "Connected to server"
msgstr "Connesso al server"
-#: ../libempathy-gtk/empathy-ui-utils.c:1578
+#: ../libempathy-gtk/empathy-ui-utils.c:1547
msgid "Disconnected from server"
msgstr "Disconnesso dal server"
-#: ../libempathy-gtk/empathy-ui-utils.c:1580
+#: ../libempathy-gtk/empathy-ui-utils.c:1549
msgid "Incoming voice call"
msgstr "Chiamata vocale in arrivo"
-#: ../libempathy-gtk/empathy-ui-utils.c:1582
+#: ../libempathy-gtk/empathy-ui-utils.c:1551
msgid "Outgoing voice call"
msgstr "Chiamata vocale in uscita"
-#: ../libempathy-gtk/empathy-ui-utils.c:1584
+#: ../libempathy-gtk/empathy-ui-utils.c:1553
msgid "Voice call ended"
msgstr "Chiamata vocale terminata"
@@ -1280,7 +1287,7 @@ msgid "Megaphone"
msgstr "Megafono"
#: ../megaphone/data/GNOME_Megaphone_Applet.server.in.in.h:2
-#: ../megaphone/src/megaphone-applet.c:417
+#: ../megaphone/src/megaphone-applet.c:527
msgid "Talk!"
msgstr "Parla!"
@@ -1294,15 +1301,15 @@ msgid "_Information"
msgstr "I_nformazioni"
#: ../megaphone/data/GNOME_Megaphone_Applet.xml.h:3
-#: ../src/empathy-main-window.glade.h:15
+#: ../src/empathy-main-window.ui.h:16
msgid "_Preferences"
msgstr "Preferen_ze"
-#: ../megaphone/src/megaphone-applet.c:255
+#: ../megaphone/src/megaphone-applet.c:168
msgid "Please configure a contact."
msgstr "Configurare un contatto."
-#: ../megaphone/src/megaphone-applet.c:348
+#: ../megaphone/src/megaphone-applet.c:258
msgid "Select contact..."
msgstr "Seleziona contatto..."
@@ -1316,24 +1323,24 @@ msgid "Set your own presence"
msgstr "Imposta la propria presenza"
# (ndt) opzione
-#: ../src/empathy.c:426
+#: ../src/empathy.c:437
msgid "Don't connect on startup"
msgstr "Non connettere all'avvio"
# (ndt) opzione
-#: ../src/empathy.c:430
+#: ../src/empathy.c:441
msgid "Don't show the contact list on startup"
msgstr "Non mostrare l'elenco contatti all'avvio"
-#: ../src/empathy.c:434
+#: ../src/empathy.c:445
msgid "Show the accounts dialog"
msgstr "Mostrare il dialogo degli account"
-#: ../src/empathy.c:446
+#: ../src/empathy.c:457
msgid "- Empathy Instant Messenger"
msgstr "- Empathy messaggistica istantanea"
-#: ../src/empathy-about-dialog.c:84
+#: ../src/empathy-about-dialog.c:83
msgid ""
"Empathy is free software; you can redistribute it and/or modify it under the "
"terms of the GNU General Public License as published by the Free Software "
@@ -1345,7 +1352,7 @@ msgstr ""
"Free Software Foundation; versione 2 della licenza, o (a scelta) una "
"versione più recente."
-#: ../src/empathy-about-dialog.c:88
+#: ../src/empathy-about-dialog.c:87
msgid ""
"Empathy is distributed in the hope that it will be useful, but WITHOUT ANY "
"WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS "
@@ -1357,7 +1364,7 @@ msgstr ""
"APPLICABILITÀ PER UNO SCOPO PARTICOLARE. Per maggiori dettagli consultare la "
"GNU General Public License."
-#: ../src/empathy-about-dialog.c:92
+#: ../src/empathy-about-dialog.c:91
msgid ""
"You should have received a copy of the GNU General Public License along with "
"Empathy; if not, write to the Free Software Foundation, Inc., 51 Franklin "
@@ -1367,11 +1374,11 @@ msgstr ""
"questo programma. In caso contrario scrivere a: Free Software Foundation, "
"Inc. 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301, USA"
-#: ../src/empathy-about-dialog.c:120
+#: ../src/empathy-about-dialog.c:119
msgid "An Instant Messaging client for GNOME"
msgstr "Un client di messaggistica istantanea per GNOME"
-#: ../src/empathy-about-dialog.c:126
+#: ../src/empathy-about-dialog.c:125
msgid "translator-credits"
msgstr ""
"Milo Casagrande <milo@ubuntu.com>\n"
@@ -1382,18 +1389,17 @@ msgstr ""
msgid "Enabled"
msgstr "Abilitato"
-#: ../src/empathy-accounts-dialog.c:401
-#: ../src/empathy-accounts-dialog.glade.h:4
+#: ../src/empathy-accounts-dialog.c:401 ../src/empathy-accounts-dialog.ui.h:4
msgid "Accounts"
msgstr "Account"
#. To translator: %s is the protocol name
-#: ../src/empathy-accounts-dialog.c:833
+#: ../src/empathy-accounts-dialog.c:834
#, c-format
msgid "New %s account"
msgstr "Nuovo account %s"
-#: ../src/empathy-accounts-dialog.c:943
+#: ../src/empathy-accounts-dialog.c:944
#, c-format
msgid ""
"You are about to remove your %s account!\n"
@@ -1402,7 +1408,7 @@ msgstr ""
"L'account %s sta per essere rimosso.\n"
"Procedere veramente?"
-#: ../src/empathy-accounts-dialog.c:949
+#: ../src/empathy-accounts-dialog.c:950
msgid ""
"Any associated conversations and chat rooms will NOT be removed if you "
"decide to proceed.\n"
@@ -1415,34 +1421,34 @@ msgstr ""
"\n"
"Se l'account verrà inserito nuovamente, saranno ancora disponibili."
-#: ../src/empathy-accounts-dialog.glade.h:1
+#: ../src/empathy-accounts-dialog.ui.h:1
msgid "<b>New Account</b>"
msgstr "<b>Nuovo account</b>"
-#: ../src/empathy-accounts-dialog.glade.h:2
+#: ../src/empathy-accounts-dialog.ui.h:2
msgid "<b>No protocol installed</b>"
msgstr "<b>Nessun protocollo installato</b>"
-#: ../src/empathy-accounts-dialog.glade.h:3
+#: ../src/empathy-accounts-dialog.ui.h:3
msgid "<b>Settings</b>"
msgstr "<b>Impostazioni</b>"
-#: ../src/empathy-accounts-dialog.glade.h:5
+#: ../src/empathy-accounts-dialog.ui.h:5
msgid "Cr_eate"
msgstr "Cr_ea"
# (ndt) messa così per renderla impersonale...
# o meglio metterla più "personale"?
-#: ../src/empathy-accounts-dialog.glade.h:6
+#: ../src/empathy-accounts-dialog.ui.h:6
msgid "I already have an account I want to use"
msgstr "Un account da utilizzare è già disponibile"
-#: ../src/empathy-accounts-dialog.glade.h:7
+#: ../src/empathy-accounts-dialog.ui.h:7
msgid "Import Accounts..."
msgstr "Importa account..."
# FIXME: backend, ci vuole di meglio
-#: ../src/empathy-accounts-dialog.glade.h:8
+#: ../src/empathy-accounts-dialog.ui.h:8
msgid ""
"To add a new account, you first have to install a backend for each protocol "
"you want to use."
@@ -1450,213 +1456,134 @@ msgstr ""
"Per aggiungere un nuovo account è necessario installare un backend per ogni "
"protocollo da usare."
-#: ../src/empathy-accounts-dialog.glade.h:9
+#: ../src/empathy-accounts-dialog.ui.h:9
msgid "Type:"
msgstr "Tipo:"
-#: ../src/empathy-call-window.c:258
+#: ../src/empathy-accounts-dialog.ui.h:10
+#, fuzzy
+#| msgid "_Add Contact..."
+msgid "_Add..."
+msgstr "A_ggiungi contatto..."
+
+#: ../src/empathy-call-window.c:321
msgid "Contrast"
msgstr "Contrasto"
-#: ../src/empathy-call-window.c:258
+#: ../src/empathy-call-window.c:324
msgid "Brightness"
msgstr "Luminosità"
-#: ../src/empathy-call-window.c:258
+#: ../src/empathy-call-window.c:327
msgid "Gamma"
msgstr "Gamma"
-#: ../src/empathy-call-window.c:290
+#: ../src/empathy-call-window.c:431
msgid "Volume"
msgstr "Volume"
-#: ../src/empathy-call-window.c:366
+#: ../src/empathy-call-window.c:534
msgid "_Sidebar"
msgstr "_Barra laterale"
-#: ../src/empathy-call-window.c:384
+#: ../src/empathy-call-window.c:552
msgid "Dialpad"
msgstr "Tastierino"
-#: ../src/empathy-call-window.c:390
+#: ../src/empathy-call-window.c:558
msgid "Audio input"
msgstr "Ingresso audio"
-#: ../src/empathy-call-window.c:394
+#: ../src/empathy-call-window.c:562
msgid "Video input"
msgstr "Ingresso video"
-#: ../src/empathy-call-window.c:407
+#: ../src/empathy-call-window.c:575
msgid "Connecting..."
msgstr "Connessione..."
-#. Translators: number of minutes:seconds the caller has been connected
-#: ../src/empathy-call-window.c:573
+#: ../src/empathy-call-window.c:589
#, c-format
-msgid "Connected -- %d:%02dm"
+msgid "Call with %s"
+msgstr ""
+
+#: ../src/empathy-call-window.c:623
+#, fuzzy
+#| msgid "_Call"
+msgid "Call"
+msgstr "C_hiama"
+
+#. Translators: number of minutes:seconds the caller has been connected
+#: ../src/empathy-call-window.c:893
+#, fuzzy, c-format
+#| msgid "Connected -- %d:%02dm"
+msgid "Connected — %d:%02dm"
msgstr "Connesso -- %d.%02dm"
# (ndt) usato lo stesso anche in ekiga
# o meglio andare con un 'Termina'?
-#: ../src/empathy-call-window.glade.h:1
+#: ../src/empathy-call-window.ui.h:1
msgid "Hang up"
msgstr "Chiudi"
# (ndt) pulsante
-#: ../src/empathy-call-window.glade.h:2
+#: ../src/empathy-call-window.ui.h:2
msgid "Send Audio"
-msgstr "Invia video"
+msgstr "Invia audio"
-# (ndt) opzione
-#: ../src/empathy-call-window.glade.h:3
+# (ndt) pulsante
+#: ../src/empathy-call-window.ui.h:3
msgid "Send video"
-msgstr "Inviare video"
+msgstr "Invia video"
-#: ../src/empathy-call-window.glade.h:4
+#: ../src/empathy-call-window.ui.h:4
msgid "Video preview"
msgstr "Anteprima video"
-#: ../src/empathy-call-window.glade.h:6
+#: ../src/empathy-call-window.ui.h:5
+msgid "_Call"
+msgstr "C_hiama"
+
+#: ../src/empathy-call-window.ui.h:6
msgid "_View"
msgstr "_Visualizza"
-#: ../src/empathy-chat-window.c:313
+#: ../src/empathy-chat-window.c:308
#, c-format
msgid "Conversations (%d)"
msgstr "Conversazioni (%d)"
-#: ../src/empathy-chat-window.c:418
+#: ../src/empathy-chat-window.c:413
msgid "Topic:"
msgstr "Argomento:"
-#: ../src/empathy-chat-window.c:423
+#: ../src/empathy-chat-window.c:418
msgid "Typing a message."
msgstr "Scrittura messaggio."
-#: ../src/empathy-chat-window.c:892 ../src/empathy-event-manager.c:429
+#: ../src/empathy-chat-window.c:889 ../src/empathy-event-manager.c:429
#, c-format
msgid "New message from %s"
msgstr "Nuovo messaggio da %s"
-#: ../src/empathy-chat-window.glade.h:1
-msgid "C_lear"
-msgstr "Pu_lisci"
-
-#: ../src/empathy-chat-window.glade.h:2
-msgid "Chat"
-msgstr "Chat"
-
-#: ../src/empathy-chat-window.glade.h:3
-msgid "Insert _Smiley"
-msgstr "Inserisci _faccina"
-
-#: ../src/empathy-chat-window.glade.h:4
-msgid "Invitation _message:"
-msgstr "_Messaggio di invito:"
-
-#: ../src/empathy-chat-window.glade.h:5
-msgid "Invite"
-msgstr "Invita"
-
-#: ../src/empathy-chat-window.glade.h:6
-msgid "Move Tab _Left"
-msgstr "Sposta scheda a s_inistra"
-
-#: ../src/empathy-chat-window.glade.h:7
-msgid "Move Tab _Right"
-msgstr "Sposta scheda a _destra"
-
-#: ../src/empathy-chat-window.glade.h:8
-msgid "Select who would you like to invite:"
-msgstr "Selezionare chi invitare:"
-
-# (ndt) messaggio predefinito per l'invito
-#: ../src/empathy-chat-window.glade.h:9
-msgid "You have been invited to join a chat conference."
-msgstr "Sei stato invitato a entrare in una conferenza."
-
-#: ../src/empathy-chat-window.glade.h:10
-msgid "_Contact"
-msgstr "_Contatto"
-
-#: ../src/empathy-chat-window.glade.h:11 ../src/empathy-main-window.glade.h:10
-msgid "_Contents"
-msgstr "_Sommario"
-
-#: ../src/empathy-chat-window.glade.h:12
-msgid "_Conversation"
-msgstr "_Conversazione"
-
-#: ../src/empathy-chat-window.glade.h:13
-msgid "_Detach Tab"
-msgstr "Dist_acca scheda"
-
-#: ../src/empathy-chat-window.glade.h:15
-msgid "_Favorite Chatroom"
-msgstr "_Stanza preferita"
-
-#: ../src/empathy-chat-window.glade.h:16 ../src/empathy-main-window.glade.h:12
-msgid "_Help"
-msgstr "A_iuto"
-
-#: ../src/empathy-chat-window.glade.h:17
-msgid "_Next Tab"
-msgstr "Scheda _successiva"
-
-#: ../src/empathy-chat-window.glade.h:18
-msgid "_Previous Tab"
-msgstr "Scheda _precedente"
-
-#: ../src/empathy-chat-window.glade.h:19
-msgid "_Tabs"
-msgstr "Sc_hede"
-
-#: ../src/empathy-chatrooms-window.c:262
+#: ../src/empathy-chatrooms-window.c:258
msgid "Name"
msgstr "Nome"
-#: ../src/empathy-chatrooms-window.c:280
+#: ../src/empathy-chatrooms-window.c:276
msgid "Room"
msgstr "Canale"
# (ndt) dovrebbe essere il nome di una colonna
-#: ../src/empathy-chatrooms-window.c:289
+#: ../src/empathy-chatrooms-window.c:285
msgid "Auto-Connect"
msgstr "Connessione automatica"
# (ndt) titolo dialogo
-#: ../src/empathy-chatrooms-window.glade.h:2
-msgid "Edit Favorite Room"
-msgstr "Modifica canale preferito"
-
-# (ndt) opzione
-#: ../src/empathy-chatrooms-window.glade.h:3
-msgid "Join room on start_up"
-msgstr "Entrare ne_l canale all'avvio"
-
-# (ndt) suggerimento
-#: ../src/empathy-chatrooms-window.glade.h:4
-msgid "Join this chat room when Empathy starts and you are connected"
-msgstr "Entra in questo canale all'avvio di Empathy e se si è connessi"
-
-# (ndt) titolo dialogo
-#: ../src/empathy-chatrooms-window.glade.h:5
+#: ../src/empathy-chatrooms-window.ui.h:2
msgid "Manage Favorite Rooms"
msgstr "Gestione canali preferiti"
-#: ../src/empathy-chatrooms-window.glade.h:6
-msgid "N_ame:"
-msgstr "_Nome:"
-
-#: ../src/empathy-chatrooms-window.glade.h:7
-msgid "S_erver:"
-msgstr "S_erver:"
-
-#: ../src/empathy-chatrooms-window.glade.h:9
-#: ../src/empathy-new-chatroom-dialog.glade.h:9
-msgid "_Room:"
-msgstr "_Canale:"
-
#: ../src/empathy-event-manager.c:377
msgid "Incoming call"
msgstr "Chiamata in arrivo"
@@ -1674,59 +1601,60 @@ msgstr "Ri_fiuta"
msgid "_Answer"
msgstr "_Rispondi"
-#: ../src/empathy-event-manager.c:516
+#: ../src/empathy-event-manager.c:507
#, c-format
msgid "Incoming call from %s"
msgstr "Chiamata in arrivo da %s"
-#: ../src/empathy-event-manager.c:564
+#: ../src/empathy-event-manager.c:547
#, c-format
msgid "%s is offering you an invitation"
msgstr "%s sta offrendo un invito"
-#: ../src/empathy-event-manager.c:570
+#: ../src/empathy-event-manager.c:553
msgid "An external application will be started to handle it."
msgstr "Verrà avviata un'applicazione esterna per poterlo gestire."
-#: ../src/empathy-event-manager.c:575
+#: ../src/empathy-event-manager.c:558
msgid "You don't have the needed external application to handle it."
msgstr "Non è disponibile l'applicazione esterna per poterlo gestire."
-#: ../src/empathy-event-manager.c:698
+#: ../src/empathy-event-manager.c:685
msgid "Room invitation"
msgstr "Invito in una stanza"
-#: ../src/empathy-event-manager.c:701
+#: ../src/empathy-event-manager.c:688
#, c-format
msgid "%s is inviting you to join %s"
msgstr "%s sta inviando un invito per entrare in %s"
#. Decline button
-#: ../src/empathy-event-manager.c:709 ../src/empathy-ft-manager.c:1023
+#: ../src/empathy-event-manager.c:696 ../src/empathy-ft-manager.c:1037
msgid "_Decline"
msgstr "_Rifiuta"
# (ndt) pulsante
-#: ../src/empathy-event-manager.c:714
+#: ../src/empathy-event-manager.c:701
+#: ../src/empathy-new-chatroom-dialog.ui.h:6
msgid "_Join"
msgstr "_Entra"
-#: ../src/empathy-event-manager.c:744
+#: ../src/empathy-event-manager.c:740
#, c-format
msgid "%s invited you to join %s"
msgstr "%s ha inviato un invito per entrare in %s"
-#: ../src/empathy-event-manager.c:867
+#: ../src/empathy-event-manager.c:848
#, c-format
msgid "Incoming file transfer from %s"
msgstr "Trasferimento file in arrivo da %s"
-#: ../src/empathy-event-manager.c:961
+#: ../src/empathy-event-manager.c:923
#, c-format
msgid "Subscription requested by %s"
msgstr "Richiesta di approvazione di %s"
-#: ../src/empathy-event-manager.c:965
+#: ../src/empathy-event-manager.c:927
#, c-format
msgid ""
"\n"
@@ -1776,117 +1704,126 @@ msgid "Unknown reason"
msgstr "Motivo sconosciuto"
#. translators: first %s is filename, second %s is the contact name
-#: ../src/empathy-ft-manager.c:226
+#: ../src/empathy-ft-manager.c:228
#, c-format
msgid "Receiving \"%s\" from %s"
msgstr "Ricezione del file «%s» da %s"
#. translators: first %s is filename, second %s is the contact name
-#: ../src/empathy-ft-manager.c:229
+#: ../src/empathy-ft-manager.c:231
#, c-format
msgid "Sending \"%s\" to %s"
msgstr "Invio del file «%s» a %s"
-#: ../src/empathy-ft-manager.c:239
+#: ../src/empathy-ft-manager.c:242
msgctxt "file size"
msgid "Unknown"
msgstr "Sconosciuta"
#. translators: first %s is the transferred size, second %s is
#. * the total file size
-#: ../src/empathy-ft-manager.c:247
-#, c-format
-msgid "%s of %s"
+#: ../src/empathy-ft-manager.c:251
+#, fuzzy, c-format
+#| msgid "%s of %s"
+msgid "%s of %s at %s/s"
msgstr "%s di %s"
-#: ../src/empathy-ft-manager.c:254
-msgid "Waiting the other participant's response"
+#: ../src/empathy-ft-manager.c:259
+#, fuzzy
+#| msgid "Waiting the other participant's response"
+msgid "Waiting for the other participant's response"
msgstr "Attesa della risposta dell'altro utente"
-#: ../src/empathy-ft-manager.c:264
+#: ../src/empathy-ft-manager.c:269
#, c-format
msgid "\"%s\" received from %s"
msgstr "File «%s» ricevuto da %s"
-#: ../src/empathy-ft-manager.c:270
+#: ../src/empathy-ft-manager.c:275
#, c-format
msgid "\"%s\" sent to %s"
msgstr "File «%s» inviato a %s"
-#: ../src/empathy-ft-manager.c:273
+#: ../src/empathy-ft-manager.c:278
msgid "File transfer completed"
msgstr "Trasferimento file completato"
-#: ../src/empathy-ft-manager.c:282
+#: ../src/empathy-ft-manager.c:287
#, c-format
msgid "\"%s\" receiving from %s"
msgstr "Ricezione di «%s» da %s"
-#: ../src/empathy-ft-manager.c:288
+#: ../src/empathy-ft-manager.c:293
#, c-format
msgid "\"%s\" sending to %s"
msgstr "Invio di «%s» a %s"
-#: ../src/empathy-ft-manager.c:291
+#: ../src/empathy-ft-manager.c:296
#, c-format
msgid "File transfer canceled: %s"
msgstr "Trasferimento file annullato: %s"
-#: ../src/empathy-ft-manager.c:306
+#: ../src/empathy-ft-manager.c:310
+msgctxt "remaining time"
+msgid "Stalled"
+msgstr ""
+
+#: ../src/empathy-ft-manager.c:313
msgctxt "remaining time"
msgid "Unknown"
msgstr "Sconosciuto"
-#: ../src/empathy-ft-manager.c:366
+#: ../src/empathy-ft-manager.c:372
msgctxt "file transfer percent"
msgid "Unknown"
msgstr "Sconosciuta"
-#: ../src/empathy-ft-manager.c:702
+#: ../src/empathy-ft-manager.c:668
msgid "%"
msgstr "%"
-#: ../src/empathy-ft-manager.c:714
+#: ../src/empathy-ft-manager.c:680
msgid "File"
msgstr "File"
-#: ../src/empathy-ft-manager.c:736
+#: ../src/empathy-ft-manager.c:702
msgid "Remaining"
msgstr "Restante"
-#: ../src/empathy-ft-manager.c:887
+#: ../src/empathy-ft-manager.c:900
msgid "Cannot save file to this location"
msgstr "Impossibile salvare il file in questa posizione"
-#: ../src/empathy-ft-manager.c:933
+#: ../src/empathy-ft-manager.c:946
msgid "Save file as..."
msgstr "Salva come..."
-#: ../src/empathy-ft-manager.c:1003
+#: ../src/empathy-ft-manager.c:1016
msgid "unknown size"
msgstr "dimensione sconosciuta"
-#: ../src/empathy-ft-manager.c:1009
+#: ../src/empathy-ft-manager.c:1022
#, c-format
msgid "%s would like to send you a file"
msgstr "%s vorrebbe inviare un file"
-#: ../src/empathy-ft-manager.c:1014
+#. Translators: the first %s is the file name, the second %s is the file size
+#: ../src/empathy-ft-manager.c:1028
#, c-format
msgid "Do you want to accept the file \"%s\" (%s)?"
msgstr "Accettare il file «%s» (%s)?"
#. Accept button
-#: ../src/empathy-ft-manager.c:1032
+#: ../src/empathy-ft-manager.c:1046
msgid "_Accept"
msgstr "_Accetta"
-#: ../src/empathy-ft-manager.glade.h:1
+#: ../src/empathy-ft-manager.ui.h:1
msgid "File transfers"
msgstr "Trasferimenti file"
# (ndt) suggerimento
-#: ../src/empathy-ft-manager.glade.h:2
+#: ../src/empathy-ft-manager.ui.h:2
msgid "Remove completed, canceled and failed file transfers from the list"
msgstr ""
"Rimuove dall'elenco i trasferimenti di file completati, annullati e non "
@@ -1894,19 +1831,19 @@ msgstr ""
# (ndt) nome di una colonna
#. Translators: this is the header of a treeview column
-#: ../src/empathy-import-dialog.c:255
+#: ../src/empathy-import-dialog.c:259
msgid "Import"
msgstr "Importa"
-#: ../src/empathy-import-dialog.c:264
+#: ../src/empathy-import-dialog.c:268
msgid "Protocol"
msgstr "Protocollo"
-#: ../src/empathy-import-dialog.c:290
+#: ../src/empathy-import-dialog.c:294
msgid "Source"
msgstr "Sorgente"
-#: ../src/empathy-import-dialog.c:378
+#: ../src/empathy-import-dialog.c:388
msgid ""
"No accounts to import could be found. Empathy currently only supports "
"importing accounts from Pidgin."
@@ -1915,143 +1852,186 @@ msgstr ""
"importare gli account solamente da Pidgin."
# (ndt) titolo
-#: ../src/empathy-import-dialog.glade.h:1
+#: ../src/empathy-import-dialog.ui.h:1
msgid "Import Accounts"
msgstr "Importa account"
-#: ../src/empathy-main-window.c:391
+#: ../src/empathy-main-window.c:393
+msgid "_Edit account"
+msgstr "Modifica _dettagli account"
+
+#: ../src/empathy-main-window.c:496
msgid "No error specified"
msgstr "Nessun errore specificato"
-#: ../src/empathy-main-window.c:394
+#: ../src/empathy-main-window.c:499
msgid "Network error"
msgstr "Errore di rete"
-#: ../src/empathy-main-window.c:397
+#: ../src/empathy-main-window.c:502
msgid "Authentication failed"
msgstr "Autenticazione non riuscita"
-#: ../src/empathy-main-window.c:400
+#: ../src/empathy-main-window.c:505
msgid "Encryption error"
msgstr "Errore di cifratura"
-#: ../src/empathy-main-window.c:403
+#: ../src/empathy-main-window.c:508
msgid "Name in use"
msgstr "Nome in uso"
-#: ../src/empathy-main-window.c:406
+#: ../src/empathy-main-window.c:511
msgid "Certificate not provided"
msgstr "Certificato non fornito"
-#: ../src/empathy-main-window.c:409
+#: ../src/empathy-main-window.c:514
msgid "Certificate untrusted"
msgstr "Certificato non fidato"
-#: ../src/empathy-main-window.c:412
+#: ../src/empathy-main-window.c:517
msgid "Certificate expired"
msgstr "Certificato scaduto"
-#: ../src/empathy-main-window.c:415
+#: ../src/empathy-main-window.c:520
msgid "Certificate not activated"
msgstr "Certificato non attivato"
-#: ../src/empathy-main-window.c:418
+#: ../src/empathy-main-window.c:523
msgid "Certificate hostname mismatch"
msgstr "Corrispondenza errata nel nome host del certificato"
-#: ../src/empathy-main-window.c:421
+#: ../src/empathy-main-window.c:526
msgid "Certificate fingerprint mismatch"
msgstr "Corrispondenza errata nell'impronta del certificato"
-#: ../src/empathy-main-window.c:424
+#: ../src/empathy-main-window.c:529
msgid "Certificate self-signed"
msgstr "Certificato auto-firmato"
-#: ../src/empathy-main-window.c:427
+#: ../src/empathy-main-window.c:532
msgid "Certificate error"
msgstr "Errore nel certificato"
-#: ../src/empathy-main-window.c:430
+#: ../src/empathy-main-window.c:535
msgid "Unknown error"
msgstr "Errore sconosciuto"
-# (ndt) suggerimento
-#: ../src/empathy-main-window.c:594
-msgid "Show and edit accounts"
-msgstr "Mostra e modifica account"
-
-#: ../src/empathy-main-window.c:974
+#: ../src/empathy-main-window.c:877
msgid "Contact"
msgstr "Contatto"
-#: ../src/empathy-main-window.c:1176
-msgid "_Edit account"
-msgstr "Modifica _dettagli account"
+# (ndt) suggerimento
+#: ../src/empathy-main-window.c:1194
+msgid "Show and edit accounts"
+msgstr "Mostra e modifica account"
-#: ../src/empathy-main-window.glade.h:1
+#: ../src/empathy-main-window.ui.h:1
msgid "Contact List"
msgstr "Elenco contatti"
# (ndt) ?
-#: ../src/empathy-main-window.glade.h:2
+#: ../src/empathy-main-window.ui.h:2
msgid "Context"
msgstr "Contesto"
# (ndt) voce di menù
-#: ../src/empathy-main-window.glade.h:3
+#: ../src/empathy-main-window.ui.h:3
msgid "Join _Favorites"
msgstr "Entra nei canali pre_feriti"
-# (ndt) voce di menù per entrare in una chat
-#: ../src/empathy-main-window.glade.h:4
-msgid "Join _New..."
-msgstr "_Entra in..."
-
-#: ../src/empathy-main-window.glade.h:5
+#: ../src/empathy-main-window.ui.h:4
msgid "Manage Favorites"
msgstr "Gestisci preferiti"
-#: ../src/empathy-main-window.glade.h:6
+#: ../src/empathy-main-window.ui.h:5
+#, fuzzy
+#| msgid "File transfers"
+msgid "Show _File Transfers"
+msgstr "Trasferimenti file"
+
+#: ../src/empathy-main-window.ui.h:6
msgid "Show _Offline Contacts"
msgstr "M_ostra contatti fuori rete"
-#: ../src/empathy-main-window.glade.h:7
+#: ../src/empathy-main-window.ui.h:7
msgid "_Accounts"
msgstr "_Account"
-#: ../src/empathy-main-window.glade.h:8
+#: ../src/empathy-main-window.ui.h:8
msgid "_Add Contact..."
msgstr "A_ggiungi contatto..."
-#: ../src/empathy-main-window.glade.h:13 ../src/empathy-status-icon.glade.h:2
+#: ../src/empathy-main-window.ui.h:10
+msgid "_Contents"
+msgstr "_Sommario"
+
+#: ../src/empathy-main-window.ui.h:12
+msgid "_Help"
+msgstr "A_iuto"
+
+# (ndt) pulsante
+#: ../src/empathy-main-window.ui.h:13
+#, fuzzy
+#| msgid "_Join"
+msgid "_Join..."
+msgstr "_Entra"
+
+#: ../src/empathy-main-window.ui.h:14 ../src/empathy-status-icon.ui.h:2
msgid "_New Conversation..."
msgstr "_Nuova conversazione..."
-#: ../src/empathy-main-window.glade.h:14
+#: ../src/empathy-main-window.ui.h:15
msgid "_Personal Information"
msgstr "Informazioni _personali"
# (ndt) voce di menù per accedere alle opzioni relative ai canali IRC
-#: ../src/empathy-main-window.glade.h:16
+#: ../src/empathy-main-window.ui.h:17
msgid "_Room"
msgstr "C_anale"
-#: ../src/empathy-new-chatroom-dialog.c:291
-msgid "Chat Rooms"
+#: ../src/empathy-new-chatroom-dialog.c:313
+#, fuzzy
+#| msgid "Chat Rooms"
+msgid "Chat Room"
msgstr "Canali chat"
-#: ../src/empathy-new-chatroom-dialog.glade.h:2
-msgid "Browse:"
-msgstr "Esplora:"
+# (ndt) titolo scheda
+#: ../src/empathy-new-chatroom-dialog.c:328
+#, fuzzy
+#| msgid "Themes"
+msgid "Members"
+msgstr "Temi"
+
+#: ../src/empathy-new-chatroom-dialog.c:449
+#, c-format
+msgctxt ""
+"Room/Join's roomlist tooltip. Parametersare a channel name, yes/no, yes/no "
+"and a number."
+msgid ""
+"<b>%s</b>\n"
+"Invite required: %s\n"
+"Password required: %s\n"
+"Members: %s"
+msgstr ""
+
+#: ../src/empathy-new-chatroom-dialog.c:451
+#: ../src/empathy-new-chatroom-dialog.c:452
+msgid "Yes"
+msgstr ""
-#: ../src/empathy-new-chatroom-dialog.glade.h:3
+#: ../src/empathy-new-chatroom-dialog.c:451
+#: ../src/empathy-new-chatroom-dialog.c:452
+msgid "No"
+msgstr ""
+
+#: ../src/empathy-new-chatroom-dialog.ui.h:2
msgid ""
"Enter the room name to join here or click on one or more rooms in the list."
msgstr ""
"Inserire il nome del canale in cui entrare o fare clic su uno o più nomi di "
"canali nell'elenco."
-#: ../src/empathy-new-chatroom-dialog.glade.h:4
+#: ../src/empathy-new-chatroom-dialog.ui.h:3
msgid ""
"Enter the server which hosts the room, or leave it empty if the room is on "
"the current account's server"
@@ -2059,52 +2039,49 @@ msgstr ""
"Inserire il server che ospita il canale o lasciarlo vuoto se il canale si "
"trova nel server di questo account"
-# (ndt) pulsante
-#: ../src/empathy-new-chatroom-dialog.glade.h:5
-msgid "Join"
-msgstr "Entra"
-
-# (ndt) titolo dialogo
-#: ../src/empathy-new-chatroom-dialog.glade.h:6
-msgid "Join New"
-msgstr "Entra in un nuovo canale"
+#: ../src/empathy-new-chatroom-dialog.ui.h:4
+#, fuzzy
+#| msgid "Room"
+msgid "Join Room"
+msgstr "Canale"
-#: ../src/empathy-new-chatroom-dialog.glade.h:7
-msgid "Re_fresh"
-msgstr "A_ggiorna"
+#: ../src/empathy-new-chatroom-dialog.ui.h:5
+#, fuzzy
+#| msgid "_Room List locale:"
+msgid "Room List"
+msgstr "_Nazione elenco canali:"
-#: ../src/empathy-new-chatroom-dialog.glade.h:8
-msgid ""
-"This list represents all chat rooms hosted on the server you have entered."
-msgstr "L'elenco rappresenta tutti i canali presenti nel server specificato."
+#: ../src/empathy-new-chatroom-dialog.ui.h:7
+msgid "_Room:"
+msgstr "_Canale:"
# (ndt) quelli che seguono sono
# messaggi di eventi a cui associare un suono
-#: ../src/empathy-preferences.c:157
+#: ../src/empathy-preferences.c:156
msgid "Message received"
msgstr "Messaggio ricevuto"
-#: ../src/empathy-preferences.c:158
+#: ../src/empathy-preferences.c:157
msgid "Message sent"
msgstr "Messaggio inviato"
-#: ../src/empathy-preferences.c:159
+#: ../src/empathy-preferences.c:158
msgid "New conversation"
msgstr "Nuova conversazione"
-#: ../src/empathy-preferences.c:160
+#: ../src/empathy-preferences.c:159
msgid "Contact goes online"
msgstr "Il contatto è in rete"
-#: ../src/empathy-preferences.c:161
+#: ../src/empathy-preferences.c:160
msgid "Contact goes offline"
msgstr "Il contatto va fuori rete"
-#: ../src/empathy-preferences.c:162
+#: ../src/empathy-preferences.c:161
msgid "Account connected"
msgstr "Account connesso"
-#: ../src/empathy-preferences.c:163
+#: ../src/empathy-preferences.c:162
msgid "Account disconnected"
msgstr "Account disconnesso"
@@ -2112,27 +2089,27 @@ msgstr "Account disconnesso"
msgid "Language"
msgstr "Lingua"
-#: ../src/empathy-preferences.glade.h:1
+#: ../src/empathy-preferences.ui.h:1
msgid "<b>Appearance</b>"
msgstr "<b>Aspetto</b>"
-#: ../src/empathy-preferences.glade.h:2
+#: ../src/empathy-preferences.ui.h:2
msgid "<b>Behavior</b>"
msgstr "<b>Comportamento</b>"
-#: ../src/empathy-preferences.glade.h:3
+#: ../src/empathy-preferences.ui.h:3
msgid "<b>Contact List</b>"
msgstr "<b>Elenco contatti</b>"
-#: ../src/empathy-preferences.glade.h:4
+#: ../src/empathy-preferences.ui.h:4
msgid "<b>Enable spell checking for languages:</b>"
msgstr "<b>Abilitare controllo ortografico per le lingue:</b>"
-#: ../src/empathy-preferences.glade.h:5
+#: ../src/empathy-preferences.ui.h:5
msgid "<b>Play sound for events</b>"
msgstr "<b>Riprodurre un suono per gli eventi</b>"
-#: ../src/empathy-preferences.glade.h:6
+#: ../src/empathy-preferences.ui.h:6
msgid ""
"<small>The list of languages reflects only the languages for which you have "
"a dictionary installed.</small>"
@@ -2141,119 +2118,119 @@ msgstr ""
"dizionario installato.</small>"
# (ndt) opzione
-#: ../src/empathy-preferences.glade.h:7
+#: ../src/empathy-preferences.ui.h:7
msgid "Automatically _connect on startup "
msgstr "C_onnettere automaticamente all'avvio"
-#: ../src/empathy-preferences.glade.h:8
+#: ../src/empathy-preferences.ui.h:8
msgid "Avatars are user chosen images shown in the contact list"
msgstr ""
"Gli avatar sono delle immagini scelte dall'utente che vengono visualizzate "
"nell'elenco dei contatti"
-#: ../src/empathy-preferences.glade.h:9
+#: ../src/empathy-preferences.ui.h:9
msgid "Chat Th_eme:"
msgstr "T_ema delle conversazioni:"
-#: ../src/empathy-preferences.glade.h:10
+#: ../src/empathy-preferences.ui.h:10
msgid "Disable notifications when _away or busy"
msgstr "Disabilitare le notifiche quando _assenti od occupati"
-#: ../src/empathy-preferences.glade.h:11
+#: ../src/empathy-preferences.ui.h:11
msgid "Disable sounds when _away or busy"
msgstr "_Disabilitare i suoni quando assenti od occupati"
# (ndt) opzione
-#: ../src/empathy-preferences.glade.h:12
+#: ../src/empathy-preferences.ui.h:12
msgid "Enable notifications when the _chat is not focused"
msgstr "Abilitare le notifiche quando la conversazione non ha il _focus"
-#: ../src/empathy-preferences.glade.h:13
+#: ../src/empathy-preferences.ui.h:13
msgid "General"
msgstr "Generale"
-#: ../src/empathy-preferences.glade.h:14
+#: ../src/empathy-preferences.ui.h:14
msgid "Notifications"
msgstr "Notifiche"
-#: ../src/empathy-preferences.glade.h:15
+#: ../src/empathy-preferences.ui.h:15
msgid "Preferences"
msgstr "Preferenze"
# (ndt) opzione
-#: ../src/empathy-preferences.glade.h:16
+#: ../src/empathy-preferences.ui.h:16
msgid "Show _avatars"
msgstr "Mostr_are immagine personale"
# (ndt) opzione
-#: ../src/empathy-preferences.glade.h:17
+#: ../src/empathy-preferences.ui.h:17
msgid "Show _smileys as images"
msgstr "Mostrare le faccin_e come immagini"
# (ndt) opzione
-#: ../src/empathy-preferences.glade.h:18
+#: ../src/empathy-preferences.ui.h:18
msgid "Show co_mpact contact list"
msgstr "Mo_strare elenco contatti compatto"
# (ndt) opzione - pulsante radio
-#: ../src/empathy-preferences.glade.h:19
+#: ../src/empathy-preferences.ui.h:19
msgid "Sort by _name"
msgstr "Ordinare per _nome"
# (ndt) opzione - pulsante radio
-#: ../src/empathy-preferences.glade.h:20
+#: ../src/empathy-preferences.ui.h:20
msgid "Sort by s_tate"
msgstr "Ordinare per s_tato"
# (ndt) titolo scheda
-#: ../src/empathy-preferences.glade.h:21
+#: ../src/empathy-preferences.ui.h:21
msgid "Sounds"
msgstr "Suoni"
# (ndt) titolo scheda
-#: ../src/empathy-preferences.glade.h:22
+#: ../src/empathy-preferences.ui.h:22
msgid "Spell Checking"
msgstr "Controllo ortografico"
# (ndt) titolo scheda
-#: ../src/empathy-preferences.glade.h:23
+#: ../src/empathy-preferences.ui.h:23
msgid "Themes"
msgstr "Temi"
# (ndt) opzione
-#: ../src/empathy-preferences.glade.h:24
+#: ../src/empathy-preferences.ui.h:24
msgid "_Enable bubble notifications"
msgstr "Abilitar_e le notifiche visive"
# (ndt) opzione
-#: ../src/empathy-preferences.glade.h:25
+#: ../src/empathy-preferences.ui.h:25
msgid "_Enable sound notifications"
msgstr "Abilitar_e le notifiche sonore"
# (ndt) opzione
-#: ../src/empathy-preferences.glade.h:26
+#: ../src/empathy-preferences.ui.h:26
msgid "_Open new chats in separate windows"
msgstr "A_prire nuove conversazioni in finestre separate"
-#: ../src/empathy-status-icon.glade.h:1
+#: ../src/empathy-status-icon.ui.h:1
msgid "Status"
msgstr "Stato"
-#: ../src/empathy-status-icon.glade.h:3
+#: ../src/empathy-status-icon.ui.h:3
msgid "_Quit"
msgstr "_Esci"
# (ndt) voce di menù
-#: ../src/empathy-status-icon.glade.h:4
+#: ../src/empathy-status-icon.ui.h:4
msgid "_Show Contact List"
msgstr "Mo_stra elenco contatti"
-#: ../src/empathy-tube-dispatch.c:364
+#: ../src/empathy-tube-dispatch.c:375
#, c-format
msgid "Unable to start application for service %s: %s"
msgstr "Impossibile avviare l'applicazione per il servizio %s: %s"
-#: ../src/empathy-tube-dispatch.c:435
+#: ../src/empathy-tube-dispatch.c:446
#, c-format
msgid ""
"An invitation was offered for service %s, but you don't have the needed "
@@ -2261,3 +2238,139 @@ msgid ""
msgstr ""
"È stato offerto un invito per il servizio %s, ma non è disponibile "
"l'applicazione per poterlo gestire"
+
+# (ndt) suggerimento
+#~ msgid "Forget password and clear the entry."
+#~ msgstr "Dimentica la password e azzera la voce."
+
+#~ msgid "Create a new IRC network"
+#~ msgstr "Crea una nuova rete IRC"
+
+#~ msgid "Edit the selected IRC network"
+#~ msgstr "Modifica la rete IRC selezionata"
+
+# (ndt) suggerimento
+#~ msgid "Remove the selected IRC network"
+#~ msgstr "Rimuove la rete IRC selezionata"
+
+#~ msgid "_Check Word Spelling..."
+#~ msgstr "_Controllo ortografico..."
+
+#~ msgid "Group Chat"
+#~ msgstr "Chat di gruppo"
+
+#~ msgid "Contact Information"
+#~ msgstr "Informazioni contatto"
+
+# (ndt) titolo dialogo
+#~ msgid "Contact information"
+#~ msgstr "Informazioni contatto"
+
+#~ msgid "Message:"
+#~ msgstr "Messaggio:"
+
+#~ msgid "Status:"
+#~ msgstr "Stato:"
+
+#~ msgid "Word"
+#~ msgstr "Parola"
+
+#~ msgid "Suggestions for the word"
+#~ msgstr "Suggerimenti per la parola"
+
+# (ndt) titolo finestra in cui ci sono le parole controllate
+#~ msgid "Spell Checker"
+#~ msgstr "Controllo ortografico"
+
+#~ msgid "Suggestions for the word:"
+#~ msgstr "Suggerimenti per la parola:"
+
+#~ msgid "C_lear"
+#~ msgstr "Pu_lisci"
+
+#~ msgid "Chat"
+#~ msgstr "Chat"
+
+#~ msgid "Insert _Smiley"
+#~ msgstr "Inserisci _faccina"
+
+#~ msgid "Invitation _message:"
+#~ msgstr "_Messaggio di invito:"
+
+#~ msgid "Invite"
+#~ msgstr "Invita"
+
+#~ msgid "Move Tab _Left"
+#~ msgstr "Sposta scheda a s_inistra"
+
+#~ msgid "Move Tab _Right"
+#~ msgstr "Sposta scheda a _destra"
+
+#~ msgid "Select who would you like to invite:"
+#~ msgstr "Selezionare chi invitare:"
+
+# (ndt) messaggio predefinito per l'invito
+#~ msgid "You have been invited to join a chat conference."
+#~ msgstr "Sei stato invitato a entrare in una conferenza."
+
+#~ msgid "_Contact"
+#~ msgstr "_Contatto"
+
+#~ msgid "_Conversation"
+#~ msgstr "_Conversazione"
+
+#~ msgid "_Detach Tab"
+#~ msgstr "Dist_acca scheda"
+
+#~ msgid "_Favorite Chatroom"
+#~ msgstr "_Stanza preferita"
+
+#~ msgid "_Next Tab"
+#~ msgstr "Scheda _successiva"
+
+#~ msgid "_Previous Tab"
+#~ msgstr "Scheda _precedente"
+
+#~ msgid "_Tabs"
+#~ msgstr "Sc_hede"
+
+# (ndt) titolo dialogo
+#~ msgid "Edit Favorite Room"
+#~ msgstr "Modifica canale preferito"
+
+# (ndt) opzione
+#~ msgid "Join room on start_up"
+#~ msgstr "Entrare ne_l canale all'avvio"
+
+# (ndt) suggerimento
+#~ msgid "Join this chat room when Empathy starts and you are connected"
+#~ msgstr "Entra in questo canale all'avvio di Empathy e se si è connessi"
+
+#~ msgid "N_ame:"
+#~ msgstr "_Nome:"
+
+#~ msgid "S_erver:"
+#~ msgstr "S_erver:"
+
+# (ndt) voce di menù per entrare in una chat
+#~ msgid "Join _New..."
+#~ msgstr "_Entra in..."
+
+#~ msgid "Browse:"
+#~ msgstr "Esplora:"
+
+# (ndt) pulsante
+#~ msgid "Join"
+#~ msgstr "Entra"
+
+# (ndt) titolo dialogo
+#~ msgid "Join New"
+#~ msgstr "Entra in un nuovo canale"
+
+#~ msgid "Re_fresh"
+#~ msgstr "A_ggiorna"
+
+#~ msgid ""
+#~ "This list represents all chat rooms hosted on the server you have entered."
+#~ msgstr ""
+#~ "L'elenco rappresenta tutti i canali presenti nel server specificato."
diff --git a/po/pa.po b/po/pa.po
index e88b80815..1559df490 100644
--- a/po/pa.po
+++ b/po/pa.po
@@ -3,21 +3,23 @@
# This file is distributed under the same license as the PACKAGE package.
#
# Amanpreet Singh Alam <aalam@users.sf.net>, 2009.
+# A S Alam <aalam@users.sf.net>, 2009.
msgid ""
msgstr ""
"Project-Id-Version: empathy.HEAD\n"
-"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=empathy&component=general\n"
-"POT-Creation-Date: 2009-02-16 21:24+0000\n"
-"PO-Revision-Date: 2009-02-27 07:05+0530\n"
-"Last-Translator: Amanpreet Singh Alam <aalam@users.sf.net>\n"
-"Language-Team: Punjabi <punjabi-users@lists.sf.net>\n"
+"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug."
+"cgi?product=empathy&component=general\n"
+"POT-Creation-Date: 2009-05-27 16:54+0000\n"
+"PO-Revision-Date: 2009-05-28 07:22+0530\n"
+"Last-Translator: A S Alam <aalam@users.sf.net>\n"
+"Language-Team: Punjabi/Panjabi <punjabi-users@lists.sf.net>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Poedit-Language: Punjabi\n"
"X-Poedit-Country: India\n"
"X-Poedit-SourceCharset: utf-8\n"
-"X-Generator: KBabel 1.11.4\n"
+"X-Generator: Lokalize 0.3\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: ../data/empathy.desktop.in.in.h:1
@@ -259,7 +261,6 @@ msgid "Whether or not to play a sound when logging off a network."
msgstr ""
#: ../data/empathy.schemas.in.h:55
-#| msgid "Disable notifications when _away or busy"
msgid "Whether or not to play sound notifications when away or busy."
msgstr "ਜਦੋਂ ਦੂਰ ਜਾਂ ਰੁੱਝੇ ਹੋਵੇ ਤਾਂ ਕੀ ਸਾਊਂਡ ਸੂਚਨਾਵਾਂ ਚਲਾਉਣੀਆਂ ਹਨ ਜਾਂ ਨਹੀਂ।"
@@ -308,655 +309,782 @@ msgid ""
"sort the contact list by state."
msgstr ""
-#: ../libempathy/empathy-tp-contact-list.c:731 ../src/empathy.c:269
+#: ../libempathy/empathy-tp-contact-list.c:727 ../src/empathy.c:282
msgid "People nearby"
msgstr "ਨੇੜਲੇ ਲੋਕ"
-#: ../libempathy/empathy-utils.c:252
+#: ../libempathy/empathy-utils.c:251
msgid "Available"
msgstr "ਉਪਲੱਬਧ"
-#: ../libempathy/empathy-utils.c:254
+#: ../libempathy/empathy-utils.c:253
msgid "Busy"
msgstr "ਰੁਝੇ"
-#: ../libempathy/empathy-utils.c:257
+#: ../libempathy/empathy-utils.c:256
msgid "Away"
msgstr "ਦੂਰ"
-#: ../libempathy/empathy-utils.c:259
+#: ../libempathy/empathy-utils.c:258
msgid "Hidden"
msgstr "ਓਹਲੇ"
-#: ../libempathy/empathy-utils.c:262
+#: ../libempathy/empathy-utils.c:261
msgid "Offline"
msgstr "ਆਫਲਾਈਨ"
-#: ../libempathy-gtk/empathy-account-chooser.c:326
+#: ../libempathy-gtk/empathy-account-chooser.c:419
msgid "All"
msgstr "ਸਭ"
#: ../libempathy-gtk/empathy-account-widget.c:302
-#: ../libempathy-gtk/empathy-account-widget.c:347
+#: ../libempathy-gtk/empathy-account-widget.c:349
#, c-format
msgid "%s:"
msgstr "%s:"
-#: ../libempathy-gtk/empathy-account-widget-aim.glade.h:1
-#: ../libempathy-gtk/empathy-account-widget-generic.glade.h:1
-#: ../libempathy-gtk/empathy-account-widget-groupwise.glade.h:1
-#: ../libempathy-gtk/empathy-account-widget-icq.glade.h:1
-#: ../libempathy-gtk/empathy-account-widget-jabber.glade.h:1
-#: ../libempathy-gtk/empathy-account-widget-msn.glade.h:1
-#: ../libempathy-gtk/empathy-account-widget-salut.glade.h:1
-#: ../libempathy-gtk/empathy-account-widget-sip.glade.h:1
-#: ../libempathy-gtk/empathy-account-widget-yahoo.glade.h:1
+#: ../libempathy-gtk/empathy-account-widget-aim.ui.h:1
+#: ../libempathy-gtk/empathy-account-widget-generic.ui.h:1
+#: ../libempathy-gtk/empathy-account-widget-groupwise.ui.h:1
+#: ../libempathy-gtk/empathy-account-widget-icq.ui.h:1
+#: ../libempathy-gtk/empathy-account-widget-jabber.ui.h:1
+#: ../libempathy-gtk/empathy-account-widget-msn.ui.h:1
+#: ../libempathy-gtk/empathy-account-widget-salut.ui.h:1
+#: ../libempathy-gtk/empathy-account-widget-sip.ui.h:1
+#: ../libempathy-gtk/empathy-account-widget-yahoo.ui.h:1
msgid "<b>Advanced</b>"
msgstr "<b>ਤਕਨੀਕੀ</b>"
-#: ../libempathy-gtk/empathy-account-widget-aim.glade.h:2
-#: ../libempathy-gtk/empathy-account-widget-groupwise.glade.h:2
-#: ../libempathy-gtk/empathy-account-widget-icq.glade.h:2
-#: ../libempathy-gtk/empathy-account-widget-jabber.glade.h:3
-#: ../libempathy-gtk/empathy-account-widget-msn.glade.h:2
-#: ../libempathy-gtk/empathy-account-widget-sip.glade.h:4
-#: ../libempathy-gtk/empathy-account-widget-yahoo.glade.h:2
-msgid "Forget password and clear the entry."
-msgstr "ਪਾਸਵਰਡ ਭੁੱਲੋ ਅਤੇ ਐਂਟਰੀ ਸਾਫ਼ ਕਰੋ।"
-
-#: ../libempathy-gtk/empathy-account-widget-aim.glade.h:3
-#: ../libempathy-gtk/empathy-account-widget-groupwise.glade.h:4
-#: ../libempathy-gtk/empathy-account-widget-icq.glade.h:4
-#: ../libempathy-gtk/empathy-account-widget-jabber.glade.h:5
-#: ../libempathy-gtk/empathy-account-widget-msn.glade.h:4
-#: ../libempathy-gtk/empathy-account-widget-sip.glade.h:5
-#: ../libempathy-gtk/empathy-account-widget-yahoo.glade.h:3
+#: ../libempathy-gtk/empathy-account-widget-aim.ui.h:2
+#: ../libempathy-gtk/empathy-account-widget-groupwise.ui.h:3
+#: ../libempathy-gtk/empathy-account-widget-icq.ui.h:3
+#: ../libempathy-gtk/empathy-account-widget-jabber.ui.h:4
+#: ../libempathy-gtk/empathy-account-widget-msn.ui.h:3
+#: ../libempathy-gtk/empathy-account-widget-sip.ui.h:4
+#: ../libempathy-gtk/empathy-account-widget-yahoo.ui.h:2
msgid "Pass_word:"
msgstr "ਪਾਸਵਰਡ(_w):"
-#: ../libempathy-gtk/empathy-account-widget-aim.glade.h:4
+#: ../libempathy-gtk/empathy-account-widget-aim.ui.h:3
msgid "Screen _Name:"
msgstr "ਸਕਰੀਨ ਨਾਂ(_N):"
-#: ../libempathy-gtk/empathy-account-widget-aim.glade.h:5
-#: ../libempathy-gtk/empathy-account-widget-groupwise.glade.h:5
-#: ../libempathy-gtk/empathy-account-widget-icq.glade.h:6
-#: ../libempathy-gtk/empathy-account-widget-jabber.glade.h:11
-#: ../libempathy-gtk/empathy-account-widget-msn.glade.h:5
-#: ../libempathy-gtk/empathy-account-widget-yahoo.glade.h:8
+#: ../libempathy-gtk/empathy-account-widget-aim.ui.h:4
+#: ../libempathy-gtk/empathy-account-widget-groupwise.ui.h:4
+#: ../libempathy-gtk/empathy-account-widget-icq.ui.h:5
+#: ../libempathy-gtk/empathy-account-widget-jabber.ui.h:10
+#: ../libempathy-gtk/empathy-account-widget-msn.ui.h:4
+#: ../libempathy-gtk/empathy-account-widget-yahoo.ui.h:7
msgid "_Port:"
msgstr "ਪੋਰਟ(_P):"
-#: ../libempathy-gtk/empathy-account-widget-aim.glade.h:6
-#: ../libempathy-gtk/empathy-account-widget-groupwise.glade.h:6
-#: ../libempathy-gtk/empathy-account-widget-icq.glade.h:7
-#: ../libempathy-gtk/empathy-account-widget-jabber.glade.h:12
-#: ../libempathy-gtk/empathy-account-widget-msn.glade.h:6
-#: ../libempathy-gtk/empathy-account-widget-yahoo.glade.h:10
-#: ../src/empathy-new-chatroom-dialog.glade.h:10
+#: ../libempathy-gtk/empathy-account-widget-aim.ui.h:5
+#: ../libempathy-gtk/empathy-account-widget-groupwise.ui.h:5
+#: ../libempathy-gtk/empathy-account-widget-icq.ui.h:6
+#: ../libempathy-gtk/empathy-account-widget-jabber.ui.h:11
+#: ../libempathy-gtk/empathy-account-widget-msn.ui.h:5
+#: ../libempathy-gtk/empathy-account-widget-yahoo.ui.h:9
+#: ../src/empathy-new-chatroom-dialog.ui.h:9
msgid "_Server:"
msgstr "ਸਰਵਰ(_S):"
-#: ../libempathy-gtk/empathy-account-widget-groupwise.glade.h:3
-#: ../libempathy-gtk/empathy-account-widget-jabber.glade.h:4
-#: ../libempathy-gtk/empathy-account-widget-msn.glade.h:3
+#: ../libempathy-gtk/empathy-account-widget-groupwise.ui.h:2
+#: ../libempathy-gtk/empathy-account-widget-jabber.ui.h:3
+#: ../libempathy-gtk/empathy-account-widget-msn.ui.h:2
msgid "Login I_D:"
msgstr "ਲਾਗਇਨ I_D:"
-#: ../libempathy-gtk/empathy-account-widget-icq.glade.h:3
+#: ../libempathy-gtk/empathy-account-widget-icq.ui.h:2
msgid "ICQ _UIN:"
msgstr "ICQ _UIN:"
-#: ../libempathy-gtk/empathy-account-widget-icq.glade.h:5
-#: ../libempathy-gtk/empathy-account-widget-yahoo.glade.h:6
+#: ../libempathy-gtk/empathy-account-widget-icq.ui.h:4
+#: ../libempathy-gtk/empathy-account-widget-yahoo.ui.h:5
msgid "_Charset:"
msgstr "ਅੱਖਰ-ਸੈੱਟ(_C):"
-#: ../libempathy-gtk/empathy-account-widget-irc.c:245
+#: ../libempathy-gtk/empathy-account-widget-irc.c:241
msgid "New Network"
msgstr "ਨਵਾਂ ਨੈੱਟਵਰਕ"
-#: ../libempathy-gtk/empathy-account-widget-irc.glade.h:1
+#: ../libempathy-gtk/empathy-account-widget-irc.ui.h:1
msgid "<b>Network</b>"
msgstr "<b>ਨੈੱਟਵਰਕ</b>"
-#: ../libempathy-gtk/empathy-account-widget-irc.glade.h:2
+#: ../libempathy-gtk/empathy-account-widget-irc.ui.h:2
msgid "<b>Servers</b>"
msgstr "<b>ਸਰਵਰ</b>"
-#: ../libempathy-gtk/empathy-account-widget-irc.glade.h:3
+#: ../libempathy-gtk/empathy-account-widget-irc.ui.h:3
msgid "Charset:"
msgstr "ਅੱਖਰਸੈੱਟ:"
-#: ../libempathy-gtk/empathy-account-widget-irc.glade.h:4
-msgid "Create a new IRC network"
-msgstr "ਇੱਕ ਨਵਾਂ IRC ਨੈੱਟਵਰਕ ਬਣਾਓ"
-
-#: ../libempathy-gtk/empathy-account-widget-irc.glade.h:5
-msgid "Edit the selected IRC network"
-msgstr "ਚੁਣੇ IRC ਨੈੱਟਵਰਕ ਸੋਧੋ"
-
-#: ../libempathy-gtk/empathy-account-widget-irc.glade.h:6
+#: ../libempathy-gtk/empathy-account-widget-irc.ui.h:4
msgid "Network"
msgstr "ਨੈੱਟਵਰਕ"
-#: ../libempathy-gtk/empathy-account-widget-irc.glade.h:7
+#: ../libempathy-gtk/empathy-account-widget-irc.ui.h:5
msgid "Network:"
msgstr "ਨੈੱਟਵਰਕ:"
-#: ../libempathy-gtk/empathy-account-widget-irc.glade.h:8
+#: ../libempathy-gtk/empathy-account-widget-irc.ui.h:6
msgid "Nickname:"
msgstr "ਨਾਂ:"
-#: ../libempathy-gtk/empathy-account-widget-irc.glade.h:9
+#: ../libempathy-gtk/empathy-account-widget-irc.ui.h:7
msgid "Password:"
msgstr "ਪਾਸਵਰਡ:"
-#: ../libempathy-gtk/empathy-account-widget-irc.glade.h:10
+#: ../libempathy-gtk/empathy-account-widget-irc.ui.h:8
msgid "Quit message:"
msgstr "ਬੰਦ ਕਰਨ ਸੁਨੇਹਾ:"
-#: ../libempathy-gtk/empathy-account-widget-irc.glade.h:11
+#: ../libempathy-gtk/empathy-account-widget-irc.ui.h:9
msgid "Real name:"
msgstr "ਅਸਲੀ ਨਾਂ:"
-#: ../libempathy-gtk/empathy-account-widget-irc.glade.h:12
-msgid "Remove the selected IRC network"
-msgstr "ਚੁਣਿਆ IRC ਨੈਟਵਰਕ ਹਟਾਓ"
-
-#: ../libempathy-gtk/empathy-account-widget-jabber.glade.h:2
+#: ../libempathy-gtk/empathy-account-widget-jabber.ui.h:2
msgid "<b>Override server settings</b>"
msgstr "<b>ਸਰਵਰ ਸਥਾਪਨ ਅਣਡਿੱਠਾ</b>"
-#: ../libempathy-gtk/empathy-account-widget-jabber.glade.h:6
+#: ../libempathy-gtk/empathy-account-widget-jabber.ui.h:5
msgid "Pri_ority:"
msgstr "ਤਰਜੀਹ(_o):"
-#: ../libempathy-gtk/empathy-account-widget-jabber.glade.h:7
+#: ../libempathy-gtk/empathy-account-widget-jabber.ui.h:6
msgid "Reso_urce:"
msgstr "ਸਰੋਤ(_u):"
-#: ../libempathy-gtk/empathy-account-widget-jabber.glade.h:8
+#: ../libempathy-gtk/empathy-account-widget-jabber.ui.h:7
msgid "Use old SS_L"
msgstr "ਪੁਰਾਣੇ SS_L ਵਰਤੋਂ"
-#: ../libempathy-gtk/empathy-account-widget-jabber.glade.h:9
+#: ../libempathy-gtk/empathy-account-widget-jabber.ui.h:8
msgid "_Encryption required (TLS/SSL)"
msgstr "ਇੰਕ੍ਰਿਪਸ਼ਨ ਚਾਹੀਦੀ ਹੈ (TLS/SSL)(_E)"
-#: ../libempathy-gtk/empathy-account-widget-jabber.glade.h:10
+#: ../libempathy-gtk/empathy-account-widget-jabber.ui.h:9
msgid "_Ignore SSL certificate errors"
msgstr "SSL ਸਰਟੀਫਿਕੇਟ ਗਲਤੀਆਂ ਅਣਡਿੱਠੀਆਂ(_I)"
-#: ../libempathy-gtk/empathy-account-widget-salut.glade.h:2
+#: ../libempathy-gtk/empathy-account-widget-salut.ui.h:2
msgid "_Email:"
msgstr "ਈਮੇਲ(_E):"
-#: ../libempathy-gtk/empathy-account-widget-salut.glade.h:3
+#: ../libempathy-gtk/empathy-account-widget-salut.ui.h:3
msgid "_First Name:"
msgstr "ਪਹਿਲਾਂ ਨਾਂ(_F): "
-#: ../libempathy-gtk/empathy-account-widget-salut.glade.h:4
+#: ../libempathy-gtk/empathy-account-widget-salut.ui.h:4
msgid "_Jabber ID:"
msgstr "ਜੱਬਰ ID(_J):"
-#: ../libempathy-gtk/empathy-account-widget-salut.glade.h:5
+#: ../libempathy-gtk/empathy-account-widget-salut.ui.h:5
msgid "_Last Name:"
msgstr "ਆਖਰੀ ਨਾਂ(_L):"
-#: ../libempathy-gtk/empathy-account-widget-salut.glade.h:6
-#: ../src/empathy-chatrooms-window.glade.h:8
+#: ../libempathy-gtk/empathy-account-widget-salut.ui.h:6
msgid "_Nickname:"
msgstr "ਨਾਂ(_N):"
-#: ../libempathy-gtk/empathy-account-widget-salut.glade.h:7
+#: ../libempathy-gtk/empathy-account-widget-salut.ui.h:7
msgid "_Published Name:"
msgstr "ਪਰਕਾਸ਼ਿਤ ਕੀਤਾ ਨਾਂ(_P):"
#. look up the DNS SRV record at the service's domain for the host name of a STUN server.
-#: ../libempathy-gtk/empathy-account-widget-sip.glade.h:3
+#: ../libempathy-gtk/empathy-account-widget-sip.ui.h:3
msgid "Discover STUN"
msgstr "STUN ਖੋਜ"
-#: ../libempathy-gtk/empathy-account-widget-sip.glade.h:6
+#: ../libempathy-gtk/empathy-account-widget-sip.ui.h:5
msgid "STUN Server:"
msgstr "STUN ਸਰਵਰ:"
-#: ../libempathy-gtk/empathy-account-widget-sip.glade.h:7
+#: ../libempathy-gtk/empathy-account-widget-sip.ui.h:6
msgid "STUN port:"
msgstr "STUN ਪੋਰਟ:"
-#: ../libempathy-gtk/empathy-account-widget-sip.glade.h:8
+#: ../libempathy-gtk/empathy-account-widget-sip.ui.h:7
msgid "_Username:"
msgstr "ਯੂਜ਼ਰ ਨਾਂ(_U):"
-#: ../libempathy-gtk/empathy-account-widget-yahoo.glade.h:4
+#: ../libempathy-gtk/empathy-account-widget-yahoo.ui.h:3
msgid "Use _Yahoo Japan"
msgstr "ਯਾਹੂ ਜਾਪਾਨ ਵਰਤੋਂ(_Y)"
-#: ../libempathy-gtk/empathy-account-widget-yahoo.glade.h:5
+#: ../libempathy-gtk/empathy-account-widget-yahoo.ui.h:4
msgid "Yahoo I_D:"
msgstr "ਯਾਹੂ I_D:"
-#: ../libempathy-gtk/empathy-account-widget-yahoo.glade.h:7
+#: ../libempathy-gtk/empathy-account-widget-yahoo.ui.h:6
msgid "_Ignore conference and chatroom invitations"
msgstr "ਕਨਫਰੰਸ ਅਤੇ ਗੱਲਬਾਤ-ਰੂਮ ਸੱਦੇ ਅਣਡਿੱਠੇ(_I)"
-#: ../libempathy-gtk/empathy-account-widget-yahoo.glade.h:9
+#: ../libempathy-gtk/empathy-account-widget-yahoo.ui.h:8
msgid "_Room List locale:"
msgstr "ਰੂਮ ਸੂਚੀ ਭਾਸ਼ਾ(_R):"
-#: ../libempathy-gtk/empathy-avatar-chooser.c:462
-#: ../libempathy-gtk/empathy-avatar-chooser.c:537
+#: ../libempathy-gtk/empathy-avatar-chooser.c:449
+#: ../libempathy-gtk/empathy-avatar-chooser.c:525
msgid "Couldn't convert image"
msgstr "ਚਿੱਤਰ ਨਾ ਬਦਲੋ"
-#: ../libempathy-gtk/empathy-avatar-chooser.c:463
+#: ../libempathy-gtk/empathy-avatar-chooser.c:450
msgid "None of the accepted image formats is supported on your system"
msgstr "ਕੋਈ ਵੀ ਮਨਜ਼ੂਰਸ਼ੁਦਾ ਚਿੱਤਰ ਫਾਰਮੈਟ ਤੁਹਾਡੇ ਸਿਸਟਮ ਵਲੋਂ ਸਹਾਇਕ ਨਹੀਂ ਹੈ।"
-#: ../libempathy-gtk/empathy-avatar-chooser.c:956
+#: ../libempathy-gtk/empathy-avatar-chooser.c:933
msgid "Select Your Avatar Image"
msgstr "ਆਪਣਾ ਅਵਤਾਰ ਲੇਖ ਚੁਣੋ"
-#: ../libempathy-gtk/empathy-avatar-chooser.c:959
+#: ../libempathy-gtk/empathy-avatar-chooser.c:936
msgid "No Image"
msgstr "ਕੋਈ ਚਿੱਤਰ ਨਹੀਂ"
-#: ../libempathy-gtk/empathy-avatar-chooser.c:1021
+#: ../libempathy-gtk/empathy-avatar-chooser.c:998
msgid "Images"
msgstr "ਚਿੱਤਰ"
-#: ../libempathy-gtk/empathy-avatar-chooser.c:1025
+#: ../libempathy-gtk/empathy-avatar-chooser.c:1002
msgid "All Files"
msgstr "ਸਭ ਫਾਇਲਾਂ"
-#: ../libempathy-gtk/empathy-avatar-image.c:294
+#: ../libempathy-gtk/empathy-avatar-image.c:324
msgid "Click to enlarge"
msgstr "ਵੱਡਾ ਕਰਨ ਲਈ ਕਲਿੱਕ ਕਰੋ"
-#: ../libempathy-gtk/empathy-chat.c:507
+#: ../libempathy-gtk/empathy-chat.c:178
+msgid "Failed to reconnect this chat"
+msgstr "ਇਸ ਗੱਲ ਨਾਲ ਫੇਰ-ਕੁਨੈਕਟ ਹੋਣ ਲਈ ਫੇਲ੍ਹ"
+
+#: ../libempathy-gtk/empathy-chat.c:396
+msgid "Unsupported command"
+msgstr "ਗ਼ੈਰ-ਸਹਾਇਕ ਕਮਾਂਡ"
+
+#: ../libempathy-gtk/empathy-chat.c:531
msgid "offline"
msgstr "ਆਫਲਾਈਨ"
-#: ../libempathy-gtk/empathy-chat.c:510
+#: ../libempathy-gtk/empathy-chat.c:534
msgid "invalid contact"
msgstr "ਗਲਤ ਸੰਪਰਕ"
-#: ../libempathy-gtk/empathy-chat.c:513
+#: ../libempathy-gtk/empathy-chat.c:537
msgid "permission denied"
msgstr "ਅਧਿਕਾਰ ਪਾਬੰਦੀ"
-#: ../libempathy-gtk/empathy-chat.c:516
+#: ../libempathy-gtk/empathy-chat.c:540
msgid "too long message"
msgstr "ਬਹੁਤ ਲੰਮਾ ਸੁਨੇਹਾ"
-#: ../libempathy-gtk/empathy-chat.c:519
+#: ../libempathy-gtk/empathy-chat.c:543
msgid "not implemented"
msgstr "ਸਥਾਪਤ ਨਹੀਂ"
-#: ../libempathy-gtk/empathy-chat.c:522
+#: ../libempathy-gtk/empathy-chat.c:546
msgid "unknown"
msgstr "ਅਣਜਾਣ"
-#: ../libempathy-gtk/empathy-chat.c:526
+#: ../libempathy-gtk/empathy-chat.c:550
#, c-format
msgid "Error sending message '%s': %s"
msgstr "ਸੁਨੇਹਾ '%s' ਭੇਜਣ ਦੌਰਾਨ ਗਲਤੀ: %s"
-#: ../libempathy-gtk/empathy-chat.c:556
+#: ../libempathy-gtk/empathy-chat.c:580
#, c-format
msgid "Topic set to: %s"
msgstr "ਵਿਸ਼ਾ ਨਹੀਂ ਕੀਤਾ: %s"
-#: ../libempathy-gtk/empathy-chat.c:558
+#: ../libempathy-gtk/empathy-chat.c:582
msgid "No topic defined"
msgstr "ਕੋਈ ਵਿਸ਼ਾ ਨਹੀਂ ਦਿੱਤਾ"
-#: ../libempathy-gtk/empathy-chat.c:973
+#: ../libempathy-gtk/empathy-chat.c:951
+msgid "(No Suggestions)"
+msgstr "(ਕੋਈ ਸੁਝਾਅ ਨਹੀਂ)"
+
+#: ../libempathy-gtk/empathy-chat.c:1005
msgid "Insert Smiley"
msgstr "ਚਿਹਰਾ ਸ਼ਾਮਲ ਕਰੋ"
#. send button
-#: ../libempathy-gtk/empathy-chat.c:991
-#: ../libempathy-gtk/empathy-ui-utils.c:1538
+#: ../libempathy-gtk/empathy-chat.c:1023
+#: ../libempathy-gtk/empathy-ui-utils.c:1507
msgid "_Send"
msgstr "ਭੇਜੋ(_S)"
-#: ../libempathy-gtk/empathy-chat.c:1025
-msgid "_Check Word Spelling..."
-msgstr "ਸ਼ਬਦ ਜੋੜ ਜਾਂਚ ਕਰੋ(_C)..."
+#: ../libempathy-gtk/empathy-chat.c:1057
+msgid "_Spelling Suggestions"
+msgstr "ਸਪੈਲਿੰਗ ਸੁਝਾਅ(_S)"
-#: ../libempathy-gtk/empathy-chat.c:1131
+#: ../libempathy-gtk/empathy-chat.c:1171
#, c-format
msgid "%s has joined the room"
msgstr "%s ਰੂਮ ਵਿੱਚ ਦਾਖਲ ਹੋਇਆ"
-#: ../libempathy-gtk/empathy-chat.c:1134
+#: ../libempathy-gtk/empathy-chat.c:1174
#, c-format
msgid "%s has left the room"
msgstr "%s ਨੇ ਰੂਮ ਛੱਡਿਆ"
-#: ../libempathy-gtk/empathy-chat.c:1248 ../src/empathy-call-window.c:474
+#: ../libempathy-gtk/empathy-chat.c:1289 ../src/empathy-call-window.c:1014
msgid "Disconnected"
msgstr "ਕੁਨੈਕਸ਼ਨ ਖਤਮ"
-#: ../libempathy-gtk/empathy-chat.c:1644
+#: ../libempathy-gtk/empathy-chat.c:1700
msgid "Connected"
msgstr "ਕੁਨੈਕਟ ਕੀਤਾ"
-#: ../libempathy-gtk/empathy-chat.c:1694
-#: ../libempathy-gtk/empathy-log-window.c:505
+#: ../libempathy-gtk/empathy-chat.c:1750
+#: ../libempathy-gtk/empathy-log-window.c:501
msgid "Conversation"
msgstr "ਗੱਲਬਾਤ"
-#: ../libempathy-gtk/empathy-chat.glade.h:1
+#: ../libempathy-gtk/empathy-chat.ui.h:1
msgid "<b>Topic:</b>"
msgstr "<b>ਵਿਸ਼ਾ:</b>"
-#: ../libempathy-gtk/empathy-chat.glade.h:2
-msgid "Group Chat"
-msgstr "ਗਰੁੱਪ ਚੈੱਟ"
-
-#: ../libempathy-gtk/empathy-chat-text-view.c:340
+#: ../libempathy-gtk/empathy-chat-text-view.c:323
msgid "_Copy Link Address"
msgstr "ਲਿੰਕ ਸਿਰਨਾਵਾਂ ਨਕਲ ਕਰੋ(_C)"
-#: ../libempathy-gtk/empathy-chat-text-view.c:348
+#: ../libempathy-gtk/empathy-chat-text-view.c:331
msgid "_Open Link"
msgstr "ਲਿੰਕ ਖੋਲ੍ਹੋ(_O)"
-#: ../libempathy-gtk/empathy-chat-text-view.c:439
-#| msgid "%A %d %B %Y"
+#. Translators: timestamp displayed between conversations in
+#. * chat windows (strftime format string)
+#: ../libempathy-gtk/empathy-chat-text-view.c:424
msgid "%A %B %d %Y"
msgstr "%A %d %B %Y"
-#: ../libempathy-gtk/empathy-contact-dialogs.c:180
-msgid "Personal Information"
-msgstr "ਨਿੱਜੀ ਜਾਣਕਾਰੀ"
-
-#: ../libempathy-gtk/empathy-contact-dialogs.c:183
+#: ../libempathy-gtk/empathy-contact-dialogs.c:179
+#: ../libempathy-gtk/empathy-contact-dialogs.c:238
msgid "Edit Contact Information"
msgstr "ਸੰਪਰਕ ਜਾਣਕਾਰੀ ਸੋਧ"
-#: ../libempathy-gtk/empathy-contact-dialogs.c:186
-msgid "Contact Information"
-msgstr "ਸੰਪਰਕ ਜਾਣਕਾਰੀ"
-
-#: ../libempathy-gtk/empathy-contact-dialogs.c:267
-msgid "I would like to add you to my contact list."
-msgstr "ਮੈਂ ਤੁਹਾਨੂੰ ਆਪਣੀ ਸੰਪਰਕ ਸੂਚੀ 'ਚ ਸ਼ਾਮਲ ਕਰਨਾ ਚਾਹੁੰਦਾ ਹਾਂ।"
+#: ../libempathy-gtk/empathy-contact-dialogs.c:289
+msgid "Personal Information"
+msgstr "ਨਿੱਜੀ ਜਾਣਕਾਰੀ"
-#: ../libempathy-gtk/empathy-contact-dialogs.c:291
+#: ../libempathy-gtk/empathy-contact-dialogs.c:392
msgid "New Contact"
msgstr "ਨਵਾਂ ਸੰਪਰਕ"
-#: ../libempathy-gtk/empathy-contact-dialogs.glade.h:1
+#: ../libempathy-gtk/empathy-contact-dialogs.ui.h:1
msgid "Decide _Later"
msgstr "ਬਾਅਦ 'ਚ ਸੋਚੂ(_L)"
-#: ../libempathy-gtk/empathy-contact-dialogs.glade.h:2
+#: ../libempathy-gtk/empathy-contact-dialogs.ui.h:2
msgid "Subscription Request"
msgstr "ਮੈਂਬਰੀ ਮੰਗ"
-#: ../libempathy-gtk/empathy-contact-list-view.c:1249
+#: ../libempathy-gtk/empathy-contact-list-view.c:1378
#, c-format
msgid "Do you really want to remove the group '%s'?"
msgstr "ਕੀ ਤੁਸੀਂ ਗਰੁੱਪ '%s' ਨੂੰ ਹਟਾਉਣਾ ਚਾਹੁੰਦੇ ਹੋ?"
-#: ../libempathy-gtk/empathy-contact-list-view.c:1251
+#: ../libempathy-gtk/empathy-contact-list-view.c:1380
msgid "Removing group"
msgstr "ਗਰੁੱਪ ਹਟਾਇਆ ਜਾ ਰਿਹਾ ਹੈ"
-#: ../libempathy-gtk/empathy-contact-list-view.c:1298
-#: ../libempathy-gtk/empathy-contact-list-view.c:1377
+#: ../libempathy-gtk/empathy-contact-list-view.c:1427
+#: ../libempathy-gtk/empathy-contact-list-view.c:1505
msgid "_Remove"
msgstr "ਹਟਾਓ(_R)"
-#: ../libempathy-gtk/empathy-contact-list-view.c:1328
+#: ../libempathy-gtk/empathy-contact-list-view.c:1457
#, c-format
msgid "Do you really want to remove the contact '%s'?"
msgstr "ਕੀ ਤੁਸੀਂ ਸੰਪਰਕ '%s' ਨੂੰ ਹਟਾਉਣਾ ਚਾਹੁੰਦੇ ਹੋ?"
-#: ../libempathy-gtk/empathy-contact-list-view.c:1330
+#: ../libempathy-gtk/empathy-contact-list-view.c:1459
msgid "Removing contact"
msgstr "ਸੰਪਰਕ ਹਟਾਇਆ ਜਾ ਰਿਹਾ ਹੈ"
-#: ../libempathy-gtk/empathy-contact-list-view.c:1335
-msgid "Sorry, I don't want you in my contact list anymore."
-msgstr "ਅਫਸੋਸ ਹੈ, ਪਰ ਮੈਂ ਤੁਹਾਨੂੰ ਆਪਣੀ ਸੰਪਰਕ ਸੂਚੀ ਵਿੱਚ ਨਹੀਂ ਰੱਖਣਾ ਚਾਹੁੰਦਾ।"
-
-#: ../libempathy-gtk/empathy-contact-menu.c:130
-#: ../src/empathy-main-window.glade.h:9
+#: ../libempathy-gtk/empathy-contact-menu.c:135
+#: ../src/empathy-main-window.ui.h:10
msgid "_Chat"
msgstr "ਗੱਲਬਾਤ(_C)"
-#: ../libempathy-gtk/empathy-contact-menu.c:161
-#: ../src/empathy-call-window.glade.h:5
-msgid "_Call"
-msgstr "ਕਾਲ ਕਰੋ(_C)"
+#: ../libempathy-gtk/empathy-contact-menu.c:166
+#| msgid "_Call"
+msgctxt "menu item"
+msgid "_Audio Call"
+msgstr "ਆਡੀਓ ਕਾਲ(_A)"
+
+#: ../libempathy-gtk/empathy-contact-menu.c:198
+#| msgid "_Call"
+msgctxt "menu item"
+msgid "_Video Call"
+msgstr "ਵੀਡਿਓ ਕਾਲ(_V)"
-#: ../libempathy-gtk/empathy-contact-menu.c:200
-#: ../src/empathy-main-window.glade.h:17
+#: ../libempathy-gtk/empathy-contact-menu.c:237
+#: ../src/empathy-main-window.ui.h:20
msgid "_View Previous Conversations"
msgstr "ਪਿਛਲੀ ਗੱਲਬਾਤ ਵੇਖੋ(_V)"
-#: ../libempathy-gtk/empathy-contact-menu.c:222
+#: ../libempathy-gtk/empathy-contact-menu.c:259
msgid "Send file"
msgstr "ਫਾਇਲ ਭੇਜੋ"
-#: ../libempathy-gtk/empathy-contact-menu.c:250
+#: ../libempathy-gtk/empathy-contact-menu.c:287
msgid "Infor_mation"
msgstr "ਜਾਣਕਾਰੀ(_m)"
-#: ../libempathy-gtk/empathy-contact-menu.c:277
-#: ../src/empathy-chat-window.glade.h:14 ../src/empathy-main-window.glade.h:11
+#: ../libempathy-gtk/empathy-contact-menu.c:314
+#: ../src/empathy-main-window.ui.h:12
msgid "_Edit"
msgstr "ਸੋਧ(_E)"
-#: ../libempathy-gtk/empathy-contact-menu.c:336
+#: ../libempathy-gtk/empathy-contact-menu.c:372
msgid "Inviting to this room"
msgstr "ਇਸ ਰੂਮ ਲਈ ਸੱਦਾ"
-#: ../libempathy-gtk/empathy-contact-menu.c:369
+#: ../libempathy-gtk/empathy-contact-menu.c:403
msgid "_Invite to chatroom"
msgstr "ਗੱਲਬਾਤ-ਰੂਮ ਲਈ ਸੱਦਾ(_I)"
-#: ../libempathy-gtk/empathy-contact-selector.c:111
+#: ../libempathy-gtk/empathy-contact-selector.c:129
msgid "Select a contact"
msgstr "ਇੱਕ ਸੰਪਰਕ ਚੁਣੋ"
-#: ../libempathy-gtk/empathy-contact-widget.c:358
+#: ../libempathy-gtk/empathy-contact-widget.c:440
msgid "Save Avatar"
msgstr "ਅਵਤਾਰ ਸੰਭਾਲੋ"
-#: ../libempathy-gtk/empathy-contact-widget.c:414
+#: ../libempathy-gtk/empathy-contact-widget.c:496
msgid "Unable to save avatar"
msgstr "ਅਵਤਾਰ ਸੰਭਾਲਣ ਲਈ ਅਸਮਰੱਥ"
-#: ../libempathy-gtk/empathy-contact-widget.c:895
+#: ../libempathy-gtk/empathy-contact-widget.c:979
msgid "Select"
msgstr "ਚੁਣੋ"
-#: ../libempathy-gtk/empathy-contact-widget.c:904
-#: ../src/empathy-main-window.c:991
+#: ../libempathy-gtk/empathy-contact-widget.c:988
+#: ../src/empathy-main-window.c:904
msgid "Group"
msgstr "ਗਰੁੱਪ"
-#: ../libempathy-gtk/empathy-contact-widget.glade.h:1
+#: ../libempathy-gtk/empathy-contact-widget.c:1239
+msgid "Country ISO Code:"
+msgstr "ਦੇਸ਼ ISO ਕੋਡ:"
+
+#: ../libempathy-gtk/empathy-contact-widget.c:1241
+#| msgid "Account:"
+msgid "Country:"
+msgstr "ਦੇਸ਼:"
+
+#: ../libempathy-gtk/empathy-contact-widget.c:1243
+#| msgid "Status:"
+msgid "State:"
+msgstr "ਹਾਲਤ:"
+
+#: ../libempathy-gtk/empathy-contact-widget.c:1245
+#| msgid "Client:"
+msgid "City:"
+msgstr "ਸ਼ਹਿਰ:"
+
+#: ../libempathy-gtk/empathy-contact-widget.c:1247
+#| msgid "Armenian"
+msgid "Area:"
+msgstr "ਏਰੀਆ:"
+
+#: ../libempathy-gtk/empathy-contact-widget.c:1249
+msgid "Postal Code:"
+msgstr "ਡਾਕ ਕੋਡ:"
+
+#: ../libempathy-gtk/empathy-contact-widget.c:1251
+#| msgid "Select"
+msgid "Street:"
+msgstr "ਗਲੀ:"
+
+#: ../libempathy-gtk/empathy-contact-widget.c:1253
+msgid "Building:"
+msgstr "ਇਮਾਰਤ:"
+
+#: ../libempathy-gtk/empathy-contact-widget.c:1255
+#| msgid "_For:"
+msgid "Floor:"
+msgstr "ਮੰਜ਼ਲ:"
+
+#: ../libempathy-gtk/empathy-contact-widget.c:1257
+#| msgid "_Room:"
+msgid "Room:"
+msgstr "ਘਰ:"
+
+#: ../libempathy-gtk/empathy-contact-widget.c:1259
+#| msgid "Type:"
+msgid "Text:"
+msgstr "ਟੈਕਸਟ:"
+
+#: ../libempathy-gtk/empathy-contact-widget.c:1261
+#| msgid "Version:"
+msgid "Description:"
+msgstr "ਵੇਰਵਾ:"
+
+#: ../libempathy-gtk/empathy-contact-widget.c:1263
+msgid "URI:"
+msgstr "URI:"
+
+#: ../libempathy-gtk/empathy-contact-widget.c:1265
+msgid "Accuracy Level:"
+msgstr "ਸ਼ੁੱਧਤਾ ਲੈਵਲ:"
+
+#: ../libempathy-gtk/empathy-contact-widget.c:1267
+msgid "Error:"
+msgstr "ਗਲਤੀ:"
+
+#: ../libempathy-gtk/empathy-contact-widget.c:1269
+msgid "Vertical Error (meters):"
+msgstr "ਵਰਟੀਕਲ ਗਲਤੀ (ਮੀਟਰ):"
+
+#: ../libempathy-gtk/empathy-contact-widget.c:1271
+msgid "Horizontal Error (meters):"
+msgstr "ਹਰੀਜੱਟਲ ਗਲਤੀ (ਮੀਟਰ):"
+
+#: ../libempathy-gtk/empathy-contact-widget.c:1273
+msgid "Speed:"
+msgstr "ਗਤੀ:"
+
+#: ../libempathy-gtk/empathy-contact-widget.c:1275
+#| msgid "Version:"
+msgid "Bearing:"
+msgstr "ਬੀਰਿੰਗ:"
+
+#: ../libempathy-gtk/empathy-contact-widget.c:1277
+msgid "Climb Speed:"
+msgstr "ਚੜ੍ਹਨ ਗਤੀ:"
+
+#: ../libempathy-gtk/empathy-contact-widget.c:1279
+msgid "Last Updated on:"
+msgstr "ਆਖਰੀ ਅੱਪਡੇਟ:"
+
+#: ../libempathy-gtk/empathy-contact-widget.c:1281
+msgid "Longitude:"
+msgstr "ਲੰਬਕਾਰੀ:"
+
+#: ../libempathy-gtk/empathy-contact-widget.c:1283
+msgid "Latitude:"
+msgstr "ਵਿਥਕਾਰ:"
+
+#: ../libempathy-gtk/empathy-contact-widget.c:1285
+msgid "Altitude:"
+msgstr "ਉਚਾਈ:"
+
+#: ../libempathy-gtk/empathy-contact-widget.c:1332
+#| msgid "<b>Contact</b>"
+msgid "<b>Location</b>"
+msgstr "<b>ਟਿਕਾਣਾ</b>"
+
+#: ../libempathy-gtk/empathy-contact-widget.c:1345
+#| msgid "<b>Contact</b>"
+msgid "<b>Location</b>, "
+msgstr "<b>ਟਿਕਾਣਾ</b>, "
+
+#: ../libempathy-gtk/empathy-contact-widget.c:1395
+msgid "%B %e, %Y at %R UTC"
+msgstr "%B %e, %Y at %R UTC"
+
+#: ../libempathy-gtk/empathy-contact-widget.ui.h:1
msgid "<b>Client Information</b>"
msgstr "<b>ਕਲਾਇਟ ਜਾਣਕਾਰੀ</b>"
-#: ../libempathy-gtk/empathy-contact-widget.glade.h:2
+#: ../libempathy-gtk/empathy-contact-widget.ui.h:2
msgid "<b>Contact Details</b>"
msgstr "<b>ਸੰਪਰਕ ਵੇਰਵਾ</b>"
-#: ../libempathy-gtk/empathy-contact-widget.glade.h:3
+#: ../libempathy-gtk/empathy-contact-widget.ui.h:3
msgid "<b>Contact</b>"
msgstr "<b>ਸੰਪਰਕ</b>"
-#: ../libempathy-gtk/empathy-contact-widget.glade.h:4
+#: ../libempathy-gtk/empathy-contact-widget.ui.h:4
msgid "<b>Groups</b>"
msgstr "<b>ਗਰੁੱਪ</b>"
-#: ../libempathy-gtk/empathy-contact-widget.glade.h:5
-#: ../libempathy-gtk/empathy-new-message-dialog.glade.h:1
-#: ../src/empathy-chatrooms-window.glade.h:1
-#: ../src/empathy-new-chatroom-dialog.glade.h:1
+#: ../libempathy-gtk/empathy-contact-widget.ui.h:5
+msgid "<b>Location</b> at (date)\t"
+msgstr "<b>ਟਿਕਾਣਾ</b> (date) ਨੂੰ\t"
+
+#: ../libempathy-gtk/empathy-contact-widget.ui.h:6
+#: ../libempathy-gtk/empathy-new-message-dialog.ui.h:1
+#: ../src/empathy-chatrooms-window.ui.h:1
+#: ../src/empathy-new-chatroom-dialog.ui.h:1
msgid "Account:"
-msgstr "ਖਾਤਾ:"
+msgstr "ਅਕਾਊਂਟ:"
-#: ../libempathy-gtk/empathy-contact-widget.glade.h:6
+#: ../libempathy-gtk/empathy-contact-widget.ui.h:7
msgid "Alias:"
msgstr "ਉਪ-ਨਾਂ:"
-#: ../libempathy-gtk/empathy-contact-widget.glade.h:7
+#: ../libempathy-gtk/empathy-contact-widget.ui.h:8
msgid "Birthday:"
msgstr "ਜਨਮਦਿਨ:"
-#: ../libempathy-gtk/empathy-contact-widget.glade.h:8
+#: ../libempathy-gtk/empathy-contact-widget.ui.h:9
msgid "Client:"
msgstr "ਕਲਾਇਟ:"
-#: ../libempathy-gtk/empathy-contact-widget.glade.h:9
-msgid "Contact information"
-msgstr "ਸੰਪਰਕ ਜਾਣਕਾਰੀ"
-
-#: ../libempathy-gtk/empathy-contact-widget.glade.h:10
+#: ../libempathy-gtk/empathy-contact-widget.ui.h:10
msgid "Email:"
msgstr "ਈਮੇਲ:"
-#: ../libempathy-gtk/empathy-contact-widget.glade.h:11
+#: ../libempathy-gtk/empathy-contact-widget.ui.h:11
msgid "Fullname:"
msgstr "ਪੂਰਾ ਨਾਂ:"
#. Identifier to connect to Instant Messaging network
-#: ../libempathy-gtk/empathy-contact-widget.glade.h:13
+#: ../libempathy-gtk/empathy-contact-widget.ui.h:13
msgid "Identifier:"
msgstr "ਪਛਾਣਕਰਤਾ:"
-#: ../libempathy-gtk/empathy-contact-widget.glade.h:14
+#: ../libempathy-gtk/empathy-contact-widget.ui.h:14
msgid "Information requested..."
msgstr "ਜਾਣਕਾਰੀ ਲੋੜੀਦੀ..."
-#: ../libempathy-gtk/empathy-contact-widget.glade.h:15
+#: ../libempathy-gtk/empathy-contact-widget.ui.h:15
msgid "OS:"
msgstr "OS:"
-#: ../libempathy-gtk/empathy-contact-widget.glade.h:16
+#: ../libempathy-gtk/empathy-contact-widget.ui.h:16
msgid ""
"Select the groups you want this contact to appear in. Note that you can "
"select more than one group or no groups."
msgstr ""
-#: ../libempathy-gtk/empathy-contact-widget.glade.h:17
+#: ../libempathy-gtk/empathy-contact-widget.ui.h:17
msgid "Version:"
msgstr "ਵਰਜਨ:"
-#: ../libempathy-gtk/empathy-contact-widget.glade.h:18
+#: ../libempathy-gtk/empathy-contact-widget.ui.h:18
msgid "Web site:"
msgstr "ਵੈੱਬਸਾਈਟ:"
-#: ../libempathy-gtk/empathy-contact-widget.glade.h:19
+#: ../libempathy-gtk/empathy-contact-widget.ui.h:19
msgid "_Add Group"
msgstr "ਗਰੁੱਪ ਸ਼ਾਮਲ(_A)"
-#: ../libempathy-gtk/empathy-irc-network-dialog.c:284
+#: ../libempathy-gtk/empathy-irc-network-dialog.c:283
msgid "new server"
msgstr "ਨਵਾਂ ਸਰਵਰ"
-#: ../libempathy-gtk/empathy-irc-network-dialog.c:513
+#: ../libempathy-gtk/empathy-irc-network-dialog.c:510
msgid "Server"
msgstr "ਸਰਵਰ"
-#: ../libempathy-gtk/empathy-irc-network-dialog.c:528
+#: ../libempathy-gtk/empathy-irc-network-dialog.c:525
msgid "Port"
msgstr "ਪੋਰਟ"
-#: ../libempathy-gtk/empathy-irc-network-dialog.c:541
+#: ../libempathy-gtk/empathy-irc-network-dialog.c:538
msgid "SSL"
msgstr "SSL"
-#: ../libempathy-gtk/empathy-log-window.c:498
-#: ../src/empathy-import-dialog.c:277
+#: ../libempathy-gtk/empathy-log-window.c:494
+#: ../src/empathy-import-dialog.c:281
msgid "Account"
-msgstr "ਖਾਤਾ"
+msgstr "ਅਕਾਊਂਟ"
-#: ../libempathy-gtk/empathy-log-window.c:515
+#: ../libempathy-gtk/empathy-log-window.c:511
msgid "Date"
msgstr "ਮਿਤੀ"
-#. Tab Label
-#: ../libempathy-gtk/empathy-log-window.glade.h:2
+#: ../libempathy-gtk/empathy-log-window.ui.h:1
msgid "Conversations"
msgstr "ਗੱਲਬਾਤ"
-#: ../libempathy-gtk/empathy-log-window.glade.h:3
+#: ../libempathy-gtk/empathy-log-window.ui.h:2
msgid "Previous Conversations"
msgstr "ਪਿਛਲੀ ਗੱਲਬਾਤ"
-#. Tab Label
-#: ../libempathy-gtk/empathy-log-window.glade.h:5
+#: ../libempathy-gtk/empathy-log-window.ui.h:3
msgid "Search"
msgstr "ਖੋਜ"
-#. Searching *for* something
-#: ../libempathy-gtk/empathy-log-window.glade.h:7
+#: ../libempathy-gtk/empathy-log-window.ui.h:4
msgid "_For:"
msgstr "ਲਈ(_F):"
-#: ../libempathy-gtk/empathy-new-message-dialog.glade.h:2
+#: ../libempathy-gtk/empathy-new-message-dialog.ui.h:2
msgid "C_all"
msgstr "ਕਾਲ(_a)"
-#: ../libempathy-gtk/empathy-new-message-dialog.glade.h:3
+#: ../libempathy-gtk/empathy-new-message-dialog.ui.h:3
msgid "C_hat"
msgstr "ਗੱਲਬਾਤ(_h)"
-#: ../libempathy-gtk/empathy-new-message-dialog.glade.h:4
+#: ../libempathy-gtk/empathy-new-message-dialog.ui.h:4
msgid "Contact ID:"
msgstr "ਸੰਪਰਕ ID:"
-#: ../libempathy-gtk/empathy-new-message-dialog.glade.h:5
+#: ../libempathy-gtk/empathy-new-message-dialog.ui.h:5
msgid "New Conversation"
msgstr "ਨਵੀਂ ਗੱਲਬਾਤ"
+#. COL_STATE_ICON_NAME
+#. COL_STATE
+#. COL_STATUS_TEXT
+#. COL_DISPLAY_MARKUP
+#. COL_STATUS_CUSTOMISABLE
+#. COL_TYPE
+#: ../libempathy-gtk/empathy-presence-chooser.c:169
+#| msgid "Custom messages..."
+msgid "Custom Message..."
+msgstr "ਪਸੰਦੀਦਾ ਸੁਨੇਹਾ..."
+
+#: ../libempathy-gtk/empathy-presence-chooser.c:225
+#| msgid "Custom messages..."
+msgid "Edit Custom Messages..."
+msgstr "ਪਸੰਦੀਦਾ ਸੁਨੇਹੇ ਸੋਧੋ..."
+
+#: ../libempathy-gtk/empathy-presence-chooser.c:324
+msgid "Click to remove this status as a favorite"
+msgstr ""
+
+#: ../libempathy-gtk/empathy-presence-chooser.c:333
+msgid "Click to make this status a favorite"
+msgstr ""
+
+#: ../libempathy-gtk/empathy-presence-chooser.c:367
+#| msgid "Status"
+msgid "Set status"
+msgstr "ਹਾਲਤ ਸੈੱਟ ਕਰੋ"
+
+#: ../libempathy-gtk/empathy-presence-chooser.c:779
+msgid "Set your presence and current status"
+msgstr "ਆਪਣੀ ਮੌਜੂਦਗੀ ਅਤੇ ਮੌਜੂਦਾ ਹਾਲਤ ਸੈੱਟ ਕਰੋ"
+
#. Custom messages
-#: ../libempathy-gtk/empathy-presence-chooser.c:685
+#: ../libempathy-gtk/empathy-presence-chooser.c:1014
msgid "Custom messages..."
msgstr "ਪਸੰਦੀਦਾ ਸੁਨੇਹੇ..."
-#: ../libempathy-gtk/empathy-presence-chooser.glade.h:1
-msgid "Custom message"
-msgstr "ਪਸੰਦੀਦਾ ਸੁਨੇਹੇ"
-
-#: ../libempathy-gtk/empathy-presence-chooser.glade.h:2
-msgid "Message:"
-msgstr "ਸੁਨੇਹਾ:"
+#: ../libempathy-gtk/empathy-status-preset-dialog.c:360
+#| msgid "Custom message"
+msgid "Enter Custom Message"
+msgstr "ਪਸੰਦੀਦਾ ਸੁਨੇਹਾ ਦਿਓ"
-#: ../libempathy-gtk/empathy-presence-chooser.glade.h:3
-msgid "Save message"
-msgstr "ਸੁਨੇਹਾ ਸੰਭਾਲੋ"
+#: ../libempathy-gtk/empathy-status-preset-dialog.c:482
+#| msgid "Custom message"
+msgid "Edit Custom Messages"
+msgstr "ਪਸੰਦੀਦਾ ਸੁਨੇਹੇ ਸੋਧੋ"
-#: ../libempathy-gtk/empathy-presence-chooser.glade.h:4
-msgid "Status:"
-msgstr "ਹਾਲਤ:"
+#: ../libempathy-gtk/empathy-status-preset-dialog.ui.h:1
+msgid "Add _New Preset"
+msgstr "ਨਵਾਂ ਪ੍ਰੀ-ਸੈੱਟ ਸ਼ਾਮਲ ਕਰੋ(_N)"
-#: ../libempathy-gtk/empathy-spell-dialog.c:88
-msgid "Word"
-msgstr "ਸ਼ਬਦ"
+#: ../libempathy-gtk/empathy-status-preset-dialog.ui.h:2
+#| msgid "Save message"
+msgid "Saved Presets"
+msgstr "ਪ੍ਰੀ-ਸੈੱਟ ਸੰਭਾਲੋ"
-#: ../libempathy-gtk/empathy-spell-dialog.c:265
-msgid "Suggestions for the word"
-msgstr "ਸ਼ਬਦ ਲਈ ਸੁਝਾਅ"
+#: ../libempathy-gtk/empathy-status-preset-dialog.ui.h:3
+msgid "gtk-add"
+msgstr "gtk-add"
-#: ../libempathy-gtk/empathy-spell-dialog.glade.h:1
-msgid "Spell Checker"
-msgstr "ਸ਼ਬਦ-ਜੋੜ ਜਾਂਚਕਾਰ"
-
-#: ../libempathy-gtk/empathy-spell-dialog.glade.h:2
-msgid "Suggestions for the word:"
-msgstr "ਸ਼ਬਦ ਲਈ ਸੁਝਾਅ:"
+#: ../libempathy-gtk/empathy-status-preset-dialog.ui.h:4
+msgid "gtk-remove"
+msgstr "gtk-remove"
#: ../libempathy-gtk/empathy-theme-manager.c:60
msgid "Classic"
@@ -974,51 +1102,51 @@ msgstr "ਸਾਫ਼"
msgid "Blue"
msgstr "ਨੀਲਾ"
-#: ../libempathy-gtk/empathy-ui-utils.c:1385
+#: ../libempathy-gtk/empathy-ui-utils.c:1354
msgid "Unable to open URI"
msgstr "URI ਖੋਲ੍ਹਣ ਲਈ ਅਸਮਰੱਥ"
-#: ../libempathy-gtk/empathy-ui-utils.c:1530
+#: ../libempathy-gtk/empathy-ui-utils.c:1499
msgid "Select a file"
msgstr "ਇੱਕ ਫਾਇਲ ਚੁਣੋ"
-#: ../libempathy-gtk/empathy-ui-utils.c:1566
+#: ../libempathy-gtk/empathy-ui-utils.c:1535
msgid "Received an instant message"
msgstr "ਇੱਕ ਤੁਰੰਤ ਸੁਨੇਹੇ ਮਿਲਿਆ"
-#: ../libempathy-gtk/empathy-ui-utils.c:1568
+#: ../libempathy-gtk/empathy-ui-utils.c:1537
msgid "Sent an instant message"
msgstr "ਇੱਕ ਤੁਰੰਤ ਸੁਨੇਹੇ ਭੇਜਿਆ"
-#: ../libempathy-gtk/empathy-ui-utils.c:1570
+#: ../libempathy-gtk/empathy-ui-utils.c:1539
msgid "Incoming chat request"
msgstr "ਆ ਰਹੀ ਗੱਲਬਾਤ ਮੰਗ"
-#: ../libempathy-gtk/empathy-ui-utils.c:1572
+#: ../libempathy-gtk/empathy-ui-utils.c:1541
msgid "Contact connected"
msgstr "ਸੰਪਰਕ ਕੁਨੈਕਟ ਹੋਇਆ"
-#: ../libempathy-gtk/empathy-ui-utils.c:1574
+#: ../libempathy-gtk/empathy-ui-utils.c:1543
msgid "Contact disconnected"
msgstr "ਸੰਪਰਕ ਨੇ ਕੁਨੈਕਸ਼ਨ ਖਤਮ"
-#: ../libempathy-gtk/empathy-ui-utils.c:1576
+#: ../libempathy-gtk/empathy-ui-utils.c:1545
msgid "Connected to server"
msgstr "ਸਰਵਰ ਨਾਲ ਕੁਨੈਕਟ ਕੀਤਾ"
-#: ../libempathy-gtk/empathy-ui-utils.c:1578
+#: ../libempathy-gtk/empathy-ui-utils.c:1547
msgid "Disconnected from server"
msgstr "ਸਰਵਰ ਤੋਂ ਕੁਨੈਕਸ਼ਨ ਖਤਮ"
-#: ../libempathy-gtk/empathy-ui-utils.c:1580
+#: ../libempathy-gtk/empathy-ui-utils.c:1549
msgid "Incoming voice call"
msgstr "ਆ ਰਹੀ ਆਵਾਜ਼ ਕਾਲ"
-#: ../libempathy-gtk/empathy-ui-utils.c:1582
+#: ../libempathy-gtk/empathy-ui-utils.c:1551
msgid "Outgoing voice call"
msgstr "ਜਾ ਰਹੀ ਆਵਾਜ਼ ਕਾਲ"
-#: ../libempathy-gtk/empathy-ui-utils.c:1584
+#: ../libempathy-gtk/empathy-ui-utils.c:1553
msgid "Voice call ended"
msgstr "ਆਵਾਜ਼ ਕਾਲ ਖਤਮ ਕੀਤੀ"
@@ -1205,7 +1333,7 @@ msgid "Megaphone"
msgstr "ਮੇਗਾਫੋਨ"
#: ../megaphone/data/GNOME_Megaphone_Applet.server.in.in.h:2
-#: ../megaphone/src/megaphone-applet.c:417
+#: ../megaphone/src/megaphone-applet.c:527
msgid "Talk!"
msgstr "ਗੱਲ!"
@@ -1219,15 +1347,15 @@ msgid "_Information"
msgstr "ਜਾਣਕਾਰੀ(_I)"
#: ../megaphone/data/GNOME_Megaphone_Applet.xml.h:3
-#: ../src/empathy-main-window.glade.h:15
+#: ../src/empathy-main-window.ui.h:17
msgid "_Preferences"
msgstr "ਮੇਰੀ ਪਸੰਦ(_P)"
-#: ../megaphone/src/megaphone-applet.c:255
+#: ../megaphone/src/megaphone-applet.c:168
msgid "Please configure a contact."
msgstr "ਇੱਕ ਸੰਪਰਕ ਲਈ ਸੰਰਚਨਾ ਕਰੋ ਜੀ।"
-#: ../megaphone/src/megaphone-applet.c:348
+#: ../megaphone/src/megaphone-applet.c:258
msgid "Select contact..."
msgstr "ਸੰਪਰਕ ਸ਼ਾਮਲ..."
@@ -1240,23 +1368,23 @@ msgstr "ਮੌਜੂਦਗੀ"
msgid "Set your own presence"
msgstr "ਆਪਣੀ ਮੌਜੂਦਗੀ ਦਿਓ"
-#: ../src/empathy.c:426
+#: ../src/empathy.c:441
msgid "Don't connect on startup"
msgstr "ਸ਼ੁਰੂ ਸਮੇਂ ਕੁਨੈਕਟ ਨਾ ਕਰੋ"
-#: ../src/empathy.c:430
+#: ../src/empathy.c:445
msgid "Don't show the contact list on startup"
msgstr "ਸ਼ੁਰੂ ਸਮੇਂ ਸੰਪਰਕ ਸੂਚੀ ਨਾ ਵੇਖਾਓ"
-#: ../src/empathy.c:434
+#: ../src/empathy.c:449
msgid "Show the accounts dialog"
-msgstr "ਖਾਤਾ ਡਾਈਲਾਗ ਵੇਖੋ"
+msgstr "ਅਕਾਊਂਟ ਡਾਈਲਾਗ ਵੇਖੋ"
-#: ../src/empathy.c:446
+#: ../src/empathy.c:461
msgid "- Empathy Instant Messenger"
msgstr "- ਇੰਪਥੀ ਤੁਰੰਤ ਸੁਨੇਹੇਦਾਰ"
-#: ../src/empathy-about-dialog.c:84
+#: ../src/empathy-about-dialog.c:83
msgid ""
"Empathy is free software; you can redistribute it and/or modify it under the "
"terms of the GNU General Public License as published by the Free Software "
@@ -1264,7 +1392,7 @@ msgid ""
"version."
msgstr ""
-#: ../src/empathy-about-dialog.c:88
+#: ../src/empathy-about-dialog.c:87
msgid ""
"Empathy is distributed in the hope that it will be useful, but WITHOUT ANY "
"WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS "
@@ -1272,39 +1400,38 @@ msgid ""
"details."
msgstr ""
-#: ../src/empathy-about-dialog.c:92
+#: ../src/empathy-about-dialog.c:91
msgid ""
"You should have received a copy of the GNU General Public License along with "
"Empathy; if not, write to the Free Software Foundation, Inc., 51 Franklin "
"Street, Fifth Floor, Boston, MA 02110-130159 USA"
msgstr ""
-#: ../src/empathy-about-dialog.c:120
+#: ../src/empathy-about-dialog.c:119
msgid "An Instant Messaging client for GNOME"
msgstr "ਗਨੋਮ ਲਈ ਤੁਰੰਤ ਸੁਨੇਹੇਦਾਰ ਕਲਾਇਟ"
-#: ../src/empathy-about-dialog.c:126
+#: ../src/empathy-about-dialog.c:125
msgid "translator-credits"
msgstr ""
-"ਅਮਨਪਰੀਤ ਸਿੰਘ ਆਲਮ <aalam@users.sf.net)\n"
+"ਅਮਨਪਰੀਤ ਸਿੰਘ ਆਲਮ <aalam@users.sf.net) 2007, 2008, 2009\n"
"http://www.satluj.com/"
#: ../src/empathy-accounts-dialog.c:391
msgid "Enabled"
msgstr "ਚਾਲੂ"
-#: ../src/empathy-accounts-dialog.c:401
-#: ../src/empathy-accounts-dialog.glade.h:4
+#: ../src/empathy-accounts-dialog.c:401 ../src/empathy-accounts-dialog.ui.h:4
msgid "Accounts"
-msgstr "ਖਾਤਾ"
+msgstr "ਅਕਾਊਂਟ"
#. To translator: %s is the protocol name
-#: ../src/empathy-accounts-dialog.c:833
+#: ../src/empathy-accounts-dialog.c:834
#, c-format
msgid "New %s account"
-msgstr "ਨਵਾਂ %s ਖਾਤਾ"
+msgstr "ਨਵਾਂ %s ਅਕਾਊਂਟ"
-#: ../src/empathy-accounts-dialog.c:943
+#: ../src/empathy-accounts-dialog.c:944
#, c-format
msgid ""
"You are about to remove your %s account!\n"
@@ -1313,7 +1440,7 @@ msgstr ""
"ਤੁਸੀਂ %s ਅਕਾਊਂਟ ਹਟਾਉਣ ਲਈ ਤਿਆਰ ਹੋ!\n"
"ਕੀ ਤੁਸੀਂ ਜਾਰੀ ਰੱਖਣਾ ਚਾਹੁੰਦੇ ਹੋ?"
-#: ../src/empathy-accounts-dialog.c:949
+#: ../src/empathy-accounts-dialog.c:950
msgid ""
"Any associated conversations and chat rooms will NOT be removed if you "
"decide to proceed.\n"
@@ -1322,312 +1449,228 @@ msgid ""
"be available."
msgstr ""
-#: ../src/empathy-accounts-dialog.glade.h:1
+#: ../src/empathy-accounts-dialog.ui.h:1
msgid "<b>New Account</b>"
-msgstr "<b>ਨਵਾਂ ਖਾਤਾ</b>"
+msgstr "<b>ਨਵਾਂ ਅਕਾਊਂਟ</b>"
-#: ../src/empathy-accounts-dialog.glade.h:2
+#: ../src/empathy-accounts-dialog.ui.h:2
msgid "<b>No protocol installed</b>"
msgstr "<b>ਕੋਈ ਪਰੋਟੋਕਾਲ ਇੰਸਟਾਲ ਨਹੀਂ</b>"
-#: ../src/empathy-accounts-dialog.glade.h:3
+#: ../src/empathy-accounts-dialog.ui.h:3
msgid "<b>Settings</b>"
-msgstr "<b>ਸਥਾਪਨ</b>"
+msgstr "<b>ਸੈਟਿੰਗ</b>"
-#: ../src/empathy-accounts-dialog.glade.h:5
+#: ../src/empathy-accounts-dialog.ui.h:5
msgid "Cr_eate"
msgstr "ਬਣਾਓ(_e)"
-#: ../src/empathy-accounts-dialog.glade.h:6
+#: ../src/empathy-accounts-dialog.ui.h:6
msgid "I already have an account I want to use"
-msgstr "ਮੇਰੇ ਕੋਲ ਪਹਿਲਾਂ ਹੀ ਖਾਤਾ ਹੈ, ਜੋ ਮੈਂ ਵਰਤਣਾ ਚਾਹੁੰਦਾ ਹਾਂ"
+msgstr "ਮੇਰੇ ਕੋਲ ਪਹਿਲਾਂ ਹੀ ਅਕਾਊਂਟ ਹੈ, ਜੋ ਮੈਂ ਵਰਤਣਾ ਚਾਹੁੰਦਾ ਹਾਂ"
-#: ../src/empathy-accounts-dialog.glade.h:7
+#: ../src/empathy-accounts-dialog.ui.h:7
msgid "Import Accounts..."
-msgstr "ਖਾਤਾ ਆਯਾਤ..."
+msgstr "ਅਕਾਊਂਟ ਇੰਪੋਰਟ ਕਰੋ..."
-#: ../src/empathy-accounts-dialog.glade.h:8
+#: ../src/empathy-accounts-dialog.ui.h:8
msgid ""
"To add a new account, you first have to install a backend for each protocol "
"you want to use."
msgstr ""
-"ਨਵਾਂ ਖਾਤਾ ਸ਼ਾਮਲ ਕਰਨ ਲਈ, ਤੁਹਾਨੂੰ ਹਰੇਕ ਵਰਤਣ ਵਾਲੇ ਪਰੋਟੋਕਾਲ, ਜੋ ਤੁਸੀਂ ਚਾਹੁੰਦੇ ਹੋ, ਲਈ ਬੈਕਐਂਡ ਇੰਸਟਾਲ "
+"ਨਵਾਂ ਅਕਾਊਂਟ ਸ਼ਾਮਲ ਕਰਨ ਲਈ, ਤੁਹਾਨੂੰ ਹਰੇਕ ਵਰਤਣ ਵਾਲੇ ਪਰੋਟੋਕਾਲ, ਜੋ ਤੁਸੀਂ ਚਾਹੁੰਦੇ ਹੋ, ਲਈ ਬੈਕਐਂਡ "
+"ਇੰਸਟਾਲ "
"ਕਰਨੀ ਪਵੇਗੀ।"
-#: ../src/empathy-accounts-dialog.glade.h:9
+#: ../src/empathy-accounts-dialog.ui.h:9
msgid "Type:"
msgstr "ਕਿਸਮ:"
-#: ../src/empathy-call-window.c:187
-#| msgid "Contact"
+#: ../src/empathy-accounts-dialog.ui.h:10
+#| msgid "_Add Contact..."
+msgid "_Add..."
+msgstr "ਸ਼ਾਮਲ(_A)..."
+
+#: ../src/empathy-call-window.c:382
msgid "Contrast"
msgstr "ਕਨਟਰਾਸਟ"
-#: ../src/empathy-call-window.c:187
+#: ../src/empathy-call-window.c:385
msgid "Brightness"
msgstr "ਚਮਕ"
-#: ../src/empathy-call-window.c:187
+#: ../src/empathy-call-window.c:388
msgid "Gamma"
msgstr "ਗਾਮਾ"
-#: ../src/empathy-call-window.c:219
-#| msgid "<b>Volume</b>"
+#: ../src/empathy-call-window.c:492
msgid "Volume"
msgstr "ਆਵਾਜ਼"
-#: ../src/empathy-call-window.c:295
+#: ../src/empathy-call-window.c:638
msgid "_Sidebar"
msgstr "ਬਾਹੀ(_S)"
-#: ../src/empathy-call-window.c:313
+#: ../src/empathy-call-window.c:657
msgid "Dialpad"
msgstr "ਡਾਈਲਪੈਡ"
-#: ../src/empathy-call-window.c:317
+#: ../src/empathy-call-window.c:663
msgid "Audio input"
msgstr "ਆਡੀਓ ਆਉਟਪੁੱਟ"
-#: ../src/empathy-call-window.c:321
+#: ../src/empathy-call-window.c:667
msgid "Video input"
msgstr "ਵੀਡਿਓ ਆਉਟਪੁੱਟ"
-#: ../src/empathy-call-window.c:334
-#| msgid "Connecting"
+#: ../src/empathy-call-window.c:691
msgid "Connecting..."
-msgstr "ਜੋੜਿਆ ਜਾ ਰਿਹਾ ਹੈ..."
+msgstr "ਕੁਨੈਕਟ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ..."
-#: ../src/empathy-call-window.c:488
+#: ../src/empathy-call-window.c:730
#, c-format
-#| msgid "Connected"
-msgid "Connected -- %d:%02dm"
-msgstr "ਜੁੜਿਆ -- %d:%02dm"
+msgid "Call with %s"
+msgstr "%s ਲਈ ਕਾਲ ਕਰੋ"
-#: ../src/empathy-call-window.glade.h:1
-#| msgid "Hang Up"
+#: ../src/empathy-call-window.c:801
+#| msgid "_Call"
+msgid "Call"
+msgstr "ਕਾਲ ਕਰੋ"
+
+#. Translators: number of minutes:seconds the caller has been connected
+#: ../src/empathy-call-window.c:1096, c-format
+#| msgid "Connected -- %d:%02dm"
+msgid "Connected — %d:%02dm"
+msgstr "ਕੁਨੈਕਟ ਹੈ -- %d:%02dm"
+
+#: ../src/empathy-call-window.ui.h:1
msgid "Hang up"
msgstr "ਬੰਦ ਕਰੋ"
-#: ../src/empathy-call-window.glade.h:2
-#| msgid "Send Video"
+#: ../src/empathy-call-window.ui.h:2
msgid "Send Audio"
msgstr "ਆਡੀਓ ਭੇਜੋ"
-#: ../src/empathy-call-window.glade.h:3
-#| msgid "Send Video"
+#: ../src/empathy-call-window.ui.h:3
msgid "Send video"
msgstr "ਵੀਡਿਓ ਭੇਜੋ"
-#: ../src/empathy-call-window.glade.h:4
+#: ../src/empathy-call-window.ui.h:4
msgid "Video preview"
msgstr "ਵੀਡਿਓ ਝਲਕ"
-#: ../src/empathy-call-window.glade.h:6
+#: ../src/empathy-call-window.ui.h:5
+msgid "_Call"
+msgstr "ਕਾਲ ਕਰੋ(_C)"
+
+#: ../src/empathy-call-window.ui.h:6 ../src/empathy-main-window.ui.h:19
msgid "_View"
msgstr "ਵੇਖੋ(_V)"
-#: ../src/empathy-chat-window.c:313
+#: ../src/empathy-chat-window.c:316
#, c-format
msgid "Conversations (%d)"
msgstr "ਗੱਲਬਾਤ (%d)"
-#: ../src/empathy-chat-window.c:418
+#: ../src/empathy-chat-window.c:421
msgid "Topic:"
msgstr "ਵਿਸ਼ਾ:"
-#: ../src/empathy-chat-window.c:423
+#: ../src/empathy-chat-window.c:426
msgid "Typing a message."
msgstr "ਸੁਨੇਹਾ ਲਿਖਦਾ/ਲਿਖਦੀ ਹੈ।"
-#: ../src/empathy-chat-window.c:892 ../src/empathy-event-manager.c:424
+#: ../src/empathy-chat-window.c:885 ../src/empathy-event-manager.c:429
#, c-format
msgid "New message from %s"
msgstr "%s ਵਲੋਂ ਨਵਾਂ ਸੁਨੇਹਾ"
-#: ../src/empathy-chat-window.glade.h:1
-msgid "C_lear"
-msgstr "ਸਾਫ਼ ਕਰੋ(_l)"
-
-#: ../src/empathy-chat-window.glade.h:2
-msgid "Chat"
-msgstr "ਗੱਲਬਾਤ"
-
-#: ../src/empathy-chat-window.glade.h:3
-msgid "Insert _Smiley"
-msgstr "ਬੰਦਾ-ਖੁਸ਼ ਸ਼ਾਮਲ(_S)"
-
-#: ../src/empathy-chat-window.glade.h:4
-msgid "Invitation _message:"
-msgstr "ਸੱਦਾ ਸੁਨੇਹਾ(_m):"
-
-#: ../src/empathy-chat-window.glade.h:5
-msgid "Invite"
-msgstr "ਸੱਦਾ"
-
-#: ../src/empathy-chat-window.glade.h:6
-msgid "Move Tab _Left"
-msgstr "ਟੈਬ ਖੱਬੇ ਭੇਜੋ(_L)"
-
-#: ../src/empathy-chat-window.glade.h:7
-msgid "Move Tab _Right"
-msgstr "ਟੈਬ ਸੱਜੇ ਭੇਜੋ(_R)"
-
-#: ../src/empathy-chat-window.glade.h:8
-msgid "Select who would you like to invite:"
-msgstr "ਚੁਣੋ, ਕਿ ਕਿਸ ਨੂੰ ਤੁਸੀਂ ਸੱਦਾ ਚਾਹੁੰਦੇ ਹੋ:"
-
-#: ../src/empathy-chat-window.glade.h:9
-msgid "You have been invited to join a chat conference."
-msgstr "ਤੁਹਾਨੂੰ ਇੱਕ ਗੱਲਬਾਤ ਕਨਫਰੰਸ ਜੁਆਇੰਨ ਕਰਨ ਲਈ ਸੱਦਾ ਹੈ।"
-
-#: ../src/empathy-chat-window.glade.h:10
-msgid "_Contact"
-msgstr "ਸੰਪਰਕ(_C)"
-
-#: ../src/empathy-chat-window.glade.h:11 ../src/empathy-main-window.glade.h:10
-msgid "_Contents"
-msgstr "ਸਮੱਗਰੀ(_C)"
-
-#: ../src/empathy-chat-window.glade.h:12
-msgid "_Conversation"
-msgstr "ਗੱਲਬਾਤ(_C)"
-
-#: ../src/empathy-chat-window.glade.h:13
-msgid "_Detach Tab"
-msgstr "ਟੈਬ ਵੱਖ ਕਰੋ(_D)"
-
-#: ../src/empathy-chat-window.glade.h:15
-msgid "_Favorite Chatroom"
-msgstr "ਪਸੰਦੀਦਾ ਗੱਲਬਾਤ-ਰੂਮ(_F)"
-
-#: ../src/empathy-chat-window.glade.h:16 ../src/empathy-main-window.glade.h:12
-msgid "_Help"
-msgstr "ਮੱਦਦ(_H)"
-
-#: ../src/empathy-chat-window.glade.h:17
-msgid "_Next Tab"
-msgstr "ਅਗਲੀ ਟੈਬ(_N)"
-
-#: ../src/empathy-chat-window.glade.h:18
-msgid "_Previous Tab"
-msgstr "ਪਿਛਲੀ ਟੈਬ(_P)"
-
-#: ../src/empathy-chat-window.glade.h:19
-msgid "_Tabs"
-msgstr "ਟੈਬਾਂ(_T)"
-
-#: ../src/empathy-chatrooms-window.c:262
+#: ../src/empathy-chatrooms-window.c:258
msgid "Name"
msgstr "ਨਾਂ"
-#: ../src/empathy-chatrooms-window.c:280
+#: ../src/empathy-chatrooms-window.c:276
msgid "Room"
msgstr "ਰੂਮ"
-#: ../src/empathy-chatrooms-window.c:289
+#: ../src/empathy-chatrooms-window.c:285
msgid "Auto-Connect"
msgstr "ਸਵੈ-ਚਾਲਤ ਕੁਨੈਕਟ"
-#: ../src/empathy-chatrooms-window.glade.h:2
-msgid "Edit Favorite Room"
-msgstr "ਪਸੰਦੀਦਾ ਰੂਮ ਸੋਧ"
-
-#: ../src/empathy-chatrooms-window.glade.h:3
-msgid "Join room on start_up"
-msgstr "ਸ਼ੁਰੂ ਸਮੇਂ ਰੂਮ ਵਿੱਚ ਦਾਖਲ ਕਰੋ(_u)"
-
-#: ../src/empathy-chatrooms-window.glade.h:4
-msgid "Join this chat room when Empathy starts and you are connected"
-msgstr "ਇਹ ਗੱਲਬਾਤ ਰੂਮ ਜੁਆਇੰਨ ਕਰੋ, ਜਦੋਂ ਇੰਪੈਂਥੀ ਸ਼ੁਰੂ ਹੋਵੇ ਅਤੇ ਤੁਸੀਂ ਜੁੜੇ ਹੋਏ ਹੋਵੋ"
-
-#: ../src/empathy-chatrooms-window.glade.h:5
+#: ../src/empathy-chatrooms-window.ui.h:2
msgid "Manage Favorite Rooms"
msgstr "ਪਸੰਦੀਦਾ ਰੂਮ ਪਰਬੰਧ"
-#: ../src/empathy-chatrooms-window.glade.h:6
-msgid "N_ame:"
-msgstr "ਨਾਂ(_a):"
-
-#: ../src/empathy-chatrooms-window.glade.h:7
-msgid "S_erver:"
-msgstr "ਸਰਵਰ(_e):"
-
-#: ../src/empathy-chatrooms-window.glade.h:9
-#: ../src/empathy-new-chatroom-dialog.glade.h:9
-msgid "_Room:"
-msgstr "ਰੂਮ(_R):"
-
-#: ../src/empathy-event-manager.c:372
+#: ../src/empathy-event-manager.c:377
msgid "Incoming call"
msgstr "ਆ ਰਹੀ ਕਾਲ"
-#: ../src/empathy-event-manager.c:375
+#: ../src/empathy-event-manager.c:380
#, c-format
msgid "%s is calling you, do you want to answer?"
msgstr "%s ਤੁਹਾਨੂੰ ਕਾਲ ਕਰ ਰਿਹਾ ਹੈ, ਕੀ ਤੁਸੀਂ ਜਵਾਬ ਦੇਣਾ ਚਾਹੁੰਦੇ ਹੋ?"
-#: ../src/empathy-event-manager.c:382
+#: ../src/empathy-event-manager.c:387
msgid "_Reject"
msgstr "ਰੱਦ ਕਰੋ(_R)"
-#: ../src/empathy-event-manager.c:388
+#: ../src/empathy-event-manager.c:393
msgid "_Answer"
msgstr "ਜਵਾਬ ਦਿਓ(_A)"
-#: ../src/empathy-event-manager.c:511
+#: ../src/empathy-event-manager.c:507
#, c-format
msgid "Incoming call from %s"
msgstr "%s ਤੋਂ ਕਾਲ ਆ ਰਹੀ ਹੈ"
-#: ../src/empathy-event-manager.c:559
+#: ../src/empathy-event-manager.c:547
#, c-format
msgid "%s is offering you an invitation"
msgstr "%s ਤੁਹਾਨੂੰ ਇੱਕ ਸੱਦਾ ਦੇ ਰਿਹਾ ਹੈ"
-#: ../src/empathy-event-manager.c:565
+#: ../src/empathy-event-manager.c:553
msgid "An external application will be started to handle it."
msgstr "ਇਸ ਨੂੰ ਵਰਤਣ ਲਈ ਇੱਕ ਬਾਹਰੀ ਐਪਲੀਕੇਸ਼ਨ ਵਰਤੀ ਜਾਵੇਗੀ।"
-#: ../src/empathy-event-manager.c:570
+#: ../src/empathy-event-manager.c:558
msgid "You don't have the needed external application to handle it."
msgstr "ਤੁਹਾਨੂੰ ਇਹ ਹੈਂਡਲ ਕਰਨ ਲਈ ਬਾਹਰੀ ਕਾਰਜ ਦੀ ਲੋੜ ਨਹੀਂ ਹੈ।"
-#: ../src/empathy-event-manager.c:692
-#| msgid "Romanian"
+#: ../src/empathy-event-manager.c:685
msgid "Room invitation"
msgstr "ਰੂਮ ਸੱਦਾ"
-#: ../src/empathy-event-manager.c:695
+#: ../src/empathy-event-manager.c:688
#, c-format
msgid "%s is inviting you to join %s"
msgstr "%s ਤੁਹਾਨੂੰ %s ਦਾਖਲ ਹੋਣ ਲਈ ਸੱਦ ਰਿਹਾ ਹੈ"
#. Decline button
-#: ../src/empathy-event-manager.c:703 ../src/empathy-ft-manager.c:1021
+#: ../src/empathy-event-manager.c:696 ../src/empathy-ft-manager.c:1037
msgid "_Decline"
msgstr "ਇਨਕਾਰ(_D)"
-#: ../src/empathy-event-manager.c:708
-#| msgid "Join"
+#: ../src/empathy-event-manager.c:701
+#: ../src/empathy-new-chatroom-dialog.ui.h:7
msgid "_Join"
msgstr "ਦਾਖਲ(_J)"
-#: ../src/empathy-event-manager.c:738
+#: ../src/empathy-event-manager.c:740
#, c-format
msgid "%s invited you to join %s"
msgstr "%s ਨੇ ਤੁਹਾਨੂੰ %s ਦਾਖਲ ਹੋਣ ਲਈ ਸੱਦਿਆ"
-#: ../src/empathy-event-manager.c:860
+#: ../src/empathy-event-manager.c:848
#, c-format
msgid "Incoming file transfer from %s"
msgstr "%s ਤੋਂ ਆ ਰਿਹਾ ਫਾਇਲ ਸੰਚਾਰ"
-#: ../src/empathy-event-manager.c:954
+#: ../src/empathy-event-manager.c:923
#, c-format
msgid "Subscription requested by %s"
msgstr "%s ਵਲੋਂ ਮੈਂਬਰੀ ਚਾਹੀਦੀ ਹੈ"
-#: ../src/empathy-event-manager.c:958
+#: ../src/empathy-event-manager.c:927
#, c-format
msgid ""
"\n"
@@ -1636,487 +1679,690 @@ msgstr ""
"\n"
"ਸੁਨੇਹਾ: %s"
-#: ../src/empathy-ft-manager.c:113
+#. Translators: time left, when it is more than one hour
+#: ../src/empathy-ft-manager.c:114
#, c-format
msgid "%u:%02u.%02u"
msgstr "%u:%02u.%02u"
-#: ../src/empathy-ft-manager.c:115
+#. Translators: time left, when is is less than one hour
+#: ../src/empathy-ft-manager.c:117
#, c-format
msgid "%02u.%02u"
msgstr "%02u.%02u"
-#: ../src/empathy-ft-manager.c:164
+#: ../src/empathy-ft-manager.c:166
msgid "No reason was specified"
msgstr "ਕੋਈ ਕਾਰਨ ਨਹੀਂ ਦਿੱਤਾ"
-#: ../src/empathy-ft-manager.c:166
+#: ../src/empathy-ft-manager.c:168
msgid "The change in state was requested"
msgstr "ਹਾਲਤ ਬਦਲਣ ਲਈ ਮੰਗ ਹੈ"
-#: ../src/empathy-ft-manager.c:168
+#: ../src/empathy-ft-manager.c:170
msgid "You canceled the file transfer"
msgstr "ਤੁਸੀਂ ਫਾਇਲ ਸੰਚਾਰ ਰੱਦ ਕੀਤਾ"
-#: ../src/empathy-ft-manager.c:170
+#: ../src/empathy-ft-manager.c:172
msgid "The other participant canceled the file transfer"
msgstr "ਹੋਰ ਯੋਗਦਾਨੀ ਨੇ ਫਾਇਲ ਸੰਚਾਰ ਰੱਦ ਕੀਤਾ"
-#: ../src/empathy-ft-manager.c:172
+#: ../src/empathy-ft-manager.c:174
msgid "Error while trying to transfer the file"
msgstr "ਫਾਇਲ ਸੰਚਾਰ ਦੀ ਕੋਸ਼ਿਸ਼ ਦੌਰਾਨ ਗਲਤੀ"
-#: ../src/empathy-ft-manager.c:174
+#: ../src/empathy-ft-manager.c:176
msgid "The other participant is unable to transfer the file"
msgstr "ਹੋਰ ਯੋਗਦਾਨੀ ਫਾਇਲ ਸੰਚਾਰ ਲਈ ਫੇਲ੍ਹ ਹੈ"
-#: ../src/empathy-ft-manager.c:176
+#: ../src/empathy-ft-manager.c:178
msgid "Unknown reason"
msgstr "ਅਣਜਾਣ ਕਾਰਨ"
#. translators: first %s is filename, second %s is the contact name
-#: ../src/empathy-ft-manager.c:224
+#: ../src/empathy-ft-manager.c:228
#, c-format
msgid "Receiving \"%s\" from %s"
msgstr "\"%s\" %s ਤੋਂ ਮਿਲ ਰਿਹਾ ਹੈ"
#. translators: first %s is filename, second %s is the contact name
-#: ../src/empathy-ft-manager.c:227
+#: ../src/empathy-ft-manager.c:231
#, c-format
msgid "Sending \"%s\" to %s"
msgstr "\"%s\" %s ਨੂੰ ਭੇਜਿਆ"
-#: ../src/empathy-ft-manager.c:237
+#: ../src/empathy-ft-manager.c:242
msgctxt "file size"
msgid "Unknown"
msgstr "ਅਣਜਾਣ"
#. translators: first %s is the transferred size, second %s is
#. * the total file size
-#: ../src/empathy-ft-manager.c:245
-#, c-format
-msgid "%s of %s"
-msgstr "%2$s ਵਿੱਚੋਂ %1$s"
-
-#: ../src/empathy-ft-manager.c:252
-msgid "Waiting the other participant's response"
+#: ../src/empathy-ft-manager.c:251, c-format
+#| msgid "%s of %s"
+msgid "%s of %s at %s/s"
+msgstr "%3$s/s ਨਾਲ %2$s ਵਿੱਚੋਂ %1$s"
+
+#: ../src/empathy-ft-manager.c:259
+#| msgid "Waiting the other participant's response"
+msgid "Waiting for the other participant's response"
msgstr "ਹੋਰ ਦਰਸ਼ਕਾਂ ਦੇ ਜਵਾਬ ਦੀ ਉਡੀਕ ਹੈ"
-#: ../src/empathy-ft-manager.c:262
+#: ../src/empathy-ft-manager.c:269
#, c-format
msgid "\"%s\" received from %s"
msgstr "\"%s\" %s ਤੋਂ ਮਿਲਿਆ"
-#: ../src/empathy-ft-manager.c:268
+#: ../src/empathy-ft-manager.c:275
#, c-format
msgid "\"%s\" sent to %s"
msgstr "\"%s\" %s ਨੂੰ ਭੇਜਿਆ"
-#: ../src/empathy-ft-manager.c:271
+#: ../src/empathy-ft-manager.c:278
msgid "File transfer completed"
msgstr "ਫਾਇਲ ਸੰਚਾਰ ਪੂਰਾ ਹੋਇਆ"
-#: ../src/empathy-ft-manager.c:280
+#: ../src/empathy-ft-manager.c:287
#, c-format
msgid "\"%s\" receiving from %s"
msgstr "\"%s\" %s ਤੋਂ ਮਿਲਿਆ"
-#: ../src/empathy-ft-manager.c:286
+#: ../src/empathy-ft-manager.c:293
#, c-format
msgid "\"%s\" sending to %s"
msgstr "\"%s\" %s ਨੂੰ ਭੇਜਿਆ ਜਾ ਰਿਹਾ ਹੈ"
-#: ../src/empathy-ft-manager.c:289
+#: ../src/empathy-ft-manager.c:296
#, c-format
msgid "File transfer canceled: %s"
msgstr "ਫਾਇਲ ਸੰਚਾਰ ਰੱਦ ਕੀਤਾ: %s"
-#: ../src/empathy-ft-manager.c:304
+#: ../src/empathy-ft-manager.c:310
+msgctxt "remaining time"
+msgid "Stalled"
+msgstr "ਰੋਕਿਆ"
+
+#: ../src/empathy-ft-manager.c:313
msgctxt "remaining time"
msgid "Unknown"
msgstr "ਅਣਜਾਣ"
-#: ../src/empathy-ft-manager.c:364
+#: ../src/empathy-ft-manager.c:372
msgctxt "file transfer percent"
msgid "Unknown"
msgstr "ਅਣਜਾਣ"
-#: ../src/empathy-ft-manager.c:700
+#: ../src/empathy-ft-manager.c:668
msgid "%"
msgstr "%"
-#: ../src/empathy-ft-manager.c:712
+#: ../src/empathy-ft-manager.c:680
msgid "File"
msgstr "ਫਾਇਲ"
-#: ../src/empathy-ft-manager.c:734
+#: ../src/empathy-ft-manager.c:702
msgid "Remaining"
msgstr "ਬਾਕੀ"
-#: ../src/empathy-ft-manager.c:885
+#: ../src/empathy-ft-manager.c:900
msgid "Cannot save file to this location"
msgstr "ਇਸ ਟਿਕਾਣਾ ਉੱਤੇ ਫਾਇਲ ਸੰਭਾਲੀ ਜਾ ਸਕਦੀ"
-#: ../src/empathy-ft-manager.c:931
+#: ../src/empathy-ft-manager.c:946
msgid "Save file as..."
msgstr "ਫਾਇਲ ਇੰਝ ਸੰਭਾਲੋ..."
-#: ../src/empathy-ft-manager.c:1001
+#: ../src/empathy-ft-manager.c:1016
msgid "unknown size"
msgstr "ਅਣਜਾਣ ਆਕਾਰ"
-#: ../src/empathy-ft-manager.c:1007
+#: ../src/empathy-ft-manager.c:1022
#, c-format
msgid "%s would like to send you a file"
msgstr "%s ਤੁਹਾਨੂੰ ਇੱਕ ਫਾਇਲ ਭੇਜਣੀ ਚਾਹੁੰਦਾ ਹੈ"
-#: ../src/empathy-ft-manager.c:1012
+#. Translators: the first %s is the file name, the second %s is the file size
+#: ../src/empathy-ft-manager.c:1028
#, c-format
msgid "Do you want to accept the file \"%s\" (%s)?"
msgstr "ਕੀ ਤੁਸੀਂ ਫਾਇਲ \"%s\" (%s) ਮਨਜ਼ੂਰ ਕਰਨੀ ਚਾਹੁੰਦੇ ਹੋ?"
#. Accept button
-#: ../src/empathy-ft-manager.c:1030
+#: ../src/empathy-ft-manager.c:1046
msgid "_Accept"
msgstr "ਮਨਜ਼ੂਰ(_A)"
-#: ../src/empathy-ft-manager.glade.h:1
+#: ../src/empathy-ft-manager.ui.h:1
msgid "File transfers"
msgstr "ਫਾਇਲ ਸੰਚਾਰ"
-#: ../src/empathy-ft-manager.glade.h:2
+#: ../src/empathy-ft-manager.ui.h:2
msgid "Remove completed, canceled and failed file transfers from the list"
-msgstr "ਸੂਚੀ ਵਿੱਚੋਂ ਪੂਰੇ ਹੋਏ, ਰੱਦ ਕੀਤੇ ਅਤੇ ਫੇਲ੍ਹ ਹੋਏ ਫਾਇਲ ਸੰਚਾਰ ਹਟਾਓ"
+msgstr "ਲਿਸਟ ਵਿੱਚੋਂ ਪੂਰੇ ਹੋਏ, ਰੱਦ ਕੀਤੇ ਅਤੇ ਫੇਲ੍ਹ ਹੋਏ ਫਾਇਲ ਸੰਚਾਰ ਹਟਾਓ"
#. Translators: this is the header of a treeview column
-#: ../src/empathy-import-dialog.c:255
+#: ../src/empathy-import-dialog.c:259
msgid "Import"
-msgstr "ਆਯਾਤ"
+msgstr "ਇੰਪੋਰਟ"
-#: ../src/empathy-import-dialog.c:264
+#: ../src/empathy-import-dialog.c:268
msgid "Protocol"
msgstr "ਪਰੋਟੋਕਾਲ"
-#: ../src/empathy-import-dialog.c:290
+#: ../src/empathy-import-dialog.c:294
msgid "Source"
msgstr "ਸਰੋਤ"
-#: ../src/empathy-import-dialog.c:378
+#: ../src/empathy-import-dialog.c:388
msgid ""
"No accounts to import could be found. Empathy currently only supports "
"importing accounts from Pidgin."
-msgstr "ਇੰਪੋਰਟ ਕਰਨ ਲਈ ਕੋਈ ਖਾਤਾ ਨਹੀਂ ਲੱਭਿਆ। ਇੰਪੈਂਥੀ ਕੇਵਲ ਪਿਡਗਿਨ ਤੋਂ ਹੀ ਖਾਤੇ ਇੰਪੋਰਟ ਕਰਨ ਲਈ ਹੀ ਸਹਾਇਕ ਹੈ।"
+msgstr ""
+"ਇੰਪੋਰਟ ਕਰਨ ਲਈ ਕੋਈ ਅਕਾਊਂਟ ਨਹੀਂ ਲੱਭਿਆ। ਇੰਪੈਂਥੀ ਕੇਵਲ ਪਿਡਗਿਨ ਤੋਂ ਹੀ ਅਕਾਊਂਟ ਇੰਪੋਰਟ ਕਰਨ ਲਈ ਹੀ ਸਹਾਇਕ "
+"ਹੈ।"
-#: ../src/empathy-import-dialog.glade.h:1
+#: ../src/empathy-import-dialog.ui.h:1
msgid "Import Accounts"
-msgstr "ਖਾਤੇ ਆਯਾਤ"
+msgstr "ਅਕਾਊਂਟ ਇੰਪੋਰਟ"
-#: ../src/empathy-main-window.c:391
+#: ../src/empathy-main-window.c:394
+msgid "_Edit account"
+msgstr "ਅਕਾਊਂਟ ਸੋਧ(_E)"
+
+#: ../src/empathy-main-window.c:497
msgid "No error specified"
msgstr "ਕੋਈ ਗਲਤੀ ਨਹੀਂ ਦਿੱਤੀ"
-#: ../src/empathy-main-window.c:394
+#: ../src/empathy-main-window.c:500
msgid "Network error"
msgstr "ਨੈੱਟਵਰਕ ਗਲਤੀ"
-#: ../src/empathy-main-window.c:397
+#: ../src/empathy-main-window.c:503
msgid "Authentication failed"
msgstr "ਪਰਮਾਣਕਿਤਾ ਫੇਲ੍ਹ ਹੈ"
-#: ../src/empathy-main-window.c:400
+#: ../src/empathy-main-window.c:506
msgid "Encryption error"
msgstr "ਇੰਕ੍ਰਿਪਸ਼ਨ ਗਲਤੀ"
-#: ../src/empathy-main-window.c:403
+#: ../src/empathy-main-window.c:509
msgid "Name in use"
msgstr "ਵਰਤਣ ਲਈ ਨਾਂ"
-#: ../src/empathy-main-window.c:406
+#: ../src/empathy-main-window.c:512
msgid "Certificate not provided"
msgstr "ਸਰਟੀਫਿਕੇਟ ਨਹੀਂ ਦਿੱਤਾ"
-#: ../src/empathy-main-window.c:409
+#: ../src/empathy-main-window.c:515
msgid "Certificate untrusted"
msgstr "ਸਰਟੀਫਿਕੇਟ ਬੇਭਰੋਸੇਯੋਗ"
-#: ../src/empathy-main-window.c:412
+#: ../src/empathy-main-window.c:518
msgid "Certificate expired"
msgstr "ਸਰਟੀਫਿਕੇਟ ਦੀ ਮਿਆਦ ਪੁੱਗੀ"
-#: ../src/empathy-main-window.c:415
+#: ../src/empathy-main-window.c:521
msgid "Certificate not activated"
msgstr "ਸਰਟੀਫਿਕੇਟ ਸਰਗਰਮ ਨਹੀਂ ਹੈ"
-#: ../src/empathy-main-window.c:418
+#: ../src/empathy-main-window.c:524
msgid "Certificate hostname mismatch"
msgstr "ਸਰਟੀਫਿਕੇਟ ਹੋਸਟ-ਨਾਂ ਨਹੀਂ ਮਿਲਦਾ"
-#: ../src/empathy-main-window.c:421
+#: ../src/empathy-main-window.c:527
msgid "Certificate fingerprint mismatch"
msgstr "ਸਰਟੀਫਿਕੇਟ ਫਿੰਗਰ-ਪਰਿੰਟ ਮਿਲਦਾ ਨਹੀਂ"
-#: ../src/empathy-main-window.c:424
+#: ../src/empathy-main-window.c:530
msgid "Certificate self-signed"
msgstr "ਸਰਟੀਫਿਕੇਟ ਖੁਦ-ਦਸਤਖਤੀ ਹੈ"
-#: ../src/empathy-main-window.c:427
+#: ../src/empathy-main-window.c:533
msgid "Certificate error"
msgstr "ਸਰਟੀਫਿਕੇਟ ਗਲਤੀ"
-#: ../src/empathy-main-window.c:430
+#: ../src/empathy-main-window.c:536
msgid "Unknown error"
msgstr "ਅਣਜਾਣ ਗਲਤੀ"
-#: ../src/empathy-main-window.c:594
-msgid "Show and edit accounts"
-msgstr "ਖਾਤੇ ਵੇਖੋ ਅਤੇ ਸੋਧੋ"
-
-#: ../src/empathy-main-window.c:974
+#: ../src/empathy-main-window.c:887
msgid "Contact"
msgstr "ਸੰਪਰਕ"
-#: ../src/empathy-main-window.c:1176
-msgid "_Edit account"
-msgstr "ਖਾਤਾ ਸੋਧ(_E)"
+#: ../src/empathy-main-window.c:1211
+msgid "Show and edit accounts"
+msgstr "ਅਕਾਊਂਟ ਵੇਖੋ ਅਤੇ ਸੋਧੋ"
-#: ../src/empathy-main-window.glade.h:1
+#: ../src/empathy-main-window.ui.h:1
msgid "Contact List"
-msgstr "ਸੰਪਰਕ ਸੂਚੀ"
+msgstr "ਸੰਪਰਕ ਲਿਸਟ"
-#: ../src/empathy-main-window.glade.h:2
+#: ../src/empathy-main-window.ui.h:2
msgid "Context"
msgstr "ਪਰਸੰਗ"
-#: ../src/empathy-main-window.glade.h:3
+#: ../src/empathy-main-window.ui.h:3
msgid "Join _Favorites"
msgstr "ਪਸੰਦ ਵਿੱਚ ਦਾਖਲ(_F)"
-#: ../src/empathy-main-window.glade.h:4
-msgid "Join _New..."
-msgstr "ਨਵੇਂ 'ਚ ਦਾਖਲ(_N)..."
-
-#: ../src/empathy-main-window.glade.h:5
+#: ../src/empathy-main-window.ui.h:4
msgid "Manage Favorites"
msgstr "ਪਸੰਦ ਪਰਬੰਧ"
-#: ../src/empathy-main-window.glade.h:6
+#: ../src/empathy-main-window.ui.h:5
+#| msgid "_Show Contact List"
+msgid "Show Contacts on a Map"
+msgstr "ਨਕਸ਼ੇ ਉੱਤੇ ਸੰਪਰਕ ਵੇਖੋ"
+
+#: ../src/empathy-main-window.ui.h:6
+#| msgid "File transfers"
+msgid "Show _File Transfers"
+msgstr "ਫਾਇਲ ਟਰਾਂਸਫਰ ਵੇਖੋ(_F)"
+
+#: ../src/empathy-main-window.ui.h:7
msgid "Show _Offline Contacts"
msgstr "ਆਫਲਾਈਨ ਸੰਪਰਕ ਵੇਖੋ(_O)"
-#: ../src/empathy-main-window.glade.h:7
+#: ../src/empathy-main-window.ui.h:8
msgid "_Accounts"
-msgstr "ਖਾਤੇ(_A)"
+msgstr "ਅਕਾਊਂਟ(_A)"
-#: ../src/empathy-main-window.glade.h:8
+#: ../src/empathy-main-window.ui.h:9
msgid "_Add Contact..."
msgstr "ਸੰਪਰਕ ਸ਼ਾਮਲ(_A)..."
-#: ../src/empathy-main-window.glade.h:13 ../src/empathy-status-icon.glade.h:2
+#: ../src/empathy-main-window.ui.h:11
+msgid "_Contents"
+msgstr "ਸਮੱਗਰੀ(_C)"
+
+#: ../src/empathy-main-window.ui.h:13
+msgid "_Help"
+msgstr "ਮੱਦਦ(_H)"
+
+#: ../src/empathy-main-window.ui.h:14
+#| msgid "_Join"
+msgid "_Join..."
+msgstr "ਦਾਖਲ(_J)..."
+
+#: ../src/empathy-main-window.ui.h:15 ../src/empathy-status-icon.ui.h:2
msgid "_New Conversation..."
msgstr "ਨਵੀਂ ਗੱਲਬਾਤ(_N)..."
-#: ../src/empathy-main-window.glade.h:14
+#: ../src/empathy-main-window.ui.h:16
msgid "_Personal Information"
msgstr "ਨਿੱਜੀ ਜਾਣਕਾਰੀ(_P)"
-#: ../src/empathy-main-window.glade.h:16
+#: ../src/empathy-main-window.ui.h:18
msgid "_Room"
msgstr "ਰੂਮ(_R)"
-#: ../src/empathy-new-chatroom-dialog.c:291
-msgid "Chat Rooms"
+#: ../src/empathy-new-chatroom-dialog.c:332
+#| msgid "Chat Rooms"
+msgid "Chat Room"
msgstr "ਗੱਲਬਾਤ ਰੂਮ"
-#: ../src/empathy-new-chatroom-dialog.glade.h:2
-msgid "Browse:"
-msgstr "ਝਲਕ:"
+#: ../src/empathy-new-chatroom-dialog.c:348
+#| msgid "Themes"
+msgid "Members"
+msgstr "ਮੈਂਬਰ"
-#: ../src/empathy-new-chatroom-dialog.glade.h:3
+#: ../src/empathy-new-chatroom-dialog.c:492
+#, c-format
+msgctxt ""
+"Room/Join's roomlist tooltip. Parametersare a channel name, yes/no, yes/no "
+"and a number."
+msgid ""
+"<b>%s</b>\n"
+"Invite required: %s\n"
+"Password required: %s\n"
+"Members: %s"
+msgstr ""
+"<b>%s</b>\n"
+"ਸੱਦਾ ਲੋੜੀਦਾ: %s\n"
+"ਪਾਸਵਰਡ ਲੋੜੀਦਾ: %s\n"
+"ਮੈਂਬਰ: %s"
+
+#: ../src/empathy-new-chatroom-dialog.c:494
+#: ../src/empathy-new-chatroom-dialog.c:495
+msgid "Yes"
+msgstr "ਹਾਂ"
+
+#: ../src/empathy-new-chatroom-dialog.c:494
+#: ../src/empathy-new-chatroom-dialog.c:495
+msgid "No"
+msgstr "ਨਹੀਂ"
+
+#: ../src/empathy-new-chatroom-dialog.c:522
+msgid "Could not start room listing"
+msgstr ""
+
+#: ../src/empathy-new-chatroom-dialog.c:532
+msgid "Could not stop room listing"
+msgstr ""
+
+#: ../src/empathy-new-chatroom-dialog.ui.h:2
+msgid "Couldn't load room list"
+msgstr ""
+
+#: ../src/empathy-new-chatroom-dialog.ui.h:3
msgid "Enter the room name to join here or click on one or more rooms in the list."
msgstr "ਦਾਖਲ ਹੋਣ ਵਾਸਤੇ ਰੂਮ ਨਾਂ ਦਿਓ ਜਾਂ ਲਿਸਟ ਵਿੱਚੋਂ ਇੱਕ ਜਾਂ ਵੱਧ ਰੂਮ ਉੱਤੇ ਕਲਿੱਕ ਕਰੋ।"
-#: ../src/empathy-new-chatroom-dialog.glade.h:4
+#: ../src/empathy-new-chatroom-dialog.ui.h:4
msgid ""
"Enter the server which hosts the room, or leave it empty if the room is on "
"the current account's server"
-msgstr "ਸਰਵਰ ਦਿਓ, ਜਿਸ ਉੱਤੇ ਰੂਮ ਮੌਜੂਦ ਹਨ ਜਾਂ ਖਾਲੀ ਛੱਡੋ, ਜੇ ਰੂਮ ਮੌਜੂਦਾ ਅਕਾਊਂਟ ਸਰਵਰ ਉੱਤੇ ਹੀ ਮੌਜੂਦ ਹਨ।"
-
-#: ../src/empathy-new-chatroom-dialog.glade.h:5
-msgid "Join"
-msgstr "ਦਾਖਲ"
+msgstr ""
+"ਸਰਵਰ ਦਿਓ, ਜਿਸ ਉੱਤੇ ਰੂਮ ਮੌਜੂਦ ਹਨ ਜਾਂ ਖਾਲੀ ਛੱਡੋ, ਜੇ ਰੂਮ ਮੌਜੂਦਾ ਅਕਾਊਂਟ ਸਰਵਰ ਉੱਤੇ ਹੀ ਮੌਜੂਦ ਹਨ।"
-#: ../src/empathy-new-chatroom-dialog.glade.h:6
-msgid "Join New"
-msgstr "ਨਵੇਂ 'ਚ ਦਾਖਲ"
+#: ../src/empathy-new-chatroom-dialog.ui.h:5
+#| msgid "Room"
+msgid "Join Room"
+msgstr "ਰੂਮ ਜੁਆਇੰਨ ਕਰੋ"
-#: ../src/empathy-new-chatroom-dialog.glade.h:7
-msgid "Re_fresh"
-msgstr "ਤਾਜ਼ਾ(_f)"
+#: ../src/empathy-new-chatroom-dialog.ui.h:6
+#| msgid "_Room List locale:"
+msgid "Room List"
+msgstr "ਰੂਮ ਲਿਸਟ"
-#: ../src/empathy-new-chatroom-dialog.glade.h:8
-msgid "This list represents all chat rooms hosted on the server you have entered."
-msgstr "ਇਹ ਸੂਚੀ ਸਰਵਰ, ਜੋ ਕਿ ਤੁਸੀਂ ਦਿੱਤਾ ਹੈ, ਉੱਤੇ ਦਿੱਤੇ ਸਭ ਗੱਲਬਾਤ ਰੂਮ ਵੇਖਾਉਦੀ ਹੈ।"
+#: ../src/empathy-new-chatroom-dialog.ui.h:8
+msgid "_Room:"
+msgstr "ਰੂਮ(_R):"
-#: ../src/empathy-preferences.c:157
+#: ../src/empathy-preferences.c:156
msgid "Message received"
msgstr "ਸੁਨੇਹਾ ਮਿਲਿਆ"
-#: ../src/empathy-preferences.c:158
+#: ../src/empathy-preferences.c:157
msgid "Message sent"
msgstr "ਸੁਨੇਹਾ ਭੇਜਿਆ"
-#: ../src/empathy-preferences.c:159
+#: ../src/empathy-preferences.c:158
msgid "New conversation"
msgstr "ਨਵੀਂ ਗੱਲਬਾਤ"
-#: ../src/empathy-preferences.c:160
+#: ../src/empathy-preferences.c:159
msgid "Contact goes online"
msgstr "ਸੰਪਰਕ ਆਨਲਾਈਨ ਹੋਇਆ"
-#: ../src/empathy-preferences.c:161
+#: ../src/empathy-preferences.c:160
msgid "Contact goes offline"
msgstr "ਸੰਪਰਕ ਬੰਦ ਕਰ ਗਿਆ"
-#: ../src/empathy-preferences.c:162
+#: ../src/empathy-preferences.c:161
msgid "Account connected"
-msgstr "ਖਾਤਾ ਕੁਨੈਕਟ ਕੀਤਾ"
+msgstr "ਅਕਾਊਂਟ ਕੁਨੈਕਟ ਕੀਤਾ"
-#: ../src/empathy-preferences.c:163
+#: ../src/empathy-preferences.c:162
msgid "Account disconnected"
-msgstr "ਖਾਤਾ ਕੁਨੈਕਸ਼ਨ ਬੰਦ ਕਰ ਗਿਆ"
+msgstr "ਅਕਾਊਂਟ ਕੁਨੈਕਸ਼ਨ ਬੰਦ ਹੋਇਆ"
#: ../src/empathy-preferences.c:397
msgid "Language"
msgstr "ਭਾਸ਼ਾ"
-#: ../src/empathy-preferences.glade.h:1
+#: ../src/empathy-preferences.ui.h:1
msgid "<b>Appearance</b>"
msgstr "<b>ਦਿੱਖ</b>"
-#: ../src/empathy-preferences.glade.h:2
-#| msgid "<b>Behaviour</b>"
+#: ../src/empathy-preferences.ui.h:2
msgid "<b>Behavior</b>"
msgstr "<b>ਰਵੱਈਆ</b>"
-#: ../src/empathy-preferences.glade.h:3
+#: ../src/empathy-preferences.ui.h:3
msgid "<b>Contact List</b>"
-msgstr "<b>ਸੰਪਰਕ ਸੂਚੀ</b>"
+msgstr "<b>ਸੰਪਰਕ ਲਿਸਟ</b>"
-#: ../src/empathy-preferences.glade.h:4
+#: ../src/empathy-preferences.ui.h:4
msgid "<b>Enable spell checking for languages:</b>"
msgstr "<b>ਭਾਸ਼ਾਵਾਂ ਲਈ ਸ਼ਬਦ-ਜੋੜ ਚੈੱਕ ਕਰਨਾ ਯੋਗ:</b>"
-#: ../src/empathy-preferences.glade.h:5
+#: ../src/empathy-preferences.ui.h:5
msgid "<b>Play sound for events</b>"
msgstr "<b>ਘਟਨਾਵਾਂ ਲਈ ਧੁਨੀ ਚਲਾਓ</b>"
-#: ../src/empathy-preferences.glade.h:6
+#: ../src/empathy-preferences.ui.h:6
msgid ""
"<small>The list of languages reflects only the languages for which you have "
"a dictionary installed.</small>"
msgstr "<small>ਭਾਸ਼ਾ ਦੀ ਲਿਸਟ ਵੇਖਾ ਰਿਹਾ ਹੈ, ਜਿੰਨ੍ਹਾਂ ਲਈ ਤੁਹਾਡੇ ਕੋਲ ਸ਼ਬਦ-ਕੋਸ਼ ਇੰਸਟਾਲ ਹੈ।</small>"
-#: ../src/empathy-preferences.glade.h:7
+#: ../src/empathy-preferences.ui.h:7
msgid "Automatically _connect on startup "
-msgstr "ਸ਼ੁਰੂ ਸਮੇਂ ਸਵੈ-ਚਾਲਤ ਜੋੜੋ(_c)"
+msgstr "ਸ਼ੁਰੂ ਸਮੇਂ ਆਟੋਮੈਟਿਕ ਹੀ ਕੁਨੈਕਟ ਕਰੋ(_c)"
-#: ../src/empathy-preferences.glade.h:8
+#: ../src/empathy-preferences.ui.h:8
msgid "Avatars are user chosen images shown in the contact list"
msgstr "ਅਵਤਾਰ ਯੂਜ਼ਰਾਂ ਲਈ ਸੰਪਰਕ ਸੂਚੀ ਵਿੱਚੋਂ ਚੁਣੇ ਚਿੱਤਰ ਹਨ"
-#: ../src/empathy-preferences.glade.h:9
+#: ../src/empathy-preferences.ui.h:9
msgid "Chat Th_eme:"
-msgstr "ਗੱਲਬਾਤ ਸਰੂਪ(_e):"
+msgstr "ਗੱਲਬਾਤ ਥੀਮ(_e):"
-#: ../src/empathy-preferences.glade.h:10
+#: ../src/empathy-preferences.ui.h:10
msgid "Disable notifications when _away or busy"
msgstr "ਜਦੋਂ ਦੂਰ ਜਾਂ ਰੁੱਝੇ ਹੋਵੇ ਤਾਂ ਸੂਚਨਾਵਾਂ ਬੰਦ ਰੱਖੋ(_a)"
-#: ../src/empathy-preferences.glade.h:11
+#: ../src/empathy-preferences.ui.h:11
msgid "Disable sounds when _away or busy"
msgstr "ਜਦੋਂ ਦੂਰ ਜਾਂ ਰੁਝੇ ਹੋਣ ਤਾਂ ਧੁਨੀ ਬੰਦ ਰੱਖੋ(_a)"
-#: ../src/empathy-preferences.glade.h:12
+#: ../src/empathy-preferences.ui.h:12
msgid "Enable notifications when the _chat is not focused"
msgstr "ਜਦੋਂ ਗੱਲਬਾਤ ਕੇਂਦਰਿਤ ਨਾ ਹੋਵੇ ਤਾਂ ਸੂਚਨਾਵਾਂ ਚਾਲੂ(_c)"
-#: ../src/empathy-preferences.glade.h:13
+#: ../src/empathy-preferences.ui.h:13
msgid "General"
msgstr "ਆਮ"
-#: ../src/empathy-preferences.glade.h:14
+#: ../src/empathy-preferences.ui.h:14
msgid "Notifications"
msgstr "ਸੂਚਨਾਵਾਂ"
-#: ../src/empathy-preferences.glade.h:15
+#: ../src/empathy-preferences.ui.h:15
msgid "Preferences"
msgstr "ਪਸੰਦ"
-#: ../src/empathy-preferences.glade.h:16
+#: ../src/empathy-preferences.ui.h:16
msgid "Show _avatars"
msgstr "ਅਵਤਾਰ ਵੇਖੋ(_a)"
-#: ../src/empathy-preferences.glade.h:17
+#: ../src/empathy-preferences.ui.h:17
msgid "Show _smileys as images"
msgstr "ਖੁਸ਼ ਚਿੱਤਰਾਂ ਵਾਂਗ ਵੇਖੋ(_s)"
-#: ../src/empathy-preferences.glade.h:18
+#: ../src/empathy-preferences.ui.h:18
msgid "Show co_mpact contact list"
msgstr "ਸੰਖੇਪ ਸੰਪਰਕ ਸੂਚੀ ਵੇਖੋ(_m)"
-#: ../src/empathy-preferences.glade.h:19
+#: ../src/empathy-preferences.ui.h:19
msgid "Sort by _name"
msgstr "ਨਾਂ ਨਾਲ ਲੜੀਬੱਧ(_n)"
-#: ../src/empathy-preferences.glade.h:20
+#: ../src/empathy-preferences.ui.h:20
msgid "Sort by s_tate"
msgstr "ਹਾਲਤ ਨਾਲ ਲੜੀਬੱਧ(_t)"
-#: ../src/empathy-preferences.glade.h:21
+#: ../src/empathy-preferences.ui.h:21
msgid "Sounds"
msgstr "ਧੁਨੀ"
-#: ../src/empathy-preferences.glade.h:22
+#: ../src/empathy-preferences.ui.h:22
msgid "Spell Checking"
msgstr "ਸ਼ਬਦਜੋੜ ਜਾਂਚ"
-#: ../src/empathy-preferences.glade.h:23
+#: ../src/empathy-preferences.ui.h:23
msgid "Themes"
-msgstr "ਸਰੂਪ"
+msgstr "ਥੀਮ"
-#: ../src/empathy-preferences.glade.h:24
+#: ../src/empathy-preferences.ui.h:24
msgid "_Enable bubble notifications"
msgstr "ਬੁਲਬੁਲਾ ਸੂਚਨਾ ਚਾਲੂ(_E)"
-#: ../src/empathy-preferences.glade.h:25
+#: ../src/empathy-preferences.ui.h:25
msgid "_Enable sound notifications"
msgstr "ਧੁਨੀ ਸੂਚਨਾ ਚਾਲੂ(_E)"
-#: ../src/empathy-preferences.glade.h:26
+#: ../src/empathy-preferences.ui.h:26
msgid "_Open new chats in separate windows"
-msgstr "ਨਵੀਆਂ ਗੱਲਾਬਾਤਾਂ ਨਵੇਂ ਝਰੋਖਿਆਂ ਵਿੱਚ ਖੋਲ੍ਹੋ(_O)"
+msgstr "ਨਵੀਆਂ ਗੱਲਾਬਾਤਾਂ ਵੱਖ ਵੱਖ ਵਿੰਡੋ ਵਿੱਚ ਖੋਲ੍ਹੋ(_O)"
-#: ../src/empathy-status-icon.glade.h:1
+#: ../src/empathy-status-icon.ui.h:1
msgid "Status"
msgstr "ਹਾਲਤ"
-#: ../src/empathy-status-icon.glade.h:3
+#: ../src/empathy-status-icon.ui.h:3
msgid "_Quit"
msgstr "ਬੰਦ ਕਰੋ(_Q)"
-#: ../src/empathy-status-icon.glade.h:4
+#: ../src/empathy-status-icon.ui.h:4
msgid "_Show Contact List"
msgstr "ਸੰਪਰਕ ਸੂਚੀ ਵੇਖੋ(_S)"
-#: ../src/empathy-tube-dispatch.c:356
+#: ../src/empathy-tube-dispatch.c:375
#, c-format
msgid "Unable to start application for service %s: %s"
-msgstr "%s ਸਰਵਿਸ ਲਈ ਕਾਰਜ ਖੋਲ੍ਹਣ ਲਈ ਅਸਮਰੱਥ: %s"
+msgstr "%s ਸਰਵਿਸ ਲਈ ਐਪਲੀਕੇਸ਼ਨ ਖੋਲ੍ਹਣ ਲਈ ਅਸਮਰੱਥ: %s"
-#: ../src/empathy-tube-dispatch.c:427
+#: ../src/empathy-tube-dispatch.c:446
#, c-format
msgid ""
"An invitation was offered for service %s, but you don't have the needed "
"application to handle it"
msgstr "ਸਰਵਿਸ %s ਲਈ ਸੱਦਾ ਦਿੱਤਾ ਗਿਆ ਸੀ, ਪਰ ਤੁਹਾਡੇ ਕੋਲ ਇਸ ਨੂੰ ਵਰਤਣ ਲਈ ਕਾਰਜ ਨਹੀਂ ਹੈ।"
+#: ../src/empathy-call-window-fullscreen.ui.h:1
+msgid "gtk-leave-fullscreen"
+msgstr "gtk-leave-fullscreen"
+
+#: ../src/empathy-map-view.ui.h:1
+#| msgid "Contact List"
+msgid "Contact Map View"
+msgstr "ਸੰਪਰਕ ਮੈਪ ਝਲਕ"
+
+#~ msgid "Forget password and clear the entry."
+#~ msgstr "ਪਾਸਵਰਡ ਭੁੱਲੋ ਅਤੇ ਐਂਟਰੀ ਸਾਫ਼ ਕਰੋ।"
+
+#~ msgid "Create a new IRC network"
+#~ msgstr "ਇੱਕ ਨਵਾਂ IRC ਨੈੱਟਵਰਕ ਬਣਾਓ"
+
+#~ msgid "Edit the selected IRC network"
+#~ msgstr "ਚੁਣੇ IRC ਨੈੱਟਵਰਕ ਸੋਧੋ"
+
+#~ msgid "Remove the selected IRC network"
+#~ msgstr "ਚੁਣਿਆ IRC ਨੈਟਵਰਕ ਹਟਾਓ"
+
+#~ msgid "_Check Word Spelling..."
+#~ msgstr "ਸ਼ਬਦ ਜੋੜ ਜਾਂਚ ਕਰੋ(_C)..."
+
+#~ msgid "Group Chat"
+#~ msgstr "ਗਰੁੱਪ ਚੈੱਟ"
+
+#~ msgid "Contact Information"
+#~ msgstr "ਸੰਪਰਕ ਜਾਣਕਾਰੀ"
+
+#~ msgid "I would like to add you to my contact list."
+#~ msgstr "ਮੈਂ ਤੁਹਾਨੂੰ ਆਪਣੀ ਸੰਪਰਕ ਸੂਚੀ 'ਚ ਸ਼ਾਮਲ ਕਰਨਾ ਚਾਹੁੰਦਾ ਹਾਂ।"
+
+#~ msgid "Sorry, I don't want you in my contact list anymore."
+#~ msgstr "ਅਫਸੋਸ ਹੈ, ਪਰ ਮੈਂ ਤੁਹਾਨੂੰ ਆਪਣੀ ਸੰਪਰਕ ਸੂਚੀ ਵਿੱਚ ਨਹੀਂ ਰੱਖਣਾ ਚਾਹੁੰਦਾ।"
+
+#~ msgid "Contact information"
+#~ msgstr "ਸੰਪਰਕ ਜਾਣਕਾਰੀ"
+
+#~ msgid "Message:"
+#~ msgstr "ਸੁਨੇਹਾ:"
+
+#~ msgid "Word"
+#~ msgstr "ਸ਼ਬਦ"
+
+#~ msgid "Suggestions for the word"
+#~ msgstr "ਸ਼ਬਦ ਲਈ ਸੁਝਾਅ"
+
+#~ msgid "Spell Checker"
+#~ msgstr "ਸ਼ਬਦ-ਜੋੜ ਜਾਂਚਕਾਰ"
+
+#~ msgid "Suggestions for the word:"
+#~ msgstr "ਸ਼ਬਦ ਲਈ ਸੁਝਾਅ:"
+
+#~ msgid "C_lear"
+#~ msgstr "ਸਾਫ਼ ਕਰੋ(_l)"
+
+#~ msgid "Chat"
+#~ msgstr "ਗੱਲਬਾਤ"
+
+#~ msgid "Insert _Smiley"
+#~ msgstr "ਬੰਦਾ-ਖੁਸ਼ ਸ਼ਾਮਲ(_S)"
+
+#~ msgid "Invitation _message:"
+#~ msgstr "ਸੱਦਾ ਸੁਨੇਹਾ(_m):"
+
+#~ msgid "Invite"
+#~ msgstr "ਸੱਦਾ"
+
+#~ msgid "Move Tab _Left"
+#~ msgstr "ਟੈਬ ਖੱਬੇ ਭੇਜੋ(_L)"
+
+#~ msgid "Move Tab _Right"
+#~ msgstr "ਟੈਬ ਸੱਜੇ ਭੇਜੋ(_R)"
+
+#~ msgid "Select who would you like to invite:"
+#~ msgstr "ਚੁਣੋ, ਕਿ ਕਿਸ ਨੂੰ ਤੁਸੀਂ ਸੱਦਾ ਚਾਹੁੰਦੇ ਹੋ:"
+
+#~ msgid "You have been invited to join a chat conference."
+#~ msgstr "ਤੁਹਾਨੂੰ ਇੱਕ ਗੱਲਬਾਤ ਕਨਫਰੰਸ ਜੁਆਇੰਨ ਕਰਨ ਲਈ ਸੱਦਾ ਹੈ।"
+
+#~ msgid "_Contact"
+#~ msgstr "ਸੰਪਰਕ(_C)"
+
+#~ msgid "_Conversation"
+#~ msgstr "ਗੱਲਬਾਤ(_C)"
+
+#~ msgid "_Detach Tab"
+#~ msgstr "ਟੈਬ ਵੱਖ ਕਰੋ(_D)"
+
+#~ msgid "_Favorite Chatroom"
+#~ msgstr "ਪਸੰਦੀਦਾ ਗੱਲਬਾਤ-ਰੂਮ(_F)"
+
+#~ msgid "_Next Tab"
+#~ msgstr "ਅਗਲੀ ਟੈਬ(_N)"
+
+#~ msgid "_Previous Tab"
+#~ msgstr "ਪਿਛਲੀ ਟੈਬ(_P)"
+
+#~ msgid "_Tabs"
+#~ msgstr "ਟੈਬਾਂ(_T)"
+
+#~ msgid "Edit Favorite Room"
+#~ msgstr "ਪਸੰਦੀਦਾ ਰੂਮ ਸੋਧ"
+
+#~ msgid "Join room on start_up"
+#~ msgstr "ਸ਼ੁਰੂ ਸਮੇਂ ਰੂਮ ਵਿੱਚ ਦਾਖਲ ਕਰੋ(_u)"
+
+#~ msgid "Join this chat room when Empathy starts and you are connected"
+#~ msgstr "ਇਹ ਗੱਲਬਾਤ ਰੂਮ ਜੁਆਇੰਨ ਕਰੋ, ਜਦੋਂ ਇੰਪੈਂਥੀ ਸ਼ੁਰੂ ਹੋਵੇ ਅਤੇ ਤੁਸੀਂ ਜੁੜੇ ਹੋਏ ਹੋਵੋ"
+
+#~ msgid "N_ame:"
+#~ msgstr "ਨਾਂ(_a):"
+
+#~ msgid "S_erver:"
+#~ msgstr "ਸਰਵਰ(_e):"
+
+#~ msgid "Join _New..."
+#~ msgstr "ਨਵੇਂ 'ਚ ਦਾਖਲ(_N)..."
+
+#~ msgid "Browse:"
+#~ msgstr "ਝਲਕ:"
+
+#~ msgid "Join"
+#~ msgstr "ਦਾਖਲ"
+
+#~ msgid "Join New"
+#~ msgstr "ਨਵੇਂ 'ਚ ਦਾਖਲ"
+
+#~ msgid "Re_fresh"
+#~ msgstr "ਤਾਜ਼ਾ(_f)"
+
+#~ msgid ""
+#~ "This list represents all chat rooms hosted on the server you have entered."
+#~ msgstr "ਇਹ ਸੂਚੀ ਸਰਵਰ, ਜੋ ਕਿ ਤੁਸੀਂ ਦਿੱਤਾ ਹੈ, ਉੱਤੇ ਦਿੱਤੇ ਸਭ ਗੱਲਬਾਤ ਰੂਮ ਵੇਖਾਉਦੀ ਹੈ।"
diff --git a/po/ta.po b/po/ta.po
new file mode 100644
index 000000000..97719da85
--- /dev/null
+++ b/po/ta.po
@@ -0,0 +1,2122 @@
+# translation of empathy.master.po to Tamil
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+#
+# Dr.T.vasudevan <agnihot3@gmail.com>, 2009.
+msgid ""
+msgstr ""
+"Project-Id-Version: empathy.master\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2009-05-20 13:57+0530\n"
+"PO-Revision-Date: 2009-05-07 21:34+0530\n"
+"Last-Translator: Dr.T.vasudevan <agnihot3@gmail.com>\n"
+"Language-Team: Tamil <Ubuntu-l10n-tam@lists.ubuntu.com>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.11.4\n"
+
+#: ../data/empathy.desktop.in.in.h:1
+msgid "Empathy Instant Messenger"
+msgstr "எம்பதி துரித செய்தியாளர்"
+
+#: ../data/empathy.desktop.in.in.h:2
+msgid "Send and receive instant messages"
+msgstr "செய்திகளை உடனுக்குடன் அனுப்புக மற்றும் பெறுக"
+
+#: ../data/empathy.schemas.in.h:1
+msgid "Always open a separate chat window for new chats."
+msgstr "எப்போதும் புதிய அரட்டைக்கு புதிய சாளரம் திற"
+
+#: ../data/empathy.schemas.in.h:2
+msgid ""
+"Character to add after nickname when using nick completion (tab) in group "
+"chat."
+msgstr "குழு அரட்டையில் செல்லப்பெயர் கீற்றில் செல்லப்பெயருக்குப்பின் சேர்க்க வேண்டிய எழுத்துரு"
+
+#: ../data/empathy.schemas.in.h:3
+msgid "Chat window theme"
+msgstr "அரட்டை சாளர கருத்து"
+
+#: ../data/empathy.schemas.in.h:4
+msgid ""
+"Comma separated list of spell checker languages to use (e.g. en, fr, nl)."
+msgstr ""
+"சொல் திருத்தி மொழிகளை பயன்படுத்த காற் புள்ளியால் பிரித்த பட்டியல் (எ-டு. en, fr, nl)"
+
+#: ../data/empathy.schemas.in.h:5
+msgid "Compact contact list"
+msgstr "அடக்கமான தொடர்பு பட்டியல்"
+
+#: ../data/empathy.schemas.in.h:6
+msgid "Contact list sort criterium"
+msgstr "தொடர்பு பட்டியல் வரிசைப்படுத்த கட்டளை விதி"
+
+#: ../data/empathy.schemas.in.h:7
+msgid "Default directory to select an avatar image from"
+msgstr "அவதாரம் படம் தேந்தெடுக்க முன்னிருப்பு அடைவு"
+
+#: ../data/empathy.schemas.in.h:8
+msgid "Disable popup notifications when away"
+msgstr "வெளியே உள்ள போது துள்ளு அறிவிப்புகளை செயல் நீக்குக"
+
+#: ../data/empathy.schemas.in.h:9
+msgid "Disable sounds when away"
+msgstr "வெளியே உள்ள போது ஒலியை செயல் நீக்குக"
+
+#: ../data/empathy.schemas.in.h:10
+msgid "Empathy default download folder"
+msgstr "எம்பதி முன்னிருப்பு தரவிறக்க அடைவு"
+
+#: ../data/empathy.schemas.in.h:11
+msgid "Empathy has asked about importing accounts"
+msgstr "எம்பதி கணக்குகளை இறக்குமதி செய்ய கேட்கிறது"
+
+#: ../data/empathy.schemas.in.h:12
+msgid "Empathy should auto-connect on startup"
+msgstr "துவங்கும் போது எம்பதி தானியங்கியாக இணைக்க வேண்டும்."
+
+#: ../data/empathy.schemas.in.h:13
+msgid "Empathy should use the avatar of the contact as the chat window icon"
+msgstr ""
+"துவங்கும் போது எம்பதி அரட்டை சாரளத்தில் சின்னமாக தொடர்பின் அவதாரத்தை காட்ட வேண்டும்."
+
+#: ../data/empathy.schemas.in.h:14
+msgid "Enable popup notifications for new messages"
+msgstr "புதிய செய்திகளுக்கு துள்ளு அறிவிப்புகளை செயல்படுத்து "
+
+#: ../data/empathy.schemas.in.h:15
+msgid "Enable spell checker"
+msgstr "சொல் திருத்தியை செயல்படுத்து"
+
+#: ../data/empathy.schemas.in.h:16
+msgid "Hide main window"
+msgstr "முதன்மை சாளரத்தை மறை "
+
+#: ../data/empathy.schemas.in.h:17
+msgid "Hide the main window."
+msgstr "முதன்மை சாளரத்தை மறை "
+
+#: ../data/empathy.schemas.in.h:18
+msgid "NetworkManager should be used"
+msgstr "வலைப்பின்னல் மேலாளரை பயன்படுத்த வேண்டும்"
+
+#: ../data/empathy.schemas.in.h:19
+msgid "Nick completed character"
+msgstr "செல்லப்பெயரை பூர்த்தி செய்யும் எழுத்துரு"
+
+#: ../data/empathy.schemas.in.h:20
+msgid "Open new chats in separate windows"
+msgstr "புதிய அரட்டைகளை தனி சாளரத்தில் திற"
+
+#: ../data/empathy.schemas.in.h:21
+msgid "Play a sound for incoming messages"
+msgstr "உள்வரும் செய்திகளுக்கு ஒலி எழுப்பு"
+
+#: ../data/empathy.schemas.in.h:22
+msgid "Play a sound for new conversations"
+msgstr "உள்வரும் உரையாடல்களுக்கு ஒலி எழுப்பு"
+
+#: ../data/empathy.schemas.in.h:23
+msgid "Play a sound for outgoing messages"
+msgstr "வெளிச்செல்லும் செய்திகளுக்கு ஒலி எழுப்பு"
+
+#: ../data/empathy.schemas.in.h:24
+msgid "Play a sound when a contact logs in"
+msgstr "தொடர்பு உள் நுழைகையில் ஒலி எழுப்பு"
+
+#: ../data/empathy.schemas.in.h:25
+msgid "Play a sound when a contact logs out"
+msgstr "தொடர்பு வெளி செல்கையில் ஒலி எழுப்பு"
+
+#: ../data/empathy.schemas.in.h:26
+msgid "Play a sound when we log in"
+msgstr "நாம் உள் நுழைகையில் ஒலி எழுப்பு"
+
+#: ../data/empathy.schemas.in.h:27
+msgid "Play a sound when we log out"
+msgstr "நாம் வெளி செல்கையில் ஒலி எழுப்பு"
+
+#: ../data/empathy.schemas.in.h:28
+msgid "Popup notifications if the chat isn't focused"
+msgstr "அரட்டை குவிப்பில் இல்லையானால் வெளித்துள்ளல் மூலம் அறிவி"
+
+#: ../data/empathy.schemas.in.h:29
+msgid "Salut account is created"
+msgstr "சாலுட் கணக்கு துவக்கப்பட்டது "
+
+#: ../data/empathy.schemas.in.h:30
+msgid "Show avatars"
+msgstr "அவதாரங்களை காட்டு"
+
+#: ../data/empathy.schemas.in.h:31
+msgid "Show hint about closing the main window"
+msgstr "முதன்மை சாளரத்தை மூடிவது குறித்து குறிப்பு காட்டு "
+
+#: ../data/empathy.schemas.in.h:32
+msgid "Show offline contacts"
+msgstr " வலை தொடர்பில்லாத தொடர்புகளை காட்டு"
+
+#: ../data/empathy.schemas.in.h:33
+msgid "Spell checking languages"
+msgstr "எழுத்துப்பிழை திருத்த மொழி"
+
+#: ../data/empathy.schemas.in.h:34
+msgid "The default folder to save file transfers in."
+msgstr "இடமாற்றிய கோப்புகளை சேமிக்க முன்னிருப்பு அடைவு"
+
+#: ../data/empathy.schemas.in.h:35
+msgid "The last directory that an avatar image was chosen from."
+msgstr "அவதாரம் படம் தேர்ந்தெடுத்த கடைசி அடைவு "
+
+#: ../data/empathy.schemas.in.h:36
+msgid "The theme that is used to display the conversation in chat windows."
+msgstr "அரட்டை சாளரங்களில் உரையாடல்களை காட்ட பயன்படும் கருத்து"
+
+#: ../data/empathy.schemas.in.h:37
+msgid "Use graphical smileys"
+msgstr "வரைகலை சிரிப்பான்களை பயன்படுத்துக"
+
+#: ../data/empathy.schemas.in.h:38
+msgid "Use notification sounds"
+msgstr "அறிவிப்பு ஒலிகளை பயன்படுத்துக"
+
+#: ../data/empathy.schemas.in.h:39
+msgid "Use theme for chat rooms"
+msgstr "அரட்டை அறைகளுக்கு கருத்துக்களை பயன்படுத்துக"
+
+#: ../data/empathy.schemas.in.h:40
+msgid ""
+"Whether or not Empathy has asked about importing accounts from other "
+"programs."
+msgstr ""
+"எம்பதி மற்ற நிரல்களில் இருந்து கணக்குகளை இறக்குமதி செய்வது குறித்து வினவியதா இல்லையா."
+
+#: ../data/empathy.schemas.in.h:41
+msgid ""
+"Whether or not Empathy should automatically log in to your accounts on "
+"startup."
+msgstr "எம்பதி துவங்கும்போது கணக்குகளில் தானியங்கியாக உள்நுழைய வேண்டுமா இல்லையா."
+
+#: ../data/empathy.schemas.in.h:42
+msgid ""
+"Whether or not Empathy should use the avatar of the contact as the chat "
+"window icon."
+msgstr "எம்பதி தொடர்பின் அவதாரத்தை அரட்டை அறை சின்னமாக பயன்படுத்த வேண்டுமா இல்லையா."
+
+#: ../data/empathy.schemas.in.h:43
+msgid ""
+"Whether or not the Salut account has been created on the first Empathy run."
+msgstr "முதல் ஓட்டத்தில் எம்பதி சலூட் கணக்கை உருவாக்கியதா இல்லையா."
+
+#: ../data/empathy.schemas.in.h:44
+msgid ""
+"Whether or not the network manager should be used to automatically "
+"disconnect/reconnect."
+msgstr ""
+"வலைப்பின்னல் மேலாளர் ஐ தானியங்கியாக இணைக்கவும் இணைப்பு விலகவும் பயன்படுத்த வேண்டுமா "
+"இல்லையா"
+
+#: ../data/empathy.schemas.in.h:45
+msgid ""
+"Whether or not to check words typed against the languages you want to check "
+"with."
+msgstr "நீங்கள் விரும்பிய மொழிகளில் உள்ளிட்ட சொற்களை சோதிக்க வேண்டுமா இல்லையா?"
+
+#: ../data/empathy.schemas.in.h:46
+msgid ""
+"Whether or not to convert smileys into graphical images in conversations."
+msgstr "உரையாடல்களில் சிரிப்பான்களை வரைகலை படங்களாக மாற்ற வேண்டுமா இல்லையா?"
+
+#: ../data/empathy.schemas.in.h:47
+msgid ""
+"Whether or not to play a sound to notify for contacts logging in the network."
+msgstr "வலைப்பின்னலில் தொடர்புகள் உள்நுழையும் போது ஒலியை எழுப்ப வேண்டுமா இல்லையா?"
+
+#: ../data/empathy.schemas.in.h:48
+msgid ""
+"Whether or not to play a sound to notify for contacts logging off the "
+"network."
+msgstr "வலைப்பின்னலில் தொடர்புகள் வெளிச்செல்லும் போது ஒலியை எழுப்ப வேண்டுமா இல்லையா?"
+
+#: ../data/empathy.schemas.in.h:49
+msgid "Whether or not to play a sound to notify for events."
+msgstr "நிகழ்வுகள் போது ஒலியை எழுப்ப வேண்டுமா இல்லையா?"
+
+#: ../data/empathy.schemas.in.h:50
+msgid "Whether or not to play a sound to notify for incoming messages."
+msgstr "செய்திகள் உள்வரும் போது ஒலியை எழுப்ப வேண்டுமா இல்லையா?"
+
+#: ../data/empathy.schemas.in.h:51
+msgid "Whether or not to play a sound to notify for new conversations."
+msgstr "புதிய உரையாடல்கள் போது ஒலியை எழுப்ப வேண்டுமா இல்லையா?"
+
+#: ../data/empathy.schemas.in.h:52
+msgid "Whether or not to play a sound to notify for outgoing messages."
+msgstr "செய்திகள் வெளிச்செல்லும் போது ஒலியை எழுப்ப வேண்டுமா இல்லையா?"
+
+#: ../data/empathy.schemas.in.h:53
+msgid "Whether or not to play a sound when logging in a network."
+msgstr "வலைப்பின்னலில் உள்நுழையும் போது ஒலி இயக்க வேண்டுமா இல்லையா?"
+
+#: ../data/empathy.schemas.in.h:54
+msgid "Whether or not to play a sound when logging off a network."
+msgstr "வலைப்பின்னலில் வெளிச்செல்லும் போது ஒலி இயக்க வேண்டுமா இல்லையா?"
+
+#: ../data/empathy.schemas.in.h:55
+msgid "Whether or not to play sound notifications when away or busy."
+msgstr "வெளியே அல்லது வேலையாக உள்ள போது ஒலி அறிக்கைகளை இயக்க வேண்டுமா இல்லையா?"
+
+#: ../data/empathy.schemas.in.h:56
+msgid ""
+"Whether or not to show a popup notification when receiving a new message "
+"even if the chat is already opened, but not focused."
+msgstr ""
+"புதிய செய்தி ஒன்று வரும்போது அரட்டை திறந்து இருந்து குவிப்பில் இல்லாவிட்டாலும் துள்ளு "
+"அறிக்கையை காட்ட வேண்டுமா இல்லையா?"
+
+#: ../data/empathy.schemas.in.h:57
+msgid ""
+"Whether or not to show a popup notification when receiving a new message."
+msgstr "புதிய செய்தி ஒன்று வரும்போது துள்ளு அறிக்கையை காட்ட வேண்டுமா இல்லையா?"
+
+#: ../data/empathy.schemas.in.h:58
+msgid ""
+"Whether or not to show avatars for contacts in the contact list and chat "
+"windows."
+msgstr "அரட்டை பட்டியலிலும் தொடர்பு பட்டியலிலும் அவதாரங்களை காட்ட வேண்டுமா இல்லையா?"
+
+#: ../data/empathy.schemas.in.h:59
+msgid "Whether or not to show contacts that are offline in the contact list."
+msgstr "தொடர்பு பட்டியலிலும் இணைப்பில் இல்லாத தொடர்புகளை காட்ட வேண்டுமா இல்லையா?"
+
+#: ../data/empathy.schemas.in.h:60
+msgid "Whether or not to show popup notifications when away or busy."
+msgstr "வெளியே அல்லது வேலையாக உள்ள போது துள்ளு அறிக்கைகளை காட்ட வேண்டுமா இல்லையா?"
+
+#: ../data/empathy.schemas.in.h:61
+msgid ""
+"Whether or not to show the message dialog about closing the main window with "
+"the 'x' button in the title bar."
+msgstr ""
+"தலைப்பு பட்டியில் x பொத்தானால் முதன்மை சாளரத்தை மூடுவதை குறித்த உரையாடலை காட்ட "
+"வேண்டுமா இல்லையா?"
+
+#: ../data/empathy.schemas.in.h:62
+msgid "Whether to show the contact list in compact mode or not."
+msgstr "அடக்கப்பாங்கில் தொடர்பு பட்டியலை காட்ட வேண்டுமா இல்லையா?"
+
+#: ../data/empathy.schemas.in.h:63
+msgid "Whether to use the theme for chat rooms or not."
+msgstr "அரட்டை அறைகளில் கருத்துக்களை பயன்படுத்த வேண்டுமா இல்லையா?"
+
+#: ../data/empathy.schemas.in.h:64
+msgid ""
+"Which criterium to use when sorting the contact list. Default is to use sort "
+"by the contact's name with the value \"name\". A value of \"state\" will "
+"sort the contact list by state."
+msgstr ""
+"தொடர்பு பட்டியல் ஐ வரிசைப்படுத்தும் போது பயன்படுத்த நிபந்தனைகள். முன்னிருப்பு தொடர்பு "
+"பெயர் மதிப்பு \"பெயர்\". \"நிலை\" என்ற மதிப்பு தொடர்பை நிலையை பொருத்து "
+"வரிசைப்படுத்தும்."
+
+#: ../libempathy/empathy-tp-contact-list.c:727 ../src/empathy.c:278
+msgid "People nearby"
+msgstr "அருகில் உள்ள மக்கள்"
+
+#: ../libempathy/empathy-utils.c:251
+msgid "Available"
+msgstr "இருப்பவை"
+
+#: ../libempathy/empathy-utils.c:253
+msgid "Busy"
+msgstr "வேலையில்"
+
+#: ../libempathy/empathy-utils.c:256
+msgid "Away"
+msgstr "வெளியில்"
+
+#: ../libempathy/empathy-utils.c:258
+msgid "Hidden"
+msgstr "மறைந்துள்ள"
+
+#: ../libempathy/empathy-utils.c:261
+msgid "Offline"
+msgstr "இணைப்பு விலகி"
+
+#: ../libempathy-gtk/empathy-account-chooser.c:419
+msgid "All"
+msgstr "அனைத்து"
+
+#: ../libempathy-gtk/empathy-account-widget.c:302
+#: ../libempathy-gtk/empathy-account-widget.c:349
+#, c-format
+msgid "%s:"
+msgstr "%s:"
+
+#: ../libempathy-gtk/empathy-account-widget-aim.ui.h:1
+#: ../libempathy-gtk/empathy-account-widget-generic.ui.h:1
+#: ../libempathy-gtk/empathy-account-widget-groupwise.ui.h:1
+#: ../libempathy-gtk/empathy-account-widget-icq.ui.h:1
+#: ../libempathy-gtk/empathy-account-widget-jabber.ui.h:1
+#: ../libempathy-gtk/empathy-account-widget-msn.ui.h:1
+#: ../libempathy-gtk/empathy-account-widget-salut.ui.h:1
+#: ../libempathy-gtk/empathy-account-widget-sip.ui.h:1
+#: ../libempathy-gtk/empathy-account-widget-yahoo.ui.h:1
+msgid "<b>Advanced</b>"
+msgstr "<b> மேம்பட்ட</b>"
+
+#: ../libempathy-gtk/empathy-account-widget-aim.ui.h:2
+#: ../libempathy-gtk/empathy-account-widget-groupwise.ui.h:3
+#: ../libempathy-gtk/empathy-account-widget-icq.ui.h:3
+#: ../libempathy-gtk/empathy-account-widget-jabber.ui.h:4
+#: ../libempathy-gtk/empathy-account-widget-msn.ui.h:3
+#: ../libempathy-gtk/empathy-account-widget-sip.ui.h:4
+#: ../libempathy-gtk/empathy-account-widget-yahoo.ui.h:2
+msgid "Pass_word:"
+msgstr "(_w) கடவுச்சொல்:"
+
+#: ../libempathy-gtk/empathy-account-widget-aim.ui.h:3
+msgid "Screen _Name:"
+msgstr "(_N) திரை பெயர்:"
+
+#: ../libempathy-gtk/empathy-account-widget-aim.ui.h:4
+#: ../libempathy-gtk/empathy-account-widget-groupwise.ui.h:4
+#: ../libempathy-gtk/empathy-account-widget-icq.ui.h:5
+#: ../libempathy-gtk/empathy-account-widget-jabber.ui.h:10
+#: ../libempathy-gtk/empathy-account-widget-msn.ui.h:4
+#: ../libempathy-gtk/empathy-account-widget-yahoo.ui.h:7
+msgid "_Port:"
+msgstr "_P துறை:"
+
+#: ../libempathy-gtk/empathy-account-widget-aim.ui.h:5
+#: ../libempathy-gtk/empathy-account-widget-groupwise.ui.h:5
+#: ../libempathy-gtk/empathy-account-widget-icq.ui.h:6
+#: ../libempathy-gtk/empathy-account-widget-jabber.ui.h:11
+#: ../libempathy-gtk/empathy-account-widget-msn.ui.h:5
+#: ../libempathy-gtk/empathy-account-widget-yahoo.ui.h:9
+#: ../src/empathy-new-chatroom-dialog.ui.h:8
+msgid "_Server:"
+msgstr "(_S) சேவையகம்:"
+
+#: ../libempathy-gtk/empathy-account-widget-groupwise.ui.h:2
+#: ../libempathy-gtk/empathy-account-widget-jabber.ui.h:3
+#: ../libempathy-gtk/empathy-account-widget-msn.ui.h:2
+msgid "Login I_D:"
+msgstr "உள்நுழை அடையாளம் (_D):"
+
+#: ../libempathy-gtk/empathy-account-widget-icq.ui.h:2
+msgid "ICQ _UIN:"
+msgstr "(_U) ஐசிக்யூ (ICQ) யுஐஎன்:"
+
+#: ../libempathy-gtk/empathy-account-widget-icq.ui.h:4
+#: ../libempathy-gtk/empathy-account-widget-yahoo.ui.h:5
+msgid "_Charset:"
+msgstr "(_C) எழுத்துருதொகுதி:"
+
+#: ../libempathy-gtk/empathy-account-widget-irc.c:241
+msgid "New Network"
+msgstr "புதிய வலையமைப்பு"
+
+#: ../libempathy-gtk/empathy-account-widget-irc.ui.h:1
+msgid "<b>Network</b>"
+msgstr "<b>பிணையம்</b>"
+
+#: ../libempathy-gtk/empathy-account-widget-irc.ui.h:2
+msgid "<b>Servers</b>"
+msgstr "<b> சேவையகங்கள்</b>"
+
+#: ../libempathy-gtk/empathy-account-widget-irc.ui.h:3
+msgid "Charset:"
+msgstr "எழுத்துருதொகுதி:"
+
+#: ../libempathy-gtk/empathy-account-widget-irc.ui.h:4
+msgid "Network"
+msgstr "வலையமைப்பு"
+
+#: ../libempathy-gtk/empathy-account-widget-irc.ui.h:5
+msgid "Network:"
+msgstr "பிணையம்:"
+
+#: ../libempathy-gtk/empathy-account-widget-irc.ui.h:6
+msgid "Nickname:"
+msgstr "புனைப்பெயர்:"
+
+#: ../libempathy-gtk/empathy-account-widget-irc.ui.h:7
+msgid "Password:"
+msgstr "கடவுச்சொல்:"
+
+#: ../libempathy-gtk/empathy-account-widget-irc.ui.h:8
+msgid "Quit message:"
+msgstr "வெளிச்செல் செய்திகள்:"
+
+#: ../libempathy-gtk/empathy-account-widget-irc.ui.h:9
+msgid "Real name:"
+msgstr "உண்மையான பெயர்:"
+
+#: ../libempathy-gtk/empathy-account-widget-jabber.ui.h:2
+msgid "<b>Override server settings</b>"
+msgstr "<b>சேவையக அமைப்பை உதாசீனம் செய்</b>"
+
+#: ../libempathy-gtk/empathy-account-widget-jabber.ui.h:5
+msgid "Pri_ority:"
+msgstr "(_o) முக்கியத்துவம்"
+
+#: ../libempathy-gtk/empathy-account-widget-jabber.ui.h:6
+msgid "Reso_urce:"
+msgstr "(_u) மூலவளம்"
+
+#: ../libempathy-gtk/empathy-account-widget-jabber.ui.h:7
+msgid "Use old SS_L"
+msgstr "(_L) பழைய எஸ்எஸ்எல் "
+
+#: ../libempathy-gtk/empathy-account-widget-jabber.ui.h:8
+msgid "_Encryption required (TLS/SSL)"
+msgstr "(_E) மறையாக்கம் அவசியம் (டிஎல்எஸ்/எஸ்எஸ்எல்)"
+
+#: ../libempathy-gtk/empathy-account-widget-jabber.ui.h:9
+msgid "_Ignore SSL certificate errors"
+msgstr "எஸ்எஸ்எல் சான்றிதழ்கள் பிழைகளை தவிர் "
+
+#: ../libempathy-gtk/empathy-account-widget-salut.ui.h:2
+msgid "_Email:"
+msgstr "(_E) மின்னஞ்சல்:"
+
+#: ../libempathy-gtk/empathy-account-widget-salut.ui.h:3
+msgid "_First Name:"
+msgstr "(_F) முதல் பெயர்:"
+
+#: ../libempathy-gtk/empathy-account-widget-salut.ui.h:4
+msgid "_Jabber ID:"
+msgstr "(_J) ஜப்பார் ஐடி (ID):"
+
+#: ../libempathy-gtk/empathy-account-widget-salut.ui.h:5
+msgid "_Last Name:"
+msgstr "(_L) கடைசி பெயர்:"
+
+#: ../libempathy-gtk/empathy-account-widget-salut.ui.h:6
+msgid "_Nickname:"
+msgstr "(_N) புனைப்பெயர்:"
+
+#: ../libempathy-gtk/empathy-account-widget-salut.ui.h:7
+msgid "_Published Name:"
+msgstr "(_P) வெளியிட்ட பெயர்:"
+
+#. look up the DNS SRV record at the service's domain for the host name of a STUN server.
+#: ../libempathy-gtk/empathy-account-widget-sip.ui.h:3
+msgid "Discover STUN"
+msgstr "ஸ்டன் ஐ காணுங்கள்"
+
+#: ../libempathy-gtk/empathy-account-widget-sip.ui.h:5
+msgid "STUN Server:"
+msgstr "ஸ்டன் சேவையகம்:"
+
+#: ../libempathy-gtk/empathy-account-widget-sip.ui.h:6
+msgid "STUN port:"
+msgstr "ஸ்டன் துறை:"
+
+#: ../libempathy-gtk/empathy-account-widget-sip.ui.h:7
+msgid "_Username:"
+msgstr "(_U) பயனர் பெயர்:"
+
+#: ../libempathy-gtk/empathy-account-widget-yahoo.ui.h:3
+msgid "Use _Yahoo Japan"
+msgstr "(_Y) யாகூ ஜப்பான் ஐ பயன்படுத்துக"
+
+#: ../libempathy-gtk/empathy-account-widget-yahoo.ui.h:4
+msgid "Yahoo I_D:"
+msgstr "(_I) யாகூ ஐடி:"
+
+#: ../libempathy-gtk/empathy-account-widget-yahoo.ui.h:6
+msgid "_Ignore conference and chatroom invitations"
+msgstr "அரட்டை அறை மற்றும் கலந்துரையாடல் அழைப்புகளை தவிர்"
+
+#: ../libempathy-gtk/empathy-account-widget-yahoo.ui.h:8
+msgid "_Room List locale:"
+msgstr "(_R) அறை பட்டியல் உள்ளமைவு:"
+
+#: ../libempathy-gtk/empathy-avatar-chooser.c:449
+#: ../libempathy-gtk/empathy-avatar-chooser.c:525
+msgid "Couldn't convert image"
+msgstr "படத்தை மாற்ற முடியவில்லை"
+
+#: ../libempathy-gtk/empathy-avatar-chooser.c:450
+msgid "None of the accepted image formats is supported on your system"
+msgstr "உங்கள் கணினியில் எந்த ஒப்புக்கொண்ட பட ஒழுங்கும் ஆதரிக்கப்படவில்லை"
+
+#: ../libempathy-gtk/empathy-avatar-chooser.c:933
+msgid "Select Your Avatar Image"
+msgstr "உங்க அவதார படத்தை தேர்வு செய்க"
+
+#: ../libempathy-gtk/empathy-avatar-chooser.c:936
+msgid "No Image"
+msgstr "படம் இல்லை"
+
+#: ../libempathy-gtk/empathy-avatar-chooser.c:998
+msgid "Images"
+msgstr "பிம்பங்கள்"
+
+#: ../libempathy-gtk/empathy-avatar-chooser.c:1002
+msgid "All Files"
+msgstr "அனைத்து கோப்புகள்"
+
+#: ../libempathy-gtk/empathy-avatar-image.c:324
+msgid "Click to enlarge"
+msgstr "பெரியதாக்க சொடுக்குக"
+
+#: ../libempathy-gtk/empathy-chat.c:178
+msgid "Failed to reconnect this chat"
+msgstr "இந்த அரட்டைக்கு மீள் இணைப்பு தோற்றது "
+
+#: ../libempathy-gtk/empathy-chat.c:396
+msgid "Unsupported command"
+msgstr "ஆதரவில்லாத கட்டளை"
+
+#: ../libempathy-gtk/empathy-chat.c:531
+msgid "offline"
+msgstr "இணைப்பு விலகி "
+
+#: ../libempathy-gtk/empathy-chat.c:534
+msgid "invalid contact"
+msgstr "செல்லுபடியாகாத தொடர்பு"
+
+#: ../libempathy-gtk/empathy-chat.c:537
+msgid "permission denied"
+msgstr "அனுமதி மறுக்கப்பட்டது"
+
+#: ../libempathy-gtk/empathy-chat.c:540
+msgid "too long message"
+msgstr "மிக நீள செய்தி"
+
+#: ../libempathy-gtk/empathy-chat.c:543
+msgid "not implemented"
+msgstr "அமுலாக்கவில்லை"
+
+#: ../libempathy-gtk/empathy-chat.c:546
+msgid "unknown"
+msgstr "தெரியாத"
+
+#: ../libempathy-gtk/empathy-chat.c:550
+#, c-format
+msgid "Error sending message '%s': %s"
+msgstr "செய்தி '%s' அனுப்புவதில் பிழை: %s"
+
+#: ../libempathy-gtk/empathy-chat.c:580
+#, c-format
+msgid "Topic set to: %s"
+msgstr "தலைப்பு இதற்கு அமை: %s"
+
+#: ../libempathy-gtk/empathy-chat.c:582
+msgid "No topic defined"
+msgstr "தலைப்பு ஏதும் வரையறுக்கப்படவில்லை"
+
+#: ../libempathy-gtk/empathy-chat.c:951
+msgid "(No Suggestions)"
+msgstr "(பரிந்துரைகள் இல்லை )"
+
+#: ../libempathy-gtk/empathy-chat.c:1005
+msgid "Insert Smiley"
+msgstr "சிரிப்பானை சொருகு"
+
+#. send button
+#: ../libempathy-gtk/empathy-chat.c:1023
+#: ../libempathy-gtk/empathy-ui-utils.c:1507
+msgid "_Send"
+msgstr "அனுப்பு (_S)"
+
+#: ../libempathy-gtk/empathy-chat.c:1057
+msgid "_Spelling Suggestions"
+msgstr "_S எழுத்தாக்க பரிந்துரைகள் "
+
+#: ../libempathy-gtk/empathy-chat.c:1171
+#, c-format
+msgid "%s has joined the room"
+msgstr "%s அறையில் சேர்ந்தார்"
+
+#: ../libempathy-gtk/empathy-chat.c:1174
+#, c-format
+msgid "%s has left the room"
+msgstr "%s அறையில் இருந்து வெளியேறினார்"
+
+#: ../libempathy-gtk/empathy-chat.c:1289 ../src/empathy-call-window.c:889
+msgid "Disconnected"
+msgstr "துண்டிக்கபட்டது"
+
+#: ../libempathy-gtk/empathy-chat.c:1700
+msgid "Connected"
+msgstr "இணைக்கப்பட்டது"
+
+#: ../libempathy-gtk/empathy-chat.c:1750
+#: ../libempathy-gtk/empathy-log-window.c:501
+msgid "Conversation"
+msgstr "உரையாடல்"
+
+#: ../libempathy-gtk/empathy-chat.ui.h:1
+msgid "<b>Topic:</b>"
+msgstr "<b> தலைப்பு</b>"
+
+#: ../libempathy-gtk/empathy-chat-text-view.c:323
+msgid "_Copy Link Address"
+msgstr "இணைப்பு முகவரியை நகலெடு (_C)"
+
+#: ../libempathy-gtk/empathy-chat-text-view.c:331
+msgid "_Open Link"
+msgstr "இணைப்பினை திற (_O)"
+
+#. Translators: timestamp displayed between conversations in
+#. * chat windows (strftime format string)
+#: ../libempathy-gtk/empathy-chat-text-view.c:424
+msgid "%A %B %d %Y"
+msgstr "%A %B %d %Y"
+
+#: ../libempathy-gtk/empathy-contact-dialogs.c:179
+#: ../libempathy-gtk/empathy-contact-dialogs.c:237
+msgid "Edit Contact Information"
+msgstr "தொடர்பின் தகவல் ஐ திருத்து"
+
+#: ../libempathy-gtk/empathy-contact-dialogs.c:288
+msgid "Personal Information"
+msgstr "தனிப்பட்ட தகவல்"
+
+#: ../libempathy-gtk/empathy-contact-dialogs.c:368
+msgid "I would like to add you to my contact list."
+msgstr "உங்களை என் தொடர்பு பட்டியலில் சேர்க்க விரும்புகிறேன்."
+
+#: ../libempathy-gtk/empathy-contact-dialogs.c:392
+msgid "New Contact"
+msgstr "புதிய தொடர்பு"
+
+#: ../libempathy-gtk/empathy-contact-dialogs.ui.h:1
+msgid "Decide _Later"
+msgstr "(_L) பிறகு முடிவு எடுக்கலாம்"
+
+#: ../libempathy-gtk/empathy-contact-dialogs.ui.h:2
+msgid "Subscription Request"
+msgstr "சந்தா வேண்டுதல்"
+
+#: ../libempathy-gtk/empathy-contact-list-view.c:1377
+#, c-format
+msgid "Do you really want to remove the group '%s'?"
+msgstr "நீங்கள் நிச்சயம் குழு '%s' ஐ நீக்க விரும்புகிறீர்களா?"
+
+#: ../libempathy-gtk/empathy-contact-list-view.c:1379
+msgid "Removing group"
+msgstr "குழுவை நீக்குதல்"
+
+#: ../libempathy-gtk/empathy-contact-list-view.c:1426
+#: ../libempathy-gtk/empathy-contact-list-view.c:1505
+msgid "_Remove"
+msgstr "நீக்கவும் (_R)"
+
+#: ../libempathy-gtk/empathy-contact-list-view.c:1456
+#, c-format
+msgid "Do you really want to remove the contact '%s'?"
+msgstr "நீங்கள் நிச்சயம் தொடர்பு '%s' ஐ நீக்க விரும்புகிறீர்களா?"
+
+#: ../libempathy-gtk/empathy-contact-list-view.c:1458
+msgid "Removing contact"
+msgstr "தொடர்பு ஐ நீக்குதல்"
+
+#: ../libempathy-gtk/empathy-contact-list-view.c:1463
+msgid "Sorry, I don't want you in my contact list anymore."
+msgstr "மன்னிக்கவும். மேலும் நீங்கள் தொடர்பு பட்டியலில் இருக்க வேண்டாம்."
+
+#: ../libempathy-gtk/empathy-contact-menu.c:135
+#: ../src/empathy-main-window.ui.h:9
+msgid "_Chat"
+msgstr "_C அரட்டை"
+
+#: ../libempathy-gtk/empathy-contact-menu.c:166
+
+msgctxt "menu item"
+msgid "_Audio Call"
+msgstr "(_A) ஒலி அழைப்பு"
+
+#: ../libempathy-gtk/empathy-contact-menu.c:198
+
+msgctxt "menu item"
+msgid "_Video Call"
+msgstr "(_V) விடியோ அழைப்பு"
+
+#: ../libempathy-gtk/empathy-contact-menu.c:237
+#: ../src/empathy-main-window.ui.h:18
+msgid "_View Previous Conversations"
+msgstr "(_V) முந்தைய உரையாடல்கள் ஐ காண்"
+
+#: ../libempathy-gtk/empathy-contact-menu.c:259
+msgid "Send file"
+msgstr "கோப்பு ஐ அனுப்புக"
+
+#: ../libempathy-gtk/empathy-contact-menu.c:287
+msgid "Infor_mation"
+msgstr "(_m) தகவல்"
+
+#: ../libempathy-gtk/empathy-contact-menu.c:314
+#: ../src/empathy-main-window.ui.h:11
+msgid "_Edit"
+msgstr "திருத்து (_E)"
+
+#: ../libempathy-gtk/empathy-contact-menu.c:372
+msgid "Inviting to this room"
+msgstr "இந்த அறைக்கு அழைப்பு"
+
+#: ../libempathy-gtk/empathy-contact-menu.c:403
+msgid "_Invite to chatroom"
+msgstr "(_I) அரட்டை அறைக்கு அழைப்பு"
+
+#: ../libempathy-gtk/empathy-contact-selector.c:129
+msgid "Select a contact"
+msgstr "ஒரு தொடர்பு ஐ தேர்வு செய்க"
+
+#: ../libempathy-gtk/empathy-contact-widget.c:413
+msgid "Save Avatar"
+msgstr "அவதாரத்தை சேமி"
+
+#: ../libempathy-gtk/empathy-contact-widget.c:469
+msgid "Unable to save avatar"
+msgstr "அவதாரத்தை சேமிக்க முடியவில்லை"
+
+#: ../libempathy-gtk/empathy-contact-widget.c:952
+msgid "Select"
+msgstr "தேர்வு"
+
+#: ../libempathy-gtk/empathy-contact-widget.c:961
+#: ../src/empathy-main-window.c:894
+msgid "Group"
+msgstr "குழு"
+
+#: ../libempathy-gtk/empathy-contact-widget.ui.h:1
+msgid "<b>Client Information</b>"
+msgstr "<b> சார்ந்தோன் தகவல்</b>"
+
+#: ../libempathy-gtk/empathy-contact-widget.ui.h:2
+msgid "<b>Contact Details</b>"
+msgstr "<b>சார்ந்தோன் தொடர்பு விவரங்கள்</b>"
+
+#: ../libempathy-gtk/empathy-contact-widget.ui.h:3
+msgid "<b>Contact</b>"
+msgstr "<b>தொடர்பு</b>"
+
+#: ../libempathy-gtk/empathy-contact-widget.ui.h:4
+msgid "<b>Groups</b>"
+msgstr "<b>குழுக்கள்</b>"
+
+#: ../libempathy-gtk/empathy-contact-widget.ui.h:5
+#: ../libempathy-gtk/empathy-new-message-dialog.ui.h:1
+#: ../src/empathy-chatrooms-window.ui.h:1
+#: ../src/empathy-new-chatroom-dialog.ui.h:1
+msgid "Account:"
+msgstr "கணக்கு:"
+
+#: ../libempathy-gtk/empathy-contact-widget.ui.h:6
+msgid "Alias:"
+msgstr "புனைப்பெயர்:"
+
+#: ../libempathy-gtk/empathy-contact-widget.ui.h:7
+msgid "Birthday:"
+msgstr "பிறந்தநாள்:"
+
+#: ../libempathy-gtk/empathy-contact-widget.ui.h:8
+msgid "Client:"
+msgstr "சார்ந்தோன்:"
+
+#: ../libempathy-gtk/empathy-contact-widget.ui.h:9
+msgid "Email:"
+msgstr "மின்னஞ்சல்:"
+
+#: ../libempathy-gtk/empathy-contact-widget.ui.h:10
+msgid "Fullname:"
+msgstr "முழுப்பெயர்:"
+
+#. Identifier to connect to Instant Messaging network
+#: ../libempathy-gtk/empathy-contact-widget.ui.h:12
+msgid "Identifier:"
+msgstr "இனங்காட்டி:"
+
+#: ../libempathy-gtk/empathy-contact-widget.ui.h:13
+msgid "Information requested..."
+msgstr "தகவல் வேண்டுதல்..."
+
+#: ../libempathy-gtk/empathy-contact-widget.ui.h:14
+msgid "OS:"
+msgstr "OS:"
+
+#: ../libempathy-gtk/empathy-contact-widget.ui.h:15
+msgid ""
+"Select the groups you want this contact to appear in. Note that you can "
+"select more than one group or no groups."
+msgstr ""
+"இந்த தொடர்பு வர வேன்டிய குழுவை தேர்வு செய்க. நீங்கள் ஒன்றுக்கு மேற்பட்ட குழுக்களை தேர்வு "
+"செய்யலாம் அல்லது ஒன்றையும் தேர்வு செய்யாதிருக்கலாம்."
+
+#: ../libempathy-gtk/empathy-contact-widget.ui.h:16
+msgid "Version:"
+msgstr "பதிப்பு:"
+
+#: ../libempathy-gtk/empathy-contact-widget.ui.h:17
+msgid "Web site:"
+msgstr "வலைத்தளம்:"
+
+#: ../libempathy-gtk/empathy-contact-widget.ui.h:18
+msgid "_Add Group"
+msgstr "குழுவை சேர் (_A)"
+
+#: ../libempathy-gtk/empathy-irc-network-dialog.c:283
+msgid "new server"
+msgstr "புதிய சேவையகம்"
+
+#: ../libempathy-gtk/empathy-irc-network-dialog.c:510
+msgid "Server"
+msgstr "சேவையகம்"
+
+#: ../libempathy-gtk/empathy-irc-network-dialog.c:525
+msgid "Port"
+msgstr "துறை"
+
+#: ../libempathy-gtk/empathy-irc-network-dialog.c:538
+msgid "SSL"
+msgstr "எஸ்எஸ்எல்"
+
+#: ../libempathy-gtk/empathy-log-window.c:494
+#: ../src/empathy-import-dialog.c:281
+msgid "Account"
+msgstr "கணக்கு"
+
+#: ../libempathy-gtk/empathy-log-window.c:511
+msgid "Date"
+msgstr "தேதி"
+
+#: ../libempathy-gtk/empathy-log-window.ui.h:1
+msgid "Conversations"
+msgstr "உரையாடல்கள்"
+
+#: ../libempathy-gtk/empathy-log-window.ui.h:2
+msgid "Previous Conversations"
+msgstr "முந்தைய உரையாடல்கள்"
+
+#: ../libempathy-gtk/empathy-log-window.ui.h:3
+msgid "Search"
+msgstr "தேடு"
+
+#: ../libempathy-gtk/empathy-log-window.ui.h:4
+msgid "_For:"
+msgstr "(_F) க்கு:"
+
+#: ../libempathy-gtk/empathy-new-message-dialog.ui.h:2
+msgid "C_all"
+msgstr "(_a) அழை"
+
+#: ../libempathy-gtk/empathy-new-message-dialog.ui.h:3
+msgid "C_hat"
+msgstr "(_h) அரட்டை"
+
+#: ../libempathy-gtk/empathy-new-message-dialog.ui.h:4
+msgid "Contact ID:"
+msgstr "தொடர்பு ஐடி (ID):"
+
+#: ../libempathy-gtk/empathy-new-message-dialog.ui.h:5
+msgid "New Conversation"
+msgstr "புதிய உரையாடல்"
+
+#. COL_STATE_ICON_NAME
+#. COL_STATE
+#. COL_STATUS_TEXT
+#. COL_DISPLAY_MARKUP
+#. COL_STATUS_CUSTOMISABLE
+#. COL_TYPE
+#: ../libempathy-gtk/empathy-presence-chooser.c:169
+msgid "Custom Message..."
+msgstr "தனிப்பயன் செய்தி..."
+
+#: ../libempathy-gtk/empathy-presence-chooser.c:225
+msgid "Edit Custom Messages..."
+msgstr "திருத்து- தனிப்பயன் செய்திகள்..."
+
+#: ../libempathy-gtk/empathy-presence-chooser.c:324
+msgid "Click to remove this status as a favorite"
+msgstr "இந்த நிலை பிடித்த நிலையாக இருப்பதை நீக்க சொடுக்கவும் "
+
+#: ../libempathy-gtk/empathy-presence-chooser.c:333
+msgid "Click to make this status a favorite"
+msgstr "இந்த நிலை பிடித்த நிலையாக ஆக்க சொடுக்கவும் "
+
+#: ../libempathy-gtk/empathy-presence-chooser.c:367
+msgid "Set status"
+msgstr "நிலையை அமை"
+
+#: ../libempathy-gtk/empathy-presence-chooser.c:776
+msgid "Set your presence and current status"
+msgstr "உங்கள் நடப்பு நிலையையும் இருப்பையௌம் அமை "
+
+#. Custom messages
+#: ../libempathy-gtk/empathy-presence-chooser.c:1011
+msgid "Custom messages..."
+msgstr "தனிப்பயன் செய்திகள்..."
+
+#: ../libempathy-gtk/empathy-status-preset-dialog.c:360
+msgid "Enter Custom Message"
+msgstr "தனிப்பயன் செய்தியை உள்ளிடுக"
+
+#: ../libempathy-gtk/empathy-status-preset-dialog.c:482
+msgid "Edit Custom Messages"
+msgstr "தனிப்பயன் செய்திகளை திருத்துக"
+
+#: ../libempathy-gtk/empathy-status-preset-dialog.ui.h:1
+msgid "Add _New Preset"
+msgstr "(_N) புதிய முன்னிருப்பை சேர் "
+
+#: ../libempathy-gtk/empathy-status-preset-dialog.ui.h:2
+msgid "Saved Presets"
+msgstr "சேமிக்கப்பட்ட முன் அமைப்புகள்"
+
+#: ../libempathy-gtk/empathy-status-preset-dialog.ui.h:3
+msgid "gtk-add"
+msgstr "ஜிடிகே-சேர்"
+
+#: ../libempathy-gtk/empathy-status-preset-dialog.ui.h:4
+msgid "gtk-remove"
+msgstr "ஜிடிகே-நீக்கு"
+
+#: ../libempathy-gtk/empathy-theme-manager.c:60
+msgid "Classic"
+msgstr "தொன்மையான"
+
+#: ../libempathy-gtk/empathy-theme-manager.c:61
+msgid "Simple"
+msgstr "எளிய"
+
+#: ../libempathy-gtk/empathy-theme-manager.c:62
+msgid "Clean"
+msgstr "சுத்தமான"
+
+#: ../libempathy-gtk/empathy-theme-manager.c:63
+msgid "Blue"
+msgstr "நீலம்"
+
+#: ../libempathy-gtk/empathy-ui-utils.c:1354
+msgid "Unable to open URI"
+msgstr "யூஆர்ஐ ஐ திறக்க முடியவில்லை"
+
+#: ../libempathy-gtk/empathy-ui-utils.c:1499
+msgid "Select a file"
+msgstr "கோப்பை தேர்வு செய்"
+
+#: ../libempathy-gtk/empathy-ui-utils.c:1535
+msgid "Received an instant message"
+msgstr "ஒரு உடனடி செய்தி கிடைக்கப்பெற்றது"
+
+#: ../libempathy-gtk/empathy-ui-utils.c:1537
+msgid "Sent an instant message"
+msgstr "ஒரு உடனடி செய்தி அனுப்பு"
+
+#: ../libempathy-gtk/empathy-ui-utils.c:1539
+msgid "Incoming chat request"
+msgstr "உள்வரும் அரட்டை வேண்டுதல்"
+
+#: ../libempathy-gtk/empathy-ui-utils.c:1541
+msgid "Contact connected"
+msgstr "தொடர்பு இணைக்கப்பட்டது"
+
+#: ../libempathy-gtk/empathy-ui-utils.c:1543
+msgid "Contact disconnected"
+msgstr "தொடர்பு துண்டிக்கப்பட்டது"
+
+#: ../libempathy-gtk/empathy-ui-utils.c:1545
+msgid "Connected to server"
+msgstr "சேவையகத்துக்கு இணைக்கப்பட்டது"
+
+#: ../libempathy-gtk/empathy-ui-utils.c:1547
+msgid "Disconnected from server"
+msgstr "சேவையகத்துக்கு இணைப்பு துண்டிக்கபட்டது"
+
+#: ../libempathy-gtk/empathy-ui-utils.c:1549
+msgid "Incoming voice call"
+msgstr "உள்வரும் குரல் அழைப்பு"
+
+#: ../libempathy-gtk/empathy-ui-utils.c:1551
+msgid "Outgoing voice call"
+msgstr "வெளி செல்லும் குரல் அழைப்பு"
+
+#: ../libempathy-gtk/empathy-ui-utils.c:1553
+msgid "Voice call ended"
+msgstr "குரல் அழைப்பு முடிந்தது"
+
+#: ../libempathy-gtk/totem-subtitle-encoding.c:158
+msgid "Current Locale"
+msgstr "தற்போதைய மொழி உள்ளமைவு"
+
+#: ../libempathy-gtk/totem-subtitle-encoding.c:161
+#: ../libempathy-gtk/totem-subtitle-encoding.c:163
+#: ../libempathy-gtk/totem-subtitle-encoding.c:165
+#: ../libempathy-gtk/totem-subtitle-encoding.c:167
+msgid "Arabic"
+msgstr "அராபிக்"
+
+#: ../libempathy-gtk/totem-subtitle-encoding.c:170
+msgid "Armenian"
+msgstr "அர்மேனியன்"
+
+#: ../libempathy-gtk/totem-subtitle-encoding.c:173
+#: ../libempathy-gtk/totem-subtitle-encoding.c:175
+#: ../libempathy-gtk/totem-subtitle-encoding.c:177
+msgid "Baltic"
+msgstr "பால்டிக்"
+
+#: ../libempathy-gtk/totem-subtitle-encoding.c:180
+msgid "Celtic"
+msgstr "செல்டிக்"
+
+#: ../libempathy-gtk/totem-subtitle-encoding.c:183
+#: ../libempathy-gtk/totem-subtitle-encoding.c:185
+#: ../libempathy-gtk/totem-subtitle-encoding.c:187
+#: ../libempathy-gtk/totem-subtitle-encoding.c:189
+msgid "Central European"
+msgstr "மத்திய ஐரோப்பா"
+
+#: ../libempathy-gtk/totem-subtitle-encoding.c:192
+#: ../libempathy-gtk/totem-subtitle-encoding.c:194
+#: ../libempathy-gtk/totem-subtitle-encoding.c:196
+#: ../libempathy-gtk/totem-subtitle-encoding.c:198
+msgid "Chinese Simplified"
+msgstr "எளிதாக்கிய சைனிஸ்"
+
+#: ../libempathy-gtk/totem-subtitle-encoding.c:201
+#: ../libempathy-gtk/totem-subtitle-encoding.c:203
+#: ../libempathy-gtk/totem-subtitle-encoding.c:205
+msgid "Chinese Traditional"
+msgstr "சைனிஸ் மரபு"
+
+#: ../libempathy-gtk/totem-subtitle-encoding.c:208
+msgid "Croatian"
+msgstr "குரேஷியன்"
+
+#: ../libempathy-gtk/totem-subtitle-encoding.c:211
+#: ../libempathy-gtk/totem-subtitle-encoding.c:213
+#: ../libempathy-gtk/totem-subtitle-encoding.c:215
+#: ../libempathy-gtk/totem-subtitle-encoding.c:217
+#: ../libempathy-gtk/totem-subtitle-encoding.c:219
+#: ../libempathy-gtk/totem-subtitle-encoding.c:221
+msgid "Cyrillic"
+msgstr "ஸைரிலிக்"
+
+#: ../libempathy-gtk/totem-subtitle-encoding.c:224
+msgid "Cyrillic/Russian"
+msgstr "ஸைரெலிக்/ரசியன்"
+
+#: ../libempathy-gtk/totem-subtitle-encoding.c:227
+#: ../libempathy-gtk/totem-subtitle-encoding.c:229
+msgid "Cyrillic/Ukrainian"
+msgstr "ஸைரெலிக்/யூக்கிரேனியன்"
+
+#: ../libempathy-gtk/totem-subtitle-encoding.c:232
+msgid "Georgian"
+msgstr "ஜியார்ஜியன்"
+
+#: ../libempathy-gtk/totem-subtitle-encoding.c:235
+#: ../libempathy-gtk/totem-subtitle-encoding.c:237
+#: ../libempathy-gtk/totem-subtitle-encoding.c:239
+msgid "Greek"
+msgstr "கிரீக்"
+
+#: ../libempathy-gtk/totem-subtitle-encoding.c:242
+msgid "Gujarati"
+msgstr "குஜராத்தி"
+
+#: ../libempathy-gtk/totem-subtitle-encoding.c:245
+msgid "Gurmukhi"
+msgstr "குர்முகி"
+
+#: ../libempathy-gtk/totem-subtitle-encoding.c:248
+#: ../libempathy-gtk/totem-subtitle-encoding.c:250
+#: ../libempathy-gtk/totem-subtitle-encoding.c:252
+#: ../libempathy-gtk/totem-subtitle-encoding.c:254
+msgid "Hebrew"
+msgstr "ஹீப்ரு"
+
+#: ../libempathy-gtk/totem-subtitle-encoding.c:257
+msgid "Hebrew Visual"
+msgstr "ஹீப்ரு காட்சி"
+
+#: ../libempathy-gtk/totem-subtitle-encoding.c:260
+msgid "Hindi"
+msgstr "ஹிந்தி"
+
+#: ../libempathy-gtk/totem-subtitle-encoding.c:263
+msgid "Icelandic"
+msgstr "ஐஸ்லாண்டிக்"
+
+#: ../libempathy-gtk/totem-subtitle-encoding.c:266
+#: ../libempathy-gtk/totem-subtitle-encoding.c:268
+#: ../libempathy-gtk/totem-subtitle-encoding.c:270
+msgid "Japanese"
+msgstr "ஜப்பானிய"
+
+#: ../libempathy-gtk/totem-subtitle-encoding.c:273
+#: ../libempathy-gtk/totem-subtitle-encoding.c:275
+#: ../libempathy-gtk/totem-subtitle-encoding.c:277
+#: ../libempathy-gtk/totem-subtitle-encoding.c:279
+msgid "Korean"
+msgstr "கொரியன்"
+
+#: ../libempathy-gtk/totem-subtitle-encoding.c:282
+msgid "Nordic"
+msgstr "நோர்டிக்"
+
+#: ../libempathy-gtk/totem-subtitle-encoding.c:285
+msgid "Persian"
+msgstr "பெர்சியன்"
+
+#: ../libempathy-gtk/totem-subtitle-encoding.c:288
+#: ../libempathy-gtk/totem-subtitle-encoding.c:290
+msgid "Romanian"
+msgstr "ரோமானியன்"
+
+#: ../libempathy-gtk/totem-subtitle-encoding.c:293
+msgid "South European"
+msgstr "தெற்கு ஐரோப்பா"
+
+#: ../libempathy-gtk/totem-subtitle-encoding.c:296
+msgid "Thai"
+msgstr "தாய்"
+
+#: ../libempathy-gtk/totem-subtitle-encoding.c:299
+#: ../libempathy-gtk/totem-subtitle-encoding.c:301
+#: ../libempathy-gtk/totem-subtitle-encoding.c:303
+#: ../libempathy-gtk/totem-subtitle-encoding.c:305
+msgid "Turkish"
+msgstr "துருக்கி"
+
+#: ../libempathy-gtk/totem-subtitle-encoding.c:308
+#: ../libempathy-gtk/totem-subtitle-encoding.c:310
+#: ../libempathy-gtk/totem-subtitle-encoding.c:312
+#: ../libempathy-gtk/totem-subtitle-encoding.c:314
+#: ../libempathy-gtk/totem-subtitle-encoding.c:316
+msgid "Unicode"
+msgstr "யூனிக்கோடு"
+
+#: ../libempathy-gtk/totem-subtitle-encoding.c:319
+#: ../libempathy-gtk/totem-subtitle-encoding.c:321
+#: ../libempathy-gtk/totem-subtitle-encoding.c:323
+#: ../libempathy-gtk/totem-subtitle-encoding.c:325
+#: ../libempathy-gtk/totem-subtitle-encoding.c:327
+msgid "Western"
+msgstr "மேற்கு மொழி"
+
+#: ../libempathy-gtk/totem-subtitle-encoding.c:330
+#: ../libempathy-gtk/totem-subtitle-encoding.c:332
+#: ../libempathy-gtk/totem-subtitle-encoding.c:334
+msgid "Vietnamese"
+msgstr "வியட்னாம்"
+
+#.
+#. * vim: sw=2 ts=8 cindent noai bs=2
+#.
+#: ../megaphone/data/GNOME_Megaphone_Applet.schemas.in.h:1
+msgid ""
+"The contact to display in the applet. Empty means no contact is displayed."
+msgstr "சிறுநிரலில் காட்ட வேண்டிய தொடர்பு. காலி எனில் காட்ட தொடர்பு இல்லை"
+
+#: ../megaphone/data/GNOME_Megaphone_Applet.schemas.in.h:2
+msgid "The contact's avatar token. Empty means contact has no avatar."
+msgstr "தொடர்பு அவதார குறிப்பு. வெற்று எனில் தொடர்புக்கு அவதாரம் இல்லை"
+
+#: ../megaphone/data/GNOME_Megaphone_Applet.server.in.in.h:1
+msgid "Megaphone"
+msgstr "ஒலி பெருக்கி"
+
+#: ../megaphone/data/GNOME_Megaphone_Applet.server.in.in.h:2
+#: ../megaphone/src/megaphone-applet.c:527
+msgid "Talk!"
+msgstr "பேசு!"
+
+#: ../megaphone/data/GNOME_Megaphone_Applet.xml.h:1
+#: ../nothere/data/GNOME_NotHere_Applet.xml.h:1
+msgid "_About"
+msgstr "(_A) பற்றி"
+
+#: ../megaphone/data/GNOME_Megaphone_Applet.xml.h:2
+msgid "_Information"
+msgstr "(_I) தகவல்"
+
+#: ../megaphone/data/GNOME_Megaphone_Applet.xml.h:3
+#: ../src/empathy-main-window.ui.h:16
+msgid "_Preferences"
+msgstr "முன்னுரிமைகள் (_P)"
+
+#: ../megaphone/src/megaphone-applet.c:168
+msgid "Please configure a contact."
+msgstr "தயவு செய்து தொடர்பு ஒன்றை அமையுங்கள்"
+
+#: ../megaphone/src/megaphone-applet.c:258
+msgid "Select contact..."
+msgstr "தொடர்பு தேர்வு ..."
+
+#: ../nothere/data/GNOME_NotHere_Applet.server.in.in.h:1
+msgid "Presence"
+msgstr "இருப்பு"
+
+#: ../nothere/data/GNOME_NotHere_Applet.server.in.in.h:2
+#: ../nothere/src/nothere-applet.c:106
+msgid "Set your own presence"
+msgstr "உங்கள் இருப்பை அமைக்கவும்"
+
+#: ../src/empathy.c:437
+msgid "Don't connect on startup"
+msgstr "துவங்கும்போது இணைக்க வேண்டாம்"
+
+#: ../src/empathy.c:441
+msgid "Don't show the contact list on startup"
+msgstr "துவங்கும்போது தொடர்பு பட்டியல் ஐ காட்ட வேண்டாம்"
+
+#: ../src/empathy.c:445
+msgid "Show the accounts dialog"
+msgstr "கணக்குகள் உரையாடல் ஐ காட்டு "
+
+#: ../src/empathy.c:457
+msgid "- Empathy Instant Messenger"
+msgstr "- எம்பதி உடனடி செய்தியாளர்"
+
+#: ../src/empathy-about-dialog.c:83
+msgid ""
+"Empathy is free software; you can redistribute it and/or modify it under the "
+"terms of the GNU General Public License as published by the Free Software "
+"Foundation; either version 2 of the License, or (at your option) any later "
+"version."
+msgstr ""
+"எம்பதி இலவச மென் பொருளாகும். நீங்கள் இலவச மென் பொருள் அமைப்பினால் வெளியிடப்பட்ட ஜிஎன்யு "
+"பொது அனுமதிக்கான இந்த 2ம் பதிப்பு அல்லது அடுத்த பதிப்புகள் விதிகளின் படி நீங்கள் "
+"(விருப்பப்படி) மாற்றலாம். அல்லது மீண்டும் பறிமாறலாம்"
+
+#: ../src/empathy-about-dialog.c:87
+msgid ""
+"Empathy is distributed in the hope that it will be useful, but WITHOUT ANY "
+"WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS "
+"FOR A PARTICULAR PURPOSE. See the GNU General Public License for more "
+"details."
+msgstr ""
+"எம்பதி உபயோகப்படும் என்ற எதிர்பார்ப்புடன் வெளியிடப்படுகிறது. ஆனால் விற்க தகுதி, "
+"குறிப்பிட்ட செயலுக்கான தகுதி உள்பட எந்த உத்திரவாதமும் அளிக்கப்படவில்லை. மேற் கொண்டு "
+"விவரங்களுக்கு ஜிஎன்யு பொது அனுமதிக்கான விதிகளை பார்க்கவும்"
+
+#: ../src/empathy-about-dialog.c:91
+msgid ""
+"You should have received a copy of the GNU General Public License along with "
+"Empathy; if not, write to the Free Software Foundation, Inc., 51 Franklin "
+"Street, Fifth Floor, Boston, MA 02110-130159 USA"
+msgstr ""
+"இந்த எம்பதி நிரலுடன் ஜிஎன்யு பொது அனுமதிக்கான விதிகளின் பிரதி உங்களுக்கு கிடைத்திருக்க "
+"வேண்டும். இல்லையானால் கீழ் கண்ட முகவரிக்கு கடிதம் எழுதவும். Free Software Foundation, "
+"Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA "
+
+#: ../src/empathy-about-dialog.c:119
+msgid "An Instant Messaging client for GNOME"
+msgstr "க்னோமுக்கு ஒரு உடனடி செய்தியாளர் சார்ந்தோன்."
+
+#: ../src/empathy-about-dialog.c:125
+msgid "translator-credits"
+msgstr "மொழிபெயர்ப்பாளர்-நன்றி அறிதல் "
+
+#: ../src/empathy-accounts-dialog.c:391
+msgid "Enabled"
+msgstr "செயலாக்கப்பட்டது"
+
+#: ../src/empathy-accounts-dialog.c:401 ../src/empathy-accounts-dialog.ui.h:4
+msgid "Accounts"
+msgstr "கணக்குகள்"
+
+#. To translator: %s is the protocol name
+#: ../src/empathy-accounts-dialog.c:834
+#, c-format
+msgid "New %s account"
+msgstr "புதிய %s கணக்கு"
+
+#: ../src/empathy-accounts-dialog.c:944
+#, c-format
+msgid ""
+"You are about to remove your %s account!\n"
+"Are you sure you want to proceed?"
+msgstr ""
+"நீங்கள் உங்கள் %s கணக்கை நீக்கப்போகிறீர்கள்!\n"
+"நிச்சயம் தொடர வேண்டுமா?"
+
+#: ../src/empathy-accounts-dialog.c:950
+msgid ""
+"Any associated conversations and chat rooms will NOT be removed if you "
+"decide to proceed.\n"
+"\n"
+"Should you decide to add the account back at a later time, they will still "
+"be available."
+msgstr ""
+"தொடர எண்ணினால் ஏதாவது தொடர்பான உரையடல்கள் மற்றும் அரட்டை அரைகள் இருப்பின் அவை நீக்கப்பட "
+"மாட்டாது..\n"
+"\n"
+"ஒரு வேளை பின்னொரு சமயம் கணக்கை புதுப்பிக்க எண்ணினால் அவை கிடைக்கும்."
+
+#: ../src/empathy-accounts-dialog.ui.h:1
+msgid "<b>New Account</b>"
+msgstr "<b> புதிய கணக்கு</b>"
+
+#: ../src/empathy-accounts-dialog.ui.h:2
+msgid "<b>No protocol installed</b>"
+msgstr "<b>நெறிமுறைகள் ஏதும் நிறுவவில்லை</b>"
+
+#: ../src/empathy-accounts-dialog.ui.h:3
+msgid "<b>Settings</b>"
+msgstr "<b> அமைப்புகள்</b>"
+
+#: ../src/empathy-accounts-dialog.ui.h:5
+msgid "Cr_eate"
+msgstr "(_e) உருவாக்கு"
+
+#: ../src/empathy-accounts-dialog.ui.h:6
+msgid "I already have an account I want to use"
+msgstr "நான் பயன்படுத்த ஏற்கெனெவே ஒரு கணக்கு உள்ளது"
+
+#: ../src/empathy-accounts-dialog.ui.h:7
+msgid "Import Accounts..."
+msgstr "கணக்குகளை இறக்குமதி செய்க..."
+
+#: ../src/empathy-accounts-dialog.ui.h:8
+msgid ""
+"To add a new account, you first have to install a backend for each protocol "
+"you want to use."
+msgstr ""
+"ஒரு புதிய கணக்கு துவக்க ஒவ்வொரு நெறிமுறைக்கும் நீங்கள் முதலில் ஒரு பின்புலத்தை அமைக்க "
+"வேண்டும்."
+
+#: ../src/empathy-accounts-dialog.ui.h:9
+msgid "Type:"
+msgstr "வகை:"
+
+#: ../src/empathy-accounts-dialog.ui.h:10
+msgid "_Add..."
+msgstr "சேர்... (_A)"
+
+#: ../src/empathy-call-window.c:370
+msgid "Contrast"
+msgstr "வேறுபாடு"
+
+#: ../src/empathy-call-window.c:373
+msgid "Brightness"
+msgstr "வெளிச்சம்"
+
+#: ../src/empathy-call-window.c:376
+msgid "Gamma"
+msgstr "காமா"
+
+#: ../src/empathy-call-window.c:480
+msgid "Volume"
+msgstr "ஒலி அளவு"
+
+#: ../src/empathy-call-window.c:592
+msgid "_Sidebar"
+msgstr "பக்கப்பட்டை(_S)"
+
+#: ../src/empathy-call-window.c:611
+msgid "Dialpad"
+msgstr "டயல் அட்டை"
+
+#: ../src/empathy-call-window.c:617
+msgid "Audio input"
+msgstr "ஒலி உள்ளீடு"
+
+#: ../src/empathy-call-window.c:621
+msgid "Video input"
+msgstr "வீடியோ உள்ளீடு"
+
+#: ../src/empathy-call-window.c:645
+msgid "Connecting..."
+msgstr "இணைக்கிறது...."
+
+#: ../src/empathy-call-window.c:660
+#, c-format
+msgid "Call with %s"
+msgstr "%s ஆல் அழை "
+
+#: ../src/empathy-call-window.c:694
+msgid "Call"
+msgstr "அழை"
+
+#. Translators: number of minutes:seconds the caller has been connected
+#: ../src/empathy-call-window.c:971
+#, c-format
+msgid "Connected — %d:%02dm"
+msgstr "இணைக்கப்பட்டது — %d:%02dm"
+
+#: ../src/empathy-call-window.ui.h:1
+msgid "Hang up"
+msgstr "துண்டி"
+
+#: ../src/empathy-call-window.ui.h:2
+msgid "Send Audio"
+msgstr "ஒலி அனுப்பு "
+
+#: ../src/empathy-call-window.ui.h:3
+msgid "Send video"
+msgstr "விடியோ அனுப்பு"
+
+#: ../src/empathy-call-window.ui.h:4
+msgid "Video preview"
+msgstr "ஒளித்தோற்ற முன்னோட்டம்"
+
+#: ../src/empathy-call-window.ui.h:5
+msgid "_Call"
+msgstr "(_C) அழை"
+
+#: ../src/empathy-call-window.ui.h:6
+msgid "_View"
+msgstr "பார்வை (_V)"
+
+#: ../src/empathy-chat-window.c:308
+#, c-format
+msgid "Conversations (%d)"
+msgstr "உரையாடல்கள் (%d)"
+
+#: ../src/empathy-chat-window.c:413
+msgid "Topic:"
+msgstr "தலைப்பு:"
+
+#: ../src/empathy-chat-window.c:418
+msgid "Typing a message."
+msgstr "செய்திகள் தட்டச்சிடல்"
+
+#: ../src/empathy-chat-window.c:889 ../src/empathy-event-manager.c:429
+#, c-format
+msgid "New message from %s"
+msgstr "%s இடமிருந்து புதிய செய்திகள்"
+
+#: ../src/empathy-chatrooms-window.c:258
+msgid "Name"
+msgstr "பெயர்"
+
+#: ../src/empathy-chatrooms-window.c:276
+msgid "Room"
+msgstr "அறை"
+
+#: ../src/empathy-chatrooms-window.c:285
+msgid "Auto-Connect"
+msgstr "தானியங்கி இணை"
+
+#: ../src/empathy-chatrooms-window.ui.h:2
+msgid "Manage Favorite Rooms"
+msgstr "பிடித்தமான அறைகளை மேலாள"
+
+#: ../src/empathy-event-manager.c:377
+msgid "Incoming call"
+msgstr "உள்வரும் அழைப்பு"
+
+#: ../src/empathy-event-manager.c:380
+#, c-format
+msgid "%s is calling you, do you want to answer?"
+msgstr "%s உங்களை அழைக்கிறார். நீங்கள் பதில் பேச வேண்டுமா?"
+
+#: ../src/empathy-event-manager.c:387
+msgid "_Reject"
+msgstr "(_R) ஏற்காதே"
+
+#: ../src/empathy-event-manager.c:393
+msgid "_Answer"
+msgstr "(_A) பதிலளி"
+
+#: ../src/empathy-event-manager.c:507
+#, c-format
+msgid "Incoming call from %s"
+msgstr "%s இடமிருந்து உள்வரும் அழைப்பு"
+
+#: ../src/empathy-event-manager.c:547
+#, c-format
+msgid "%s is offering you an invitation"
+msgstr "%s உங்களுக்கு ஒரு அழைப்பு வேண்டுதல் விடுக்கிறார்"
+
+#: ../src/empathy-event-manager.c:553
+msgid "An external application will be started to handle it."
+msgstr "இதை கையாள ஒரு வெளி பயன்பாடு துவக்கப்படும்."
+
+#: ../src/empathy-event-manager.c:558
+msgid "You don't have the needed external application to handle it."
+msgstr "இதை கையாள தேவையான ஒரு வெளி பயன்பாடு உங்கள் கணினியில் இல்லை."
+
+#: ../src/empathy-event-manager.c:685
+msgid "Room invitation"
+msgstr "அறை அழைப்பு"
+
+#: ../src/empathy-event-manager.c:688
+#, c-format
+msgid "%s is inviting you to join %s"
+msgstr "%s உங்களை %s உடன் சேர அழைக்கிறார்."
+
+#. Decline button
+#: ../src/empathy-event-manager.c:696 ../src/empathy-ft-manager.c:1037
+msgid "_Decline"
+msgstr "நிராகரி (_D)"
+
+#: ../src/empathy-event-manager.c:701
+#: ../src/empathy-new-chatroom-dialog.ui.h:6
+msgid "_Join"
+msgstr "(_J) இணை"
+
+#: ../src/empathy-event-manager.c:740
+#, c-format
+msgid "%s invited you to join %s"
+msgstr "%s %s இல் சேர உங்களை அழைத்துள்ளார்"
+
+#: ../src/empathy-event-manager.c:848
+#, c-format
+msgid "Incoming file transfer from %s"
+msgstr "%s இடமிருந்து உள்வரும் கோப்பு பரிமாற்றம்."
+
+#: ../src/empathy-event-manager.c:923
+#, c-format
+msgid "Subscription requested by %s"
+msgstr "%s இன் சந்தா வேண்டுதல்"
+
+#: ../src/empathy-event-manager.c:927
+#, c-format
+msgid ""
+"\n"
+"Message: %s"
+msgstr ""
+"\n"
+"செய்தி: %s"
+
+#. Translators: time left, when it is more than one hour
+#: ../src/empathy-ft-manager.c:114
+#, c-format
+msgid "%u:%02u.%02u"
+msgstr "%u:%02u.%02u"
+
+#. Translators: time left, when is is less than one hour
+#: ../src/empathy-ft-manager.c:117
+#, c-format
+msgid "%02u.%02u"
+msgstr "%02u.%02u"
+
+#: ../src/empathy-ft-manager.c:166
+msgid "No reason was specified"
+msgstr "காரணம் குறிப்பிடவில்லை"
+
+#: ../src/empathy-ft-manager.c:168
+msgid "The change in state was requested"
+msgstr "நிலையில் மாற்றம் வேண்டப்பட்டது"
+
+#: ../src/empathy-ft-manager.c:170
+msgid "You canceled the file transfer"
+msgstr "நீங்கள் கோப்பு பரி மாற்றத்தை ரத்து செய்தீர்கள்"
+
+#: ../src/empathy-ft-manager.c:172
+msgid "The other participant canceled the file transfer"
+msgstr "மற்ற பங்குதாரர் கோப்பு பரி மாற்றத்தை ரத்து செய்தார்."
+
+#: ../src/empathy-ft-manager.c:174
+msgid "Error while trying to transfer the file"
+msgstr "கோப்பு பரி மாற்றத்தில் பிழை "
+
+#: ../src/empathy-ft-manager.c:176
+msgid "The other participant is unable to transfer the file"
+msgstr "மற்ற பங்குதாரர் கோப்பு பரி மாற்றத்தை செய்ய முடியவில்லை."
+
+#: ../src/empathy-ft-manager.c:178
+msgid "Unknown reason"
+msgstr "தெரியாத காரணம்"
+
+#. translators: first %s is filename, second %s is the contact name
+#: ../src/empathy-ft-manager.c:228
+#, c-format
+msgid "Receiving \"%s\" from %s"
+msgstr " \"%s\" ஐ %s இடமிருந்து பெறுகிறது"
+
+#. translators: first %s is filename, second %s is the contact name
+#: ../src/empathy-ft-manager.c:231
+#, c-format
+msgid "Sending \"%s\" to %s"
+msgstr "\"%s\" ஐ %s க்கு அனுப்புகிறது"
+
+#: ../src/empathy-ft-manager.c:242
+msgctxt "file size"
+msgid "Unknown"
+msgstr "தெரியாத"
+
+#. translators: first %s is the transferred size, second %s is
+#. * the total file size
+#: ../src/empathy-ft-manager.c:251
+#, c-format
+msgid "%s of %s at %s/s"
+msgstr "%s %sல் %s/s இல்"
+
+#: ../src/empathy-ft-manager.c:259
+msgid "Waiting for the other participant's response"
+msgstr "மற்ற பங்கேற்பாளரின் பதிலுக்கு காத்திருத்தல்"
+
+#: ../src/empathy-ft-manager.c:269
+#, c-format
+msgid "\"%s\" received from %s"
+msgstr "\"%s\" %s இடமிருந்து கிடைத்தது"
+
+#: ../src/empathy-ft-manager.c:275
+#, c-format
+msgid "\"%s\" sent to %s"
+msgstr "\"%s\" %s க்கு அனுப்பப்பட்டது"
+
+#: ../src/empathy-ft-manager.c:278
+msgid "File transfer completed"
+msgstr "கோப்பு பறிமாற்றம் முடிந்தது"
+
+#: ../src/empathy-ft-manager.c:287
+#, c-format
+msgid "\"%s\" receiving from %s"
+msgstr "\"%s\" %s இடமிருந்து பெறப்படுகிறது"
+
+#: ../src/empathy-ft-manager.c:293
+#, c-format
+msgid "\"%s\" sending to %s"
+msgstr "\"%s\" %s க்கு அனுப்பப்படுகிறது"
+
+#: ../src/empathy-ft-manager.c:296
+#, c-format
+msgid "File transfer canceled: %s"
+msgstr "கோப்பு பறிமாற்றம் ரத்து செய்யப்பட்டது.: %s"
+
+#: ../src/empathy-ft-manager.c:310
+msgctxt "remaining time"
+msgid "Stalled"
+msgstr "Stalled"
+
+#: ../src/empathy-ft-manager.c:313
+msgctxt "remaining time"
+msgid "Unknown"
+msgstr "தெரியாத"
+
+#: ../src/empathy-ft-manager.c:372
+msgctxt "file transfer percent"
+msgid "Unknown"
+msgstr "தெரியாத"
+
+#: ../src/empathy-ft-manager.c:668
+msgid "%"
+msgstr "%"
+
+#: ../src/empathy-ft-manager.c:680
+msgid "File"
+msgstr "கோப்பு"
+
+#: ../src/empathy-ft-manager.c:702
+msgid "Remaining"
+msgstr "மீதமுள்ளவை"
+
+#: ../src/empathy-ft-manager.c:900
+msgid "Cannot save file to this location"
+msgstr "இந்த இடத்தில் கோப்பை சேமிக்க முடியவில்லை"
+
+#: ../src/empathy-ft-manager.c:946
+msgid "Save file as..."
+msgstr "கோப்பை இவ்வாறு சேமி..."
+
+#: ../src/empathy-ft-manager.c:1016
+msgid "unknown size"
+msgstr "தெரியாத அளவு"
+
+#: ../src/empathy-ft-manager.c:1022
+#, c-format
+msgid "%s would like to send you a file"
+msgstr " %s உங்களுக்கு ஒரு கோப்பை அனுப்ப விழைகிறார்."
+
+#. Translators: the first %s is the file name, the second %s is the file size
+#: ../src/empathy-ft-manager.c:1028
+#, c-format
+msgid "Do you want to accept the file \"%s\" (%s)?"
+msgstr "கோப்பு \"%s\" (%s) ஐ ஏற்க விருப்பமா?"
+
+#. Accept button
+#: ../src/empathy-ft-manager.c:1046
+msgid "_Accept"
+msgstr "ஏற்றுக்கொள் (_A)"
+
+#: ../src/empathy-ft-manager.ui.h:1
+msgid "File transfers"
+msgstr "கோப்பு பறிமாற்றங்கள் "
+
+#: ../src/empathy-ft-manager.ui.h:2
+msgid "Remove completed, canceled and failed file transfers from the list"
+msgstr ""
+"பூர்த்தியானது, ரத்து செய்யப்பட்டது, தோல்வி அடைந்தது ஆகிய கோப்பு பரிமாற்றங்களை பட்டியலில் "
+"இருந்து நீக்கு "
+
+#. Translators: this is the header of a treeview column
+#: ../src/empathy-import-dialog.c:259
+msgid "Import"
+msgstr "இறக்குமதி செய்"
+
+#: ../src/empathy-import-dialog.c:268
+msgid "Protocol"
+msgstr "விதிமுறை"
+
+#: ../src/empathy-import-dialog.c:294
+msgid "Source"
+msgstr "மூலம்"
+
+#: ../src/empathy-import-dialog.c:388
+msgid ""
+"No accounts to import could be found. Empathy currently only supports "
+"importing accounts from Pidgin."
+msgstr ""
+"கணக்குகள் ஏதும் இறக்குமதி செய்ய இல்லை. எம்பதி இப்போதைக்கு பிட்ஜின் இலிருந்து மட்டுமே "
+"இறக்குமதிகளை அனுமதிக்கிறது."
+
+#: ../src/empathy-import-dialog.ui.h:1
+msgid "Import Accounts"
+msgstr "இறக்குமதி செய் கணக்குகள்"
+
+#: ../src/empathy-main-window.c:393
+msgid "_Edit account"
+msgstr "(_E) கணக்குகளை திருத்துக"
+
+#: ../src/empathy-main-window.c:496
+msgid "No error specified"
+msgstr "பிழை ஏதும் குறிப்பிடவில்லை"
+
+#: ../src/empathy-main-window.c:499
+msgid "Network error"
+msgstr "வலையமைப்பு பிழை"
+
+#: ../src/empathy-main-window.c:502
+msgid "Authentication failed"
+msgstr "உறுதி செய்தல் தோல்வி"
+
+#: ../src/empathy-main-window.c:505
+msgid "Encryption error"
+msgstr "மறையாக்க பிழை"
+
+#: ../src/empathy-main-window.c:508
+msgid "Name in use"
+msgstr "பயனில் உள்ள பெயர் "
+
+#: ../src/empathy-main-window.c:511
+msgid "Certificate not provided"
+msgstr "சான்றிதழ் தரப்படவில்லை"
+
+#: ../src/empathy-main-window.c:514
+msgid "Certificate untrusted"
+msgstr "சான்றிதழில் நம்பக தன்மை இல்லை"
+
+#: ../src/empathy-main-window.c:517
+msgid "Certificate expired"
+msgstr "சான்றிதழ் காலாவதியானது"
+
+#: ../src/empathy-main-window.c:520
+msgid "Certificate not activated"
+msgstr "சான்றிதழ் செயல்படுத்தப்படவில்லை"
+
+#: ../src/empathy-main-window.c:523
+msgid "Certificate hostname mismatch"
+msgstr "சான்றிதழ் புரவலன் பெயர் ஒத்திசையவில்லை"
+
+#: ../src/empathy-main-window.c:526
+msgid "Certificate fingerprint mismatch"
+msgstr "சான்றிதழ் அடையாளம் ஒத்திசையவில்லை"
+
+#: ../src/empathy-main-window.c:529
+msgid "Certificate self-signed"
+msgstr "சான்றிதழ் தானே கையெழுத்திட்டது"
+
+#: ../src/empathy-main-window.c:532
+msgid "Certificate error"
+msgstr "சான்றிதழ் பிழை"
+
+#: ../src/empathy-main-window.c:535
+msgid "Unknown error"
+msgstr "தெரியாத பிழை"
+
+#: ../src/empathy-main-window.c:877
+msgid "Contact"
+msgstr "தொடர்பு"
+
+#: ../src/empathy-main-window.c:1194
+msgid "Show and edit accounts"
+msgstr "கணக்குகளை காட்டவும் மற்றும் திருத்தவும் "
+
+#: ../src/empathy-main-window.ui.h:1
+msgid "Contact List"
+msgstr "தொடர்பு பட்டியல்"
+
+#: ../src/empathy-main-window.ui.h:2
+msgid "Context"
+msgstr "சூழல்"
+
+#: ../src/empathy-main-window.ui.h:3
+msgid "Join _Favorites"
+msgstr "(_F) விருப்பங்கள் சேர் "
+
+#: ../src/empathy-main-window.ui.h:4
+msgid "Manage Favorites"
+msgstr "விருப்பங்களை மேலாளுக"
+
+#: ../src/empathy-main-window.ui.h:5
+msgid "Show _File Transfers"
+msgstr "(_F) கோப்பு பறிமாற்றங்களை காட்டுக"
+
+#: ../src/empathy-main-window.ui.h:6
+msgid "Show _Offline Contacts"
+msgstr "(_O) இணைப்பு விலகி உள்ள தொடர்புகள் ஐ காட்டுக"
+
+#: ../src/empathy-main-window.ui.h:7
+msgid "_Accounts"
+msgstr "கணக்குகள் (_A)"
+
+#: ../src/empathy-main-window.ui.h:8
+msgid "_Add Contact..."
+msgstr "(_A) தொடர்பை சேர்..."
+
+#: ../src/empathy-main-window.ui.h:10
+msgid "_Contents"
+msgstr "உள்ளடக்கங்கள் (_C)"
+
+#: ../src/empathy-main-window.ui.h:12
+msgid "_Help"
+msgstr "உதவி (_H)"
+
+#: ../src/empathy-main-window.ui.h:13
+msgid "_Join..."
+msgstr "(_J) சேர்..."
+
+#: ../src/empathy-main-window.ui.h:14 ../src/empathy-status-icon.ui.h:2
+msgid "_New Conversation..."
+msgstr "(_N) புதிய உரையாடல்..."
+
+#: ../src/empathy-main-window.ui.h:15
+msgid "_Personal Information"
+msgstr "(_P) தனிப்பட்ட தகவல்"
+
+#: ../src/empathy-main-window.ui.h:17
+msgid "_Room"
+msgstr "(_R) அறை"
+
+#: ../src/empathy-new-chatroom-dialog.c:319
+msgid "Chat Room"
+msgstr "அரட்டை அறை"
+
+#: ../src/empathy-new-chatroom-dialog.c:335
+msgid "Members"
+msgstr "உறுப்பினர்கள்"
+
+#: ../src/empathy-new-chatroom-dialog.c:464
+#, c-format
+msgctxt ""
+"Room/Join's roomlist tooltip. Parametersare a channel name, yes/no, yes/no "
+"and a number."
+msgid ""
+"<b>%s</b>\n"
+"Invite required: %s\n"
+"Password required: %s\n"
+"Members: %s"
+msgstr ""
+"<b>%s</b>\n"
+"Invite required: %s\n"
+"Password required: %s\n"
+"Members: %s"
+
+#: ../src/empathy-new-chatroom-dialog.c:466
+#: ../src/empathy-new-chatroom-dialog.c:467
+msgid "Yes"
+msgstr "ஆம்"
+
+#: ../src/empathy-new-chatroom-dialog.c:466
+#: ../src/empathy-new-chatroom-dialog.c:467
+msgid "No"
+msgstr "இல்லை"
+
+#: ../src/empathy-new-chatroom-dialog.ui.h:2
+msgid ""
+"Enter the room name to join here or click on one or more rooms in the list."
+msgstr ""
+"சேருவதற்கான அறை பெயரை இங்கு உள்ளிடுக. அல்லது பட்டியலில் உள்ள ஒன்றோ மேற்பட்ட பெயர்களையோ "
+"சொடுக்குக."
+
+#: ../src/empathy-new-chatroom-dialog.ui.h:3
+msgid ""
+"Enter the server which hosts the room, or leave it empty if the room is on "
+"the current account's server"
+msgstr ""
+"அறையை தரும் சேவையகத்தின் பெயரை இங்கு உள்ளிடுக. அல்லது அது நடப்பு சேவையகத்தில் இருந்தால் "
+"வெற்றாக விடவும்."
+
+#: ../src/empathy-new-chatroom-dialog.ui.h:4
+msgid "Join Room"
+msgstr "அறை இல் சேர் "
+
+#: ../src/empathy-new-chatroom-dialog.ui.h:5
+msgid "Room List"
+msgstr "அறை பட்டியல்"
+
+#: ../src/empathy-new-chatroom-dialog.ui.h:7
+msgid "_Room:"
+msgstr "(_R) அறை:"
+
+#: ../src/empathy-preferences.c:156
+msgid "Message received"
+msgstr "தகவல் பெறப்பட்டது"
+
+#: ../src/empathy-preferences.c:157
+msgid "Message sent"
+msgstr "தகவல் அனுப்பப்பட்டது"
+
+#: ../src/empathy-preferences.c:158
+msgid "New conversation"
+msgstr "புதிய உரையாடல்"
+
+#: ../src/empathy-preferences.c:159
+msgid "Contact goes online"
+msgstr "தொடர்பு இணைபில் வருகிறார்"
+
+#: ../src/empathy-preferences.c:160
+msgid "Contact goes offline"
+msgstr "தொடர்பு இணைப்பு விலகி செல்கிறார்"
+
+#: ../src/empathy-preferences.c:161
+msgid "Account connected"
+msgstr "கணக்கு இணைக்கப்பட்டது"
+
+#: ../src/empathy-preferences.c:162
+msgid "Account disconnected"
+msgstr "கணக்கு இணைப்பு நீக்கப்பட்டது"
+
+#: ../src/empathy-preferences.c:397
+msgid "Language"
+msgstr "மொழி"
+
+#: ../src/empathy-preferences.ui.h:1
+msgid "<b>Appearance</b>"
+msgstr "<b>தோற்றம்</b>"
+
+#: ../src/empathy-preferences.ui.h:2
+msgid "<b>Behavior</b>"
+msgstr "<b>நடத்தை</b>"
+
+#: ../src/empathy-preferences.ui.h:3
+msgid "<b>Contact List</b>"
+msgstr "<b> தொடர்பு பட்டியல்</b>"
+
+#: ../src/empathy-preferences.ui.h:4
+msgid "<b>Enable spell checking for languages:</b>"
+msgstr "<b>மொழிகளுக்கு எழுத்து பிழை திருத்தத்தை செயல்படுத்து</b>"
+
+#: ../src/empathy-preferences.ui.h:5
+msgid "<b>Play sound for events</b>"
+msgstr "<b>நிகழ்வுகளுக்கு ஒலியை இயக்கு</b>"
+
+#: ../src/empathy-preferences.ui.h:6
+msgid ""
+"<small>The list of languages reflects only the languages for which you have "
+"a dictionary installed.</small>"
+msgstr ""
+"<small>இந்த பட்டியல் நீங்கள் எந்த மொழிகளுக்கு அகராதி நிறுவி இருக்கிறீர்களோ அவற்றை மட்டுமே "
+"காட்டுகிறது</small>"
+
+#: ../src/empathy-preferences.ui.h:7
+msgid "Automatically _connect on startup "
+msgstr "(_c) துவங்கும்போது தானியங்கியாக இணை"
+
+#: ../src/empathy-preferences.ui.h:8
+msgid "Avatars are user chosen images shown in the contact list"
+msgstr "அவதாரங்கள் என்பது தொடர்பு பட்டியலில் காணப்படும் பயனர் தேர்ந்தெடுத்த பிம்பங்கள்"
+
+#: ../src/empathy-preferences.ui.h:9
+msgid "Chat Th_eme:"
+msgstr "(_e) அரட்டை கருத்து:"
+
+#: ../src/empathy-preferences.ui.h:10
+msgid "Disable notifications when _away or busy"
+msgstr "(_a) வெளியே அல்லது வேலையில் உள்ளபோது அறிவிப்புகளை செயல் நீக்கு"
+
+#: ../src/empathy-preferences.ui.h:11
+msgid "Disable sounds when _away or busy"
+msgstr "(_a) வெளியே அல்லது வேலையில் உள்ளபோது ஒலிகளை செயல் நீக்கு"
+
+#: ../src/empathy-preferences.ui.h:12
+msgid "Enable notifications when the _chat is not focused"
+msgstr "(_c) அரட்டை குவிப்பில் இல்லாத போது அறிவிப்புகளை செயல்படுத்து"
+
+#: ../src/empathy-preferences.ui.h:13
+msgid "General"
+msgstr "பொது"
+
+#: ../src/empathy-preferences.ui.h:14
+msgid "Notifications"
+msgstr "அறிவிப்புகள்"
+
+#: ../src/empathy-preferences.ui.h:15
+msgid "Preferences"
+msgstr "விருப்பங்கள்"
+
+#: ../src/empathy-preferences.ui.h:16
+msgid "Show _avatars"
+msgstr "(_a) அவதாரங்களை காட்டு"
+
+#: ../src/empathy-preferences.ui.h:17
+msgid "Show _smileys as images"
+msgstr "(_s) சிரிப்பான்களை பிம்பங்களாக காட்டு"
+
+#: ../src/empathy-preferences.ui.h:18
+msgid "Show co_mpact contact list"
+msgstr "(_m) அடக்கமான தொடர்பு பட்டியல் ஐ காட்டு "
+
+#: ../src/empathy-preferences.ui.h:19
+msgid "Sort by _name"
+msgstr "(_n) பெயர் ஆல் வரிசைப்படுத்து"
+
+#: ../src/empathy-preferences.ui.h:20
+msgid "Sort by s_tate"
+msgstr "(_t) நிலை வாரியாக வரிசைப்படுத்து"
+
+#: ../src/empathy-preferences.ui.h:21
+msgid "Sounds"
+msgstr "ஒலிகள்"
+
+#: ../src/empathy-preferences.ui.h:22
+msgid "Spell Checking"
+msgstr "எழுத்து பிழை திருத்தம்"
+
+#: ../src/empathy-preferences.ui.h:23
+msgid "Themes"
+msgstr "கருத்துகள்"
+
+#: ../src/empathy-preferences.ui.h:24
+msgid "_Enable bubble notifications"
+msgstr "(_E) பலூனில் அறிவிப்புகளை செயல்படுத்து"
+
+#: ../src/empathy-preferences.ui.h:25
+msgid "_Enable sound notifications"
+msgstr "(_E) ஒலி அறிவிப்புகளை செயல்படுத்து"
+
+#: ../src/empathy-preferences.ui.h:26
+msgid "_Open new chats in separate windows"
+msgstr "(_O) புதிய அரட்டைகளை தனி சாளரங்களில் திற"
+
+#: ../src/empathy-status-icon.ui.h:1
+msgid "Status"
+msgstr "நிலை"
+
+#: ../src/empathy-status-icon.ui.h:3
+msgid "_Quit"
+msgstr "வெளியேறு (_Q)"
+
+#: ../src/empathy-status-icon.ui.h:4
+msgid "_Show Contact List"
+msgstr "(_S) தொடர்பு பட்டியல் ஐ காட்டு "
+
+#: ../src/empathy-tube-dispatch.c:375
+#, c-format
+msgid "Unable to start application for service %s: %s"
+msgstr " %s சேவைக்கு பயன்பாட்டை துவக்க முடியவில்லை: %s"
+
+#: ../src/empathy-tube-dispatch.c:446
+#, c-format
+msgid ""
+"An invitation was offered for service %s, but you don't have the needed "
+"application to handle it"
+msgstr ""
+" %s சேவைக்கு அழைப்பு கொடுக்கப்பட்டது ஆனால் அதை கையாள உங்கள் கணினியில் தேவையான பயன்பாடு "
+"இல்லை"
+
+#: ../src/empathy-call-window-fullscreen.ui.h:1
+msgid "gtk-leave-fullscreen"
+msgstr "ஜிடிகே முழுத்திரையை விட்டுவிலகு"
diff --git a/python/example.py b/python/example.py
index cffd5fffb..38a04978e 100755
--- a/python/example.py
+++ b/python/example.py
@@ -16,7 +16,8 @@ class HelloWorld:
manager = empathy.ContactManager()
store = empathygtk.ContactListStore(manager)
- view = empathygtk.ContactListView(store, 0)
+ features = empathygtk.ContactListFeatureFlags(empathygtk.CONTACT_LIST_FEATURE_NONE)
+ view = empathygtk.ContactListView(store, 0, features)
self.window.add (view)
view.show()
diff --git a/python/pyempathy/Makefile.am b/python/pyempathy/Makefile.am
index 8ec61ff8e..ef6faa0a7 100644
--- a/python/pyempathy/Makefile.am
+++ b/python/pyempathy/Makefile.am
@@ -1,3 +1,5 @@
+include $(top_srcdir)/tools/shave.mk
+
PYDEFS=`pkg-config --variable=defsdir pygtk-2.0`
AM_CPPFLAGS = \
@@ -31,7 +33,7 @@ empathy_la_LDFLAGS = \
-module -avoid-version
pyempathy.c: pyempathy.override pyempathy.defs
- $(PYGOBJECTCODEGEN) \
+ $(QUIET_GEN)$(PYGOBJECTCODEGEN) \
--prefix empathy \
--register $(PYDEFS)/gdk-types.defs \
--register $(PYDEFS)/gtk-types.defs \
diff --git a/python/pyempathy/pyempathy.defs b/python/pyempathy/pyempathy.defs
index 3e9fd624c..02c8dad19 100644
--- a/python/pyempathy/pyempathy.defs
+++ b/python/pyempathy/pyempathy.defs
@@ -77,6 +77,20 @@
(gtype-id "EMPATHY_TYPE_DISPATCHER")
)
+(define-object FTFactory
+ (in-module "Empathy")
+ (parent "GObject")
+ (c-name "EmpathyFTFactory")
+ (gtype-id "EMPATHY_TYPE_FT_FACTORY")
+)
+
+(define-object FTHandler
+ (in-module "Empathy")
+ (parent "GObject")
+ (c-name "EmpathyFTHandler")
+ (gtype-id "EMPATHY_TYPE_FT_HANDLER")
+)
+
(define-object Idle
(in-module "Empathy")
(parent "GObject")
@@ -194,6 +208,7 @@
'("audio" "EMPATHY_CAPABILITIES_AUDIO")
'("video" "EMPATHY_CAPABILITIES_VIDEO")
'("ft" "EMPATHY_CAPABILITIES_FT")
+ '("stream-tube" "EMPATHY_CAPABILITIES_STREAM_TUBE")
'("unknown" "EMPATHY_CAPABILITIES_UNKNOWN")
)
)
@@ -210,6 +225,7 @@
'("irc" "EMPATHY_DEBUG_IRC")
'("dispatcher" "EMPATHY_DEBUG_DISPATCHER")
'("ft" "EMPATHY_DEBUG_FT")
+ '("location" "EMPATHY_DEBUG_LOCATION")
'("other" "EMPATHY_DEBUG_OTHER")
)
)
@@ -240,6 +256,19 @@
)
)
+(define-enum FTErrorEnum
+ (in-module "Empathy")
+ (c-name "EmpathyFTErrorEnum")
+ (gtype-id "EMPATHY_TYPE_FT_ERROR_ENUM")
+ (values
+ '("failed" "EMPATHY_FT_ERROR_FAILED")
+ '("hash-mismatch" "EMPATHY_FT_ERROR_HASH_MISMATCH")
+ '("tp-error" "EMPATHY_FT_ERROR_TP_ERROR")
+ '("socket" "EMPATHY_FT_ERROR_SOCKET")
+ '("not-supported" "EMPATHY_FT_ERROR_NOT_SUPPORTED")
+ )
+)
+
;; From empathy-account-manager.h
@@ -474,6 +503,30 @@
(return-type "EmpathyTpChat*")
)
+(define-method set_tp_chat
+ (of-object "EmpathyChatroom")
+ (c-name "empathy_chatroom_set_tp_chat")
+ (return-type "none")
+ (parameters
+ '("EmpathyTpChat*" "tp_chat")
+ )
+)
+
+(define-method is_favorite
+ (of-object "EmpathyChatroom")
+ (c-name "empathy_chatroom_is_favorite")
+ (return-type "gboolean")
+)
+
+(define-method set_favorite
+ (of-object "EmpathyChatroom")
+ (c-name "empathy_chatroom_set_favorite")
+ (return-type "none")
+ (parameters
+ '("gboolean" "favorite")
+ )
+)
+
;; From empathy-chatroom-manager.h
@@ -574,6 +627,17 @@
)
)
+(define-method new_call_with_streams
+ (of-object "EmpathyCallFactory")
+ (c-name "empathy_call_factory_new_call_with_streams")
+ (return-type "none")
+ (parameters
+ '("EmpathyContact*" "contact")
+ '("gboolean" "initial_audio")
+ '("gboolean" "initial_video")
+ )
+)
+
(define-method claim_channel
(of-object "EmpathyCallFactory")
(c-name "empathy_call_factory_claim_channel")
@@ -600,6 +664,16 @@
)
)
+(define-function call_handler_new_for_contact_with_streams
+ (c-name "empathy_call_handler_new_for_contact_with_streams")
+ (return-type "EmpathyCallHandler*")
+ (parameters
+ '("EmpathyContact*" "contact")
+ '("gboolean" "audio")
+ '("gboolean" "video")
+ )
+)
+
(define-function call_handler_new_for_channel
(c-name "empathy_call_handler_new_for_channel")
(return-type "EmpathyCallHandler*")
@@ -642,6 +716,17 @@
)
)
+(define-function contact_new_for_log
+ (c-name "empathy_contact_new_for_log")
+ (return-type "EmpathyContact*")
+ (parameters
+ '("McAccount*" "account")
+ '("const-gchar*" "id")
+ '("const-gchar*" "name")
+ '("gboolean" "is_user")
+ )
+)
+
(define-method get_tp_contact
(of-object "EmpathyContact")
(c-name "empathy_contact_get_tp_contact")
@@ -708,7 +793,7 @@
(define-method get_presence
(of-object "EmpathyContact")
(c-name "empathy_contact_get_presence")
- (return-type "McPresence")
+ (return-type "TpConnectionPresenceType")
)
(define-method set_presence
@@ -716,7 +801,7 @@
(c-name "empathy_contact_set_presence")
(return-type "none")
(parameters
- '("McPresence" "presence")
+ '("TpConnectionPresenceType" "presence")
)
)
@@ -804,6 +889,12 @@
(return-type "gboolean")
)
+(define-method can_use_stream_tube
+ (of-object "EmpathyContact")
+ (c-name "empathy_contact_can_use_stream_tube")
+ (return-type "gboolean")
+)
+
(define-function contact_hash
(c-name "empathy_contact_hash")
(return-type "guint")
@@ -872,6 +963,21 @@
)
)
+(define-method get_location
+ (of-object "EmpathyContact")
+ (c-name "empathy_contact_get_location")
+ (return-type "GHashTable*")
+)
+
+(define-method set_location
+ (of-object "EmpathyContact")
+ (c-name "empathy_contact_set_location")
+ (return-type "none")
+ (parameters
+ '("GHashTable*" "location")
+ )
+)
+
;; From empathy-contact-groups.h
@@ -1154,15 +1260,32 @@
)
)
-(define-method find_channel_class
+(define-method find_requestable_channel_classes_async
+ (of-object "EmpathyDispatcher")
+ (c-name "empathy_dispatcher_find_requestable_channel_classes_async")
+ (return-type "none")
+ (parameters
+ '("TpConnection*" "connection")
+ '("const-gchar*" "channel_type")
+ '("guint" "handle_type")
+ '("EmpathyDispatcherFindChannelClassCb" "callback")
+ '("gpointer" "user_data")
+ '("const-char*" "first_property_name")
+ )
+ (varargs #t)
+)
+
+(define-method find_requestable_channel_classes
(of-object "EmpathyDispatcher")
- (c-name "empathy_dispatcher_find_channel_class")
- (return-type "GStrv")
+ (c-name "empathy_dispatcher_find_requestable_channel_classes")
+ (return-type "GList*")
(parameters
'("TpConnection*" "connection")
'("const-gchar*" "channel_type")
'("guint" "handle_type")
+ '("const-char*" "first_property_name")
)
+ (varargs #t)
)
(define-function dispatcher_dup_singleton
@@ -1271,6 +1394,160 @@
+;; From empathy-ft-factory.h
+
+(define-function ft_factory_get_type
+ (c-name "empathy_ft_factory_get_type")
+ (return-type "GType")
+)
+
+(define-function ft_factory_dup_singleton
+ (c-name "empathy_ft_factory_dup_singleton")
+ (return-type "EmpathyFTFactory*")
+)
+
+(define-method new_transfer_outgoing
+ (of-object "EmpathyFTFactory")
+ (c-name "empathy_ft_factory_new_transfer_outgoing")
+ (return-type "none")
+ (parameters
+ '("EmpathyContact*" "contact")
+ '("GFile*" "source")
+ )
+)
+
+(define-method claim_channel
+ (of-object "EmpathyFTFactory")
+ (c-name "empathy_ft_factory_claim_channel")
+ (return-type "none")
+ (parameters
+ '("EmpathyDispatchOperation*" "operation")
+ )
+)
+
+(define-method set_destination_for_incoming_handler
+ (of-object "EmpathyFTFactory")
+ (c-name "empathy_ft_factory_set_destination_for_incoming_handler")
+ (return-type "none")
+ (parameters
+ '("EmpathyFTHandler*" "handler")
+ '("GFile*" "destination")
+ )
+)
+
+
+
+;; From empathy-ft-handler.h
+
+(define-function ft_handler_get_type
+ (c-name "empathy_ft_handler_get_type")
+ (return-type "GType")
+)
+
+(define-function ft_handler_new_outgoing
+ (c-name "empathy_ft_handler_new_outgoing")
+ (return-type "none")
+ (parameters
+ '("EmpathyContact*" "contact")
+ '("GFile*" "source")
+ '("EmpathyFTHandlerReadyCallback" "callback")
+ '("gpointer" "user_data")
+ )
+)
+
+(define-function ft_handler_new_incoming
+ (c-name "empathy_ft_handler_new_incoming")
+ (return-type "none")
+ (parameters
+ '("EmpathyTpFile*" "tp_file")
+ '("EmpathyFTHandlerReadyCallback" "callback")
+ '("gpointer" "user_data")
+ )
+)
+
+(define-method incoming_set_destination
+ (of-object "EmpathyFTHandler")
+ (c-name "empathy_ft_handler_incoming_set_destination")
+ (return-type "none")
+ (parameters
+ '("GFile*" "destination")
+ )
+)
+
+(define-method start_transfer
+ (of-object "EmpathyFTHandler")
+ (c-name "empathy_ft_handler_start_transfer")
+ (return-type "none")
+)
+
+(define-method cancel_transfer
+ (of-object "EmpathyFTHandler")
+ (c-name "empathy_ft_handler_cancel_transfer")
+ (return-type "none")
+)
+
+(define-method get_filename
+ (of-object "EmpathyFTHandler")
+ (c-name "empathy_ft_handler_get_filename")
+ (return-type "const-char*")
+)
+
+(define-method get_content_type
+ (of-object "EmpathyFTHandler")
+ (c-name "empathy_ft_handler_get_content_type")
+ (return-type "const-char*")
+)
+
+(define-method get_contact
+ (of-object "EmpathyFTHandler")
+ (c-name "empathy_ft_handler_get_contact")
+ (return-type "EmpathyContact*")
+)
+
+(define-method get_gfile
+ (of-object "EmpathyFTHandler")
+ (c-name "empathy_ft_handler_get_gfile")
+ (return-type "GFile*")
+)
+
+(define-method get_use_hash
+ (of-object "EmpathyFTHandler")
+ (c-name "empathy_ft_handler_get_use_hash")
+ (return-type "gboolean")
+)
+
+(define-method is_incoming
+ (of-object "EmpathyFTHandler")
+ (c-name "empathy_ft_handler_is_incoming")
+ (return-type "gboolean")
+)
+
+(define-method get_transferred_bytes
+ (of-object "EmpathyFTHandler")
+ (c-name "empathy_ft_handler_get_transferred_bytes")
+ (return-type "guint64")
+)
+
+(define-method get_total_bytes
+ (of-object "EmpathyFTHandler")
+ (c-name "empathy_ft_handler_get_total_bytes")
+ (return-type "guint64")
+)
+
+(define-method is_completed
+ (of-object "EmpathyFTHandler")
+ (c-name "empathy_ft_handler_is_completed")
+ (return-type "gboolean")
+)
+
+(define-method is_cancelled
+ (of-object "EmpathyFTHandler")
+ (c-name "empathy_ft_handler_is_cancelled")
+ (return-type "gboolean")
+)
+
+
+
;; From empathy-idle.h
(define-function idle_get_type
@@ -1286,7 +1563,7 @@
(define-method get_state
(of-object "EmpathyIdle")
(c-name "empathy_idle_get_state")
- (return-type "McPresence")
+ (return-type "TpConnectionPresenceType")
)
(define-method set_state
@@ -1294,7 +1571,7 @@
(c-name "empathy_idle_set_state")
(return-type "none")
(parameters
- '("McPresence" "state")
+ '("TpConnectionPresenceType" "state")
)
)
@@ -1316,7 +1593,7 @@
(define-method get_flash_state
(of-object "EmpathyIdle")
(c-name "empathy_idle_get_flash_state")
- (return-type "McPresence")
+ (return-type "TpConnectionPresenceType")
)
(define-method set_flash_state
@@ -1324,7 +1601,7 @@
(c-name "empathy_idle_set_flash_state")
(return-type "none")
(parameters
- '("McPresence" "state")
+ '("TpConnectionPresenceType" "state")
)
)
@@ -1333,7 +1610,7 @@
(c-name "empathy_idle_set_presence")
(return-type "none")
(parameters
- '("McPresence" "state")
+ '("TpConnectionPresenceType" "state")
'("const-gchar*" "status")
)
)
@@ -1893,7 +2170,7 @@
(c-name "empathy_status_presets_get")
(return-type "GList*")
(parameters
- '("McPresence" "state")
+ '("TpConnectionPresenceType" "state")
'("gint" "max_number")
)
)
@@ -1902,7 +2179,7 @@
(c-name "empathy_status_presets_set_last")
(return-type "none")
(parameters
- '("McPresence" "state")
+ '("TpConnectionPresenceType" "state")
'("const-gchar*" "status")
)
)
@@ -1911,7 +2188,7 @@
(c-name "empathy_status_presets_remove")
(return-type "none")
(parameters
- '("McPresence" "state")
+ '("TpConnectionPresenceType" "state")
'("const-gchar*" "status")
)
)
@@ -1923,7 +2200,7 @@
(define-function status_presets_get_default_state
(c-name "empathy_status_presets_get_default_state")
- (return-type "McPresence")
+ (return-type "TpConnectionPresenceType")
)
(define-function status_presets_get_default_status
@@ -1935,7 +2212,7 @@
(c-name "empathy_status_presets_set_default")
(return-type "none")
(parameters
- '("McPresence" "state")
+ '("TpConnectionPresenceType" "state")
'("const-gchar*" "status")
)
)
@@ -1988,6 +2265,14 @@
)
)
+(define-function time_to_string_relative
+ (c-name "empathy_time_to_string_relative")
+ (return-type "gchar*")
+ (parameters
+ '("time_t" "t")
+ )
+)
+
;; From empathy-tp-call.h
@@ -2018,6 +2303,8 @@
(return-type "none")
(parameters
'("EmpathyContact*" "contact")
+ '("gboolean" "audio")
+ '("gboolean" "video")
)
)
@@ -2187,7 +2474,7 @@
(parameters
'("guint" "n_ids")
'("const-gchar*-const*" "ids")
- '("EmpathyTpContactFactoryGotContactsCb" "callback")
+ '("EmpathyTpContactFactoryContactsByIdCb" "callback")
'("gpointer" "user_data")
'("GDestroyNotify" "destroy")
'("GObject*" "weak_object")
@@ -2201,7 +2488,33 @@
(parameters
'("guint" "n_handles")
'("const-TpHandle*" "handles")
- '("EmpathyTpContactFactoryGotContactsCb" "callback")
+ '("EmpathyTpContactFactoryContactsByHandleCb" "callback")
+ '("gpointer" "user_data")
+ '("GDestroyNotify" "destroy")
+ '("GObject*" "weak_object")
+ )
+)
+
+(define-method get_from_id
+ (of-object "EmpathyTpContactFactory")
+ (c-name "empathy_tp_contact_factory_get_from_id")
+ (return-type "none")
+ (parameters
+ '("const-gchar*" "id")
+ '("EmpathyTpContactFactoryContactCb" "callback")
+ '("gpointer" "user_data")
+ '("GDestroyNotify" "destroy")
+ '("GObject*" "weak_object")
+ )
+)
+
+(define-method get_from_handle
+ (of-object "EmpathyTpContactFactory")
+ (c-name "empathy_tp_contact_factory_get_from_handle")
+ (return-type "none")
+ (parameters
+ '("TpHandle" "handle")
+ '("EmpathyTpContactFactoryContactCb" "callback")
'("gpointer" "user_data")
'("GDestroyNotify" "destroy")
'("GObject*" "weak_object")
@@ -2229,6 +2542,15 @@
)
)
+(define-method set_location
+ (of-object "EmpathyTpContactFactory")
+ (c-name "empathy_tp_contact_factory_set_location")
+ (return-type "none")
+ (parameters
+ '("GHashTable*" "location")
+ )
+)
+
;; From empathy-tp-contact-list.h
@@ -2280,15 +2602,10 @@
(return-type "EmpathyTpFile*")
(parameters
'("TpChannel*" "channel")
+ '("gboolean" "incoming")
)
)
-(define-method get_channel
- (of-object "EmpathyTpFile")
- (c-name "empathy_tp_file_get_channel")
- (return-type "TpChannel*")
-)
-
(define-method accept
(of-object "EmpathyTpFile")
(c-name "empathy_tp_file_accept")
@@ -2296,42 +2613,38 @@
(parameters
'("guint64" "offset")
'("GFile*" "gfile")
- '("GError**" "error")
+ '("GCancellable*" "cancellable")
+ '("EmpathyTpFileProgressCallback" "progress_callback")
+ '("gpointer" "progress_user_data")
+ '("EmpathyTpFileOperationCallback" "op_callback")
+ '("gpointer" "op_user_data")
)
)
-(define-method cancel
- (of-object "EmpathyTpFile")
- (c-name "empathy_tp_file_cancel")
- (return-type "none")
-)
-
-(define-method close
- (of-object "EmpathyTpFile")
- (c-name "empathy_tp_file_close")
- (return-type "none")
-)
-
(define-method offer
(of-object "EmpathyTpFile")
(c-name "empathy_tp_file_offer")
(return-type "none")
(parameters
'("GFile*" "gfile")
- '("GError**" "error")
+ '("GCancellable*" "cancellable")
+ '("EmpathyTpFileProgressCallback" "progress_callback")
+ '("gpointer" "progress_user_data")
+ '("EmpathyTpFileOperationCallback" "op_callback")
+ '("gpointer" "op_user_data")
)
)
-(define-method get_contact
+(define-method cancel
(of-object "EmpathyTpFile")
- (c-name "empathy_tp_file_get_contact")
- (return-type "EmpathyContact*")
+ (c-name "empathy_tp_file_cancel")
+ (return-type "none")
)
-(define-method get_filename
+(define-method close
(of-object "EmpathyTpFile")
- (c-name "empathy_tp_file_get_filename")
- (return-type "const-gchar*")
+ (c-name "empathy_tp_file_close")
+ (return-type "none")
)
(define-method is_incoming
@@ -2340,45 +2653,6 @@
(return-type "gboolean")
)
-(define-method get_state
- (of-object "EmpathyTpFile")
- (c-name "empathy_tp_file_get_state")
- (return-type "TpFileTransferState")
- (parameters
- '("TpFileTransferStateChangeReason*" "reason")
- )
-)
-
-(define-method get_size
- (of-object "EmpathyTpFile")
- (c-name "empathy_tp_file_get_size")
- (return-type "guint64")
-)
-
-(define-method get_transferred_bytes
- (of-object "EmpathyTpFile")
- (c-name "empathy_tp_file_get_transferred_bytes")
- (return-type "guint64")
-)
-
-(define-method get_remaining_time
- (of-object "EmpathyTpFile")
- (c-name "empathy_tp_file_get_remaining_time")
- (return-type "gint")
-)
-
-(define-method get_content_type
- (of-object "EmpathyTpFile")
- (c-name "empathy_tp_file_get_content_type")
- (return-type "const-gchar*")
-)
-
-(define-method is_ready
- (of-object "EmpathyTpFile")
- (c-name "empathy_tp_file_is_ready")
- (return-type "gboolean")
-)
-
;; From empathy-tp-roomlist.h
@@ -2452,11 +2726,23 @@
(return-type "none")
(parameters
'("TpSocketAddressType" "type")
- '("EmpatyTpTubeAcceptStreamTubeCb*" "callback")
+ '("EmpathyTpTubeAcceptStreamTubeCb*" "callback")
'("gpointer" "user_data")
)
)
+(define-method call_when_ready
+ (of-object "EmpathyTpTube")
+ (c-name "empathy_tp_tube_call_when_ready")
+ (return-type "none")
+ (parameters
+ '("EmpathyTpTubeReadyCb*" "callback")
+ '("gpointer" "user_data")
+ '("GDestroyNotify" "destroy")
+ '("GObject*" "weak_object")
+ )
+)
+
;; From empathy-tube-handler.h
@@ -2599,7 +2885,7 @@
(c-name "empathy_presence_get_default_message")
(return-type "const-gchar*")
(parameters
- '("McPresence" "presence")
+ '("TpConnectionPresenceType" "presence")
)
)
@@ -2607,13 +2893,13 @@
(c-name "empathy_presence_to_str")
(return-type "const-gchar*")
(parameters
- '("McPresence" "presence")
+ '("TpConnectionPresenceType" "presence")
)
)
(define-function presence_from_str
(c-name "empathy_presence_from_str")
- (return-type "McPresence")
+ (return-type "TpConnectionPresenceType")
(parameters
'("const-gchar*" "str")
)
@@ -2650,4 +2936,13 @@
(return-type "gboolean")
)
+(define-function uint_compare
+ (c-name "empathy_uint_compare")
+ (return-type "gint")
+ (parameters
+ '("gconstpointer" "a")
+ '("gconstpointer" "b")
+ )
+)
+
diff --git a/python/pyempathy/pyempathy.override b/python/pyempathy/pyempathy.override
index e4c99086c..c985be7b6 100644
--- a/python/pyempathy/pyempathy.override
+++ b/python/pyempathy/pyempathy.override
@@ -14,6 +14,8 @@ headers
#include "empathy-debug.h"
#include "empathy-dispatcher.h"
#include "empathy-enum-types.h"
+#include "empathy-ft-factory.h"
+#include "empathy-ft-handler.h"
#include "empathy-idle.h"
#include "empathy-irc-network.h"
#include "empathy-irc-network-manager.h"
diff --git a/python/pyempathygtk/Makefile.am b/python/pyempathygtk/Makefile.am
index 84204e764..3f4c6d52d 100644
--- a/python/pyempathygtk/Makefile.am
+++ b/python/pyempathygtk/Makefile.am
@@ -1,3 +1,5 @@
+include $(top_srcdir)/tools/shave.mk
+
PYDEFS=`pkg-config --variable=defsdir pygtk-2.0`
AM_CPPFLAGS = \
@@ -31,7 +33,7 @@ empathygtk_la_LDFLAGS = \
-module -avoid-version
pyempathygtk.c: pyempathygtk.override pyempathygtk.defs
- $(PYGOBJECTCODEGEN) \
+ $(QUIET_GEN)$(PYGOBJECTCODEGEN) \
--prefix empathy \
--register $(PYDEFS)/gdk-types.defs \
--register $(PYDEFS)/gtk-types.defs \
diff --git a/python/pyempathygtk/pyempathygtk.defs b/python/pyempathygtk/pyempathygtk.defs
index 01b65f7a1..291e154d8 100644
--- a/python/pyempathygtk/pyempathygtk.defs
+++ b/python/pyempathygtk/pyempathygtk.defs
@@ -181,7 +181,8 @@
'("is-active" "EMPATHY_CONTACT_LIST_STORE_COL_IS_ACTIVE")
'("is-online" "EMPATHY_CONTACT_LIST_STORE_COL_IS_ONLINE")
'("is-separator" "EMPATHY_CONTACT_LIST_STORE_COL_IS_SEPARATOR")
- '("can-voip" "EMPATHY_CONTACT_LIST_STORE_COL_CAN_VOIP")
+ '("can-audio-call" "EMPATHY_CONTACT_LIST_STORE_COL_CAN_AUDIO_CALL")
+ '("can-video-call" "EMPATHY_CONTACT_LIST_STORE_COL_CAN_VIDEO_CALL")
'("count" "EMPATHY_CONTACT_LIST_STORE_COL_COUNT")
)
)
@@ -230,6 +231,7 @@
'("edit-id" "EMPATHY_CONTACT_WIDGET_EDIT_ID")
'("edit-groups" "EMPATHY_CONTACT_WIDGET_EDIT_GROUPS")
'("for-tooltip" "EMPATHY_CONTACT_WIDGET_FOR_TOOLTIP")
+ '("show-location" "EMPATHY_CONTACT_WIDGET_SHOW_LOCATION")
)
)
@@ -278,9 +280,9 @@
(return-type "GtkWidget*")
)
-(define-method get_account
+(define-method dup_account
(of-object "EmpathyAccountChooser")
- (c-name "empathy_account_chooser_get_account")
+ (c-name "empathy_account_chooser_dup_account")
(return-type "McAccount*")
)
@@ -359,6 +361,15 @@
)
)
+(define-function account_widget_set_default_focus
+ (c-name "empathy_account_widget_set_default_focus")
+ (return-type "none")
+ (parameters
+ '("GtkBuilder*" "gui")
+ '("const-gchar*" "entry")
+ )
+)
+
(define-function account_widget_generic_new
(c-name "empathy_account_widget_generic_new")
(is-constructor-of "EmpathyAccountWidgetGeneric")
@@ -1145,9 +1156,9 @@
)
)
-(define-method get_selected
+(define-method dup_selected
(of-object "EmpathyContactListView")
- (c-name "empathy_contact_list_view_get_selected")
+ (c-name "empathy_contact_list_view_dup_selected")
(return-type "EmpathyContact*")
)
@@ -1188,9 +1199,15 @@
(return-type "GtkWidget*")
)
-(define-method call_menu_item_new
+(define-method audio_call_menu_item_new
(of-object "EmpathyContact")
- (c-name "empathy_contact_call_menu_item_new")
+ (c-name "empathy_contact_audio_call_menu_item_new")
+ (return-type "GtkWidget*")
+)
+
+(define-method video_call_menu_item_new
+ (of-object "EmpathyContact")
+ (c-name "empathy_contact_video_call_menu_item_new")
(return-type "GtkWidget*")
)
@@ -1546,8 +1563,8 @@
(return-type "GtkWidget*")
)
-(define-function profile_chooser_get_selected
- (c-name "empathy_profile_chooser_get_selected")
+(define-function profile_chooser_dup_selected
+ (c-name "empathy_profile_chooser_dup_selected")
(return-type "McProfile*")
(parameters
'("GtkWidget*" "widget")
@@ -1692,21 +1709,6 @@
-;; From empathy-spell-dialog.h
-
-(define-function spell_dialog_show
- (c-name "empathy_spell_dialog_show")
- (return-type "none")
- (parameters
- '("EmpathyChat*" "chat")
- '("GtkTextIter*" "start")
- '("GtkTextIter*" "end")
- '("const-gchar*" "word")
- )
-)
-
-
-
;; From empathy-theme-boxes.h
(define-function theme_boxes_get_type
@@ -1816,7 +1818,7 @@
(c-name "empathy_icon_name_for_presence")
(return-type "const-gchar*")
(parameters
- '("McPresence" "presence")
+ '("TpConnectionPresenceType" "presence")
)
)
@@ -1990,6 +1992,14 @@
)
)
+(define-function receive_file_with_file_chooser
+ (c-name "empathy_receive_file_with_file_chooser")
+ (return-type "none")
+ (parameters
+ '("EmpathyFTHandler*" "handler")
+ )
+)
+
(define-function sound_play
(c-name "empathy_sound_play")
(return-type "none")
diff --git a/python/pyempathygtk/pyempathygtk.override b/python/pyempathygtk/pyempathygtk.override
index 1480cef66..3229cbac2 100644
--- a/python/pyempathygtk/pyempathygtk.override
+++ b/python/pyempathygtk/pyempathygtk.override
@@ -29,7 +29,6 @@ headers
#include "empathy-presence-chooser.h"
#include "empathy-profile-chooser.h"
#include "empathy-smiley-manager.h"
-#include "empathy-spell-dialog.h"
#include "empathy-spell.h"
#include "empathy-theme-boxes.h"
#include "empathy-theme-irc.h"
@@ -62,12 +61,13 @@ import gtk.Bin as PyGtkBin_Type
import gtk.DrawingArea as PyGtkDrawingArea_Type
import gtk.ComboBoxEntry as PyGtkComboBoxEntry_Type
import gtk.Builder as PyGtkBuilder_Type
-import gst.GstBin as PyGstBin_Type
+import gst.Bin as PyGstBin_Type
import empathy.Contact as PyEmpathyContact_Type
import empathy.ContactList as PyEmpathyContactList_Type
import empathy.TpChat as PyEmpathyTpChat_Type
import empathy.Message as PyEmpathyMessage_Type
import empathy.TpCall as PyEmpathyTpCall_Type
+import empathy.FTHandler as PyEmpathyFTHandler_Type
%%
ignore-glob
*_get_type
@@ -76,6 +76,5 @@ ignore
empathy_chat_correct_word
empathy_chat_view_set_margin
empathy_chat_get_view
- empathy_spell_dialog_show
empathy_window_iconify
%%
diff --git a/python/update-binding.sh b/python/update-binding.sh
index 16a879faf..1f6e4ae78 100755
--- a/python/update-binding.sh
+++ b/python/update-binding.sh
@@ -18,6 +18,8 @@ python /usr/share/pygobject/2.0/codegen/h2def.py \
empathy-debug.h \
empathy-dispatcher.h \
empathy-dispatch-operation.h \
+ empathy-ft-factory.h \
+ empathy-ft-handler.h \
empathy-idle.h \
empathy-irc-network.h \
empathy-irc-network-manager.h \
@@ -76,7 +78,6 @@ python /usr/share/pygobject/2.0/codegen/h2def.py \
empathy-profile-chooser.h \
empathy-smiley-manager.h \
empathy-spell.h \
- empathy-spell-dialog.h \
empathy-theme-boxes.h \
empathy-theme-irc.h \
empathy-theme-manager.h \
diff --git a/release.py b/release.py
index 60977d502..9d20d1ab6 100755
--- a/release.py
+++ b/release.py
@@ -5,9 +5,11 @@ import re
import urllib
import csv
import datetime
+import time
from string import Template
from optparse import OptionParser
+last_tag_patern = 'EMPATHY_2_27*'
username = 'xclaesse'
upload_server = 'master.gnome.org'
template = '''\
@@ -66,6 +68,10 @@ class Project:
version_dir = self.package_version[:second]
self.package_dl_url = 'http://download.gnome.org/sources/%s/%s/' % (self.package_name.lower(),
version_dir)
+ tags_str = self.exec_cmd('git tag -l %s' % (last_tag_patern))
+ tags = tags_str.splitlines()
+ self.last_tag = tags[len(tags)-1]
+
def exec_cmd(self,cmd):
return os.popen(cmd).read()
@@ -128,51 +134,46 @@ class Project:
t = Template(template)
return t.substitute(locals())
- def get_last_tag(self):
- tags_str = self.exec_cmd('git tag')
- tags = tags_str.splitlines()
-
- return tags[len(tags)-1]
-
- def parse_commit(self, ref, author, date, message):
- p1 = message.rfind('(')
- p2 = message.rfind (')')
- if len(message) - p2 <= 2 and \
- message[p1+1:].find('#') == -1:
- author = message[p1+1:p2]
- message = message[:p1]
-
- msg = message.lower()
- if msg.find('translation') != -1 and \
- (msg.find('added') != -1 or \
- msg.find('updated') != -1):
- self.translations += ' - ' + message + ' (' + author + ').\n'
- elif message.find('#') != -1:
- p1 = message.find('#')
- while p1 != -1:
- bug = Bug()
- p2 = p1 + 1
- while p2 < len (message) and \
- message[p2].isdigit():
- p2 = p2 + 1
- bug.number = message[p1+1:p2]
- bug.author = author
- self.bug_commits.append(bug)
- p1 = message.find('#', p2)
- else:
- self.commits += ' - ' + message + ' (' + author + ').\n'
-
- def query_bug_commits(self):
- bugs = ''
- for bug in self.bug_commits:
- bugs += bug.number + ','
-
- # Bugzilla query to use
- query = 'http://bugzilla.gnome.org/buglist.cgi?ctype=csv' \
- '&bug_status=RESOLVED,CLOSED,VERIFIED' \
- '&resolution=FIXED' \
- '&bug_id=' + bugs.replace(',', '%2c')
-
+ def get_translations(self, cmd, format):
+ translations = ''
+ files_str = self.exec_cmd(cmd)
+ files = files_str.splitlines()
+ for line in files:
+ f = line[line.rfind(' '):]
+ lang = f[f.rfind('/')+1:f.rfind('.')]
+ commit_str = self.exec_cmd("git log %s.. %s" % (self.last_tag, f))
+ if commit_str == '':
+ continue
+
+ authors = ''
+ for line in commit_str.splitlines():
+ if line.startswith('Author:'):
+ p1 = line.find(' ')
+ p2 = line.find('<')
+ author = line[p1:p2].strip()
+
+ if authors.find(author) != -1:
+ continue
+ if authors != '':
+ authors += ", "
+ authors += author
+
+ translations += format % (lang, authors)
+ return translations
+
+ def get_bugs(self):
+ commit_str = self.exec_cmd('git show %s' % (self.last_tag))
+ for line in commit_str.splitlines():
+ if line.startswith('Date:'):
+ time_str = line[5:line.rfind('+')].strip()
+ t = time.strptime(time_str)
+ last_tag_date = time.strftime('%Y-%m-%d', t)
+ break
+
+ query = 'http://bugzilla.gnome.org/buglist.cgi?' \
+ 'ctype=csv&product=empathy&' \
+ 'bug_status=RESOLVED,CLOSED,VERIFIED&resolution=FIXED&' \
+ 'chfieldfrom=%s&chfieldto=Now' % (last_tag_date)
f = urllib.urlopen(query)
s = f.read()
f.close()
@@ -191,82 +192,28 @@ class Project:
col_description = i
i = i + 1
+ bugs = ''
for row in reader:
bug_number = row[col_bug_id]
description = row[col_description]
-
- for bug in self.bug_commits:
- if bug.number == bug_number:
- self.bugs += ' - Fixed #%s, %s (%s)\n' % (bug.number, description, bug.author)
- break
-
- def get_commits(self):
- self.commits = ''
- self.translations = ''
- self.bugs = ''
- self.bug_commits = []
- last_tag = self.get_last_tag()
- ref = None
-
- changes = self.exec_cmd ("git log " + last_tag + "..")
- for line in changes.splitlines(1):
- if line.startswith('commit'):
- if ref != None:
- self.parse_commit (ref, author, date, message)
- p1 = line.find(' ')
- ref = line[p1:].strip()
- author = ''
- date = ''
- message = ''
- elif line.startswith('Author:'):
- p1 = line.find(' ')
- p2 = line.find('<')
- author = line[p1:p2].strip()
- elif line.startswith('Date:'):
- p1 = line.find(' ')
- date = line[p1:].strip()
- elif line.startswith(' git-svn-id:'):
- continue
- elif line.startswith(' Signed-off-by:'):
- continue
- elif line.startswith(' From:'):
- continue
- elif line.startswith('Merge:'):
- continue
- else:
- msg = line.strip()
- if msg == '':
- continue
- if message != '':
- message += '\n'
- message += msg
-
- if len (self.bug_commits) > 0:
- self.query_bug_commits ()
-
- def make_tag(self):
- new_tag = self.package_name.upper() + '_' +\
- self.package_version.replace('.', '_')
-
- info = self.exec_cmd('git svn info | grep URL')
- url1 = info[info.find(" "):].strip()
-
- end = url1.find("empathy")
- end = url1.find("/", end)
- url2 = url1[:end] + '/tags/' + new_tag
-
- self.exec_cmd('svn copy %s %s -m "Tagged for release %s."' % (url1, url2, self.package_version))
- self.exec_cmd('git tag -m "Tagged for release %s." %s' % ( self.package_version, new_tag))
+ bugs += ' - Fixed #%s, %s\n' % (bug_number, description)
+ return bugs
def generate_news(self):
- self.get_commits()
+ translations = self.get_translations("ls -l po/*.po", \
+ " - Updated %s Translation (%s)\n")
+ help_translations = self.get_translations("ls -l help/*/*.po", \
+ " - Updated %s Documentation translation (%s)\n")
+ bugs = self.get_bugs()
+
news = 'NEW in '+ self.package_version + '\n==============\n'
- if self.commits != '':
- news += self.commits + '\n'
- if self.bugs != '':
- news += 'Bugs fixed:\n' + self.bugs + '\n'
- if self.translations != '':
- news += 'Translations:\n' + self.translations + '\n'
+ if bugs != '':
+ news += 'Bugs fixed:\n' + bugs + '\n'
+ if translations != '':
+ news += 'Translations:\n' + translations + '\n'
+ if help_translations != '':
+ news += 'Documentation translations:\n' + \
+ help_translations + '\n'
return news
@@ -280,6 +227,11 @@ class Project:
self.exec_cmd('cat NEWS >> /tmp/NEWS')
self.exec_cmd('mv /tmp/NEWS .')
+ def make_tag(self):
+ new_tag = self.package_name.upper() + '_' +\
+ self.package_version.replace('.', '_')
+ self.exec_cmd('git tag -m "Tagged for release %s." %s' % ( self.package_version, new_tag))
+
def upload_tarball(self):
tarball = '%s-%s.tar.gz' % (self.package_name.lower(), self.package_version)
diff --git a/shave-libtool.in b/shave-libtool.in
new file mode 100644
index 000000000..1f3a720c1
--- /dev/null
+++ b/shave-libtool.in
@@ -0,0 +1,69 @@
+#!/bin/sh
+
+# we need sed
+SED=@SED@
+if test -z "$SED" ; then
+SED=sed
+fi
+
+lt_unmangle ()
+{
+ last_result=`echo $1 | $SED -e 's#.libs/##' -e 's#[0-9a-zA-Z_\-\.]*_la-##'`
+}
+
+# the real libtool to use
+LIBTOOL="$1"
+shift
+
+# if 1, don't print anything, the underlaying wrapper will do it
+pass_though=0
+
+# scan the arguments, keep the right ones for libtool, and discover the mode
+preserved_args=
+while test "$#" -gt 0; do
+ opt="$1"
+ shift
+
+ case $opt in
+ --mode=*)
+ mode=`echo $opt | $SED -e 's/[-_a-zA-Z0-9]*=//'`
+ preserved_args="$preserved_args $opt"
+ ;;
+ -o)
+ lt_output="$1"
+ preserved_args="$preserved_args $opt"
+ ;;
+ *)
+ preserved_args="$preserved_args $opt"
+ ;;
+ esac
+done
+
+case "$mode" in
+compile)
+ # shave will be called and print the actual CC/CXX/LINK line
+ preserved_args="$preserved_args --shave-mode=$mode"
+ pass_though=1
+ ;;
+link)
+ preserved_args="$preserved_args --shave-mode=$mode"
+ Q=" LINK "
+ ;;
+*)
+ # let's u
+ # echo "*** libtool: Unimplemented mode: $mode, fill a bug report"
+ ;;
+esac
+
+lt_unmangle "$lt_output"
+output=$last_result
+
+if test -z $V; then
+ if test $pass_though -eq 0; then
+ echo "$Q$output"
+ fi
+ $LIBTOOL --silent $preserved_args
+else
+ echo $LIBTOOL $preserved_args
+ $LIBTOOL $preserved_args
+fi
diff --git a/shave.in b/shave.in
new file mode 100644
index 000000000..5c16f27ae
--- /dev/null
+++ b/shave.in
@@ -0,0 +1,79 @@
+#!/bin/sh
+
+# we need sed
+SED=@SED@
+if test -z "$SED" ; then
+SED=sed
+fi
+
+lt_unmangle ()
+{
+ last_result=`echo $1 | $SED -e 's#.libs/##' -e 's#[0-9a-zA-Z_\-\.]*_la-##'`
+}
+
+# the tool to wrap (cc, cxx, ar, ranlib, ..)
+tool="$1"
+shift
+
+# the reel tool (to call)
+REEL_TOOL="$1"
+shift
+
+pass_through=0
+preserved_args=
+while test "$#" -gt 0; do
+ opt="$1"
+ shift
+
+ case $opt in
+ --shave-mode=*)
+ mode=`echo $opt | $SED -e 's/[-_a-zA-Z0-9]*=//'`
+ ;;
+ -o)
+ lt_output="$1"
+ preserved_args="$preserved_args $opt"
+ ;;
+ *)
+ preserved_args="$preserved_args $opt"
+ ;;
+ esac
+done
+
+# mode=link is handled in the libtool wrapper
+case "$mode,$tool" in
+link,*)
+ pass_through=1
+ ;;
+*,cxx)
+ Q=" CXX "
+ ;;
+*,cc)
+ Q=" CC "
+ ;;
+*,fc)
+ Q=" FC "
+ ;;
+*,f77)
+ Q=" F77 "
+ ;;
+*,objc)
+ Q=" OBJC "
+ ;;
+*,*)
+ # should not happen
+ Q=" CC "
+ ;;
+esac
+
+lt_unmangle "$lt_output"
+output=$last_result
+
+if test -z $V; then
+ if test $pass_through -eq 0; then
+ echo "$Q$output"
+ fi
+ $REEL_TOOL $preserved_args
+else
+ echo $REEL_TOOL $preserved_args
+ $REEL_TOOL $preserved_args
+fi
diff --git a/src/Makefile.am b/src/Makefile.am
index b776396aa..081b6f4f2 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -1,16 +1,20 @@
+include $(top_srcdir)/tools/shave.mk
+
AM_CPPFLAGS = \
-I$(top_srcdir) \
$(EMPATHY_CFLAGS) \
$(LIBNOTIFY_CFLAGS) \
- $(WARN_CFLAGS) \
+ $(LIBCHAMPLAIN_CFLAGS) \
$(DISABLE_DEPRECATED)
+ $(WARN_CFLAGS)
LDADD = \
$(top_builddir)/libempathy-gtk/libempathy-gtk.la \
$(top_builddir)/libempathy/libempathy.la \
$(top_builddir)/extensions/libemp-extensions.la \
$(LIBNOTIFY_LIBS) \
- $(EMPATHY_LIBS)
+ $(EMPATHY_LIBS) \
+ $(LIBCHAMPLAIN_LIBS)
bin_PROGRAMS = \
empathy \
@@ -20,12 +24,12 @@ BUILT_SOURCES= \
empathy-tube-dispatch-enumtypes.h \
empathy-tube-dispatch-enumtypes.c
-empathy_SOURCES = \
- bacon-message-connection.c bacon-message-connection.h \
+empathy_handwritten_source = \
empathy.c \
empathy-about-dialog.c empathy-about-dialog.h \
empathy-accounts-dialog.c empathy-accounts-dialog.h \
empathy-call-window.c empathy-call-window.h \
+ empathy-call-window-fullscreen.c empathy-call-window-fullscreen.h \
empathy-chatrooms-window.c empathy-chatrooms-window.h \
empathy-debug-dialog.c empathy-debug-dialog.h \
empathy-chat-window.c empathy-chat-window.h \
@@ -39,17 +43,28 @@ empathy_SOURCES = \
empathy-preferences.c empathy-preferences.h \
empathy-sidebar.c empathy-sidebar.h \
empathy-status-icon.c empathy-status-icon.h \
- empathy-tube-dispatch.c empathy-tube-dispatch.h \
+ empathy-tube-dispatch.c empathy-tube-dispatch.h
+
+empathy_SOURCES = \
+ $(empathy_handwritten_source) \
+ bacon-message-connection.c bacon-message-connection.h \
ephy-spinner.c ephy-spinner.h
nodist_empathy_SOURCES = $(BUILT_SOURCES)
empathy_logs_SOURCES = empathy-logs.c
+check_c_sources = \
+ $(empathy_handwritten_source) \
+ $(empathy_logs_SOURCES)
+include $(top_srcdir)/tools/check-coding-style.mk
+check-local: check-coding-style
+
uidir = $(datadir)/empathy
ui_DATA = \
empathy-accounts-dialog.ui \
empathy-call-window.ui \
+ empathy-call-window-fullscreen.ui \
empathy-chatrooms-window.ui \
empathy-chat-window.ui \
empathy-ft-manager.ui \
@@ -59,12 +74,20 @@ ui_DATA = \
empathy-preferences.ui \
empathy-status-icon.ui
+if HAVE_LIBCHAMPLAIN
+empathy_SOURCES += \
+ empathy-map-view.c empathy-map-view.h
+
+ui_DATA += \
+ empathy-map-view.ui
+endif
+
dist_man_MANS = \
empathy.1
# rules for making the glib enum objects
%-enumtypes.h: %.h Makefile.in
- glib-mkenums \
+ $(QUIET_GEN)glib-mkenums \
--fhead "#ifndef __$(shell echo $* | tr [:lower:]- [:upper:]_)_ENUM_TYPES_H__\n#define __$(shell echo $* | tr [:lower:]- [:upper:]_)_ENUM_TYPES_H__\n\n#include <glib-object.h>\n\nG_BEGIN_DECLS\n" \
--fprod "/* enumerations from \"@filename@\" */\n" \
--vhead "GType @enum_name@_get_type (void);\n#define $(shell echo $* | tr [:lower:]- [:upper:]_ | sed 's/_.*//')_TYPE_@ENUMSHORT@ (@enum_name@_get_type())\n" \
@@ -72,7 +95,7 @@ dist_man_MANS = \
$< > $@
%-enumtypes.c: %.h Makefile.in
- glib-mkenums \
+ $(QUIET_GEN)glib-mkenums \
--fhead "#include <$*.h>\n#include <$*-enumtypes.h>" \
--fprod "\n/* enumerations from \"@filename@\" */" \
--vhead "GType\n@enum_name@_get_type (void)\n{\n static GType etype = 0;\n if (etype == 0) {\n static const G@Type@Value values[] = {" \
diff --git a/src/empathy-about-dialog.c b/src/empathy-about-dialog.c
index a743f22c4..62c545864 100644
--- a/src/empathy-about-dialog.c
+++ b/src/empathy-about-dialog.c
@@ -15,9 +15,9 @@
*
* You should have received a copy of the GNU General Public
* License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- *
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301 USA
+ *
* Authors: Martyn Russell <martyn@imendio.com>
* Xavier Claessens <xclaesse@gmail.com>
*/
@@ -44,6 +44,7 @@ static const char *authors[] = {
"Aurelien Naldi",
"Bastien Nocera",
"Christoffer Olsen",
+ "Cosimo Cecchi",
"Elliot Fairweather",
"Frederic Crozat",
"Frederic Peters",
diff --git a/src/empathy-about-dialog.h b/src/empathy-about-dialog.h
index e7eac5ff9..3e8f40531 100644
--- a/src/empathy-about-dialog.h
+++ b/src/empathy-about-dialog.h
@@ -15,9 +15,9 @@
*
* You should have received a copy of the GNU General Public
* License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- *
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301 USA
+ *
* Authors: Martyn Russell <martyn@imendio.com>
* Xavier Claessens <xclaesse@gmail.com>
*/
diff --git a/src/empathy-accounts-dialog.c b/src/empathy-accounts-dialog.c
index e15c0eab1..e311ac637 100644
--- a/src/empathy-accounts-dialog.c
+++ b/src/empathy-accounts-dialog.c
@@ -15,9 +15,9 @@
*
* You should have received a copy of the GNU General Public
* License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- *
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301 USA
+ *
* Authors: Martyn Russell <martyn@imendio.com>
* Xavier Claessens <xclaesse@gmail.com>
*/
@@ -217,9 +217,9 @@ accounts_dialog_update_account (EmpathyAccountsDialog *dialog,
profile = mc_account_get_profile (account);
config_ui = mc_profile_get_configuration_ui (profile);
if (!tp_strdiff (config_ui, "jabber")) {
- dialog->settings_widget =
+ dialog->settings_widget =
empathy_account_widget_jabber_new (account);
- }
+ }
else if (!tp_strdiff (config_ui, "msn")) {
dialog ->settings_widget =
empathy_account_widget_msn_new (account);
@@ -232,11 +232,11 @@ accounts_dialog_update_account (EmpathyAccountsDialog *dialog,
dialog->settings_widget =
empathy_account_widget_irc_new (account);
}
- else if (!tp_strdiff(config_ui, "icq")) {
+ else if (!tp_strdiff (config_ui, "icq")) {
dialog->settings_widget =
empathy_account_widget_icq_new (account);
}
- else if (!tp_strdiff(config_ui, "aim")) {
+ else if (!tp_strdiff (config_ui, "aim")) {
dialog->settings_widget =
empathy_account_widget_aim_new (account);
}
@@ -253,7 +253,7 @@ accounts_dialog_update_account (EmpathyAccountsDialog *dialog,
empathy_account_widget_groupwise_new (account);
}
else {
- dialog->settings_widget =
+ dialog->settings_widget =
empathy_account_widget_generic_new (account);
}
@@ -358,7 +358,7 @@ accounts_dialog_enable_toggled_cb (GtkCellRendererToggle *cell_renderer,
mc_account_set_enabled (account, !enabled);
DEBUG ("%s account %s", enabled ? "Disabled" : "Enable",
- mc_account_get_display_name(account));
+ mc_account_get_display_name (account));
g_object_unref (account);
}
@@ -469,7 +469,7 @@ accounts_dialog_model_pixbuf_data_func (GtkTreeViewColumn *tree_column,
if (pixbuf) {
if (status == TP_CONNECTION_STATUS_DISCONNECTED ||
- (status == TP_CONNECTION_STATUS_CONNECTING &&
+ (status == TP_CONNECTION_STATUS_CONNECTING &&
!dialog->connecting_show)) {
GdkPixbuf *modded_pixbuf;
@@ -954,10 +954,10 @@ accounts_dialog_button_remove_clicked_cb (GtkWidget *button,
"they will still be available."));
gtk_dialog_add_button (GTK_DIALOG (message_dialog),
- GTK_STOCK_CANCEL,
+ GTK_STOCK_CANCEL,
GTK_RESPONSE_NO);
gtk_dialog_add_button (GTK_DIALOG (message_dialog),
- GTK_STOCK_REMOVE,
+ GTK_STOCK_REMOVE,
GTK_RESPONSE_YES);
gtk_widget_show (message_dialog);
diff --git a/src/empathy-accounts-dialog.h b/src/empathy-accounts-dialog.h
index 369b2f75b..40ea24f3e 100644
--- a/src/empathy-accounts-dialog.h
+++ b/src/empathy-accounts-dialog.h
@@ -15,9 +15,9 @@
*
* You should have received a copy of the GNU General Public
* License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- *
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301 USA
+ *
* Authors: Martyn Russell <martyn@imendio.com>
* Xavier Claessens <xclaesse@gmail.com>
*/
diff --git a/src/empathy-call-window-fullscreen.c b/src/empathy-call-window-fullscreen.c
new file mode 100644
index 000000000..33f4085b3
--- /dev/null
+++ b/src/empathy-call-window-fullscreen.c
@@ -0,0 +1,294 @@
+/*
+ * empathy-call-window-fullscreen.c - Source for EmpathyCallWindowFullscreen
+ * Copyright (C) 2009 Collabora Ltd.
+ *
+ * Some code is based on the Totem Movie Player, especially
+ * totem-fullscreen.c which has the following copyright:
+ * Copyright (C) 2001-2007 Bastien Nocera <hadess@hadess.net>
+ * Copyright (C) 2007 Sunil Mohan Adapa <sunilmohan@gnu.org.in>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include "empathy-call-window-fullscreen.h"
+
+#include <gtk/gtk.h>
+
+#include <libempathy/empathy-utils.h>
+#include <libempathy-gtk/empathy-ui-utils.h>
+
+/* The number of seconds for which the "leave fullscreen" popup should
+ be shown */
+#define FULLSCREEN_POPUP_TIMEOUT 5
+
+G_DEFINE_TYPE (EmpathyCallWindowFullscreen, empathy_call_window_fullscreen,
+ G_TYPE_OBJECT)
+
+/* private structure */
+typedef struct _EmpathyCallWindowFullscreenPriv
+ EmpathyCallWindowFullscreenPriv;
+
+struct _EmpathyCallWindowFullscreenPriv
+{
+ EmpathyCallWindow *parent_window;
+
+ GtkWidget *leave_fullscreen_popup;
+ GtkWidget *video_widget;
+
+ guint popup_timeout;
+ gboolean popup_creation_in_progress;
+ gboolean dispose_has_run;
+};
+
+#define GET_PRIV(o) \
+ (G_TYPE_INSTANCE_GET_PRIVATE ((o), EMPATHY_TYPE_CALL_WINDOW_FULLSCREEN, \
+ EmpathyCallWindowFullscreenPriv))
+
+static void empathy_call_window_fullscreen_dispose (GObject *object);
+static void empathy_call_window_fullscreen_finalize (GObject *object);
+
+static gboolean empathy_call_window_fullscreen_hide_popup (
+ EmpathyCallWindowFullscreen *fs);
+
+static void
+empathy_call_window_fullscreen_set_cursor_visible (
+ EmpathyCallWindowFullscreen *fs,
+ gboolean show_cursor)
+{
+ EmpathyCallWindowFullscreenPriv *priv = GET_PRIV (fs);
+
+ if (priv->video_widget != NULL && !show_cursor)
+ {
+ gdk_window_set_cursor (priv->video_widget->window,
+ gdk_cursor_new (GDK_BLANK_CURSOR));
+ }
+ else
+ gdk_window_set_cursor (priv->video_widget->window, NULL);
+}
+
+static void
+empathy_call_window_fullscreen_add_popup_timeout (
+ EmpathyCallWindowFullscreen *self)
+{
+ EmpathyCallWindowFullscreenPriv *priv = GET_PRIV (self);
+
+ if (priv->popup_timeout == 0)
+ {
+ priv->popup_timeout = g_timeout_add_seconds (FULLSCREEN_POPUP_TIMEOUT,
+ (GSourceFunc) empathy_call_window_fullscreen_hide_popup, self);
+ }
+}
+
+static void
+empathy_call_window_fullscreen_remove_popup_timeout (
+ EmpathyCallWindowFullscreen *self)
+{
+ EmpathyCallWindowFullscreenPriv *priv = GET_PRIV (self);
+
+ if (priv->popup_timeout != 0)
+ {
+ g_source_remove (priv->popup_timeout);
+ priv->popup_timeout = 0;
+ }
+}
+
+void
+empathy_call_window_fullscreen_show_popup (EmpathyCallWindowFullscreen *self)
+{
+ gint leave_fullscreen_width, leave_fullscreen_height;
+ GdkScreen *screen;
+ GdkRectangle fullscreen_rect;
+ EmpathyCallWindowFullscreenPriv *priv = GET_PRIV (self);
+
+ g_assert (self->is_fullscreen);
+
+ g_return_if_fail (priv->parent_window != NULL);
+
+ if (priv->popup_creation_in_progress)
+ return;
+
+ if (!gtk_window_is_active (GTK_WINDOW (priv->parent_window)))
+ return;
+
+ priv->popup_creation_in_progress = TRUE;
+
+ empathy_call_window_fullscreen_set_cursor_visible (self, TRUE);
+
+ /* Obtaining the screen rectangle */
+ screen = gtk_window_get_screen (GTK_WINDOW (priv->parent_window));
+ gdk_screen_get_monitor_geometry (screen,
+ gdk_screen_get_monitor_at_window (screen,
+ GTK_WIDGET (priv->parent_window)->window),
+ &fullscreen_rect);
+
+ /* Getting the popup window sizes */
+ gtk_window_get_size (GTK_WINDOW (priv->leave_fullscreen_popup),
+ &leave_fullscreen_width, &leave_fullscreen_height);
+
+ /* Moving the popup to the top-right corner (if the direction is LTR) or the
+ top-left corner (if the direction is RTL).*/
+ if (gtk_widget_get_direction (priv->leave_fullscreen_popup)
+ == GTK_TEXT_DIR_LTR)
+ {
+ gtk_window_move (GTK_WINDOW (priv->leave_fullscreen_popup),
+ fullscreen_rect.width + fullscreen_rect.x - leave_fullscreen_width,
+ fullscreen_rect.y);
+
+ }
+ else
+ {
+ gtk_window_move (GTK_WINDOW (priv->leave_fullscreen_popup),
+ fullscreen_rect.x, fullscreen_rect.y);
+ }
+
+ gtk_widget_show_all (priv->leave_fullscreen_popup);
+ empathy_call_window_fullscreen_add_popup_timeout (self);
+
+ priv->popup_creation_in_progress = FALSE;
+}
+
+static gboolean
+empathy_call_window_fullscreen_hide_popup (EmpathyCallWindowFullscreen *fs)
+{
+ EmpathyCallWindowFullscreenPriv *priv = GET_PRIV (fs);
+
+ if (priv->video_widget == NULL || !fs->is_fullscreen)
+ return TRUE;
+
+ gtk_widget_hide (priv->leave_fullscreen_popup);
+ empathy_call_window_fullscreen_remove_popup_timeout (fs);
+
+ empathy_call_window_fullscreen_set_cursor_visible (fs, FALSE);
+
+ return FALSE;
+}
+
+static void
+empathy_call_window_fullscreen_init (EmpathyCallWindowFullscreen *self)
+{
+ EmpathyCallWindowFullscreenPriv *priv = GET_PRIV (self);
+ GtkBuilder *gui;
+ gchar *filename;
+
+ filename = empathy_file_lookup ("empathy-call-window-fullscreen.ui", "src");
+ gui = empathy_builder_get_file (filename,
+ "leave_fullscreen_window", &priv->leave_fullscreen_popup,
+ "leave_fullscreen_button", &self->leave_fullscreen_button,
+ NULL);
+
+ gtk_widget_add_events (priv->leave_fullscreen_popup, GDK_POINTER_MOTION_MASK);
+
+ g_object_unref (gui);
+ g_free (filename);
+}
+
+static void
+empathy_call_window_fullscreen_class_init (
+ EmpathyCallWindowFullscreenClass *klass)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+ g_type_class_add_private (klass, sizeof (EmpathyCallWindowFullscreenPriv));
+
+ object_class->dispose = empathy_call_window_fullscreen_dispose;
+ object_class->finalize = empathy_call_window_fullscreen_finalize;
+}
+
+void
+empathy_call_window_fullscreen_dispose (GObject *object)
+{
+ EmpathyCallWindowFullscreen *self = EMPATHY_CALL_WINDOW_FULLSCREEN (object);
+ EmpathyCallWindowFullscreenPriv *priv = GET_PRIV (self);
+
+ if (priv->dispose_has_run)
+ return;
+
+ priv->dispose_has_run = TRUE;
+
+ if (priv->leave_fullscreen_popup != NULL)
+ gtk_widget_destroy (priv->leave_fullscreen_popup);
+ priv->leave_fullscreen_popup = NULL;
+
+ if (G_OBJECT_CLASS (empathy_call_window_fullscreen_parent_class)->dispose)
+ {
+ G_OBJECT_CLASS (
+ empathy_call_window_fullscreen_parent_class)->dispose (object);
+ }
+}
+
+void
+empathy_call_window_fullscreen_finalize (GObject *object)
+{
+ EmpathyCallWindowFullscreen *self = EMPATHY_CALL_WINDOW_FULLSCREEN (object);
+
+ empathy_call_window_fullscreen_remove_popup_timeout (self);
+
+ G_OBJECT_CLASS (
+ empathy_call_window_fullscreen_parent_class)->finalize (object);
+}
+
+static void
+empathy_call_window_fullscreen_parent_window_notify (GtkWidget *parent_window,
+ GParamSpec *property, EmpathyCallWindowFullscreen *fs)
+{
+ EmpathyCallWindowFullscreenPriv *priv = GET_PRIV (fs);
+
+ if (!fs->is_fullscreen)
+ return;
+
+ if (parent_window == GTK_WIDGET (priv->parent_window) &&
+ !gtk_window_is_active (GTK_WINDOW (parent_window)))
+ {
+ empathy_call_window_fullscreen_hide_popup (fs);
+ empathy_call_window_fullscreen_set_cursor_visible (fs, TRUE);
+ }
+}
+
+EmpathyCallWindowFullscreen *
+empathy_call_window_fullscreen_new (EmpathyCallWindow *parent_window)
+{
+ EmpathyCallWindowFullscreen *self = EMPATHY_CALL_WINDOW_FULLSCREEN (
+ g_object_new (EMPATHY_TYPE_CALL_WINDOW_FULLSCREEN, NULL));
+ EmpathyCallWindowFullscreenPriv *priv = GET_PRIV (self);
+
+ priv->parent_window = parent_window;
+ g_signal_connect (G_OBJECT (priv->parent_window), "notify::is-active",
+ G_CALLBACK (empathy_call_window_fullscreen_parent_window_notify), self);
+
+ return self;
+}
+
+void
+empathy_call_window_fullscreen_set_fullscreen (EmpathyCallWindowFullscreen *fs,
+ gboolean set_fullscreen)
+{
+
+ if (set_fullscreen)
+ empathy_call_window_fullscreen_remove_popup_timeout (fs);
+ else
+ empathy_call_window_fullscreen_hide_popup (fs);
+
+ empathy_call_window_fullscreen_set_cursor_visible (fs, !set_fullscreen);
+ fs->is_fullscreen = set_fullscreen;
+}
+
+void
+empathy_call_window_fullscreen_set_video_widget (
+ EmpathyCallWindowFullscreen *fs,
+ GtkWidget *video_widget)
+{
+ EmpathyCallWindowFullscreenPriv *priv = GET_PRIV (fs);
+ priv->video_widget = video_widget;
+}
diff --git a/src/empathy-call-window-fullscreen.h b/src/empathy-call-window-fullscreen.h
new file mode 100644
index 000000000..8bde16ced
--- /dev/null
+++ b/src/empathy-call-window-fullscreen.h
@@ -0,0 +1,77 @@
+/*
+ * empathy-call-window-fullscreen.h - Header for EmpathyCallWindowFullscreen
+ * Copyright (C) 2009 Collabora Ltd.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef __EMPATHY_CALL_WINDOW_FULLSCREEN_H__
+#define __EMPATHY_CALL_WINDOW_FULLSCREEN_H__
+
+#include <glib-object.h>
+#include <gtk/gtk.h>
+
+#include "empathy-call-window.h"
+
+G_BEGIN_DECLS
+
+typedef struct _EmpathyCallWindowFullscreen EmpathyCallWindowFullscreen;
+typedef struct _EmpathyCallWindowFullscreenClass
+ EmpathyCallWindowFullscreenClass;
+
+struct _EmpathyCallWindowFullscreenClass {
+ GObjectClass parent_class;
+};
+
+struct _EmpathyCallWindowFullscreen {
+ GObject parent;
+ gboolean is_fullscreen;
+ GtkWidget *leave_fullscreen_button;
+};
+
+GType empathy_call_window_fullscreen_get_type (void);
+
+/* TYPE MACROS */
+#define EMPATHY_TYPE_CALL_WINDOW_FULLSCREEN \
+ (empathy_call_window_fullscreen_get_type ())
+#define EMPATHY_CALL_WINDOW_FULLSCREEN(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST((obj), EMPATHY_TYPE_CALL_WINDOW_FULLSCREEN, \
+ EmpathyCallWindowFullscreen))
+#define EMPATHY_CALL_WINDOW_FULLSCREEN_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST((klass), EMPATHY_TYPE_CALL_WINDOW_FULLSCREEN, \
+ EmpathyCallWindowClassFullscreen))
+#define EMPATHY_IS_CALL_WINDOW_FULLSCREEN(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE((obj), EMPATHY_TYPE_CALL_WINDOW_FULLSCREEN))
+#define EMPATHY_IS_CALL_WINDOW_FULLSCREEN_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_TYPE((klass), EMPATHY_TYPE_CALL_WINDOW_FULLSCREEN))
+#define EMPATHY_CALL_WINDOW_FULLSCREEN_GET_CLASS(obj) \
+ (G_TYPE_INSTANCE_GET_CLASS ((obj), EMPATHY_TYPE_CALL_WINDOW_FULLSCREEN, \
+ EmpathyCallWindowFullscreenClass))
+
+EmpathyCallWindowFullscreen *empathy_call_window_fullscreen_new (
+ EmpathyCallWindow *parent);
+
+void empathy_call_window_fullscreen_set_fullscreen (
+ EmpathyCallWindowFullscreen *fs,
+ gboolean set_fullscreen);
+void empathy_call_window_fullscreen_set_video_widget (
+ EmpathyCallWindowFullscreen *fs,
+ GtkWidget *video_widget);
+void empathy_call_window_fullscreen_show_popup (
+ EmpathyCallWindowFullscreen *fs);
+
+G_END_DECLS
+
+#endif /* #ifndef __EMPATHY_CALL_WINDOW_FULLSCREEN_H__*/
diff --git a/src/empathy-call-window-fullscreen.ui b/src/empathy-call-window-fullscreen.ui
new file mode 100644
index 000000000..5bf5e509b
--- /dev/null
+++ b/src/empathy-call-window-fullscreen.ui
@@ -0,0 +1,23 @@
+<?xml version="1.0"?>
+<interface>
+ <requires lib="gtk+" version="2.16"/>
+ <!-- interface-naming-policy toplevel-contextual -->
+ <object class="GtkWindow" id="leave_fullscreen_window">
+ <property name="type">popup</property>
+ <property name="resizable">False</property>
+ <property name="skip_taskbar_hint">True</property>
+ <property name="skip_pager_hint">True</property>
+ <property name="decorated">False</property>
+ <property name="deletable">False</property>
+ <signal name="motion_notify_event" handler="empathy_call_window_fullscreen_motion_notify_cb"/>
+ <child>
+ <object class="GtkButton" id="leave_fullscreen_button">
+ <property name="label" translatable="yes">gtk-leave-fullscreen</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_stock">True</property>
+ </object>
+ </child>
+ </object>
+</interface>
diff --git a/src/empathy-call-window.c b/src/empathy-call-window.c
index 01c2c4f5c..08c0e7ea2 100644
--- a/src/empathy-call-window.c
+++ b/src/empathy-call-window.c
@@ -1,6 +1,6 @@
/*
* empathy-call-window.c - Source for EmpathyCallWindow
- * Copyright (C) 2008 Collabora Ltd.
+ * Copyright (C) 2008-2009 Collabora Ltd.
* @author Sjoerd Simons <sjoerd.simons@collabora.co.uk>
*
* This library is free software; you can redistribute it and/or
@@ -24,13 +24,16 @@
#include <math.h>
+#include <gdk/gdkkeysyms.h>
#include <gst/gst.h>
#include <gtk/gtk.h>
#include <glib/gi18n.h>
#include <telepathy-farsight/channel.h>
+#include <libempathy/empathy-tp-contact-factory.h>
#include <libempathy/empathy-utils.h>
+#include <libempathy-gtk/empathy-avatar-image.h>
#include <libempathy-gtk/empathy-video-widget.h>
#include <libempathy-gtk/empathy-audio-src.h>
#include <libempathy-gtk/empathy-audio-sink.h>
@@ -39,10 +42,23 @@
#include "empathy-call-window.h"
+#include "empathy-call-window-fullscreen.h"
#include "empathy-sidebar.h"
#define BUTTON_ID "empathy-call-dtmf-button-id"
+#define CONTENT_HBOX_BORDER_WIDTH 6
+#define CONTENT_HBOX_SPACING 3
+#define CONTENT_HBOX_CHILDREN_PACKING_PADDING 3
+
+#define SELF_VIDEO_SECTION_WIDTH 160
+#define SELF_VIDEO_SECTION_HEIGTH 120
+
+/* The avatar's default width and height are set to the same value because we
+ want a square icon. */
+#define REMOTE_CONTACT_AVATAR_DEFAULT_WIDTH EMPATHY_VIDEO_WIDGET_DEFAULT_HEIGHT
+#define REMOTE_CONTACT_AVATAR_DEFAULT_HEIGHT EMPATHY_VIDEO_WIDGET_DEFAULT_HEIGHT
+
G_DEFINE_TYPE(EmpathyCallWindow, empathy_call_window, GTK_TYPE_WINDOW)
/* signal enum */
@@ -66,12 +82,15 @@ struct _EmpathyCallWindowPriv
{
gboolean dispose_has_run;
EmpathyCallHandler *handler;
+ EmpathyContact *contact;
gboolean connected;
GtkUIManager *ui_manager;
GtkWidget *video_output;
GtkWidget *video_preview;
+ GtkWidget *remote_user_avatar_widget;
+ GtkWidget *self_user_avatar_widget;
GtkWidget *sidebar;
GtkWidget *sidebar_button;
GtkWidget *statusbar;
@@ -81,6 +100,17 @@ struct _EmpathyCallWindowPriv
GtkWidget *toolbar;
GtkWidget *pane;
GtkAction *send_video;
+ GtkAction *menu_fullscreen;
+
+ /* We keep a reference on the hbox which contains the main content so we can
+ easilly repack everything when toggling fullscreen */
+ GtkWidget *content_hbox;
+
+ /* This vbox is contained in the content_hbox. When toggling fullscreen,
+ it needs to be repacked. We keep a reference on it for easier access. */
+ GtkWidget *vbox;
+
+ gulong video_output_motion_handler_id;
gdouble volume;
GtkAdjustment *audio_input_adj;
@@ -108,6 +138,15 @@ struct _EmpathyCallWindowPriv
GMutex *lock;
gboolean call_started;
gboolean sending_video;
+
+ EmpathyCallWindowFullscreen *fullscreen;
+ gboolean is_fullscreen;
+
+ /* Those fields represent the state of the window before it actually was in
+ fullscreen mode. */
+ gboolean sidebar_was_visible_before_fs;
+ gint original_width_before_fs;
+ gint original_height_before_fs;
};
#define GET_PRIV(o) \
@@ -118,7 +157,10 @@ static void empathy_call_window_realized_cb (GtkWidget *widget,
EmpathyCallWindow *window);
static gboolean empathy_call_window_delete_cb (GtkWidget *widget,
- GdkEvent*event, EmpathyCallWindow *window);
+ GdkEvent *event, EmpathyCallWindow *window);
+
+static gboolean empathy_call_window_state_event_cb (GtkWidget *widget,
+ GdkEventWindowState *event, EmpathyCallWindow *window);
static void empathy_call_window_sidebar_toggled_cb (GtkToggleButton *toggle,
EmpathyCallWindow *window);
@@ -138,9 +180,29 @@ static void empathy_call_window_mic_toggled_cb (
static void empathy_call_window_sidebar_hidden_cb (EmpathySidebar *sidebar,
EmpathyCallWindow *window);
+static void empathy_call_window_sidebar_shown_cb (EmpathySidebar *sidebar,
+ EmpathyCallWindow *window);
+
static void empathy_call_window_hangup_cb (gpointer object,
EmpathyCallWindow *window);
+static void empathy_call_window_fullscreen_cb (gpointer object,
+ EmpathyCallWindow *window);
+
+static void empathy_call_window_fullscreen_toggle (EmpathyCallWindow *window);
+
+static gboolean empathy_call_window_video_button_press_cb (GtkWidget *video_output,
+ GdkEventButton *event, EmpathyCallWindow *window);
+
+static gboolean empathy_call_window_key_press_cb (GtkWidget *video_output,
+ GdkEventKey *event, EmpathyCallWindow *window);
+
+static gboolean empathy_call_window_video_output_motion_notify (GtkWidget *widget,
+ GdkEventMotion *event, EmpathyCallWindow *window);
+
+static void empathy_call_window_video_menu_popup (EmpathyCallWindow *window,
+ guint button);
+
static void empathy_call_window_status_message (EmpathyCallWindow *window,
gchar *message);
@@ -458,10 +520,12 @@ empathy_call_window_init (EmpathyCallWindow *self)
{
EmpathyCallWindowPriv *priv = GET_PRIV (self);
GtkBuilder *gui;
- GtkWidget *vbox, *top_vbox;
- GtkWidget *hbox, *h;
+ GtkWidget *top_vbox;
+ GtkWidget *h;
GtkWidget *arrow;
GtkWidget *page;
+ GtkWidget *remote_user_output_frame, *self_user_output_frame;
+ GtkWidget *remote_user_output_hbox, *self_user_output_hbox;
GstBus *bus;
gchar *filename;
@@ -475,6 +539,7 @@ empathy_call_window_init (EmpathyCallWindow *self)
"toolbar", &priv->toolbar,
"send_video", &priv->send_video,
"ui_manager", &priv->ui_manager,
+ "menufullscreen", &priv->menu_fullscreen,
NULL);
empathy_builder_connect (gui, self,
@@ -484,6 +549,7 @@ empathy_call_window_init (EmpathyCallWindow *self)
"camera", "toggled", empathy_call_window_camera_toggled_cb,
"send_video", "toggled", empathy_call_window_send_video_toggled_cb,
"show_preview", "toggled", empathy_call_window_show_preview_toggled_cb,
+ "menufullscreen", "activate", empathy_call_window_fullscreen_cb,
NULL);
priv->lock = g_mutex_new ();
@@ -494,27 +560,66 @@ empathy_call_window_init (EmpathyCallWindow *self)
priv->pipeline = gst_pipeline_new (NULL);
- hbox = gtk_hbox_new (FALSE, 3);
- gtk_container_set_border_width (GTK_CONTAINER (hbox), 6);
- gtk_paned_pack1 (GTK_PANED (priv->pane), hbox, TRUE, FALSE);
+ priv->content_hbox = gtk_hbox_new (FALSE, CONTENT_HBOX_SPACING);
+ gtk_container_set_border_width (GTK_CONTAINER (priv->content_hbox),
+ CONTENT_HBOX_BORDER_WIDTH);
+ gtk_paned_pack1 (GTK_PANED (priv->pane), priv->content_hbox, TRUE, FALSE);
bus = gst_pipeline_get_bus (GST_PIPELINE (priv->pipeline));
gst_bus_add_watch (bus, empathy_call_window_bus_message, self);
+ remote_user_output_frame = gtk_frame_new (NULL);
+ gtk_widget_set_size_request (remote_user_output_frame,
+ EMPATHY_VIDEO_WIDGET_DEFAULT_WIDTH, EMPATHY_VIDEO_WIDGET_DEFAULT_HEIGHT);
+ remote_user_output_hbox = gtk_hbox_new (FALSE, 0);
+
+ priv->remote_user_avatar_widget = gtk_image_new ();
+ gtk_box_pack_start (GTK_BOX (remote_user_output_hbox),
+ priv->remote_user_avatar_widget, TRUE, TRUE, 0);
+
priv->video_output = empathy_video_widget_new (bus);
- gtk_box_pack_start (GTK_BOX (hbox), priv->video_output, TRUE, TRUE, 3);
+ gtk_box_pack_start (GTK_BOX (remote_user_output_hbox),
+ priv->video_output, TRUE, TRUE, 0);
+
+ gtk_container_add (GTK_CONTAINER (remote_user_output_frame),
+ remote_user_output_hbox);
+
+ gtk_widget_add_events (priv->video_output,
+ GDK_BUTTON_PRESS_MASK | GDK_POINTER_MOTION_MASK);
+ g_signal_connect (G_OBJECT (priv->video_output), "button-press-event",
+ G_CALLBACK (empathy_call_window_video_button_press_cb), self);
+ gtk_box_pack_start (GTK_BOX (priv->content_hbox), remote_user_output_frame,
+ TRUE, TRUE, CONTENT_HBOX_CHILDREN_PACKING_PADDING);
priv->video_tee = gst_element_factory_make ("tee", NULL);
gst_object_ref (priv->video_tee);
gst_object_sink (priv->video_tee);
- vbox = gtk_vbox_new (FALSE, 3);
- gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 3);
+ priv->vbox = gtk_vbox_new (FALSE, 3);
+ gtk_box_pack_start (GTK_BOX (priv->content_hbox), priv->vbox,
+ FALSE, FALSE, CONTENT_HBOX_CHILDREN_PACKING_PADDING);
- priv->video_preview = empathy_video_widget_new_with_size (bus, 160, 120);
+ self_user_output_frame = gtk_frame_new (NULL);
+ gtk_widget_set_size_request (self_user_output_frame, SELF_VIDEO_SECTION_WIDTH,
+ SELF_VIDEO_SECTION_HEIGTH);
+ self_user_output_hbox = gtk_hbox_new (FALSE, 0);
+
+ priv->self_user_avatar_widget = gtk_image_new ();
+ gtk_box_pack_start (GTK_BOX (self_user_output_hbox),
+ priv->self_user_avatar_widget, TRUE, TRUE, 0);
+
+ priv->video_preview = empathy_video_widget_new_with_size (bus,
+ SELF_VIDEO_SECTION_WIDTH, SELF_VIDEO_SECTION_HEIGTH);
g_object_set (priv->video_preview, "sync", FALSE, "async", TRUE, NULL);
- gtk_box_pack_start (GTK_BOX (vbox), priv->video_preview, FALSE, FALSE, 0);
+ gtk_box_pack_start (GTK_BOX (self_user_output_hbox), priv->video_preview,
+ TRUE, TRUE, 0);
+
+ gtk_container_add (GTK_CONTAINER (self_user_output_frame),
+ self_user_output_hbox);
+
+ gtk_box_pack_start (GTK_BOX (priv->vbox), self_user_output_frame, FALSE,
+ FALSE, 0);
priv->video_input = empathy_video_src_new ();
gst_object_ref (priv->video_input);
@@ -538,13 +643,14 @@ empathy_call_window_init (EmpathyCallWindow *self)
gtk_button_set_image (GTK_BUTTON (priv->sidebar_button), arrow);
h = gtk_hbox_new (FALSE, 3);
- gtk_box_pack_end (GTK_BOX (vbox), h, FALSE, FALSE, 3);
+ gtk_box_pack_end (GTK_BOX (priv->vbox), h, FALSE, FALSE, 3);
gtk_box_pack_end (GTK_BOX (h), priv->sidebar_button, FALSE, FALSE, 3);
priv->sidebar = empathy_sidebar_new ();
g_signal_connect (G_OBJECT (priv->sidebar),
- "hide", G_CALLBACK (empathy_call_window_sidebar_hidden_cb),
- self);
+ "hide", G_CALLBACK (empathy_call_window_sidebar_hidden_cb), self);
+ g_signal_connect (G_OBJECT (priv->sidebar),
+ "show", G_CALLBACK (empathy_call_window_sidebar_shown_cb), self);
gtk_paned_pack2 (GTK_PANED (priv->pane), priv->sidebar, FALSE, FALSE);
priv->dtmf_panel = empathy_call_window_create_dtmf (self);
@@ -565,18 +671,153 @@ empathy_call_window_init (EmpathyCallWindow *self)
gtk_widget_hide (priv->sidebar);
+ priv->fullscreen = empathy_call_window_fullscreen_new (self);
+ empathy_call_window_fullscreen_set_video_widget (priv->fullscreen, priv->video_output);
+ g_signal_connect (G_OBJECT (priv->fullscreen->leave_fullscreen_button),
+ "clicked", G_CALLBACK (empathy_call_window_fullscreen_cb), self);
+
g_signal_connect (G_OBJECT (self), "realize",
G_CALLBACK (empathy_call_window_realized_cb), self);
g_signal_connect (G_OBJECT (self), "delete-event",
G_CALLBACK (empathy_call_window_delete_cb), self);
+ g_signal_connect (G_OBJECT (self), "window-state-event",
+ G_CALLBACK (empathy_call_window_state_event_cb), self);
+
+ g_signal_connect (G_OBJECT (self), "key-press-event",
+ G_CALLBACK (empathy_call_window_key_press_cb), self);
+
empathy_call_window_status_message (self, _("Connecting..."));
priv->timer = g_timer_new ();
g_object_ref (priv->ui_manager);
g_object_unref (gui);
+ g_free (filename);
+}
+
+/* Instead of specifying a width and a height, we specify only one size. That's
+ because we want a square avatar icon. */
+static void
+init_contact_avatar_with_size (EmpathyContact *contact, GtkWidget *image_widget,
+ gint size)
+{
+
+ GdkPixbuf *pixbuf_avatar = NULL;
+
+ if (contact != NULL)
+ {
+ pixbuf_avatar = empathy_pixbuf_avatar_from_contact_scaled (contact,
+ size, size);
+ }
+
+ if (pixbuf_avatar == NULL)
+ {
+ pixbuf_avatar = empathy_pixbuf_from_icon_name_sized ("stock_person",
+ size);
+ }
+
+ gtk_image_set_from_pixbuf (GTK_IMAGE (image_widget), pixbuf_avatar);
+}
+
+static void
+set_window_title (EmpathyCallWindow *self)
+{
+ EmpathyCallWindowPriv *priv = GET_PRIV (self);
+ gchar *tmp;
+
+ tmp = g_strdup_printf (_("Call with %s"),
+ empathy_contact_get_name (priv->contact));
+ gtk_window_set_title (GTK_WINDOW (self), tmp);
+ g_free (tmp);
+}
+
+static void
+contact_name_changed_cb (EmpathyContact *contact,
+ GParamSpec *pspec, EmpathyCallWindow *self)
+{
+ set_window_title (self);
+}
+
+static void
+contact_avatar_changed_cb (EmpathyContact *contact,
+ GParamSpec *pspec, GtkWidget *avatar_widget)
+{
+ init_contact_avatar_with_size (contact, avatar_widget,
+ avatar_widget->allocation.height);
+}
+
+static void
+empathy_call_window_got_self_contact_cb (EmpathyTpContactFactory *factory,
+ EmpathyContact *contact, const GError *error, gpointer user_data,
+ GObject *weak_object)
+{
+ EmpathyCallWindow *self = EMPATHY_CALL_WINDOW (user_data);
+ EmpathyCallWindowPriv *priv = GET_PRIV (self);
+
+ init_contact_avatar_with_size (contact, priv->self_user_avatar_widget,
+ MIN (SELF_VIDEO_SECTION_WIDTH, SELF_VIDEO_SECTION_HEIGTH));
+
+ g_signal_connect (contact, "notify::avatar",
+ G_CALLBACK (contact_avatar_changed_cb), priv->self_user_avatar_widget);
+}
+
+static void
+empathy_call_window_constructed (GObject *object)
+{
+ EmpathyCallWindow *self = EMPATHY_CALL_WINDOW (object);
+ EmpathyCallWindowPriv *priv = GET_PRIV (self);
+
+ g_assert (priv->handler != NULL);
+
+ g_object_get (priv->handler, "contact", &(priv->contact), NULL);
+
+ if (priv->contact != NULL)
+ {
+ TpConnection *connection;
+ EmpathyTpContactFactory *factory;
+
+ set_window_title (self);
+
+ g_signal_connect (priv->contact, "notify::name",
+ G_CALLBACK (contact_name_changed_cb), self);
+ g_signal_connect (priv->contact, "notify::avatar",
+ G_CALLBACK (contact_avatar_changed_cb),
+ priv->remote_user_avatar_widget);
+
+ /* Retreiving the self avatar */
+ connection = empathy_contact_get_connection (priv->contact);
+ factory = empathy_tp_contact_factory_dup_singleton (connection);
+ empathy_tp_contact_factory_get_from_handle (factory,
+ tp_connection_get_self_handle (connection),
+ empathy_call_window_got_self_contact_cb, self, NULL, NULL);
+
+ g_object_unref (factory);
+ }
+ else
+ {
+ g_warning ("call handler doesn't have a contact");
+ gtk_window_set_title (GTK_WINDOW (self), _("Call"));
+
+ /* Since we can't access the remote contact, we can't get a connection
+ to it and can't get the self contact (and its avatar). This means
+ that we have to manually set the self avatar. */
+ init_contact_avatar_with_size (NULL, priv->self_user_avatar_widget,
+ MIN (SELF_VIDEO_SECTION_WIDTH, SELF_VIDEO_SECTION_HEIGTH));
+ }
+
+ init_contact_avatar_with_size (priv->contact,
+ priv->remote_user_avatar_widget, MIN (REMOTE_CONTACT_AVATAR_DEFAULT_WIDTH,
+ REMOTE_CONTACT_AVATAR_DEFAULT_HEIGHT));
+
+ /* We hide the self avatar. It will be shown if a problem is
+ encountered when we try to send video. As for the remote avatar, it
+ is shown by default and will be hidden when we receive video from
+ the remote side. */
+ gtk_widget_hide (priv->self_user_avatar_widget);
+ gtk_widget_hide (priv->video_output);
+ gtk_widget_show (priv->remote_user_avatar_widget);
}
static void empathy_call_window_dispose (GObject *object);
@@ -624,6 +865,7 @@ empathy_call_window_class_init (
g_type_class_add_private (empathy_call_window_class,
sizeof (EmpathyCallWindowPriv));
+ object_class->constructed = empathy_call_window_constructed;
object_class->set_property = empathy_call_window_set_property;
object_class->get_property = empathy_call_window_get_property;
@@ -633,7 +875,7 @@ empathy_call_window_class_init (
param_spec = g_param_spec_object ("handler",
"handler", "The call handler",
EMPATHY_TYPE_CALL_HANDLER,
- G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS);
g_object_class_install_property (object_class,
PROP_CALL_HANDLER, param_spec);
@@ -683,6 +925,14 @@ empathy_call_window_dispose (GObject *object)
g_object_unref (priv->ui_manager);
priv->ui_manager = NULL;
+ if (priv->contact != NULL)
+ {
+ g_signal_handlers_disconnect_by_func (priv->contact,
+ contact_name_changed_cb, self);
+ g_object_unref (priv->contact);
+ priv->contact = NULL;
+ }
+
/* release any references held by the object here */
if (G_OBJECT_CLASS (empathy_call_window_parent_class)->dispose)
G_OBJECT_CLASS (empathy_call_window_parent_class)->dispose (object);
@@ -694,6 +944,13 @@ empathy_call_window_finalize (GObject *object)
EmpathyCallWindow *self = EMPATHY_CALL_WINDOW (object);
EmpathyCallWindowPriv *priv = GET_PRIV (self);
+ if (priv->video_output_motion_handler_id != 0)
+ {
+ g_signal_handler_disconnect (G_OBJECT (priv->video_output),
+ priv->video_output_motion_handler_id);
+ priv->video_output_motion_handler_id = 0;
+ }
+
/* free any data held directly by the object here */
g_mutex_free (priv->lock);
@@ -902,6 +1159,8 @@ empathy_call_window_src_added_cb (EmpathyCallHandler *handler,
pad = empathy_call_window_get_audio_sink_pad (self);
break;
case TP_MEDIA_STREAM_TYPE_VIDEO:
+ gtk_widget_hide (priv->remote_user_avatar_widget);
+ gtk_widget_show (priv->video_output);
pad = empathy_call_window_get_video_sink_pad (self);
break;
default:
@@ -936,7 +1195,7 @@ empathy_call_window_sink_added_cb (EmpathyCallHandler *handler,
case TP_MEDIA_STREAM_TYPE_VIDEO:
if (priv->video_input != NULL)
{
- pad = gst_element_get_request_pad (priv->video_tee, "src%d");
+ pad = gst_element_get_request_pad (priv->video_tee, "src%d");
gst_pad_link (pad, sink);
}
break;
@@ -1005,6 +1264,9 @@ empathy_call_window_remove_video_input (EmpathyCallWindow *self)
priv->video_input = NULL;
g_object_unref (priv->video_tee);
priv->video_tee = NULL;
+
+ gtk_widget_hide (priv->video_preview);
+ gtk_widget_show (priv->self_user_avatar_widget);
}
@@ -1041,7 +1303,7 @@ empathy_call_window_bus_message (GstBus *bus, GstMessage *message,
break;
case GST_MESSAGE_ERROR:
{
- GError *error;
+ GError *error = NULL;
gchar *debug;
gst_message_parse_error (message, &error, &debug);
@@ -1112,6 +1374,108 @@ empathy_call_window_delete_cb (GtkWidget *widget, GdkEvent*event,
}
static void
+show_controls (EmpathyCallWindow *window, gboolean set_fullscreen)
+{
+ GtkWidget *menu;
+ EmpathyCallWindowPriv *priv = GET_PRIV (window);
+
+ menu = gtk_ui_manager_get_widget (priv->ui_manager,
+ "/menubar1");
+
+ if (set_fullscreen)
+ {
+ gtk_widget_hide (priv->sidebar);
+ gtk_widget_hide (menu);
+ gtk_widget_hide (priv->vbox);
+ gtk_widget_hide (priv->statusbar);
+ gtk_widget_hide (priv->toolbar);
+ }
+ else
+ {
+ if (priv->sidebar_was_visible_before_fs)
+ gtk_widget_show (priv->sidebar);
+
+ gtk_widget_show (menu);
+ gtk_widget_show (priv->vbox);
+ gtk_widget_show (priv->statusbar);
+ gtk_widget_show (priv->toolbar);
+
+ gtk_window_resize (GTK_WINDOW (window), priv->original_width_before_fs,
+ priv->original_height_before_fs);
+ }
+}
+
+static void
+show_borders (EmpathyCallWindow *window, gboolean set_fullscreen)
+{
+ EmpathyCallWindowPriv *priv = GET_PRIV (window);
+
+ gtk_container_set_border_width (GTK_CONTAINER (priv->content_hbox),
+ set_fullscreen ? 0 : CONTENT_HBOX_BORDER_WIDTH);
+ gtk_box_set_spacing (GTK_BOX (priv->content_hbox),
+ set_fullscreen ? 0 : CONTENT_HBOX_SPACING);
+ gtk_box_set_child_packing (GTK_BOX (priv->content_hbox),
+ priv->video_output, TRUE, TRUE,
+ set_fullscreen ? 0 : CONTENT_HBOX_CHILDREN_PACKING_PADDING,
+ GTK_PACK_START);
+ gtk_box_set_child_packing (GTK_BOX (priv->content_hbox),
+ priv->vbox, TRUE, TRUE,
+ set_fullscreen ? 0 : CONTENT_HBOX_CHILDREN_PACKING_PADDING,
+ GTK_PACK_START);
+}
+
+static gboolean
+empathy_call_window_state_event_cb (GtkWidget *widget,
+ GdkEventWindowState *event, EmpathyCallWindow *window)
+{
+ if (event->changed_mask & GDK_WINDOW_STATE_FULLSCREEN)
+ {
+ EmpathyCallWindowPriv *priv = GET_PRIV (window);
+ gboolean set_fullscreen = event->new_window_state & GDK_WINDOW_STATE_FULLSCREEN;
+
+ if (set_fullscreen)
+ {
+ gboolean sidebar_was_visible;
+ gint original_width = GTK_WIDGET (window)->allocation.width;
+ gint original_height = GTK_WIDGET (window)->allocation.height;
+
+ g_object_get (priv->sidebar, "visible", &sidebar_was_visible, NULL);
+
+ priv->sidebar_was_visible_before_fs = sidebar_was_visible;
+ priv->original_width_before_fs = original_width;
+ priv->original_height_before_fs = original_height;
+
+ if (priv->video_output_motion_handler_id == 0 &&
+ priv->video_output != NULL)
+ {
+ priv->video_output_motion_handler_id = g_signal_connect (
+ G_OBJECT (priv->video_output), "motion-notify-event",
+ G_CALLBACK (empathy_call_window_video_output_motion_notify), window);
+ }
+ }
+ else
+ {
+ if (priv->video_output_motion_handler_id != 0)
+ {
+ g_signal_handler_disconnect (G_OBJECT (priv->video_output),
+ priv->video_output_motion_handler_id);
+ priv->video_output_motion_handler_id = 0;
+ }
+ }
+
+ empathy_call_window_fullscreen_set_fullscreen (priv->fullscreen,
+ set_fullscreen);
+ show_controls (window, set_fullscreen);
+ show_borders (window, set_fullscreen);
+ gtk_action_set_stock_id (priv->menu_fullscreen,
+ (set_fullscreen ? "gtk-leave-fullscreen" : "gtk-fullscreen"));
+ priv->is_fullscreen = set_fullscreen;
+ }
+
+ return FALSE;
+}
+
+static void
empathy_call_window_sidebar_toggled_cb (GtkToggleButton *toggle,
EmpathyCallWindow *window)
{
@@ -1166,10 +1530,10 @@ empathy_call_window_camera_toggled_cb (GtkToggleToolButton *toggle,
if (priv->sending_video == active)
return;
+ priv->sending_video = active;
empathy_call_window_set_send_video (window, active);
gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (priv->send_video), active);
- priv->sending_video = active;
}
static void
@@ -1183,11 +1547,11 @@ empathy_call_window_send_video_toggled_cb (GtkToggleAction *toggle,
if (priv->sending_video == active)
return;
+ priv->sending_video = active;
empathy_call_window_set_send_video (window, active);
gtk_toggle_tool_button_set_active (
GTK_TOGGLE_TOOL_BUTTON (priv->camera_button), active);
- priv->sending_video = active;
}
static void
@@ -1236,6 +1600,16 @@ empathy_call_window_sidebar_hidden_cb (EmpathySidebar *sidebar,
}
static void
+empathy_call_window_sidebar_shown_cb (EmpathySidebar *sidebar,
+ EmpathyCallWindow *window)
+{
+ EmpathyCallWindowPriv *priv = GET_PRIV (window);
+
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (priv->sidebar_button),
+ TRUE);
+}
+
+static void
empathy_call_window_hangup_cb (gpointer object,
EmpathyCallWindow *window)
{
@@ -1246,6 +1620,83 @@ empathy_call_window_hangup_cb (gpointer object,
}
static void
+empathy_call_window_fullscreen_cb (gpointer object,
+ EmpathyCallWindow *window)
+{
+ empathy_call_window_fullscreen_toggle (window);
+}
+
+static void
+empathy_call_window_fullscreen_toggle (EmpathyCallWindow *window)
+{
+ EmpathyCallWindowPriv *priv = GET_PRIV (window);
+
+ if (priv->is_fullscreen)
+ gtk_window_unfullscreen (GTK_WINDOW (window));
+ else
+ gtk_window_fullscreen (GTK_WINDOW (window));
+}
+
+static gboolean
+empathy_call_window_video_button_press_cb (GtkWidget *video_output,
+ GdkEventButton *event, EmpathyCallWindow *window)
+{
+ if (event->button == 3 && event->type == GDK_BUTTON_PRESS)
+ {
+ empathy_call_window_video_menu_popup (window, event->button);
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+static gboolean
+empathy_call_window_key_press_cb (GtkWidget *video_output,
+ GdkEventKey *event, EmpathyCallWindow *window)
+{
+ EmpathyCallWindowPriv *priv = GET_PRIV (window);
+
+ if (priv->is_fullscreen && event->keyval == GDK_Escape)
+ {
+ /* Since we are in fullscreen mode, toggling will bring us back to
+ normal mode. */
+ empathy_call_window_fullscreen_toggle (window);
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+static gboolean
+empathy_call_window_video_output_motion_notify (GtkWidget *widget,
+ GdkEventMotion *event, EmpathyCallWindow *window)
+{
+ EmpathyCallWindowPriv *priv = GET_PRIV (window);
+
+ if (priv->is_fullscreen)
+ {
+ empathy_call_window_fullscreen_show_popup (priv->fullscreen);
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+static void
+empathy_call_window_video_menu_popup (EmpathyCallWindow *window,
+ guint button)
+{
+ GtkWidget *menu;
+ EmpathyCallWindowPriv *priv = GET_PRIV (window);
+
+ menu = gtk_ui_manager_get_widget (priv->ui_manager,
+ "/video-popup");
+ gtk_menu_popup (GTK_MENU (menu), NULL, NULL, NULL, NULL,
+ button, gtk_get_current_event_time ());
+ gtk_menu_shell_select_first (GTK_MENU_SHELL (menu), FALSE);
+}
+
+static void
empathy_call_window_status_message (EmpathyCallWindow *window,
gchar *message)
{
diff --git a/src/empathy-call-window.h b/src/empathy-call-window.h
index 26b0e7881..01ea5def7 100644
--- a/src/empathy-call-window.h
+++ b/src/empathy-call-window.h
@@ -38,11 +38,11 @@ struct _EmpathyCallWindow {
GtkWindow parent;
};
-GType empathy_call_window_get_type(void);
+GType empathy_call_window_get_type (void);
/* TYPE MACROS */
#define EMPATHY_TYPE_CALL_WINDOW \
- (empathy_call_window_get_type())
+ (empathy_call_window_get_type ())
#define EMPATHY_CALL_WINDOW(obj) \
(G_TYPE_CHECK_INSTANCE_CAST((obj), EMPATHY_TYPE_CALL_WINDOW, \
EmpathyCallWindow))
@@ -57,8 +57,7 @@ GType empathy_call_window_get_type(void);
(G_TYPE_INSTANCE_GET_CLASS ((obj), EMPATHY_TYPE_CALL_WINDOW, \
EmpathyCallWindowClass))
-EmpathyCallWindow *
-empathy_call_window_new (EmpathyCallHandler *handler);
+EmpathyCallWindow *empathy_call_window_new (EmpathyCallHandler *handler);
G_END_DECLS
diff --git a/src/empathy-call-window.ui b/src/empathy-call-window.ui
index ce3d85b56..a0e1e1304 100644
--- a/src/empathy-call-window.ui
+++ b/src/empathy-call-window.ui
@@ -36,6 +36,13 @@
<property name="label" translatable="yes">Video preview</property>
</object>
</child>
+ <child>
+ <object class="GtkAction" id="menufullscreen">
+ <property name="stock_id">gtk-fullscreen</property>
+ <property name="name">menufullscreen</property>
+ </object>
+ <accelerator key="F11"/>
+ </child>
</object>
</child>
<ui>
@@ -46,8 +53,12 @@
</menu>
<menu action="view">
<menuitem action="show_preview"/>
+ <menuitem action="menufullscreen"/>
</menu>
</menubar>
+ <popup name="video-popup">
+ <menuitem name="menufullscreen" action="menufullscreen"/>
+ </popup>
</ui>
</object>
<object class="GtkVBox" id="call_window_vbox">
diff --git a/src/empathy-chat-window.c b/src/empathy-chat-window.c
index 0738f6e52..bf02c3cc6 100644
--- a/src/empathy-chat-window.c
+++ b/src/empathy-chat-window.c
@@ -15,9 +15,9 @@
*
* You should have received a copy of the GNU General Public
* License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- *
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301 USA
+ *
* Authors: Mikael Hallendal <micke@imendio.com>
* Richard Hult <richard@imendio.com>
* Martyn Russell <martyn@imendio.com>
@@ -76,7 +76,6 @@ typedef struct {
/* Menu items. */
GtkUIManager *ui_manager;
GtkAction *menu_conv_insert_smiley;
- GtkAction *menu_conv_contact;
GtkAction *menu_conv_favorite;
GtkAction *menu_edit_cut;
@@ -162,21 +161,39 @@ chat_window_close_clicked_cb (GtkAction *action,
}
static void
-chat_window_close_button_style_set_cb (GtkWidget *button,
+chat_tab_style_set_cb (GtkWidget *hbox,
GtkStyle *previous_style,
gpointer user_data)
{
- gint h, w;
+ GtkWidget *button;
+ int char_width, h, w;
+ PangoContext *context;
+ PangoFontMetrics *metrics;
+
+ button = g_object_get_data (G_OBJECT (user_data),
+ "chat-window-tab-close-button");
+ context = gtk_widget_get_pango_context (hbox);
+
+ metrics = pango_context_get_metrics (context, hbox->style->font_desc,
+ pango_context_get_language (context));
+ char_width = pango_font_metrics_get_approximate_char_width (metrics);
+ pango_font_metrics_unref (metrics);
gtk_icon_size_lookup_for_settings (gtk_widget_get_settings (button),
GTK_ICON_SIZE_MENU, &w, &h);
+ /* Request at least about 12 chars width plus at least space for the status
+ * image and the close button */
+ gtk_widget_set_size_request (hbox,
+ 12 * PANGO_PIXELS (char_width) + 2 * w, -1);
+
gtk_widget_set_size_request (button, w, h);
}
static GtkWidget *
chat_window_create_label (EmpathyChatWindow *window,
- EmpathyChat *chat)
+ EmpathyChat *chat,
+ gboolean is_tab_label)
{
EmpathyChatWindowPriv *priv;
GtkWidget *hbox;
@@ -198,7 +215,8 @@ chat_window_create_label (EmpathyChatWindow *window,
gtk_event_box_set_visible_window (GTK_EVENT_BOX (event_box), FALSE);
name_label = gtk_label_new (NULL);
- gtk_label_set_ellipsize (GTK_LABEL (name_label), PANGO_ELLIPSIZE_END);
+ if (is_tab_label)
+ gtk_label_set_ellipsize (GTK_LABEL (name_label), PANGO_ELLIPSIZE_END);
attr_list = pango_attr_list_new ();
attr = pango_attr_scale_new (1/1.2);
@@ -210,7 +228,9 @@ chat_window_create_label (EmpathyChatWindow *window,
gtk_misc_set_padding (GTK_MISC (name_label), 2, 0);
gtk_misc_set_alignment (GTK_MISC (name_label), 0.0, 0.5);
- g_object_set_data (G_OBJECT (chat), "chat-window-tab-label", name_label);
+ g_object_set_data (G_OBJECT (chat),
+ is_tab_label ? "chat-window-tab-label" : "chat-window-menu-label",
+ name_label);
status_image = gtk_image_new ();
@@ -220,42 +240,47 @@ chat_window_create_label (EmpathyChatWindow *window,
gtk_box_pack_start (GTK_BOX (event_box_hbox), status_image, FALSE, FALSE, 0);
gtk_box_pack_start (GTK_BOX (event_box_hbox), name_label, TRUE, TRUE, 0);
- g_object_set_data (G_OBJECT (chat), "chat-window-tab-image", status_image);
- g_object_set_data (G_OBJECT (chat), "chat-window-tab-tooltip-widget", event_box);
+ g_object_set_data (G_OBJECT (chat),
+ is_tab_label ? "chat-window-tab-image" : "chat-window-menu-image",
+ status_image);
+ g_object_set_data (G_OBJECT (chat),
+ is_tab_label ? "chat-window-tab-tooltip-widget" : "chat-window-menu-tooltip-widget",
+ event_box);
- close_button = gtk_button_new ();
- gtk_button_set_relief (GTK_BUTTON (close_button), GTK_RELIEF_NONE);
- g_object_set_data (G_OBJECT (chat), "chat-window-tab-close-button", close_button);
+ gtk_container_add (GTK_CONTAINER (event_box), event_box_hbox);
+ gtk_box_pack_start (GTK_BOX (hbox), event_box, TRUE, TRUE, 0);
- /* We don't want focus/keynav for the button to avoid clutter, and
- * Ctrl-W works anyway.
- */
- GTK_WIDGET_UNSET_FLAGS (close_button, GTK_CAN_FOCUS);
- GTK_WIDGET_UNSET_FLAGS (close_button, GTK_CAN_DEFAULT);
+ if (is_tab_label) {
+ close_button = gtk_button_new ();
+ gtk_button_set_relief (GTK_BUTTON (close_button), GTK_RELIEF_NONE);
+ g_object_set_data (G_OBJECT (chat), "chat-window-tab-close-button", close_button);
- /* Set the name to make the special rc style match. */
- gtk_widget_set_name (close_button, "empathy-close-button");
+ /* We don't want focus/keynav for the button to avoid clutter, and
+ * Ctrl-W works anyway.
+ */
+ GTK_WIDGET_UNSET_FLAGS (close_button, GTK_CAN_FOCUS);
+ GTK_WIDGET_UNSET_FLAGS (close_button, GTK_CAN_DEFAULT);
- close_image = gtk_image_new_from_stock (GTK_STOCK_CLOSE, GTK_ICON_SIZE_MENU);
+ /* Set the name to make the special rc style match. */
+ gtk_widget_set_name (close_button, "empathy-close-button");
- gtk_container_add (GTK_CONTAINER (close_button), close_image);
+ close_image = gtk_image_new_from_stock (GTK_STOCK_CLOSE, GTK_ICON_SIZE_MENU);
- gtk_container_add (GTK_CONTAINER (event_box), event_box_hbox);
- gtk_box_pack_start (GTK_BOX (hbox), event_box, TRUE, TRUE, 0);
- gtk_box_pack_end (GTK_BOX (hbox), close_button, FALSE, FALSE, 0);
+ gtk_container_add (GTK_CONTAINER (close_button), close_image);
- /* React to theme changes and also used to setup the initial size
- * correctly.
- */
- g_signal_connect (close_button,
- "style-set",
- G_CALLBACK (chat_window_close_button_style_set_cb),
- chat);
+ gtk_box_pack_end (GTK_BOX (hbox), close_button, FALSE, FALSE, 0);
- g_signal_connect (close_button,
- "clicked",
- G_CALLBACK (chat_window_close_clicked_cb),
- chat);
+ g_signal_connect (close_button,
+ "clicked",
+ G_CALLBACK (chat_window_close_clicked_cb),
+ chat);
+
+ /* React to theme changes and also setup the size correctly. */
+ g_signal_connect (hbox,
+ "style-set",
+ G_CALLBACK (chat_tab_style_set_cb),
+ chat);
+ }
gtk_widget_show_all (hbox);
@@ -279,6 +304,8 @@ chat_window_update (EmpathyChatWindow *window)
gboolean avatar_in_icon;
GtkWidget *chat;
GtkWidget *chat_close_button;
+ GtkWidget *submenu;
+ GtkWidget *menu;
/* Get information */
page_num = gtk_notebook_get_current_page (GTK_NOTEBOOK (priv->notebook));
@@ -299,6 +326,13 @@ chat_window_update (EmpathyChatWindow *window)
gtk_action_set_sensitive (priv->menu_tabs_right, !last_page);
gtk_action_set_sensitive (priv->menu_conv_insert_smiley, is_connected);
+ /* Update Contact menu */
+ menu = gtk_ui_manager_get_widget (priv->ui_manager,
+ "/chats_menubar/menu_contact");
+ submenu = empathy_chat_get_contact_menu (priv->current_chat);
+ gtk_menu_item_set_submenu (GTK_MENU_ITEM (menu), submenu);
+ gtk_widget_show (menu);
+
/* Update window title */
if (n_chats == 1) {
gtk_window_set_title (GTK_WINDOW (priv->dialog), name);
@@ -390,6 +424,8 @@ chat_window_update_chat_tab (EmpathyChat *chat)
}
widget = g_object_get_data (G_OBJECT (chat), "chat-window-tab-image");
gtk_image_set_from_icon_name (GTK_IMAGE (widget), icon_name, GTK_ICON_SIZE_MENU);
+ widget = g_object_get_data (G_OBJECT (chat), "chat-window-menu-image");
+ gtk_image_set_from_icon_name (GTK_IMAGE (widget), icon_name, GTK_ICON_SIZE_MENU);
/* Update tab tooltip */
tooltip = g_string_new (NULL);
@@ -423,11 +459,15 @@ chat_window_update_chat_tab (EmpathyChat *chat)
markup = g_string_free (tooltip, FALSE);
widget = g_object_get_data (G_OBJECT (chat), "chat-window-tab-tooltip-widget");
gtk_widget_set_tooltip_markup (widget, markup);
+ widget = g_object_get_data (G_OBJECT (chat), "chat-window-menu-tooltip-widget");
+ gtk_widget_set_tooltip_markup (widget, markup);
g_free (markup);
- /* Update tab label */
+ /* Update tab and menu label */
widget = g_object_get_data (G_OBJECT (chat), "chat-window-tab-label");
gtk_label_set_text (GTK_LABEL (widget), name);
+ widget = g_object_get_data (G_OBJECT (chat), "chat-window-menu-label");
+ gtk_label_set_text (GTK_LABEL (widget), name);
/* Update the window if it's the current chat */
if (priv->current_chat == chat) {
@@ -488,20 +528,8 @@ chat_window_conv_activate_cb (GtkAction *action,
EmpathyChatWindow *window)
{
EmpathyChatWindowPriv *priv = GET_PRIV (window);
- GtkWidget *menu = NULL;
- GtkWidget *submenu = NULL;
gboolean is_room;
- /* Contact submenu */
- submenu = empathy_chat_get_contact_menu (priv->current_chat);
- if (submenu) {
- menu = gtk_ui_manager_get_widget (priv->ui_manager,
- "/chats_menubar/menu_conv/menu_conv_contact");
- gtk_menu_item_set_submenu (GTK_MENU_ITEM (menu), submenu);
- gtk_widget_show (submenu);
- }
- gtk_action_set_visible (priv->menu_conv_contact, submenu != NULL);
-
/* Favorite room menu */
is_room = empathy_chat_is_room (priv->current_chat);
if (is_room) {
@@ -930,32 +958,23 @@ chat_window_new_message_cb (EmpathyChat *chat,
/* - if we're the sender, we play the sound if it's specified in the
* preferences and we're not away.
* - if we receive a message, we play the sound if it's specified in the
- * prefereces and the window does not have focus on the chat receiving
+ * preferences and the window does not have focus on the chat receiving
* the message.
*/
sender = empathy_message_get_sender (message);
- if (empathy_contact_is_user (sender) != FALSE) {
+ if (empathy_contact_is_user (sender)) {
empathy_sound_play (GTK_WIDGET (priv->dialog),
EMPATHY_SOUND_MESSAGE_OUTGOING);
- } else {
- if ((!has_focus || priv->current_chat != chat)) {
- empathy_sound_play (GTK_WIDGET (priv->dialog),
- EMPATHY_SOUND_MESSAGE_INCOMING);
- }
- }
-
- if (!has_focus) {
- chat_window_show_or_update_notification (window, message, chat);
}
if (has_focus && priv->current_chat == chat) {
return;
}
- /* If empathy_chat_is_room() returns TRUE, that means it's a named MUC.
- * If empathy_chat_get_remote_contact() returns NULL, that means it's
+ /* If empathy_chat_is_room () returns TRUE, that means it's a named MUC.
+ * If empathy_chat_get_remote_contact () returns NULL, that means it's
* an unamed MUC (msn-like).
* In case of a MUC, we set urgency only if the message contains our
* alias. */
@@ -966,8 +985,13 @@ chat_window_new_message_cb (EmpathyChat *chat,
needs_urgency = TRUE;
}
- if (needs_urgency && !has_focus) {
- chat_window_set_urgency_hint (window, TRUE);
+ if (needs_urgency) {
+ if (!has_focus)
+ chat_window_set_urgency_hint (window, TRUE);
+
+ empathy_sound_play (GTK_WIDGET (priv->dialog),
+ EMPATHY_SOUND_MESSAGE_INCOMING);
+ chat_window_show_or_update_notification (window, message, chat);
}
if (!g_list_find (priv->chats_new_msg, chat)) {
@@ -1213,7 +1237,7 @@ chat_window_drag_data_received (GtkWidget *widget,
/* We should return TRUE to remove the data when doing
* GDK_ACTION_MOVE, but we don't here otherwise it has
* weird consequences, and we handle that internally
- * anyway with add_chat() and remove_chat().
+ * anyway with add_chat () and remove_chat ().
*/
gtk_drag_finish (context, TRUE, FALSE, time);
}
@@ -1223,7 +1247,7 @@ chat_window_drag_data_received (GtkWidget *widget,
DEBUG ("DND tab");
- chat = (void*) selection->data;
+ chat = (void *) selection->data;
old_window = chat_window_find_chat (*chat);
if (old_window) {
@@ -1244,7 +1268,7 @@ chat_window_drag_data_received (GtkWidget *widget,
/* We should return TRUE to remove the data when doing
* GDK_ACTION_MOVE, but we don't here otherwise it has
* weird consequences, and we handle that internally
- * anyway with add_chat() and remove_chat().
+ * anyway with add_chat () and remove_chat ().
*/
gtk_drag_finish (context, TRUE, FALSE, time);
} else {
@@ -1326,7 +1350,6 @@ empathy_chat_window_init (EmpathyChatWindow *window)
"chat_vbox", &chat_vbox,
"ui_manager", &priv->ui_manager,
"menu_conv_insert_smiley", &priv->menu_conv_insert_smiley,
- "menu_conv_contact", &priv->menu_conv_contact,
"menu_conv_favorite", &priv->menu_conv_favorite,
"menu_edit_cut", &priv->menu_edit_cut,
"menu_edit_copy", &priv->menu_edit_copy,
@@ -1362,7 +1385,9 @@ empathy_chat_window_init (EmpathyChatWindow *window)
priv->chatroom_manager = empathy_chatroom_manager_dup_singleton (NULL);
priv->notebook = gtk_notebook_new ();
- gtk_notebook_set_group (GTK_NOTEBOOK (priv->notebook), "EmpathyChatWindow");
+ gtk_notebook_set_group (GTK_NOTEBOOK (priv->notebook), "EmpathyChatWindow");
+ gtk_notebook_set_scrollable (GTK_NOTEBOOK (priv->notebook), TRUE);
+ gtk_notebook_popup_enable (GTK_NOTEBOOK (priv->notebook));
gtk_box_pack_start (GTK_BOX (chat_vbox), priv->notebook, TRUE, TRUE, 0);
gtk_widget_show (priv->notebook);
@@ -1508,6 +1533,7 @@ empathy_chat_window_add_chat (EmpathyChatWindow *window,
{
EmpathyChatWindowPriv *priv;
GtkWidget *label;
+ GtkWidget *popup_label;
GtkWidget *child;
gint x, y, w, h;
@@ -1539,7 +1565,8 @@ empathy_chat_window_add_chat (EmpathyChatWindow *window,
}
child = GTK_WIDGET (chat);
- label = chat_window_create_label (window, chat);
+ label = chat_window_create_label (window, chat, TRUE);
+ popup_label = chat_window_create_label (window, chat, FALSE);
gtk_widget_show (child);
g_signal_connect (chat, "notify::name",
@@ -1553,11 +1580,11 @@ empathy_chat_window_add_chat (EmpathyChatWindow *window,
NULL);
chat_window_chat_notify_cb (chat);
- gtk_notebook_append_page (GTK_NOTEBOOK (priv->notebook), child, label);
+ gtk_notebook_append_page_menu (GTK_NOTEBOOK (priv->notebook), child, label, popup_label);
gtk_notebook_set_tab_reorderable (GTK_NOTEBOOK (priv->notebook), child, TRUE);
gtk_notebook_set_tab_detachable (GTK_NOTEBOOK (priv->notebook), child, TRUE);
gtk_notebook_set_tab_label_packing (GTK_NOTEBOOK (priv->notebook), child,
- TRUE, TRUE, GTK_PACK_START);
+ TRUE, TRUE, GTK_PACK_START);
DEBUG ("Chat added (%d references)", G_OBJECT (chat)->ref_count);
}
@@ -1713,6 +1740,6 @@ empathy_chat_window_present_chat (EmpathyChat *chat)
empathy_chat_window_switch_to_chat (window, chat);
empathy_window_present (GTK_WINDOW (priv->dialog), TRUE);
- gtk_widget_grab_focus (chat->input_text_view);
+ gtk_widget_grab_focus (chat->input_text_view);
}
diff --git a/src/empathy-chat-window.h b/src/empathy-chat-window.h
index 8b7fe06a9..835d67296 100644
--- a/src/empathy-chat-window.h
+++ b/src/empathy-chat-window.h
@@ -15,9 +15,9 @@
*
* You should have received a copy of the GNU General Public
* License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- *
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301 USA
+ *
* Authors: Mikael Hallendal <micke@imendio.com>
* Richard Hult <richard@imendio.com>
* Martyn Russell <martyn@imendio.com>
diff --git a/src/empathy-chat-window.ui b/src/empathy-chat-window.ui
index a347a454e..0d5a83180 100644
--- a/src/empathy-chat-window.ui
+++ b/src/empathy-chat-window.ui
@@ -26,12 +26,6 @@
</object>
</child>
<child>
- <object class="GtkAction" id="menu_conv_contact">
- <property name="name">menu_conv_contact</property>
- <property name="label" translatable="yes">_Contact</property>
- </object>
- </child>
- <child>
<object class="GtkToggleAction" id="menu_conv_favorite">
<property name="name">menu_conv_favorite</property>
<property name="label" translatable="yes">_Favorite Chatroom</property>
@@ -45,6 +39,12 @@
<accelerator key="W" modifiers="GDK_CONTROL_MASK"/>
</child>
<child>
+ <object class="GtkAction" id="menu_contact">
+ <property name="name">menu_contact</property>
+ <property name="label" translatable="yes">_Contact</property>
+ </object>
+ </child>
+ <child>
<object class="GtkAction" id="menu_edit">
<property name="name">menu_edit</property>
<property name="label" translatable="yes">_Edit</property>
@@ -136,11 +136,11 @@
<menu action="menu_conv">
<menuitem action="menu_conv_clear"/>
<menuitem action="menu_conv_insert_smiley"/>
- <menuitem action="menu_conv_contact"/>
<menuitem action="menu_conv_favorite"/>
<separator/>
<menuitem action="menu_conv_close"/>
</menu>
+ <menu action="menu_contact" />
<menu action="menu_edit">
<menuitem action="menu_edit_cut"/>
<menuitem action="menu_edit_copy"/>
diff --git a/src/empathy-chatrooms-window.c b/src/empathy-chatrooms-window.c
index fa63d5a51..a0fb8e6ec 100644
--- a/src/empathy-chatrooms-window.c
+++ b/src/empathy-chatrooms-window.c
@@ -15,8 +15,8 @@
*
* You should have received a copy of the GNU General Public
* License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301 USA
*
* Authors: Xavier Claessens <xclaesse@gmail.com>
* Martyn Russell <martyn@imendio.com>
@@ -154,7 +154,7 @@ empathy_chatrooms_window_show (GtkWindow *parent)
empathy_account_chooser_set_filter (EMPATHY_ACCOUNT_CHOOSER (window->account_chooser),
empathy_account_chooser_filter_is_connected,
NULL);
- g_object_set (window->account_chooser,
+ g_object_set (window->account_chooser,
"has-all-option", TRUE,
NULL);
empathy_account_chooser_set_account (EMPATHY_ACCOUNT_CHOOSER (window->account_chooser), NULL);
@@ -222,7 +222,7 @@ chatrooms_window_model_setup (EmpathyChatroomsWindow *window)
gtk_tree_view_set_model (view, GTK_TREE_MODEL (store));
- /* Selection */
+ /* Selection */
selection = gtk_tree_view_get_selection (view);
gtk_tree_selection_set_mode (selection, GTK_SELECTION_SINGLE);
@@ -273,8 +273,8 @@ chatrooms_window_model_add_columns (EmpathyChatroomsWindow *window)
/* Room */
cell = gtk_cell_renderer_text_new ();
- column = gtk_tree_view_column_new_with_attributes (_("Room"), cell,
- "text", COL_ROOM,
+ column = gtk_tree_view_column_new_with_attributes (_("Room"), cell,
+ "text", COL_ROOM,
NULL);
count = gtk_tree_view_append_column (view, column);
gtk_tree_view_column_set_sort_column_id (column, count - 1);
@@ -293,7 +293,7 @@ chatrooms_window_model_add_columns (EmpathyChatroomsWindow *window)
window);
/* Sort model */
- gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (model), 0,
+ gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (model), 0,
GTK_SORT_ASCENDING);
}
@@ -323,7 +323,7 @@ chatrooms_window_model_refresh_data (EmpathyChatroomsWindow *window,
chatrooms = empathy_chatroom_manager_get_chatrooms (window->manager, account);
/* Sort out columns, we only show the server column for
- * selected protocol types, such as Jabber.
+ * selected protocol types, such as Jabber.
*/
if (account) {
column = gtk_tree_view_get_column (view, window->room_column);
diff --git a/src/empathy-chatrooms-window.h b/src/empathy-chatrooms-window.h
index 727188f01..1d8476ecc 100644
--- a/src/empathy-chatrooms-window.h
+++ b/src/empathy-chatrooms-window.h
@@ -15,8 +15,8 @@
*
* You should have received a copy of the GNU General Public
* License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301 USA
*
* Authors: Xavier Claessens <xclaesse@gmail.com>
* Martyn Russell <martyn@imendio.com>
diff --git a/src/empathy-event-manager.c b/src/empathy-event-manager.c
index 7d8721c3e..81d98ef74 100644
--- a/src/empathy-event-manager.c
+++ b/src/empathy-event-manager.c
@@ -14,7 +14,7 @@
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- *
+ *
* Authors: Xavier Claessens <xclaesse@gmail.com>
* Sjoerd Simons <sjoerd.simons@collabora.co.uk>
*/
@@ -373,8 +373,7 @@ event_channel_process_voip_func (EventPriv *event)
return;
}
- dialog = gtk_message_dialog_new (GTK_WINDOW (empathy_main_window_get()),
- GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
+ dialog = gtk_message_dialog_new (NULL, 0,
GTK_MESSAGE_QUESTION, GTK_BUTTONS_NONE, _("Incoming call"));
gtk_message_dialog_format_secondary_text (
GTK_MESSAGE_DIALOG (dialog),
@@ -573,7 +572,7 @@ static void
event_manager_tube_dispatch_ability_cb (GObject *object,
GParamSpec *spec, gpointer user_data)
{
- EventManagerApproval *approval = (EventManagerApproval *)user_data;
+ EventManagerApproval *approval = (EventManagerApproval *) user_data;
EmpathyTubeDispatchAbility dispatchability;
dispatchability =
@@ -594,7 +593,7 @@ event_manager_tube_got_contact_cb (EmpathyTpContactFactory *factory,
gpointer user_data,
GObject *object)
{
- EventManagerApproval *approval = (EventManagerApproval *)user_data;
+ EventManagerApproval *approval = (EventManagerApproval *) user_data;
EmpathyTubeDispatchAbility dispatchability;
if (error != NULL)
@@ -753,6 +752,32 @@ event_manager_muc_invite_got_contact_cb (EmpathyTpContactFactory *factory,
}
static void
+event_manager_ft_got_contact_cb (EmpathyTpContactFactory *factory,
+ EmpathyContact *contact,
+ const GError *error,
+ gpointer user_data,
+ GObject *object)
+{
+ EventManagerApproval *approval = (EventManagerApproval *) user_data;
+ char *header;
+
+ approval->contact = contact;
+
+ header = g_strdup_printf (_("Incoming file transfer from %s"),
+ empathy_contact_get_name (approval->contact));
+
+ event_manager_add (approval->manager, approval->contact,
+ EMPATHY_IMAGE_DOCUMENT_SEND, header, NULL, approval,
+ event_channel_process_func, NULL);
+
+ /* FIXME better sound for incoming file transfers ?*/
+ empathy_sound_play (empathy_main_window_get (),
+ EMPATHY_SOUND_CONVERSATION_NEW);
+
+ g_free (header);
+}
+
+static void
event_manager_approve_channel_cb (EmpathyDispatcher *dispatcher,
EmpathyDispatchOperation *operation, EmpathyEventManager *manager)
{
@@ -840,26 +865,23 @@ event_manager_approve_channel_cb (EmpathyDispatcher *dispatcher,
}
else if (!tp_strdiff (channel_type, TP_IFACE_CHANNEL_TYPE_FILE_TRANSFER))
{
- EmpathyTpFile *file;
- gchar *header;
-
- file = EMPATHY_TP_FILE (empathy_dispatch_operation_get_channel_wrapper (operation));
- approval->contact = g_object_ref (empathy_tp_file_get_contact (file));
-
- header = g_strdup_printf (_("Incoming file transfer from %s"),
- empathy_contact_get_name (approval->contact));
+ TpChannel *channel;
+ TpConnection *connection;
+ TpHandle handle;
+ EmpathyTpContactFactory *factory;
- event_manager_add (manager, approval->contact, EMPATHY_IMAGE_DOCUMENT_SEND,
- header, NULL, approval, event_channel_process_func, NULL);
+ channel = empathy_dispatch_operation_get_channel (operation);
+ handle = tp_channel_get_handle (channel, NULL);
- /* FIXME better sound for incoming file transfers ?*/
- empathy_sound_play (empathy_main_window_get (),
- EMPATHY_SOUND_CONVERSATION_NEW);
+ connection = tp_channel_borrow_connection (channel);
+ factory = empathy_tp_contact_factory_dup_singleton (connection);
+ empathy_tp_contact_factory_get_from_handle (factory, handle,
+ event_manager_ft_got_contact_cb, approval, NULL, G_OBJECT (manager));
- g_free (header);
+ g_object_unref (factory);
}
- else if (!tp_strdiff (channel_type, EMP_IFACE_CHANNEL_TYPE_STREAM_TUBE) ||
- !tp_strdiff (channel_type, EMP_IFACE_CHANNEL_TYPE_DBUS_TUBE))
+ else if (!tp_strdiff (channel_type, TP_IFACE_CHANNEL_TYPE_STREAM_TUBE) ||
+ !tp_strdiff (channel_type, TP_IFACE_CHANNEL_TYPE_DBUS_TUBE))
{
TpChannel *channel;
TpHandle handle;
@@ -882,7 +904,7 @@ event_manager_approve_channel_cb (EmpathyDispatcher *dispatcher,
}
else
{
- DEBUG ("Unknown channel type, ignoring..");
+ DEBUG ("Unknown channel type (%s), ignoring..", channel_type);
}
}
@@ -1054,7 +1076,7 @@ empathy_event_manager_get_top_event (EmpathyEventManager *manager)
void
empathy_event_activate (EmpathyEvent *event_public)
{
- EventPriv *event = (EventPriv*) event_public;
+ EventPriv *event = (EventPriv *) event_public;
g_return_if_fail (event_public != NULL);
diff --git a/src/empathy-ft-manager.c b/src/empathy-ft-manager.c
index 98e58d4f3..bc4f2a7b7 100644
--- a/src/empathy-ft-manager.c
+++ b/src/empathy-ft-manager.c
@@ -1,8 +1,7 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
/*
* Copyright (C) 2003, 2004 Xan Lopez
* Copyright (C) 2007 Marco Barisione <marco@barisione.org>
- * Copyright (C) 2008 Collabora Ltd.
+ * Copyright (C) 2008-2009 Collabora Ltd.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
@@ -16,13 +15,14 @@
*
* You should have received a copy of the GNU General Public
* License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301 USA
*
* Authors: Xan Lopez
* Marco Barisione <marco@barisione.org>
* Jonny Lamb <jonny.lamb@collabora.co.uk>
* Xavier Claessens <xclaesse@gmail.com>
+ * Cosimo Cecchi <cosimo.cecchi@collabora.co.uk>
*/
/* The original file transfer manager code was copied from Epiphany */
@@ -46,19 +46,6 @@
#include "empathy-ft-manager.h"
-#include "extensions/extensions.h"
-
-/**
- * SECTION:empathy-ft-manager
- * @short_description: File transfer dialog
- * @see_also: #EmpathyTpFile, empathy_dispatcher_send_file()
- * @include: libempthy-gtk/empathy-ft-manager.h
- *
- * The #EmpathyFTManager object represents the file transfer dialog,
- * it can show multiple file transfers at the same time (added
- * with empathy_ft_manager_add_tp_file()).
- */
-
enum
{
COL_PERCENT,
@@ -68,24 +55,19 @@ enum
COL_FT_OBJECT
};
-/**
- * EmpathyFTManagerPriv:
- *
- * Private fields of the #EmpathyFTManager class.
- */
-struct _EmpathyFTManagerPriv
-{
+typedef struct {
GtkTreeModel *model;
- GHashTable *tp_file_to_row_ref;
+ GHashTable *ft_handler_to_row_ref;
/* Widgets */
GtkWidget *window;
GtkWidget *treeview;
GtkWidget *open_button;
GtkWidget *abort_button;
+ GtkWidget *clear_button;
guint save_geometry_id;
-};
+} EmpathyFTManagerPriv;
enum
{
@@ -96,10 +78,15 @@ enum
G_DEFINE_TYPE (EmpathyFTManager, empathy_ft_manager, G_TYPE_OBJECT);
+#define GET_PRIV(obj) EMPATHY_GET_PRIV (obj, EmpathyFTManager)
+
static EmpathyFTManager *manager_singleton = NULL;
+static void ft_handler_hashing_started_cb (EmpathyFTHandler *handler,
+ EmpathyFTManager *manager);
+
static gchar *
-ft_manager_format_interval (gint interval)
+ft_manager_format_interval (guint interval)
{
gint hours, mins, secs;
@@ -117,235 +104,62 @@ ft_manager_format_interval (gint interval)
return g_strdup_printf (_("%02u.%02u"), mins, secs);
}
-static GtkTreeRowReference *
-ft_manager_get_row_from_tp_file (EmpathyFTManager *ft_manager,
- EmpathyTpFile *tp_file)
-{
- return g_hash_table_lookup (ft_manager->priv->tp_file_to_row_ref, tp_file);
-}
-
static void
-ft_manager_update_buttons (EmpathyFTManager *ft_manager)
+ft_manager_update_buttons (EmpathyFTManager *manager)
{
GtkTreeSelection *selection;
GtkTreeModel *model;
GtkTreeIter iter;
- EmpathyTpFile *tp_file;
- TpFileTransferState state;
+ EmpathyFTHandler *handler;
gboolean open_enabled = FALSE;
gboolean abort_enabled = FALSE;
+ gboolean clear_enabled = FALSE;
+ gboolean is_completed, is_cancelled;
+ GHashTableIter hash_iter;
+ EmpathyFTManagerPriv *priv = GET_PRIV (manager);
+
+ selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (priv->treeview));
- selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (
- ft_manager->priv->treeview));
if (gtk_tree_selection_get_selected (selection, &model, &iter))
{
- gtk_tree_model_get (model, &iter, COL_FT_OBJECT, &tp_file, -1);
- state = empathy_tp_file_get_state (tp_file, NULL);
+ gtk_tree_model_get (model, &iter, COL_FT_OBJECT, &handler, -1);
+
+ is_completed = empathy_ft_handler_is_completed (handler);
+ is_cancelled = empathy_ft_handler_is_cancelled (handler);
/* I can open the file if the transfer is completed and was incoming */
- open_enabled = (state == TP_FILE_TRANSFER_STATE_COMPLETED &&
- empathy_tp_file_is_incoming (tp_file));
+ open_enabled = (is_completed && empathy_ft_handler_is_incoming (handler));
/* I can abort if the transfer is not already finished */
- abort_enabled = (state != TP_FILE_TRANSFER_STATE_CANCELLED &&
- state != TP_FILE_TRANSFER_STATE_COMPLETED);
+ abort_enabled = (is_cancelled == FALSE && is_completed == FALSE);
- g_object_unref (tp_file);
+ g_object_unref (handler);
}
- gtk_widget_set_sensitive (ft_manager->priv->open_button, open_enabled);
- gtk_widget_set_sensitive (ft_manager->priv->abort_button, abort_enabled);
-}
+ g_hash_table_iter_init (&hash_iter, priv->ft_handler_to_row_ref);
-static const gchar *
-ft_manager_state_change_reason_to_string (TpFileTransferStateChangeReason reason)
-{
- switch (reason)
+ while (g_hash_table_iter_next (&hash_iter, (gpointer *) &handler, NULL))
{
- case TP_FILE_TRANSFER_STATE_CHANGE_REASON_NONE:
- return _("No reason was specified");
- case TP_FILE_TRANSFER_STATE_CHANGE_REASON_REQUESTED:
- return _("The change in state was requested");
- case TP_FILE_TRANSFER_STATE_CHANGE_REASON_LOCAL_STOPPED:
- return _("You canceled the file transfer");
- case TP_FILE_TRANSFER_STATE_CHANGE_REASON_REMOTE_STOPPED:
- return _("The other participant canceled the file transfer");
- case TP_FILE_TRANSFER_STATE_CHANGE_REASON_LOCAL_ERROR:
- return _("Error while trying to transfer the file");
- case TP_FILE_TRANSFER_STATE_CHANGE_REASON_REMOTE_ERROR:
- return _("The other participant is unable to transfer the file");
- }
- return _("Unknown reason");
-}
-
-static void
-ft_manager_update_ft_row (EmpathyFTManager *ft_manager,
- EmpathyTpFile *tp_file)
-{
- GtkTreeRowReference *row_ref;
- GtkTreePath *path;
- GtkTreeIter iter;
- const gchar *filename;
- const gchar *contact_name;
- const gchar *msg;
- gchar *msg_dup = NULL;
- gchar *remaining_str = NULL;
- gchar *first_line_format;
- gchar *first_line = NULL;
- gchar *second_line = NULL;
- guint64 transferred_bytes;
- guint64 total_size;
- gint remaining = -1;
- gint percent;
- TpFileTransferState state;
- TpFileTransferStateChangeReason reason;
- gboolean incoming;
-
- row_ref = ft_manager_get_row_from_tp_file (ft_manager, tp_file);
- g_return_if_fail (row_ref != NULL);
-
- filename = empathy_tp_file_get_filename (tp_file);
- contact_name = empathy_contact_get_name (empathy_tp_file_get_contact (tp_file));
- transferred_bytes = empathy_tp_file_get_transferred_bytes (tp_file);
- total_size = empathy_tp_file_get_size (tp_file);
- state = empathy_tp_file_get_state (tp_file, &reason);
- incoming = empathy_tp_file_is_incoming (tp_file);
+ if (empathy_ft_handler_is_completed (handler) ||
+ empathy_ft_handler_is_cancelled (handler))
+ clear_enabled = TRUE;
- switch (state)
- {
- case TP_FILE_TRANSFER_STATE_NONE:
- /* This should never happen, the CM is broken. But we avoid warning
- * because it's not our fault. */
- DEBUG ("State is NONE, probably a broken CM");
+ if (clear_enabled)
break;
- case TP_FILE_TRANSFER_STATE_PENDING:
- case TP_FILE_TRANSFER_STATE_OPEN:
- case TP_FILE_TRANSFER_STATE_ACCEPTED:
- if (incoming)
- /* translators: first %s is filename, second %s is the contact name */
- first_line_format = _("Receiving \"%s\" from %s");
- else
- /* translators: first %s is filename, second %s is the contact name */
- first_line_format = _("Sending \"%s\" to %s");
-
- first_line = g_strdup_printf (first_line_format, filename, contact_name);
-
- if (state == TP_FILE_TRANSFER_STATE_OPEN || incoming)
- {
- gchar *total_size_str;
- gchar *transferred_bytes_str;
-
- if (total_size == EMPATHY_TP_FILE_UNKNOWN_SIZE)
- total_size_str = g_strdup (C_("file size", "Unknown"));
- else
- total_size_str = g_format_size_for_display (total_size);
-
- transferred_bytes_str = g_format_size_for_display (transferred_bytes);
-
- /* translators: first %s is the transferred size, second %s is
- * the total file size */
- second_line = g_strdup_printf (_("%s of %s"), transferred_bytes_str,
- total_size_str);
- g_free (transferred_bytes_str);
- g_free (total_size_str);
-
- }
- else
- second_line = g_strdup (_("Waiting for the other participant's response"));
-
- remaining = empathy_tp_file_get_remaining_time (tp_file);
- break;
-
- case TP_FILE_TRANSFER_STATE_COMPLETED:
- if (incoming)
- /* translators: first %s is filename, second %s
- * is the contact name */
- first_line = g_strdup_printf (
- _("\"%s\" received from %s"), filename,
- contact_name);
- else
- /* translators: first %s is filename, second %s
- * is the contact name */
- first_line = g_strdup_printf (
- _("\"%s\" sent to %s"), filename,
- contact_name);
-
- second_line = g_strdup (_("File transfer completed"));
-
- break;
-
- case TP_FILE_TRANSFER_STATE_CANCELLED:
- if (incoming)
- /* translators: first %s is filename, second %s
- * is the contact name */
- first_line = g_strdup_printf (
- _("\"%s\" receiving from %s"), filename,
- contact_name);
- else
- /* translators: first %s is filename, second %s
- * is the contact name */
- first_line = g_strdup_printf (
- _("\"%s\" sending to %s"), filename,
- contact_name);
-
- second_line = g_strdup_printf (_("File transfer canceled: %s"),
- ft_manager_state_change_reason_to_string (reason));
-
- break;
- }
-
- if (total_size != EMPATHY_TP_FILE_UNKNOWN_SIZE && total_size != 0)
- percent = transferred_bytes * 100 / total_size;
- else
- percent = -1;
-
- if (remaining < 0)
- {
- if (state != TP_FILE_TRANSFER_STATE_COMPLETED &&
- state != TP_FILE_TRANSFER_STATE_CANCELLED)
- remaining_str = g_strdup (C_("remaining time", "Unknown"));
}
- else
- remaining_str = ft_manager_format_interval (remaining);
-
- if (first_line != NULL && second_line != NULL)
- msg = msg_dup = g_strdup_printf ("%s\n%s", first_line, second_line);
- else
- msg = first_line ? first_line : second_line;
-
- /* Set new values in the store */
- path = gtk_tree_row_reference_get_path (row_ref);
- gtk_tree_model_get_iter (ft_manager->priv->model, &iter, path);
- gtk_list_store_set (GTK_LIST_STORE (ft_manager->priv->model),
- &iter,
- COL_PERCENT, percent,
- COL_MESSAGE, msg ? msg : "",
- COL_REMAINING, remaining_str ? remaining_str : "",
- -1);
-
- gtk_tree_path_free (path);
-
- g_free (msg_dup);
- g_free (first_line);
- g_free (second_line);
- g_free (remaining_str);
- ft_manager_update_buttons (ft_manager);
-}
+ gtk_widget_set_sensitive (priv->open_button, open_enabled);
+ gtk_widget_set_sensitive (priv->abort_button, abort_enabled);
-static void
-ft_manager_transferred_bytes_changed_cb (EmpathyTpFile *tp_file,
- GParamSpec *pspec,
- EmpathyFTManager *ft_manager)
-{
- ft_manager_update_ft_row (ft_manager, tp_file);
+ if (clear_enabled)
+ gtk_widget_set_sensitive (priv->clear_button, TRUE);
}
static void
ft_manager_selection_changed (GtkTreeSelection *selection,
- EmpathyFTManager *ft_manager)
+ EmpathyFTManager *manager)
{
- ft_manager_update_buttons (ft_manager);
+ ft_manager_update_buttons (manager);
}
static void
@@ -369,79 +183,57 @@ ft_manager_progress_cell_data_func (GtkTreeViewColumn *col,
g_object_set (renderer, "text", text, "value", percent, NULL);
}
-static gboolean
-ft_manager_save_geometry_timeout_cb (EmpathyFTManager *ft_manager)
-{
- gint x, y, w, h;
-
- gtk_window_get_size (GTK_WINDOW (ft_manager->priv->window), &w, &h);
- gtk_window_get_position (GTK_WINDOW (ft_manager->priv->window), &x, &y);
-
- empathy_geometry_save ("ft-manager", x, y, w, h);
-
- ft_manager->priv->save_geometry_id = 0;
-
- return FALSE;
-}
-
-static gboolean
-ft_manager_configure_event_cb (GtkWidget *widget,
- GdkEventConfigure *event,
- EmpathyFTManager *ft_manager)
+static GtkTreeRowReference *
+ft_manager_get_row_from_handler (EmpathyFTManager *manager,
+ EmpathyFTHandler *handler)
{
- if (ft_manager->priv->save_geometry_id != 0)
- g_source_remove (ft_manager->priv->save_geometry_id);
+ EmpathyFTManagerPriv *priv = GET_PRIV (manager);
- ft_manager->priv->save_geometry_id = g_timeout_add (500,
- (GSourceFunc) ft_manager_save_geometry_timeout_cb, ft_manager);
-
- return FALSE;
+ return g_hash_table_lookup (priv->ft_handler_to_row_ref, handler);
}
static void
-ft_manager_remove_file_from_model (EmpathyFTManager *ft_manager,
- EmpathyTpFile *tp_file)
+ft_manager_remove_file_from_model (EmpathyFTManager *manager,
+ EmpathyFTHandler *handler)
{
GtkTreeRowReference *row_ref;
GtkTreeSelection *selection;
GtkTreePath *path = NULL;
GtkTreeIter iter;
gboolean update_selection;
+ EmpathyFTManagerPriv *priv = GET_PRIV (manager);
- row_ref = ft_manager_get_row_from_tp_file (ft_manager, tp_file);
+ row_ref = ft_manager_get_row_from_handler (manager, handler);
g_return_if_fail (row_ref);
DEBUG ("Removing file transfer from window: contact=%s, filename=%s",
- empathy_contact_get_name (empathy_tp_file_get_contact (tp_file)),
- empathy_tp_file_get_filename (tp_file));
+ empathy_contact_get_name (empathy_ft_handler_get_contact (handler)),
+ empathy_ft_handler_get_filename (handler));
/* Get the iter from the row_ref */
path = gtk_tree_row_reference_get_path (row_ref);
- gtk_tree_model_get_iter (ft_manager->priv->model, &iter, path);
+ gtk_tree_model_get_iter (priv->model, &iter, path);
gtk_tree_path_free (path);
/* We have to update the selection only if we are removing the selected row */
- selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (ft_manager->priv->treeview));
+ selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (priv->treeview));
update_selection = gtk_tree_selection_iter_is_selected (selection, &iter);
/* Remove tp_file's row. After that iter points to the next row */
- if (!gtk_list_store_remove (GTK_LIST_STORE (ft_manager->priv->model), &iter))
+ if (!gtk_list_store_remove (GTK_LIST_STORE (priv->model), &iter))
{
gint n_row;
/* There is no next row, set iter to the last row */
- n_row = gtk_tree_model_iter_n_children (ft_manager->priv->model, NULL);
+ n_row = gtk_tree_model_iter_n_children (priv->model, NULL);
if (n_row > 0)
- gtk_tree_model_iter_nth_child (ft_manager->priv->model, &iter, NULL,
- n_row - 1);
+ gtk_tree_model_iter_nth_child (priv->model, &iter, NULL, n_row - 1);
else
update_selection = FALSE;
}
if (update_selection)
gtk_tree_selection_select_iter (selection, &iter);
-
- empathy_tp_file_close (tp_file);
}
static gboolean
@@ -449,113 +241,679 @@ remove_finished_transfer_foreach (gpointer key,
gpointer value,
gpointer user_data)
{
- EmpathyTpFile *tp_file = EMPATHY_TP_FILE (key);
- EmpathyFTManager *self = EMPATHY_FT_MANAGER (user_data);
- TpFileTransferState state;
+ EmpathyFTHandler *handler = key;
+ EmpathyFTManager *manager = user_data;
- state = empathy_tp_file_get_state (tp_file, NULL);
- if (state == TP_FILE_TRANSFER_STATE_COMPLETED ||
- state == TP_FILE_TRANSFER_STATE_CANCELLED)
+ if (empathy_ft_handler_is_completed (handler) ||
+ empathy_ft_handler_is_cancelled (handler))
{
- ft_manager_remove_file_from_model (self, tp_file);
+ ft_manager_remove_file_from_model (manager, handler);
return TRUE;
}
return FALSE;
}
+static gchar *
+ft_manager_format_progress_bytes_and_percentage (guint64 current,
+ guint64 total,
+ gdouble speed,
+ int *percentage)
+{
+ char *total_str, *current_str, *retval;
+ char *speed_str = NULL;
+
+ total_str = g_format_size_for_display (total);
+ current_str = g_format_size_for_display (current);
+
+ if (speed > 0)
+ speed_str = g_format_size_for_display ((goffset) speed);
+
+ /* translators: first %s is the currently processed size, second %s is
+ * the total file size */
+ retval = speed_str ?
+ g_strdup_printf (_("%s of %s at %s/s"), current_str, total_str, speed_str) :
+ g_strdup_printf (_("%s of %s"), current_str, total_str);
+
+ g_free (total_str);
+ g_free (current_str);
+ g_free (speed_str);
+
+ if (percentage != NULL)
+ {
+ if (total != 0)
+ *percentage = current * 100 / total;
+ else
+ *percentage = -1;
+ }
+
+ return retval;
+}
+
+static gchar *
+ft_manager_format_contact_info (EmpathyFTHandler *handler)
+{
+ gboolean incoming;
+ const char *filename, *contact_name, *first_line_format;
+ char *retval;
+
+ incoming = empathy_ft_handler_is_incoming (handler);
+ contact_name = empathy_contact_get_name
+ (empathy_ft_handler_get_contact (handler));
+ filename = empathy_ft_handler_get_filename (handler);
+
+ if (incoming)
+ /* translators: first %s is filename, second %s is the contact name */
+ first_line_format = _("Receiving \"%s\" from %s");
+ else
+ /* translators: first %s is filename, second %s is the contact name */
+ first_line_format = _("Sending \"%s\" to %s");
+
+ retval = g_strdup_printf (first_line_format, filename, contact_name);
+
+ return retval;
+}
+
+static gchar *
+ft_manager_format_error_message (EmpathyFTHandler *handler,
+ const GError *error)
+{
+ const char *contact_name, *filename;
+ EmpathyContact *contact;
+ char *first_line, *message;
+ gboolean incoming;
+
+ contact_name = NULL;
+ incoming = empathy_ft_handler_is_incoming (handler);
+
+ contact = empathy_ft_handler_get_contact (handler);
+ if (contact)
+ contact_name = empathy_contact_get_name (contact);
+
+ filename = empathy_ft_handler_get_filename (handler);
+
+ if (incoming)
+ /* filename/contact_name here are either both NULL or both valid */
+ if (filename && contact_name)
+ /* translators: first %s is filename, second %s
+ * is the contact name */
+ first_line = g_strdup_printf (_("Error receiving \"%s\" from %s"), filename,
+ contact_name);
+ else
+ first_line = g_strdup (_("Error receiving a file"));
+ else
+ /* translators: first %s is filename, second %s
+ * is the contact name */
+ if (filename && contact_name)
+ first_line = g_strdup_printf (_("Error sending \"%s\" to %s"), filename,
+ contact_name);
+ else
+ first_line = g_strdup (_("Error sending a file"));
+
+ message = g_strdup_printf ("%s\n%s", first_line, error->message);
+
+ g_free (first_line);
+
+ return message;
+}
+
+static void
+ft_manager_update_handler_message (EmpathyFTManager *manager,
+ GtkTreeRowReference *row_ref,
+ const char *message)
+{
+ GtkTreePath *path;
+ GtkTreeIter iter;
+ EmpathyFTManagerPriv *priv = GET_PRIV (manager);
+
+ /* Set new value in the store */
+ path = gtk_tree_row_reference_get_path (row_ref);
+ gtk_tree_model_get_iter (priv->model, &iter, path);
+ gtk_list_store_set (GTK_LIST_STORE (priv->model),
+ &iter,
+ COL_MESSAGE, message ? message : "",
+ -1);
+
+ gtk_tree_path_free (path);
+}
+
+static void
+ft_manager_update_handler_progress (EmpathyFTManager *manager,
+ GtkTreeRowReference *row_ref,
+ int percentage)
+{
+ GtkTreePath *path;
+ GtkTreeIter iter;
+ EmpathyFTManagerPriv *priv = GET_PRIV (manager);
+
+ /* Set new value in the store */
+ path = gtk_tree_row_reference_get_path (row_ref);
+ gtk_tree_model_get_iter (priv->model, &iter, path);
+ gtk_list_store_set (GTK_LIST_STORE (priv->model),
+ &iter,
+ COL_PERCENT, percentage,
+ -1);
+
+ gtk_tree_path_free (path);
+
+}
+
+static void
+ft_manager_update_handler_time (EmpathyFTManager *manager,
+ GtkTreeRowReference *row_ref,
+ guint remaining_time)
+{
+ GtkTreePath *path;
+ GtkTreeIter iter;
+ EmpathyFTManagerPriv *priv = GET_PRIV (manager);
+ char *remaining_str;
+
+ remaining_str = ft_manager_format_interval (remaining_time);
+
+ /* Set new value in the store */
+ path = gtk_tree_row_reference_get_path (row_ref);
+ gtk_tree_model_get_iter (priv->model, &iter, path);
+ gtk_list_store_set (GTK_LIST_STORE (priv->model),
+ &iter,
+ COL_REMAINING, remaining_str,
+ -1);
+
+ gtk_tree_path_free (path);
+ g_free (remaining_str);
+}
+
+static void
+ft_manager_clear_handler_time (EmpathyFTManager *manager,
+ GtkTreeRowReference *row_ref)
+{
+ GtkTreePath *path;
+ GtkTreeIter iter;
+ EmpathyFTManagerPriv *priv = GET_PRIV (manager);
+
+ /* Set new value in the store */
+ path = gtk_tree_row_reference_get_path (row_ref);
+ gtk_tree_model_get_iter (priv->model, &iter, path);
+ gtk_list_store_set (GTK_LIST_STORE (priv->model),
+ &iter,
+ COL_REMAINING, NULL,
+ -1);
+
+ gtk_tree_path_free (path);
+}
+
+static void
+ft_handler_transfer_error_cb (EmpathyFTHandler *handler,
+ GError *error,
+ EmpathyFTManager *manager)
+{
+ char *message;
+ GtkTreeRowReference *row_ref;
+
+ DEBUG ("Transfer error %s", error->message);
+
+ row_ref = ft_manager_get_row_from_handler (manager, handler);
+ g_return_if_fail (row_ref != NULL);
+
+ message = ft_manager_format_error_message (handler, error);
+
+ ft_manager_update_handler_message (manager, row_ref, message);
+ ft_manager_clear_handler_time (manager, row_ref);
+ ft_manager_update_buttons (manager);
+
+ g_free (message);
+}
+
+static void
+do_real_transfer_done (EmpathyFTManager *manager,
+ EmpathyFTHandler *handler)
+{
+ const char *contact_name;
+ const char *filename;
+ char *first_line, *second_line, *message;
+ char *uri;
+ gboolean incoming;
+ GtkTreeRowReference *row_ref;
+ GtkRecentManager *recent_manager;
+ GFile *file;
+
+ row_ref = ft_manager_get_row_from_handler (manager, handler);
+ g_return_if_fail (row_ref != NULL);
+
+ incoming = empathy_ft_handler_is_incoming (handler);
+ contact_name = empathy_contact_get_name
+ (empathy_ft_handler_get_contact (handler));
+ filename = empathy_ft_handler_get_filename (handler);
+
+ if (incoming)
+ /* translators: first %s is filename, second %s
+ * is the contact name */
+ first_line = g_strdup_printf (_("\"%s\" received from %s"), filename,
+ contact_name);
+ else
+ /* translators: first %s is filename, second %s
+ * is the contact name */
+ first_line = g_strdup_printf (_("\"%s\" sent to %s"), filename,
+ contact_name);
+
+ second_line = g_strdup (_("File transfer completed"));
+
+ message = g_strdup_printf ("%s\n%s", first_line, second_line);
+ ft_manager_update_handler_message (manager, row_ref, message);
+ ft_manager_clear_handler_time (manager, row_ref);
+
+ /* update buttons */
+ ft_manager_update_buttons (manager);
+
+ g_free (message);
+ g_free (first_line);
+ g_free (second_line);
+
+ recent_manager = gtk_recent_manager_get_default ();
+ file = empathy_ft_handler_get_gfile (handler);
+ uri = g_file_get_uri (file);
+
+ gtk_recent_manager_add_item (recent_manager, uri);
+
+ g_free (uri);
+}
+
+static void
+ft_handler_transfer_done_cb (EmpathyFTHandler *handler,
+ EmpathyTpFile *tp_file,
+ EmpathyFTManager *manager)
+{
+ if (empathy_ft_handler_is_incoming (handler) &&
+ empathy_ft_handler_get_use_hash (handler))
+ {
+ DEBUG ("Transfer done, waiting for hashing-started");
+
+ /* connect to the signal and return early */
+ g_signal_connect (handler, "hashing-started",
+ G_CALLBACK (ft_handler_hashing_started_cb), manager);
+
+ return;
+ }
+
+ DEBUG ("Transfer done, no hashing");
+
+ do_real_transfer_done (manager, handler);
+}
+
+static void
+ft_handler_transfer_progress_cb (EmpathyFTHandler *handler,
+ guint64 current_bytes,
+ guint64 total_bytes,
+ guint remaining_time,
+ gdouble speed,
+ EmpathyFTManager *manager)
+{
+ char *first_line, *second_line, *message;
+ int percentage;
+ GtkTreeRowReference *row_ref;
+
+ DEBUG ("Transfer progress");
+
+ row_ref = ft_manager_get_row_from_handler (manager, handler);
+ g_return_if_fail (row_ref != NULL);
+
+ first_line = ft_manager_format_contact_info (handler);
+ second_line = ft_manager_format_progress_bytes_and_percentage
+ (current_bytes, total_bytes, speed, &percentage);
+
+ message = g_strdup_printf ("%s\n%s", first_line, second_line);
+
+ ft_manager_update_handler_message (manager, row_ref, message);
+ ft_manager_update_handler_progress (manager, row_ref, percentage);
+
+ if (remaining_time > 0)
+ ft_manager_update_handler_time (manager, row_ref, remaining_time);
+
+ g_free (message);
+ g_free (first_line);
+ g_free (second_line);
+}
+
+static void
+ft_handler_transfer_started_cb (EmpathyFTHandler *handler,
+ EmpathyTpFile *tp_file,
+ EmpathyFTManager *manager)
+{
+ guint64 transferred_bytes, total_bytes;
+
+ DEBUG ("Transfer started");
+
+ g_signal_connect (handler, "transfer-progress",
+ G_CALLBACK (ft_handler_transfer_progress_cb), manager);
+ g_signal_connect (handler, "transfer-done",
+ G_CALLBACK (ft_handler_transfer_done_cb), manager);
+
+ transferred_bytes = empathy_ft_handler_get_transferred_bytes (handler);
+ total_bytes = empathy_ft_handler_get_total_bytes (handler);
+
+ ft_handler_transfer_progress_cb (handler, transferred_bytes, total_bytes,
+ 0, -1, manager);
+}
+
+static void
+ft_handler_hashing_done_cb (EmpathyFTHandler *handler,
+ EmpathyFTManager *manager)
+{
+ GtkTreeRowReference *row_ref;
+ char *first_line, *second_line, *message;
+
+ DEBUG ("Hashing done");
+
+ /* update the message */
+ if (empathy_ft_handler_is_incoming (handler))
+ {
+ do_real_transfer_done (manager, handler);
+ return;
+ }
+
+ row_ref = ft_manager_get_row_from_handler (manager, handler);
+ g_return_if_fail (row_ref != NULL);
+
+ first_line = ft_manager_format_contact_info (handler);
+ second_line = g_strdup (_("Waiting for the other participant's response"));
+ message = g_strdup_printf ("%s\n%s", first_line, second_line);
+
+ ft_manager_update_handler_message (manager, row_ref, message);
+
+ g_free (message);
+ g_free (first_line);
+ g_free (second_line);
+
+ g_signal_connect (handler, "transfer-started",
+ G_CALLBACK (ft_handler_transfer_started_cb), manager);
+}
+
+static void
+ft_handler_hashing_progress_cb (EmpathyFTHandler *handler,
+ guint64 current_bytes,
+ guint64 total_bytes,
+ EmpathyFTManager *manager)
+{
+ char *first_line, *second_line, *message;
+ GtkTreeRowReference *row_ref;
+
+ row_ref = ft_manager_get_row_from_handler (manager, handler);
+ g_return_if_fail (row_ref != NULL);
+
+ if (empathy_ft_handler_is_incoming (handler))
+ first_line = g_strdup_printf (_("Checking integrity of \"%s\""),
+ empathy_ft_handler_get_filename (handler));
+ else
+ first_line = g_strdup_printf (_("Hashing \"%s\""),
+ empathy_ft_handler_get_filename (handler));
+
+ second_line = ft_manager_format_progress_bytes_and_percentage
+ (current_bytes, total_bytes, -1, NULL);
+
+ message = g_strdup_printf ("%s\n%s", first_line, second_line);
+
+ ft_manager_update_handler_message (manager, row_ref, message);
+
+ g_free (message);
+ g_free (first_line);
+ g_free (second_line);
+}
+
+static void
+ft_handler_hashing_started_cb (EmpathyFTHandler *handler,
+ EmpathyFTManager *manager)
+{
+ char *message, *first_line, *second_line;
+ GtkTreeRowReference *row_ref;
+
+ DEBUG ("Hashing started");
+
+ g_signal_connect (handler, "hashing-progress",
+ G_CALLBACK (ft_handler_hashing_progress_cb), manager);
+ g_signal_connect (handler, "hashing-done",
+ G_CALLBACK (ft_handler_hashing_done_cb), manager);
+
+ row_ref = ft_manager_get_row_from_handler (manager, handler);
+ g_return_if_fail (row_ref != NULL);
+
+ first_line = ft_manager_format_contact_info (handler);
+
+ if (empathy_ft_handler_is_incoming (handler))
+ second_line = g_strdup_printf (_("Checking integrity of \"%s\""),
+ empathy_ft_handler_get_filename (handler));
+ else
+ second_line = g_strdup_printf (_("Hashing \"%s\""),
+ empathy_ft_handler_get_filename (handler));
+
+ message = g_strdup_printf ("%s\n%s", first_line, second_line);
+
+ ft_manager_update_handler_message (manager, row_ref, message);
+
+ g_free (first_line);
+ g_free (second_line);
+ g_free (message);
+}
+
static void
-ft_manager_state_changed_cb (EmpathyTpFile *tp_file,
- GParamSpec *pspec,
- EmpathyFTManager *ft_manager)
+ft_manager_start_transfer (EmpathyFTManager *manager,
+ EmpathyFTHandler *handler)
{
- if (empathy_tp_file_get_state (tp_file, NULL) ==
- TP_FILE_TRANSFER_STATE_COMPLETED)
+ EmpathyFTManagerPriv *priv;
+ gboolean is_outgoing;
+
+ priv = GET_PRIV (manager);
+
+ is_outgoing = !empathy_ft_handler_is_incoming (handler);
+
+ DEBUG ("Start transfer, is outgoing %s",
+ is_outgoing ? "True" : "False");
+
+ /* now connect the signals */
+ g_signal_connect (handler, "transfer-error",
+ G_CALLBACK (ft_handler_transfer_error_cb), manager);
+
+ if (is_outgoing && empathy_ft_handler_get_use_hash (handler)) {
+ g_signal_connect (handler, "hashing-started",
+ G_CALLBACK (ft_handler_hashing_started_cb), manager);
+ } else {
+ /* either incoming or outgoing without hash */
+ g_signal_connect (handler, "transfer-started",
+ G_CALLBACK (ft_handler_transfer_started_cb), manager);
+ }
+
+ empathy_ft_handler_start_transfer (handler);
+}
+
+static void
+ft_manager_add_handler_to_list (EmpathyFTManager *manager,
+ EmpathyFTHandler *handler,
+ const GError *error)
+{
+ GtkTreeRowReference *row_ref;
+ GtkTreeIter iter;
+ GtkTreeSelection *selection;
+ GtkTreePath *path;
+ GIcon *icon;
+ const char *content_type, *second_line;
+ char *first_line, *message;
+ EmpathyFTManagerPriv *priv = GET_PRIV (manager);
+
+ icon = NULL;
+
+ /* get the icon name from the mime-type of the file. */
+ content_type = empathy_ft_handler_get_content_type (handler);
+
+ if (content_type != NULL)
+ icon = g_content_type_get_icon (content_type);
+
+ /* append the handler in the store */
+ gtk_list_store_insert_with_values (GTK_LIST_STORE (priv->model),
+ &iter, G_MAXINT, COL_FT_OBJECT, handler,
+ COL_ICON, icon, -1);
+
+ if (icon != NULL)
+ g_object_unref (icon);
+
+ /* insert the new row_ref in the hash table */
+ path = gtk_tree_model_get_path (GTK_TREE_MODEL (priv->model), &iter);
+ row_ref = gtk_tree_row_reference_new (GTK_TREE_MODEL (priv->model), path);
+ gtk_tree_path_free (path);
+ g_hash_table_insert (priv->ft_handler_to_row_ref, g_object_ref (handler),
+ row_ref);
+
+ /* select the new row */
+ selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (priv->treeview));
+ gtk_tree_selection_select_iter (selection, &iter);
+
+ if (error != NULL)
{
- GtkRecentManager *manager;
- const gchar *uri;
+ message = ft_manager_format_error_message (handler, error);
+ ft_manager_update_handler_message (manager, row_ref, message);
- manager = gtk_recent_manager_get_default ();
- uri = g_object_get_data (G_OBJECT (tp_file), "uri");
- if (uri != NULL)
- gtk_recent_manager_add_item (manager, uri);
+ g_free (message);
+ return;
}
- ft_manager_update_ft_row (ft_manager, tp_file);
+ /* update the row with the initial values.
+ * the only case where we postpone this is in case we're managing
+ * an outgoing+hashing transfer, as the hashing started signal will
+ * take care of updating the information.
+ */
+ if (empathy_ft_handler_is_incoming (handler) ||
+ !empathy_ft_handler_get_use_hash (handler)) {
+ first_line = ft_manager_format_contact_info (handler);
+ second_line = _("Waiting for the other participant's response");
+ message = g_strdup_printf ("%s\n%s", first_line, second_line);
+
+ ft_manager_update_handler_message (manager, row_ref, message);
+
+ g_free (first_line);
+ g_free (message);
+ }
+
+ /* hook up the signals and start the transfer */
+ ft_manager_start_transfer (manager, handler);
}
static void
-ft_manager_clear (EmpathyFTManager *ft_manager)
+ft_manager_clear (EmpathyFTManager *manager)
{
+ EmpathyFTManagerPriv *priv;
+
DEBUG ("Clearing file transfer list");
+ priv = GET_PRIV (manager);
+
/* Remove completed and cancelled transfers */
- g_hash_table_foreach_remove (ft_manager->priv->tp_file_to_row_ref,
- remove_finished_transfer_foreach, ft_manager);
+ g_hash_table_foreach_remove (priv->ft_handler_to_row_ref,
+ remove_finished_transfer_foreach, manager);
+
+ /* set the clear button back to insensitive */
+ gtk_widget_set_sensitive (priv->clear_button, FALSE);
}
static void
-ft_manager_open (EmpathyFTManager *ft_manager)
+ft_manager_open (EmpathyFTManager *manager)
{
GtkTreeSelection *selection;
GtkTreeIter iter;
GtkTreeModel *model;
- EmpathyTpFile *tp_file;
- const gchar *uri;
+ EmpathyFTHandler *handler;
+ char *uri;
+ GFile *file;
+ EmpathyFTManagerPriv *priv = GET_PRIV (manager);
- selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (ft_manager->priv->treeview));
+ selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (priv->treeview));
if (!gtk_tree_selection_get_selected (selection, &model, &iter))
return;
- gtk_tree_model_get (model, &iter, COL_FT_OBJECT, &tp_file, -1);
- g_return_if_fail (tp_file != NULL);
+ gtk_tree_model_get (model, &iter, COL_FT_OBJECT, &handler, -1);
+
+ file = empathy_ft_handler_get_gfile (handler);
+ uri = g_file_get_uri (file);
- uri = g_object_get_data (G_OBJECT (tp_file), "uri");
DEBUG ("Opening URI: %s", uri);
- empathy_url_show (GTK_WIDGET (ft_manager->priv->window), uri);
- g_object_unref (tp_file);
+ empathy_url_show (GTK_WIDGET (priv->window), uri);
+
+ g_object_unref (handler);
+ g_free (uri);
}
static void
-ft_manager_stop (EmpathyFTManager *ft_manager)
+ft_manager_stop (EmpathyFTManager *manager)
{
GtkTreeSelection *selection;
GtkTreeIter iter;
GtkTreeModel *model;
- EmpathyTpFile *tp_file;
+ EmpathyFTHandler *handler;
+ EmpathyFTManagerPriv *priv;
+
+ priv = GET_PRIV (manager);
- selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (ft_manager->priv->treeview));
+ selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (priv->treeview));
if (!gtk_tree_selection_get_selected (selection, &model, &iter))
return;
- gtk_tree_model_get (model, &iter, COL_FT_OBJECT, &tp_file, -1);
- g_return_if_fail (tp_file != NULL);
+ gtk_tree_model_get (model, &iter, COL_FT_OBJECT, &handler, -1);
+ g_return_if_fail (handler != NULL);
DEBUG ("Stopping file transfer: contact=%s, filename=%s",
- empathy_contact_get_name (empathy_tp_file_get_contact (tp_file)),
- empathy_tp_file_get_filename (tp_file));
+ empathy_contact_get_name (empathy_ft_handler_get_contact (handler)),
+ empathy_ft_handler_get_filename (handler));
- empathy_tp_file_cancel (tp_file);
- g_object_unref (tp_file);
+ empathy_ft_handler_cancel_transfer (handler);
+
+ g_object_unref (handler);
+}
+
+static gboolean
+ft_manager_save_geometry_timeout_cb (EmpathyFTManager *manager)
+{
+ EmpathyFTManagerPriv *priv = GET_PRIV (manager);
+ gint x, y, w, h;
+
+ gtk_window_get_size (GTK_WINDOW (priv->window), &w, &h);
+ gtk_window_get_position (GTK_WINDOW (priv->window), &x, &y);
+
+ empathy_geometry_save ("ft-manager", x, y, w, h);
+
+ priv->save_geometry_id = 0;
+
+ return FALSE;
+}
+
+static gboolean
+ft_manager_configure_event_cb (GtkWidget *widget,
+ GdkEventConfigure *event,
+ EmpathyFTManager *manager)
+{
+ EmpathyFTManagerPriv *priv = GET_PRIV (manager);
+
+ if (priv->save_geometry_id != 0)
+ g_source_remove (priv->save_geometry_id);
+
+ priv->save_geometry_id = g_timeout_add (500,
+ (GSourceFunc) ft_manager_save_geometry_timeout_cb, manager);
+
+ return FALSE;
}
static void
ft_manager_response_cb (GtkWidget *widget,
gint response,
- EmpathyFTManager *ft_manager)
+ EmpathyFTManager *manager)
{
switch (response)
{
case RESPONSE_CLEAR:
- ft_manager_clear (ft_manager);
+ ft_manager_clear (manager);
break;
case RESPONSE_OPEN:
- ft_manager_open (ft_manager);
+ ft_manager_open (manager);
break;
case RESPONSE_STOP:
- ft_manager_stop (ft_manager);
+ ft_manager_stop (manager);
break;
}
}
@@ -563,10 +921,16 @@ ft_manager_response_cb (GtkWidget *widget,
static gboolean
ft_manager_delete_event_cb (GtkWidget *widget,
GdkEvent *event,
- EmpathyFTManager *ft_manager)
+ EmpathyFTManager *manager)
{
- ft_manager_clear (ft_manager);
- if (g_hash_table_size (ft_manager->priv->tp_file_to_row_ref) > 0)
+ EmpathyFTManagerPriv *priv = GET_PRIV (manager);
+
+ DEBUG ("%p", manager);
+
+ /* remove all the completed/cancelled/errored transfers */
+ ft_manager_clear (manager);
+
+ if (g_hash_table_size (priv->ft_handler_to_row_ref) > 0)
{
/* There is still FTs on flight, just hide the window */
DEBUG ("Hiding window");
@@ -579,16 +943,15 @@ ft_manager_delete_event_cb (GtkWidget *widget,
static void
ft_manager_destroy_cb (GtkWidget *widget,
- EmpathyFTManager *ft_manager)
+ EmpathyFTManager *manager)
{
- ft_manager->priv->window = NULL;
- if (ft_manager->priv->save_geometry_id != 0)
- g_source_remove (ft_manager->priv->save_geometry_id);
- g_hash_table_remove_all (ft_manager->priv->tp_file_to_row_ref);
+ DEBUG ("%p", manager);
+
+ g_object_unref (manager);
}
static void
-ft_manager_build_ui (EmpathyFTManager *ft_manager)
+ft_manager_build_ui (EmpathyFTManager *manager)
{
GtkBuilder *gui;
gint x, y, w, h;
@@ -598,27 +961,26 @@ ft_manager_build_ui (EmpathyFTManager *ft_manager)
GtkCellRenderer *renderer;
GtkTreeSelection *selection;
gchar *filename;
-
- if (ft_manager->priv->window != NULL)
- return;
+ EmpathyFTManagerPriv *priv = GET_PRIV (manager);
filename = empathy_file_lookup ("empathy-ft-manager.ui", "src");
gui = empathy_builder_get_file (filename,
- "ft_manager_dialog", &ft_manager->priv->window,
- "ft_list", &ft_manager->priv->treeview,
- "open_button", &ft_manager->priv->open_button,
- "abort_button", &ft_manager->priv->abort_button,
+ "ft_manager_dialog", &priv->window,
+ "ft_list", &priv->treeview,
+ "clear_button", &priv->clear_button,
+ "open_button", &priv->open_button,
+ "abort_button", &priv->abort_button,
NULL);
g_free (filename);
- empathy_builder_connect (gui, ft_manager,
+ empathy_builder_connect (gui, manager,
"ft_manager_dialog", "destroy", ft_manager_destroy_cb,
"ft_manager_dialog", "response", ft_manager_response_cb,
"ft_manager_dialog", "delete-event", ft_manager_delete_event_cb,
"ft_manager_dialog", "configure-event", ft_manager_configure_event_cb,
NULL);
- g_object_unref (gui);
+ empathy_builder_unref_and_keep_widget (gui, priv->window);
/* Window geometry. */
empathy_geometry_load ("ft-manager", &x, &y, &w, &h);
@@ -627,22 +989,22 @@ ft_manager_build_ui (EmpathyFTManager *ft_manager)
{
/* Let the window manager position it if we don't have
* good x, y coordinates. */
- gtk_window_move (GTK_WINDOW (ft_manager->priv->window), x, y);
+ gtk_window_move (GTK_WINDOW (priv->window), x, y);
}
if (w > 0 && h > 0)
{
/* Use the defaults from the ui file if we don't have
* good w, h geometry. */
- gtk_window_resize (GTK_WINDOW (ft_manager->priv->window), w, h);
+ gtk_window_resize (GTK_WINDOW (priv->window), w, h);
}
/* Setup the tree view */
- view = GTK_TREE_VIEW (ft_manager->priv->treeview);
+ view = GTK_TREE_VIEW (priv->treeview);
selection = gtk_tree_view_get_selection (view);
gtk_tree_selection_set_mode (selection, GTK_SELECTION_BROWSE);
g_signal_connect (selection, "changed",
- G_CALLBACK (ft_manager_selection_changed), ft_manager);
+ G_CALLBACK (ft_manager_selection_changed), manager);
gtk_tree_view_set_headers_visible (view, TRUE);
gtk_tree_view_set_enable_search (view, FALSE);
@@ -652,9 +1014,9 @@ ft_manager_build_ui (EmpathyFTManager *ft_manager)
G_TYPE_ICON, /* icon */
G_TYPE_STRING, /* message */
G_TYPE_STRING, /* remaining */
- G_TYPE_OBJECT); /* ft_file */
+ G_TYPE_OBJECT); /* ft_handler */
gtk_tree_view_set_model (view, GTK_TREE_MODEL (liststore));
- ft_manager->priv->model = GTK_TREE_MODEL (liststore);
+ priv->model = GTK_TREE_MODEL (liststore);
g_object_unref (liststore);
/* Progress column */
@@ -702,36 +1064,45 @@ ft_manager_build_ui (EmpathyFTManager *ft_manager)
gtk_tree_view_column_pack_start (column, renderer, FALSE);
gtk_tree_view_column_set_attributes (column, renderer,
"text", COL_REMAINING, NULL);
+
+ /* clear button should be sensitive only if there are completed/cancelled
+ * handlers in the store.
+ */
+ gtk_widget_set_sensitive (priv->clear_button, FALSE);
}
+/* GObject method overrides */
+
static void
empathy_ft_manager_finalize (GObject *object)
{
- EmpathyFTManager *ft_manager = (EmpathyFTManager *) object;
+ EmpathyFTManagerPriv *priv = GET_PRIV (object);
- DEBUG ("%p", object);
+ DEBUG ("FT Manager %p", object);
- if (ft_manager->priv->window)
- gtk_widget_destroy (ft_manager->priv->window);
+ g_hash_table_destroy (priv->ft_handler_to_row_ref);
- g_hash_table_destroy (ft_manager->priv->tp_file_to_row_ref);
+ if (priv->save_geometry_id != 0)
+ g_source_remove (priv->save_geometry_id);
G_OBJECT_CLASS (empathy_ft_manager_parent_class)->finalize (object);
}
static void
-empathy_ft_manager_init (EmpathyFTManager *ft_manager)
+empathy_ft_manager_init (EmpathyFTManager *manager)
{
EmpathyFTManagerPriv *priv;
- priv = G_TYPE_INSTANCE_GET_PRIVATE ((ft_manager), EMPATHY_TYPE_FT_MANAGER,
+ priv = G_TYPE_INSTANCE_GET_PRIVATE ((manager), EMPATHY_TYPE_FT_MANAGER,
EmpathyFTManagerPriv);
- ft_manager->priv = priv;
+ manager->priv = priv;
- priv->tp_file_to_row_ref = g_hash_table_new_full (g_direct_hash,
+ priv->ft_handler_to_row_ref = g_hash_table_new_full (g_direct_hash,
g_direct_equal, (GDestroyNotify) g_object_unref,
(GDestroyNotify) gtk_tree_row_reference_free);
+
+ ft_manager_build_ui (manager);
}
static GObject *
@@ -743,7 +1114,7 @@ empathy_ft_manager_constructor (GType type,
if (manager_singleton)
{
- retval = g_object_ref (manager_singleton);
+ retval = G_OBJECT (manager_singleton);
}
else
{
@@ -768,325 +1139,50 @@ empathy_ft_manager_class_init (EmpathyFTManagerClass *klass)
g_type_class_add_private (object_class, sizeof (EmpathyFTManagerPriv));
}
-/**
- * empathy_ft_manager_dup_singleton:
- *
- * Returns a reference to the #EmpathyFTManager singleton object.
- *
- * Returns: a #EmpathyFTManager
- */
-EmpathyFTManager *
-empathy_ft_manager_dup_singleton (void)
-{
- return g_object_new (EMPATHY_TYPE_FT_MANAGER, NULL);
-}
-
-/**
- * empathy_ft_manager_get_dialog:
- * @ft_manager: an #EmpathyFTManager
- *
- * Returns the #GtkWidget of @ft_manager.
- *
- * Returns: the dialog
- */
-GtkWidget *
-empathy_ft_manager_get_dialog (EmpathyFTManager *ft_manager)
-{
- g_return_val_if_fail (EMPATHY_IS_FT_MANAGER (ft_manager), NULL);
-
- ft_manager_build_ui (ft_manager);
-
- return ft_manager->priv->window;
-}
-
-static void
-ft_manager_add_tp_file_to_list (EmpathyFTManager *ft_manager,
- EmpathyTpFile *tp_file)
-{
- GtkTreeRowReference *row_ref;
- GtkTreeIter iter;
- GtkTreeSelection *selection;
- GtkTreePath *path;
- GIcon *icon;
- const gchar *content_type;
-
- ft_manager_build_ui (ft_manager);
-
- /* Get the icon name from the mime-type of the file. */
- content_type = empathy_tp_file_get_content_type (tp_file);
- icon = g_content_type_get_icon (content_type);
-
- /* Append the ft in the store */
- gtk_list_store_insert_with_values (GTK_LIST_STORE (ft_manager->priv->model),
- &iter, G_MAXINT, COL_FT_OBJECT, tp_file, COL_ICON, icon, -1);
-
- g_object_unref (icon);
-
- /* Insert the new row_ref in the hash table */
- path = gtk_tree_model_get_path (GTK_TREE_MODEL (ft_manager->priv->model),
- &iter);
- row_ref = gtk_tree_row_reference_new (GTK_TREE_MODEL (
- ft_manager->priv->model), path);
- gtk_tree_path_free (path);
- g_hash_table_insert (ft_manager->priv->tp_file_to_row_ref,
- g_object_ref (tp_file), row_ref);
-
- /* Select the new row */
- selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (
- ft_manager->priv->treeview));
- gtk_tree_selection_select_iter (selection, &iter);
-
- /* Update the row with the initial values, and keep track of changes */
- ft_manager_update_ft_row (ft_manager, tp_file);
- g_signal_connect (tp_file, "notify::state",
- G_CALLBACK (ft_manager_state_changed_cb), ft_manager);
- g_signal_connect (tp_file, "notify::transferred-bytes",
- G_CALLBACK (ft_manager_transferred_bytes_changed_cb), ft_manager);
-
- gtk_window_present (GTK_WINDOW (ft_manager->priv->window));
-}
-
-typedef struct {
- EmpathyFTManager *ft_manager;
- EmpathyTpFile *tp_file;
-} ReceiveResponseData;
+/* public methods */
-static void
-ft_manager_receive_response_data_free (ReceiveResponseData *response_data)
-{
- if (!response_data)
- return;
-
- g_object_unref (response_data->tp_file);
- g_object_unref (response_data->ft_manager);
- g_slice_free (ReceiveResponseData, response_data);
-}
-
-static void
-ft_manager_save_dialog_response_cb (GtkDialog *widget,
- gint response_id,
- ReceiveResponseData *response_data)
+void
+empathy_ft_manager_add_handler (EmpathyFTHandler *handler)
{
- if (response_id == GTK_RESPONSE_OK)
- {
- gchar *uri;
- gchar *folder;
-
- uri = gtk_file_chooser_get_uri (GTK_FILE_CHOOSER (widget));
-
- if (uri)
- {
- GFile *file;
- GError *error = NULL;
-
- file = g_file_new_for_uri (uri);
- empathy_tp_file_accept (response_data->tp_file, 0, file, &error);
-
- if (error)
- {
- GtkWidget *dialog;
-
- DEBUG ("Error with opening file to write to: %s",
- error->message ? error->message : "no error");
-
- /* Error is already translated */
- dialog = gtk_message_dialog_new (NULL, 0, GTK_MESSAGE_ERROR,
- GTK_BUTTONS_CLOSE, _("Cannot save file to this location"));
-
- gtk_message_dialog_format_secondary_text (
- GTK_MESSAGE_DIALOG (dialog), "%s",
- error->message);
-
- g_signal_connect (dialog, "response",
- G_CALLBACK (gtk_widget_destroy), NULL);
-
- gtk_widget_show (dialog);
-
- g_error_free (error);
- return;
- }
+ EmpathyFTManager *manager;
+ EmpathyFTManagerPriv *priv;
- g_object_set_data_full (G_OBJECT (response_data->tp_file),
- "uri", uri, g_free);
+ DEBUG ("Adding handler");
- ft_manager_add_tp_file_to_list (response_data->ft_manager,
- response_data->tp_file);
+ g_return_if_fail (EMPATHY_IS_FT_HANDLER (handler));
- g_object_unref (file);
- }
+ manager = g_object_new (EMPATHY_TYPE_FT_MANAGER, NULL);
+ priv = GET_PRIV (manager);
- folder = gtk_file_chooser_get_current_folder (GTK_FILE_CHOOSER (widget));
- if (folder)
- {
- empathy_conf_set_string (empathy_conf_get (),
- EMPATHY_PREFS_FILE_TRANSFER_DEFAULT_FOLDER,
- folder);
- g_free (folder);
- }
- }
-
- gtk_widget_destroy (GTK_WIDGET (widget));
- ft_manager_receive_response_data_free (response_data);
+ ft_manager_add_handler_to_list (manager, handler, NULL);
+ gtk_window_present (GTK_WINDOW (priv->window));
}
-static void
-ft_manager_create_save_dialog (ReceiveResponseData *response_data)
+void
+empathy_ft_manager_display_error (EmpathyFTHandler *handler,
+ const GError *error)
{
- GtkWidget *widget;
- gchar *folder;
-
- DEBUG ("Creating save file chooser");
-
- widget = gtk_file_chooser_dialog_new (_("Save file as..."),
- NULL, GTK_FILE_CHOOSER_ACTION_SAVE,
- GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
- GTK_STOCK_SAVE_AS, GTK_RESPONSE_OK,
- NULL);
-
- if (!empathy_conf_get_string (empathy_conf_get (),
- EMPATHY_PREFS_FILE_TRANSFER_DEFAULT_FOLDER,
- &folder) || !folder)
- folder = g_strdup (g_get_user_special_dir (G_USER_DIRECTORY_DOWNLOAD));
-
- if (folder)
- gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (widget), folder);
-
- gtk_file_chooser_set_current_name (GTK_FILE_CHOOSER (widget),
- empathy_tp_file_get_filename (response_data->tp_file));
-
- gtk_dialog_set_default_response (GTK_DIALOG (widget),
- GTK_RESPONSE_OK);
-
- gtk_file_chooser_set_do_overwrite_confirmation (GTK_FILE_CHOOSER (widget),
- TRUE);
-
- g_signal_connect (widget, "response",
- G_CALLBACK (ft_manager_save_dialog_response_cb), response_data);
-
- gtk_widget_show (widget);
-
- g_free (folder);
-}
+ EmpathyFTManager *manager;
+ EmpathyFTManagerPriv *priv;
-static void
-ft_manager_receive_file_response_cb (GtkWidget *dialog,
- gint response,
- ReceiveResponseData *response_data)
-{
- if (response == GTK_RESPONSE_ACCEPT)
- ft_manager_create_save_dialog (response_data);
- else
- {
- empathy_tp_file_cancel (response_data->tp_file);
- ft_manager_receive_response_data_free (response_data);
- }
+ g_return_if_fail (EMPATHY_IS_FT_HANDLER (handler));
+ g_return_if_fail (error != NULL);
- gtk_widget_destroy (dialog);
-}
+ manager = g_object_new (EMPATHY_TYPE_FT_MANAGER, NULL);
+ priv = GET_PRIV (manager);
-static void
-ft_manager_display_accept_dialog (EmpathyFTManager *ft_manager,
- EmpathyTpFile *tp_file)
-{
- GtkWidget *dialog;
- GtkWidget *image;
- GtkWidget *button;
- const gchar *contact_name;
- const gchar *filename;
- guint64 size;
- gchar *size_str;
- ReceiveResponseData *response_data;
-
- g_return_if_fail (EMPATHY_IS_FT_MANAGER (ft_manager));
- g_return_if_fail (EMPATHY_IS_TP_FILE (tp_file));
-
- DEBUG ("Creating accept dialog");
-
- contact_name = empathy_contact_get_name (empathy_tp_file_get_contact (tp_file));
- filename = empathy_tp_file_get_filename (tp_file);
-
- size = empathy_tp_file_get_size (tp_file);
- if (size == EMPATHY_TP_FILE_UNKNOWN_SIZE)
- size_str = g_strdup (_("unknown size"));
- else
- size_str = g_format_size_for_display (size);
-
- dialog = gtk_message_dialog_new (NULL, 0, GTK_MESSAGE_INFO,
- GTK_BUTTONS_NONE,
- _("%s would like to send you a file"),
- contact_name);
-
- gtk_message_dialog_format_secondary_text
- (GTK_MESSAGE_DIALOG (dialog),
- /* Translators: the first %s is the file name, the second %s is the file size */
- _("Do you want to accept the file \"%s\" (%s)?"),
- filename, size_str);
-
- /* Icon */
- image = gtk_image_new_from_stock (GTK_STOCK_SAVE, GTK_ICON_SIZE_DIALOG);
- gtk_widget_show (image);
- gtk_message_dialog_set_image (GTK_MESSAGE_DIALOG (dialog), image);
-
- /* Decline button */
- button = gtk_button_new_with_mnemonic (_("_Decline"));
- gtk_button_set_image (GTK_BUTTON (button),
- gtk_image_new_from_stock (GTK_STOCK_CANCEL,
- GTK_ICON_SIZE_BUTTON));
- gtk_widget_show (button);
- gtk_dialog_add_action_widget (GTK_DIALOG (dialog), button,
- GTK_RESPONSE_REJECT);
-
- /* Accept button */
- button = gtk_button_new_with_mnemonic (_("_Accept"));
- gtk_button_set_image (GTK_BUTTON (button),
- gtk_image_new_from_stock (GTK_STOCK_SAVE,
- GTK_ICON_SIZE_BUTTON));
- gtk_widget_show (button);
- gtk_dialog_add_action_widget (GTK_DIALOG (dialog), button,
- GTK_RESPONSE_ACCEPT);
- GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
- gtk_widget_grab_default (button);
-
- response_data = g_slice_new0 (ReceiveResponseData);
- response_data->ft_manager = g_object_ref (ft_manager);
- response_data->tp_file = g_object_ref (tp_file);
-
- g_signal_connect (dialog, "response",
- G_CALLBACK (ft_manager_receive_file_response_cb), response_data);
-
- gtk_widget_show (dialog);
-
- g_free (size_str);
+ ft_manager_add_handler_to_list (manager, handler, error);
+ gtk_window_present (GTK_WINDOW (priv->window));
}
-/**
- * empathy_ft_manager_add_tp_file:
- * @ft_manager: an #EmpathyFTManager
- * @ft: an #EmpathyFT
- *
- * Adds a file transfer to the file transfer manager dialog @ft_manager.
- * The manager dialog then shows the progress and other information about
- * @ft.
- */
void
-empathy_ft_manager_add_tp_file (EmpathyFTManager *ft_manager,
- EmpathyTpFile *tp_file)
+empathy_ft_manager_show (void)
{
- TpFileTransferState state;
-
- g_return_if_fail (EMPATHY_IS_FT_MANAGER (ft_manager));
- g_return_if_fail (EMPATHY_IS_TP_FILE (tp_file));
-
- state = empathy_tp_file_get_state (tp_file, NULL);
+ EmpathyFTManager *manager;
+ EmpathyFTManagerPriv *priv;
- DEBUG ("Adding a file transfer: contact=%s, filename=%s, state=%d",
- empathy_contact_get_name (empathy_tp_file_get_contact (tp_file)),
- empathy_tp_file_get_filename (tp_file), state);
+ manager = g_object_new (EMPATHY_TYPE_FT_MANAGER, NULL);
+ priv = GET_PRIV (manager);
- if (state == TP_FILE_TRANSFER_STATE_PENDING &&
- empathy_tp_file_is_incoming (tp_file))
- ft_manager_display_accept_dialog (ft_manager, tp_file);
- else
- ft_manager_add_tp_file_to_list (ft_manager, tp_file);
+ gtk_window_present (GTK_WINDOW (priv->window));
}
-
diff --git a/src/empathy-ft-manager.h b/src/empathy-ft-manager.h
index 4803bc814..0ff820f06 100644
--- a/src/empathy-ft-manager.h
+++ b/src/empathy-ft-manager.h
@@ -1,7 +1,6 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
/*
* Copyright (C) 2007 Marco Barisione <marco@barisione.org>
- * Copyright (C) 2008 Collabora Ltd.
+ * Copyright (C) 2008-2009 Collabora Ltd.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
@@ -15,11 +14,12 @@
*
* You should have received a copy of the GNU General Public
* License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301 USA
*
* Authors: Marco Barisione <marco@barisione.org>
* Jonny Lamb <jonny.lamb@collabora.co.uk>
+ * Cosimo Cecchi <cosimo.cecchi@collabora.co.uk>
*/
#ifndef __EMPATHY_FT_MANAGER_H__
@@ -29,38 +29,42 @@
#include <glib-object.h>
#include <glib.h>
-#include <libempathy/empathy-tp-file.h>
+#include <libempathy/empathy-ft-handler.h>
G_BEGIN_DECLS
-#define EMPATHY_TYPE_FT_MANAGER (empathy_ft_manager_get_type ())
-#define EMPATHY_FT_MANAGER(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), EMPATHY_TYPE_FT_MANAGER, EmpathyFTManager))
-#define EMPATHY_FT_MANAGER_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), EMPATHY_TYPE_FT_MANAGER, EmpathyFTManagerClass))
-#define EMPATHY_IS_FT_MANAGER(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), EMPATHY_TYPE_FT_MANAGER))
-#define EMPATHY_IS_FT_MANAGER_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), EMPATHY_TYPE_FT_MANAGER))
-#define EMPATHY_FT_MANAGER_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), EMPATHY_TYPE_FT_MANAGER, EmpathyFTManagerClass))
+#define EMPATHY_TYPE_FT_MANAGER \
+ (empathy_ft_manager_get_type ())
+#define EMPATHY_FT_MANAGER(o) \
+ (G_TYPE_CHECK_INSTANCE_CAST ((o), EMPATHY_TYPE_FT_MANAGER, EmpathyFTManager))
+#define EMPATHY_FT_MANAGER_CLASS(k) \
+ (G_TYPE_CHECK_CLASS_CAST((k), EMPATHY_TYPE_FT_MANAGER, EmpathyFTManagerClass))
+#define EMPATHY_IS_FT_MANAGER(o) \
+ (G_TYPE_CHECK_INSTANCE_TYPE ((o), EMPATHY_TYPE_FT_MANAGER))
+#define EMPATHY_IS_FT_MANAGER_CLASS(k) \
+ (G_TYPE_CHECK_CLASS_TYPE ((k), EMPATHY_TYPE_FT_MANAGER))
+#define EMPATHY_FT_MANAGER_GET_CLASS(o) \
+ (G_TYPE_INSTANCE_GET_CLASS ((o), EMPATHY_TYPE_FT_MANAGER, EmpathyFTManagerClass))
typedef struct _EmpathyFTManager EmpathyFTManager;
-typedef struct _EmpathyFTManagerPriv EmpathyFTManagerPriv;
typedef struct _EmpathyFTManagerClass EmpathyFTManagerClass;
-struct _EmpathyFTManager
-{
+struct _EmpathyFTManager {
GObject parent;
-
- EmpathyFTManagerPriv *priv;
+ gpointer priv;
};
-struct _EmpathyFTManagerClass
-{
+struct _EmpathyFTManagerClass {
GObjectClass parent_class;
};
GType empathy_ft_manager_get_type (void);
-EmpathyFTManager *empathy_ft_manager_dup_singleton (void);
-void empathy_ft_manager_add_tp_file (EmpathyFTManager *ft_manager, EmpathyTpFile *tp_file);
-GtkWidget *empathy_ft_manager_get_dialog (EmpathyFTManager *ft_manager);
+/* public methods */
+void empathy_ft_manager_add_handler (EmpathyFTHandler *handler);
+void empathy_ft_manager_display_error (EmpathyFTHandler *handler,
+ const GError *error);
+void empathy_ft_manager_show (void);
G_END_DECLS
diff --git a/src/empathy-import-dialog.c b/src/empathy-import-dialog.c
index c7c321f96..8e9a04595 100644
--- a/src/empathy-import-dialog.c
+++ b/src/empathy-import-dialog.c
@@ -13,8 +13,8 @@
*
* You should have received a copy of the GNU General Public
* License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301 USA
*
* Authors: Jonny Lamb <jonny.lamb@collabora.co.uk>
* */
@@ -396,10 +396,10 @@ empathy_import_dialog_show (GtkWindow *parent,
return;
}
-
+
/* We have accounts, let's display the window with them */
dialog = g_slice_new0 (EmpathyImportDialog);
- dialog->accounts = accounts;
+ dialog->accounts = accounts;
filename = empathy_file_lookup ("empathy-import-dialog.ui", "src");
gui = empathy_builder_get_file (filename,
diff --git a/src/empathy-import-dialog.h b/src/empathy-import-dialog.h
index 278afc701..a3ef3e13c 100644
--- a/src/empathy-import-dialog.h
+++ b/src/empathy-import-dialog.h
@@ -13,8 +13,8 @@
*
* You should have received a copy of the GNU General Public
* License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301 USA
*
* Authors: Jonny Lamb <jonny.lamb@collabora.co.uk>
*/
diff --git a/src/empathy-import-pidgin.c b/src/empathy-import-pidgin.c
index 76295c702..a58111d59 100644
--- a/src/empathy-import-pidgin.c
+++ b/src/empathy-import-pidgin.c
@@ -13,8 +13,8 @@
*
* You should have received a copy of the GNU General Public
* License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301 USA
*
* Authors: Jonny Lamb <jonny.lamb@collabora.co.uk>
* */
@@ -294,7 +294,7 @@ empathy_import_pidgin_load (void)
}
OUT:
- xmlFreeDoc(doc);
+ xmlFreeDoc (doc);
xmlFreeParserCtxt (ctxt);
FILENAME:
diff --git a/src/empathy-import-pidgin.h b/src/empathy-import-pidgin.h
index fc7d2e491..b72acf553 100644
--- a/src/empathy-import-pidgin.h
+++ b/src/empathy-import-pidgin.h
@@ -13,8 +13,8 @@
*
* You should have received a copy of the GNU General Public
* License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301 USA
*
* Authors: Jonny Lamb <jonny.lamb@collabora.co.uk>
*/
diff --git a/src/empathy-logs.c b/src/empathy-logs.c
index 502be67d7..b9f38e0e7 100644
--- a/src/empathy-logs.c
+++ b/src/empathy-logs.c
@@ -14,9 +14,9 @@
*
* You should have received a copy of the GNU General Public
* License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- *
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301 USA
+ *
* Authors: Xavier Claessens <xclaesse@gmail.com>
*/
diff --git a/src/empathy-main-window.c b/src/empathy-main-window.c
index 9015a5d25..5830d2b71 100644
--- a/src/empathy-main-window.c
+++ b/src/empathy-main-window.c
@@ -15,9 +15,9 @@
*
* You should have received a copy of the GNU General Public
* License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- *
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301 USA
+ *
* Authors: Xavier Claessens <xclaesse@gmail.com>
*/
@@ -57,8 +57,10 @@
#include "empathy-about-dialog.h"
#include "empathy-debug-dialog.h"
#include "empathy-new-chatroom-dialog.h"
+#include "empathy-map-view.h"
#include "empathy-chatrooms-window.h"
#include "empathy-event-manager.h"
+#include "empathy-ft-manager.h"
#define DEBUG_FLAG EMPATHY_DEBUG_OTHER
#include <libempathy/empathy-debug.h>
@@ -93,7 +95,7 @@ typedef struct {
GtkWidget *errors_vbox;
GtkUIManager *ui_manager;
- GtkAction *chat_history;
+ GtkAction *view_history;
GtkAction *room_join_favorites;
GtkWidget *room_menu;
GtkWidget *room_separator;
@@ -133,7 +135,7 @@ main_window_flash_foreach (GtkTreeModel *model,
GtkTreeIter *iter,
gpointer user_data)
{
- FlashForeachData *data = (FlashForeachData*) user_data;
+ FlashForeachData *data = (FlashForeachData *) user_data;
EmpathyContact *contact;
const gchar *icon_name;
GtkTreePath *parent_path = NULL;
@@ -165,7 +167,7 @@ main_window_flash_foreach (GtkTreeModel *model,
/* To make sure the parent is shown correctly, we emit
* the row-changed signal on the parent so it prompts
- * it to be refreshed by the filter func.
+ * it to be refreshed by the filter func.
*/
if (gtk_tree_model_iter_parent (model, &parent_iter, iter)) {
parent_path = gtk_tree_model_get_path (model, &parent_iter);
@@ -562,8 +564,8 @@ main_window_connection_changed_cb (EmpathyAccountManager *manager,
static void
main_window_contact_presence_changed_cb (EmpathyContactMonitor *monitor,
EmpathyContact *contact,
- McPresence current,
- McPresence previous,
+ TpConnectionPresenceType current,
+ TpConnectionPresenceType previous,
EmpathyMainWindow *window)
{
McAccount *account;
@@ -576,18 +578,25 @@ main_window_contact_presence_changed_cb (EmpathyContactMonitor *monitor,
return;
}
- if (previous < MC_PRESENCE_AVAILABLE && current > MC_PRESENCE_OFFLINE) {
- /* someone is logging in */
- empathy_sound_play (GTK_WIDGET (window->window),
- EMPATHY_SOUND_CONTACT_CONNECTED);
- return;
- }
-
- if (previous > MC_PRESENCE_OFFLINE && current < MC_PRESENCE_AVAILABLE) {
- /* someone is logging off */
- empathy_sound_play (GTK_WIDGET (window->window),
- EMPATHY_SOUND_CONTACT_DISCONNECTED);
- }
+ if (tp_connection_presence_type_cmp_availability (previous,
+ TP_CONNECTION_PRESENCE_TYPE_OFFLINE) > 0)
+ {
+ /* contact was online */
+ if (tp_connection_presence_type_cmp_availability (current,
+ TP_CONNECTION_PRESENCE_TYPE_OFFLINE) <= 0)
+ /* someone is logging off */
+ empathy_sound_play (GTK_WIDGET (window->window),
+ EMPATHY_SOUND_CONTACT_DISCONNECTED);
+ }
+ else
+ {
+ /* contact was offline */
+ if (tp_connection_presence_type_cmp_availability (current,
+ TP_CONNECTION_PRESENCE_TYPE_OFFLINE) > 0)
+ /* someone is logging in */
+ empathy_sound_play (GTK_WIDGET (window->window),
+ EMPATHY_SOUND_CONTACT_CONNECTED);
+ }
}
static void
@@ -663,7 +672,7 @@ main_window_chat_quit_cb (GtkAction *action,
}
static void
-main_window_chat_history_cb (GtkAction *action,
+main_window_view_history_cb (GtkAction *action,
EmpathyMainWindow *window)
{
empathy_log_window_show (NULL, NULL, FALSE, GTK_WINDOW (window->window));
@@ -684,7 +693,14 @@ main_window_chat_add_contact_cb (GtkAction *action,
}
static void
-main_window_chat_show_offline_cb (GtkToggleAction *action,
+main_window_view_show_ft_manager (GtkAction *action,
+ EmpathyMainWindow *window)
+{
+ empathy_ft_manager_show ();
+}
+
+static void
+main_window_view_show_offline_cb (GtkToggleAction *action,
EmpathyMainWindow *window)
{
gboolean current;
@@ -701,6 +717,15 @@ main_window_chat_show_offline_cb (GtkToggleAction *action,
}
static void
+main_window_view_show_map_cb (GtkCheckMenuItem *item,
+ EmpathyMainWindow *window)
+{
+#if HAVE_LIBCHAMPLAIN
+ empathy_map_view_show ();
+#endif
+}
+
+static void
main_window_favorite_chatroom_join (EmpathyChatroom *chatroom)
{
EmpathyAccountManager *manager;
@@ -986,7 +1011,7 @@ main_window_account_created_or_deleted_cb (EmpathyAccountManager *manager,
McAccount *account,
EmpathyMainWindow *window)
{
- gtk_action_set_sensitive (window->chat_history,
+ gtk_action_set_sensitive (window->view_history,
empathy_account_manager_get_count (manager) > 0);
}
@@ -1046,7 +1071,7 @@ main_window_notify_sort_criterium_cb (EmpathyConf *conf,
g_free (str);
if (enum_value) {
- empathy_contact_list_store_set_sort_criterium (window->list_store,
+ empathy_contact_list_store_set_sort_criterium (window->list_store,
enum_value->value);
}
}
@@ -1090,6 +1115,7 @@ empathy_main_window_show (void)
GtkWidget *sw;
GtkToggleAction *show_offline_widget;
GtkWidget *ebox;
+ GtkAction *show_map_widget;
GtkToolItem *item;
gboolean show_offline;
gboolean show_avatars;
@@ -1112,8 +1138,9 @@ empathy_main_window_show (void)
"main_vbox", &window->main_vbox,
"errors_vbox", &window->errors_vbox,
"ui_manager", &window->ui_manager,
- "chat_show_offline", &show_offline_widget,
- "chat_history", &window->chat_history,
+ "view_show_offline", &show_offline_widget,
+ "view_history", &window->view_history,
+ "view_show_map", &show_map_widget,
"room_join_favorites", &window->room_join_favorites,
"presence_toolbar", &window->presence_toolbar,
"roster_scrolledwindow", &sw,
@@ -1125,12 +1152,14 @@ empathy_main_window_show (void)
"main_window", "configure_event", main_window_configure_event_cb,
"chat_quit", "activate", main_window_chat_quit_cb,
"chat_new_message", "activate", main_window_chat_new_message_cb,
- "chat_history", "activate", main_window_chat_history_cb,
+ "view_history", "activate", main_window_view_history_cb,
"room_join_new", "activate", main_window_room_join_new_cb,
"room_join_favorites", "activate", main_window_room_join_favorites_cb,
"room_manage_favorites", "activate", main_window_room_manage_favorites_cb,
"chat_add_contact", "activate", main_window_chat_add_contact_cb,
- "chat_show_offline", "toggled", main_window_chat_show_offline_cb,
+ "view_show_ft_manager", "activate", main_window_view_show_ft_manager,
+ "view_show_offline", "toggled", main_window_view_show_offline_cb,
+ "view_show_map", "activate", main_window_view_show_map_cb,
"edit", "activate", main_window_edit_cb,
"edit_accounts", "activate", main_window_edit_accounts_cb,
"edit_personal_information", "activate", main_window_edit_personal_information_cb,
@@ -1146,6 +1175,10 @@ empathy_main_window_show (void)
g_object_ref (window->ui_manager);
g_object_unref (gui);
+#if !HAVE_LIBCHAMPLAIN
+ gtk_action_set_visible (show_map_widget, FALSE);
+#endif
+
window->mc = empathy_mission_control_dup_singleton ();
window->account_manager = empathy_account_manager_dup_singleton ();
diff --git a/src/empathy-main-window.h b/src/empathy-main-window.h
index 7960c460c..562fa12c6 100644
--- a/src/empathy-main-window.h
+++ b/src/empathy-main-window.h
@@ -15,9 +15,9 @@
*
* You should have received a copy of the GNU General Public
* License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- *
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301 USA
+ *
* Authors: Xavier Claessens <xclaesse@gmail.com>
*/
diff --git a/src/empathy-main-window.ui b/src/empathy-main-window.ui
index 73b49a5db..f914979f6 100644
--- a/src/empathy-main-window.ui
+++ b/src/empathy-main-window.ui
@@ -19,10 +19,10 @@
<accelerator key="N" modifiers="GDK_CONTROL_MASK"/>
</child>
<child>
- <object class="GtkAction" id="chat_history">
+ <object class="GtkAction" id="view_history">
<property name="icon-name">document-open-recent</property>
- <property name="name">chat_history</property>
- <property name="label" translatable="yes">_View Previous Conversations</property>
+ <property name="name">view_history</property>
+ <property name="label" translatable="yes">_Previous Conversations</property>
</object>
<accelerator key="F3" modifiers=""/>
</child>
@@ -34,13 +34,26 @@
</object>
</child>
<child>
- <object class="GtkToggleAction" id="chat_show_offline">
- <property name="name">chat_show_offline</property>
- <property name="label" translatable="yes">Show _Offline Contacts</property>
+ <object class="GtkAction" id="view_show_ft_manager">
+ <property name="icon-name">document-send</property>
+ <property name="name">view_show_ft_manager</property>
+ <property name="label" translatable="yes">_File Transfers</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkToggleAction" id="view_show_offline">
+ <property name="name">view_show_offline</property>
+ <property name="label" translatable="yes">_Offline Contacts</property>
</object>
<accelerator key="H" modifiers="GDK_CONTROL_MASK"/>
</child>
<child>
+ <object class="GtkAction" id="view_show_map">
+ <property name="name">view_show_map</property>
+ <property name="label" translatable="yes">Contacts on a _Map</property>
+ </object>
+ </child>
+ <child>
<object class="GtkAction" id="chat_quit">
<property name="stock_id">gtk-quit</property>
<property name="name">chat_quit</property>
@@ -80,6 +93,12 @@
</object>
</child>
<child>
+ <object class="GtkAction" id="view">
+ <property name="name">view</property>
+ <property name="label" translatable="yes">_View</property>
+ </object>
+ </child>
+ <child>
<object class="GtkAction" id="room">
<property name="name">room</property>
<property name="label" translatable="yes">_Room</property>
@@ -137,12 +156,9 @@
<menubar name="menubar">
<menu action="chat">
<menuitem action="chat_new_message"/>
- <menuitem action="chat_history"/>
<separator/>
<menuitem action="chat_add_contact"/>
<separator/>
- <menuitem action="chat_show_offline"/>
- <separator/>
<menuitem action="chat_quit"/>
</menu>
<menu action="edit">
@@ -153,6 +169,13 @@
<separator/>
<menuitem action="edit_preferences"/>
</menu>
+ <menu action="view">
+ <menuitem action="view_show_offline"/>
+ <separator/>
+ <menuitem action="view_history"/>
+ <menuitem action="view_show_ft_manager"/>
+ <menuitem action="view_show_map"/>
+ </menu>
<menu action="room">
<menuitem action="room_join_new"/>
<menuitem action="room_join_favorites"/>
diff --git a/src/empathy-map-view.c b/src/empathy-map-view.c
new file mode 100644
index 000000000..b8a32885c
--- /dev/null
+++ b/src/empathy-map-view.c
@@ -0,0 +1,296 @@
+/*
+ * Copyright (C) 2008, 2009 Collabora Ltd.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Authors: Pierre-Luc Beaudoin <pierre-luc.beaudoin@collabora.co.uk>
+ */
+
+#include <config.h>
+
+#include <sys/stat.h>
+#include <gtk/gtk.h>
+#include <glib/gi18n.h>
+
+#include <champlain/champlain.h>
+#include <champlain-gtk/champlain-gtk.h>
+#include <clutter-gtk/gtk-clutter-embed.h>
+#include <telepathy-glib/util.h>
+
+#include <libempathy/empathy-contact.h>
+#include <libempathy/empathy-contact-manager.h>
+#include <libempathy/empathy-utils.h>
+#include <libempathy/empathy-location.h>
+
+#include <libempathy-gtk/empathy-contact-list-store.h>
+#include <libempathy-gtk/empathy-contact-list-view.h>
+#include <libempathy-gtk/empathy-presence-chooser.h>
+#include <libempathy-gtk/empathy-ui-utils.h>
+
+#include "empathy-map-view.h"
+
+#define DEBUG_FLAG EMPATHY_DEBUG_LOCATION
+#include <libempathy/empathy-debug.h>
+
+typedef struct {
+ EmpathyContactListStore *list_store;
+
+ GtkWidget *window;
+ GtkWidget *zoom_in;
+ GtkWidget *zoom_out;
+ ChamplainView *map_view;
+ ChamplainLayer *layer;
+} EmpathyMapView;
+
+static void map_view_destroy_cb (GtkWidget *widget,
+ EmpathyMapView *window);
+static gboolean map_view_contacts_foreach (GtkTreeModel *model,
+ GtkTreePath *path,
+ GtkTreeIter *iter,
+ gpointer user_data);
+static void map_view_zoom_in_cb (GtkWidget *widget,
+ EmpathyMapView *window);
+static void map_view_zoom_out_cb (GtkWidget *widget,
+ EmpathyMapView *window);
+static void map_view_contact_location_notify (GObject *gobject,
+ GParamSpec *arg1,
+ gpointer user_data);
+
+GtkWidget *
+empathy_map_view_show (void)
+{
+ static EmpathyMapView *window = NULL;
+ GtkBuilder *gui;
+ GtkWidget *sw;
+ GtkWidget *embed;
+ gchar *filename;
+ GtkTreeModel *model;
+ EmpathyContactList *list_iface;
+ EmpathyContactListStore *list_store;
+
+ if (window)
+ {
+ empathy_window_present (GTK_WINDOW (window->window), TRUE);
+ return window->window;
+ }
+
+ window = g_slice_new0 (EmpathyMapView);
+
+ /* Set up interface */
+ filename = empathy_file_lookup ("empathy-map-view.ui", "src");
+ gui = empathy_builder_get_file (filename,
+ "map_view", &window->window,
+ "zoom_in", &window->zoom_in,
+ "zoom_out", &window->zoom_out,
+ "map_scrolledwindow", &sw,
+ NULL);
+ g_free (filename);
+
+ empathy_builder_connect (gui, window,
+ "map_view", "destroy", map_view_destroy_cb,
+ "zoom_in", "clicked", map_view_zoom_in_cb,
+ "zoom_out", "clicked", map_view_zoom_out_cb,
+ NULL);
+
+ g_object_unref (gui);
+
+ /* Clear the static pointer to window if the dialog is destroyed */
+ g_object_add_weak_pointer (G_OBJECT (window->window), (gpointer *) &window);
+
+ list_iface = EMPATHY_CONTACT_LIST (empathy_contact_manager_dup_singleton ());
+ list_store = empathy_contact_list_store_new (list_iface);
+ empathy_contact_list_store_set_show_groups (list_store, FALSE);
+ empathy_contact_list_store_set_show_avatars (list_store, TRUE);
+ g_object_unref (list_iface);
+
+ window->list_store = list_store;
+
+ /* Set up map view */
+ window->map_view = CHAMPLAIN_VIEW (champlain_view_new ());
+ g_object_set (G_OBJECT (window->map_view), "zoom-level", 1,
+ "scroll-mode", CHAMPLAIN_SCROLL_MODE_KINETIC, NULL);
+ champlain_view_center_on (window->map_view, 36, 0);
+
+ embed = champlain_view_embed_new (window->map_view);
+ gtk_container_add (GTK_CONTAINER (sw),
+ GTK_WIDGET (embed));
+ gtk_widget_show_all (embed);
+
+ window->layer = g_object_ref (champlain_layer_new ());
+ champlain_view_add_layer (window->map_view, window->layer);
+
+ /* Set up contact list. */
+ model = GTK_TREE_MODEL (window->list_store);
+ gtk_tree_model_foreach (model, map_view_contacts_foreach, window);
+
+ empathy_window_present (GTK_WINDOW (window->window), TRUE);
+ return window->window;
+}
+
+static void
+map_view_destroy_cb (GtkWidget *widget,
+ EmpathyMapView *window)
+{
+ GList *item;
+
+ item = clutter_container_get_children (window->layer);
+ while (item != NULL)
+ {
+ EmpathyContact *contact;
+ ChamplainMarker *marker;
+
+ marker = CHAMPLAIN_MARKER (item->data);
+ contact = g_object_get_data (G_OBJECT (marker), "contact");
+ g_signal_handlers_disconnect_by_func (contact, map_view_contact_location_notify, marker);
+
+ item = g_list_next (item);
+ }
+
+ g_object_unref (window->list_store);
+ g_object_unref (window->layer);
+ g_slice_free (EmpathyMapView, window);
+}
+
+static void
+map_view_marker_update_position (ChamplainMarker *marker,
+ EmpathyContact *contact)
+{
+ gdouble lon, lat;
+ GValue *value;
+ GHashTable *location;
+
+ location = empathy_contact_get_location (contact);
+
+ if (location == NULL ||
+ g_hash_table_size (location) == 0)
+ {
+ clutter_actor_hide (CLUTTER_ACTOR (marker));
+ return;
+ }
+
+ value = g_hash_table_lookup (location, EMPATHY_LOCATION_LAT);
+ if (value == NULL)
+ {
+ clutter_actor_hide (CLUTTER_ACTOR (marker));
+ return;
+ }
+ lat = g_value_get_double (value);
+
+ value = g_hash_table_lookup (location, EMPATHY_LOCATION_LON);
+ if (value == NULL)
+ {
+ clutter_actor_hide (CLUTTER_ACTOR (marker));
+ return;
+ }
+ lon = g_value_get_double (value);
+
+ clutter_actor_show (CLUTTER_ACTOR (marker));
+ champlain_base_marker_set_position (CHAMPLAIN_BASE_MARKER (marker), lat, lon);
+}
+
+static void
+map_view_contact_location_notify (GObject *gobject,
+ GParamSpec *arg1,
+ gpointer user_data)
+{
+ ChamplainMarker *marker = CHAMPLAIN_MARKER (user_data);
+ EmpathyContact *contact = EMPATHY_CONTACT (gobject);
+ map_view_marker_update_position (marker, contact);
+}
+
+static gboolean
+map_view_contacts_foreach (GtkTreeModel *model,
+ GtkTreePath *path,
+ GtkTreeIter *iter,
+ gpointer user_data)
+{
+ EmpathyMapView *window = (EmpathyMapView*) user_data;
+ EmpathyContact *contact;
+ ClutterActor *marker;
+ ClutterActor *texture;
+ GHashTable *location;
+ GdkPixbuf *avatar;
+ const gchar *name;
+ gchar *date;
+ gchar *label;
+ GValue *gtime;
+ time_t time;
+
+ gtk_tree_model_get (model, iter, EMPATHY_CONTACT_LIST_STORE_COL_CONTACT,
+ &contact, -1);
+
+ if (contact == NULL)
+ return FALSE;
+
+ location = empathy_contact_get_location (contact);
+
+ if (location == NULL)
+ return FALSE;
+
+ marker = champlain_marker_new ();
+
+ avatar = empathy_pixbuf_avatar_from_contact_scaled (contact, 32, 32);
+ if (avatar != NULL)
+ {
+ texture = clutter_texture_new ();
+ gtk_clutter_texture_set_from_pixbuf (CLUTTER_TEXTURE (texture), avatar);
+ champlain_marker_set_image (CHAMPLAIN_MARKER (marker), texture);
+ g_object_unref (avatar);
+ }
+ else
+ champlain_marker_set_image (CHAMPLAIN_MARKER (marker), NULL);
+
+ name = empathy_contact_get_name (contact);
+ gtime = g_hash_table_lookup (location, EMPATHY_LOCATION_TIMESTAMP);
+ if (gtime != NULL)
+ {
+ time = g_value_get_int64 (gtime);
+ date = empathy_time_to_string_relative (time);
+ label = g_strconcat ("<b>", name, "</b>\n<small>", date, "</small>", NULL);
+ g_free (date);
+ }
+ else
+ {
+ label = g_strconcat ("<b>", name, "</b>\n", NULL);
+ }
+ champlain_marker_set_use_markup (CHAMPLAIN_MARKER (marker), TRUE);
+ champlain_marker_set_text (CHAMPLAIN_MARKER (marker), label);
+ g_free (label);
+
+ clutter_container_add (CLUTTER_CONTAINER (window->layer), marker, NULL);
+
+ g_signal_connect (contact, "notify::location",
+ G_CALLBACK (map_view_contact_location_notify), marker);
+ g_object_set_data_full (G_OBJECT (marker), "contact", g_object_ref (contact), g_object_unref);
+
+ map_view_marker_update_position (CHAMPLAIN_MARKER (marker), contact);
+
+ g_object_unref (contact);
+ return FALSE;
+}
+
+static void
+map_view_zoom_in_cb (GtkWidget *widget,
+ EmpathyMapView *window)
+{
+ champlain_view_zoom_in (window->map_view);
+}
+
+static void
+map_view_zoom_out_cb (GtkWidget *widget,
+ EmpathyMapView *window)
+{
+ champlain_view_zoom_out (window->map_view);
+}
diff --git a/src/empathy-map-view.h b/src/empathy-map-view.h
new file mode 100644
index 000000000..80a05a129
--- /dev/null
+++ b/src/empathy-map-view.h
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2008 Collabora Ltd.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Authors: Pierre-Luc Beaudoin <pierre-luc@pierlux.com>
+ */
+
+#ifndef __EMPATHY_MAP_VIEW_H__
+#define __EMPATHY_MAP_VIEW_H__
+
+#include <gtk/gtkwidget.h>
+
+G_BEGIN_DECLS
+
+GtkWidget *empathy_map_view_show (void);
+
+G_END_DECLS
+
+#endif /* __EMPATHY_MAP_VIEW_H__ */
diff --git a/src/empathy-map-view.ui b/src/empathy-map-view.ui
new file mode 100644
index 000000000..f1140399b
--- /dev/null
+++ b/src/empathy-map-view.ui
@@ -0,0 +1,59 @@
+<?xml version="1.0"?>
+<interface>
+ <requires lib="gtk+" version="2.16"/>
+ <!-- interface-naming-policy toplevel-contextual -->
+ <object class="GtkWindow" id="map_view">
+ <property name="title" translatable="yes">Contact Map View</property>
+ <property name="role">map_view</property>
+ <property name="window_position">center</property>
+ <property name="default_width">512</property>
+ <property name="default_height">384</property>
+ <child>
+ <object class="GtkVBox" id="main_vbox">
+ <property name="visible">True</property>
+ <child>
+ <object class="GtkToolbar" id="toolbar">
+ <property name="visible">True</property>
+ <child>
+ <object class="GtkToolButton" id="zoom_in">
+ <property name="visible">True</property>
+ <property name="stock_id">gtk-zoom-in</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="zoom_out">
+ <property name="visible">True</property>
+ <property name="stock_id">gtk-zoom-out</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkViewport" id="map_scrolledwindow">
+ <property name="visible">True</property>
+ <property name="resize_mode">queue</property>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+</interface>
diff --git a/src/empathy-misc.c b/src/empathy-misc.c
index 0a943bb6d..a1a084740 100644
--- a/src/empathy-misc.c
+++ b/src/empathy-misc.c
@@ -14,9 +14,9 @@
*
* You should have received a copy of the GNU General Public
* License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- *
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301 USA
+ *
* Author: Cosimo Cecchi <cosimo.cecchi@collabora.co.uk>
*
*/
diff --git a/src/empathy-misc.h b/src/empathy-misc.h
index aaa743ca6..b3fe8fdbf 100644
--- a/src/empathy-misc.h
+++ b/src/empathy-misc.h
@@ -14,9 +14,9 @@
*
* You should have received a copy of the GNU General Public
* License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- *
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301 USA
+ *
* Author: Cosimo Cecchi <cosimo.cecchi@collabora.co.uk>
*
*/
diff --git a/src/empathy-new-chatroom-dialog.c b/src/empathy-new-chatroom-dialog.c
index 837d9acfe..563665932 100644
--- a/src/empathy-new-chatroom-dialog.c
+++ b/src/empathy-new-chatroom-dialog.c
@@ -15,9 +15,9 @@
*
* You should have received a copy of the GNU General Public
* License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- *
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301 USA
+ *
* Authors: Martyn Russell <martyn@imendio.com>
* Xavier Claessens <xclaesse@gmail.com>
*/
@@ -30,6 +30,7 @@
#include <gtk/gtk.h>
#include <glib.h>
#include <glib/gi18n.h>
+#include <glib/gprintf.h>
#include <libmissioncontrol/mission-control.h>
#include <libmissioncontrol/mc-account.h>
@@ -66,7 +67,8 @@ typedef struct {
GtkWidget *treeview;
GtkTreeModel *model;
GtkWidget *button_join;
- GtkWidget *button_close;
+ GtkWidget *label_error_message;
+ GtkWidget *viewport_error;
} EmpathyNewChatroomDialog;
enum {
@@ -75,6 +77,7 @@ enum {
COL_NAME,
COL_ROOM,
COL_MEMBERS,
+ COL_MEMBERS_INT,
COL_TOOLTIP,
COL_COUNT
};
@@ -97,6 +100,12 @@ static void new_chatroom_dialog_new_room_cb (EmpathyTpRo
static void new_chatroom_dialog_listing_cb (EmpathyTpRoomlist *room_list,
gpointer unused,
EmpathyNewChatroomDialog *dialog);
+static void start_listing_error_cb (EmpathyTpRoomlist *room_list,
+ GError *error,
+ EmpathyNewChatroomDialog *dialog);
+static void stop_listing_error_cb (EmpathyTpRoomlist *room_list,
+ GError *error,
+ EmpathyNewChatroomDialog *dialog);
static void new_chatroom_dialog_model_clear (EmpathyNewChatroomDialog *dialog);
static void new_chatroom_dialog_model_row_activated_cb (GtkTreeView *tree_view,
GtkTreePath *path,
@@ -116,6 +125,8 @@ static void new_chatroom_dialog_expander_browse_activate_cb (GtkWidget
static gboolean new_chatroom_dialog_entry_server_focus_out_cb (GtkWidget *widget,
GdkEventFocus *event,
EmpathyNewChatroomDialog *dialog);
+static void new_chatroom_dialog_button_close_error_clicked_cb (GtkButton *button,
+ EmpathyNewChatroomDialog *dialog);
static EmpathyNewChatroomDialog *dialog_p = NULL;
@@ -146,6 +157,8 @@ empathy_new_chatroom_dialog_show (GtkWindow *parent)
"treeview", &dialog->treeview,
"button_join", &dialog->button_join,
"expander_browse", &dialog->expander_browse,
+ "label_error_message", &dialog->label_error_message,
+ "viewport_error", &dialog->viewport_error,
NULL);
g_free (filename);
@@ -157,6 +170,7 @@ empathy_new_chatroom_dialog_show (GtkWindow *parent)
"entry_server", "focus-out-event", new_chatroom_dialog_entry_server_focus_out_cb,
"entry_room", "changed", new_chatroom_dialog_entry_changed_cb,
"expander_browse", "activate", new_chatroom_dialog_expander_browse_activate_cb,
+ "button_close_error", "clicked", new_chatroom_dialog_button_close_error_clicked_cb,
NULL);
g_object_unref (gui);
@@ -227,7 +241,7 @@ new_chatroom_dialog_destroy_cb (GtkWidget *widget,
if (dialog->room_list) {
g_object_unref (dialog->room_list);
}
- g_object_unref (dialog->model);
+ g_object_unref (dialog->model);
g_free (dialog);
}
@@ -253,6 +267,7 @@ new_chatroom_dialog_model_setup (EmpathyNewChatroomDialog *dialog)
G_TYPE_STRING, /* Name */
G_TYPE_STRING, /* Room */
G_TYPE_STRING, /* Member count */
+ G_TYPE_INT, /* Member count int */
G_TYPE_STRING); /* Tool tip */
dialog->model = GTK_TREE_MODEL (store);
@@ -295,12 +310,16 @@ new_chatroom_dialog_model_add_columns (EmpathyNewChatroomDialog *dialog)
cell,
"stock-id", COL_INVITE_ONLY,
NULL);
+
+ gtk_tree_view_column_set_sort_column_id (column, COL_INVITE_ONLY);
gtk_tree_view_append_column (view, column);
column = gtk_tree_view_column_new_with_attributes (NULL,
cell,
"stock-id", COL_NEED_PASSWORD,
NULL);
+
+ gtk_tree_view_column_set_sort_column_id (column, COL_NEED_PASSWORD);
gtk_tree_view_append_column (view, column);
cell = gtk_cell_renderer_text_new ();
@@ -315,6 +334,7 @@ new_chatroom_dialog_model_add_columns (EmpathyNewChatroomDialog *dialog)
"text", COL_NAME,
NULL);
+ gtk_tree_view_column_set_sort_column_id (column, COL_NAME);
gtk_tree_view_column_set_expand (column, TRUE);
gtk_tree_view_append_column (view, column);
@@ -329,6 +349,8 @@ new_chatroom_dialog_model_add_columns (EmpathyNewChatroomDialog *dialog)
cell,
"text", COL_MEMBERS,
NULL);
+
+ gtk_tree_view_column_set_sort_column_id (column, COL_MEMBERS_INT);
gtk_tree_view_append_column (view, column);
}
@@ -379,6 +401,7 @@ new_chatroom_dialog_account_changed_cb (GtkComboBox *combobox,
EmpathyAccountChooser *account_chooser;
McAccount *account;
gboolean listing = FALSE;
+ gboolean expanded = FALSE;
if (dialog->room_list) {
g_object_unref (dialog->room_list);
@@ -401,6 +424,19 @@ new_chatroom_dialog_account_changed_cb (GtkComboBox *combobox,
g_signal_connect (dialog->room_list, "notify::is-listing",
G_CALLBACK (new_chatroom_dialog_listing_cb),
dialog);
+ g_signal_connect (dialog->room_list, "error::start",
+ G_CALLBACK (start_listing_error_cb),
+ dialog);
+ g_signal_connect (dialog->room_list, "error::stop",
+ G_CALLBACK (stop_listing_error_cb),
+ dialog);
+
+ expanded = gtk_expander_get_expanded (GTK_EXPANDER (dialog->expander_browse));
+ if (expanded) {
+ gtk_widget_hide (dialog->viewport_error);
+ gtk_widget_set_sensitive (dialog->treeview, TRUE);
+ new_chatroom_dialog_browse_start (dialog);
+ }
listing = empathy_tp_roomlist_is_listing (dialog->room_list);
if (listing) {
@@ -414,6 +450,13 @@ new_chatroom_dialog_account_changed_cb (GtkComboBox *combobox,
}
static void
+new_chatroom_dialog_button_close_error_clicked_cb (GtkButton *button,
+ EmpathyNewChatroomDialog *dialog)
+{
+ gtk_widget_hide (dialog->viewport_error);
+}
+
+static void
new_chatroom_dialog_roomlist_destroy_cb (EmpathyTpRoomlist *room_list,
EmpathyNewChatroomDialog *dialog)
{
@@ -463,6 +506,7 @@ new_chatroom_dialog_new_room_cb (EmpathyTpRoomlist *room_list,
COL_NAME, empathy_chatroom_get_name (chatroom),
COL_ROOM, empathy_chatroom_get_room (chatroom),
COL_MEMBERS, members,
+ COL_MEMBERS_INT, empathy_chatroom_get_members_count (chatroom),
COL_TOOLTIP, tooltip,
-1);
@@ -471,6 +515,26 @@ new_chatroom_dialog_new_room_cb (EmpathyTpRoomlist *room_list,
}
static void
+start_listing_error_cb (EmpathyTpRoomlist *room_list,
+ GError *error,
+ EmpathyNewChatroomDialog *dialog)
+{
+ gtk_label_set_text (GTK_LABEL (dialog->label_error_message), _("Could not start room listing"));
+ gtk_widget_show_all (dialog->viewport_error);
+ gtk_widget_set_sensitive (dialog->treeview, FALSE);
+}
+
+static void
+stop_listing_error_cb (EmpathyTpRoomlist *room_list,
+ GError *error,
+ EmpathyNewChatroomDialog *dialog)
+{
+ gtk_label_set_text (GTK_LABEL (dialog->label_error_message), _("Could not stop room listing"));
+ gtk_widget_show_all (dialog->viewport_error);
+ gtk_widget_set_sensitive (dialog->treeview, FALSE);
+}
+
+static void
new_chatroom_dialog_listing_cb (EmpathyTpRoomlist *room_list,
gpointer unused,
EmpathyNewChatroomDialog *dialog)
@@ -606,6 +670,8 @@ new_chatroom_dialog_expander_browse_activate_cb (GtkWidget *widget
new_chatroom_dialog_browse_stop (dialog);
gtk_window_set_resizable (GTK_WINDOW (dialog->window), FALSE);
} else {
+ gtk_widget_hide (dialog->viewport_error);
+ gtk_widget_set_sensitive (dialog->treeview, TRUE);
new_chatroom_dialog_browse_start (dialog);
gtk_window_set_resizable (GTK_WINDOW (dialog->window), TRUE);
}
diff --git a/src/empathy-new-chatroom-dialog.h b/src/empathy-new-chatroom-dialog.h
index ae8b2385e..b1cef0daa 100644
--- a/src/empathy-new-chatroom-dialog.h
+++ b/src/empathy-new-chatroom-dialog.h
@@ -15,9 +15,9 @@
*
* You should have received a copy of the GNU General Public
* License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- *
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301 USA
+ *
* Authors: Martyn Russell <martyn@imendio.com>
* Xavier Claessens <xclaesse@gmail.com>
*/
diff --git a/src/empathy-new-chatroom-dialog.ui b/src/empathy-new-chatroom-dialog.ui
index ba7a326ef..a8fccf4a0 100644
--- a/src/empathy-new-chatroom-dialog.ui
+++ b/src/empathy-new-chatroom-dialog.ui
@@ -1,13 +1,14 @@
<?xml version="1.0"?>
-<!--*- mode: xml -*-->
<interface>
+ <requires lib="gtk+" version="2.16"/>
+ <!-- interface-naming-policy toplevel-contextual -->
<object class="GtkDialog" id="new_chatroom_dialog">
<property name="visible">True</property>
<property name="border_width">5</property>
<property name="title" translatable="yes">Join Room</property>
<property name="role">join_new_chatroom</property>
<property name="default_width">350</property>
- <property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property>
+ <property name="type_hint">dialog</property>
<property name="has_separator">False</property>
<child internal-child="vbox">
<object class="GtkVBox" id="dialog-vbox4">
@@ -25,16 +26,10 @@
<property name="column_spacing">5</property>
<property name="row_spacing">5</property>
<child>
- <placeholder/>
- </child>
- <child>
- <placeholder/>
- </child>
- <child>
<object class="GtkEntry" id="entry_room">
<property name="visible">True</property>
<property name="can_focus">True</property>
- <property name="tooltip-text" translatable="yes">Enter the room name to join here or click on one or more rooms in the list.</property>
+ <property name="tooltip_text" translatable="yes">Enter the room name to join here or click on one or more rooms in the list.</property>
<property name="activates_default">True</property>
<property name="width_chars">25</property>
</object>
@@ -64,7 +59,7 @@
<object class="GtkEntry" id="entry_server">
<property name="visible">True</property>
<property name="can_focus">True</property>
- <property name="tooltip-text" translatable="yes">Enter the server which hosts the room, or leave it empty if the room is on the current account's server</property>
+ <property name="tooltip_text" translatable="yes">Enter the server which hosts the room, or leave it empty if the room is on the current account's server</property>
<property name="width_chars">25</property>
</object>
<packing>
@@ -73,7 +68,7 @@
<property name="top_attach">1</property>
<property name="bottom_attach">2</property>
<property name="x_options">GTK_FILL</property>
- <property name="y_options"/>
+ <property name="y_options"></property>
</packing>
</child>
<child>
@@ -88,7 +83,7 @@
<property name="top_attach">1</property>
<property name="bottom_attach">2</property>
<property name="x_options">GTK_FILL</property>
- <property name="y_options"/>
+ <property name="y_options"></property>
</packing>
</child>
<child>
@@ -99,13 +94,20 @@
</object>
<packing>
<property name="x_options">GTK_FILL</property>
- <property name="y_options"/>
+ <property name="y_options"></property>
</packing>
</child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
+ <property name="position">0</property>
</packing>
</child>
<child>
@@ -113,21 +115,90 @@
<property name="visible">True</property>
<property name="can_focus">True</property>
<child>
- <object class="GtkScrolledWindow" id="scrolledwindow2">
- <property name="width_request">350</property>
- <property name="height_request">150</property>
+ <object class="GtkVBox" id="vbox1">
<property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="hscrollbar_policy">GTK_POLICY_NEVER</property>
- <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
- <property name="shadow_type">GTK_SHADOW_IN</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">2</property>
+ <child>
+ <object class="GtkViewport" id="viewport_error">
+ <property name="resize_mode">queue</property>
+ <child>
+ <object class="GtkHBox" id="hbox1">
+ <property name="visible">True</property>
+ <child>
+ <object class="GtkImage" id="image1">
+ <property name="visible">True</property>
+ <property name="stock">gtk-dialog-error</property>
+ <property name="icon-size">1</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label_error_message">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="xpad">10</property>
+ <property name="label" translatable="yes">Couldn't load room list</property>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="button_close_error">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="relief">none</property>
+ <child>
+ <object class="GtkImage" id="image2">
+ <property name="visible">True</property>
+ <property name="stock">gtk-close</property>
+ <property name="icon-size">1</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
<child>
- <object class="GtkTreeView" id="treeview">
+ <object class="GtkScrolledWindow" id="scrolledwindow2">
+ <property name="width_request">350</property>
+ <property name="height_request">150</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
- <property name="search_column">0</property>
- <property name="show_expanders">False</property>
+ <property name="hscrollbar_policy">never</property>
+ <property name="vscrollbar_policy">automatic</property>
+ <property name="shadow_type">in</property>
+ <child>
+ <object class="GtkTreeView" id="treeview">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="search_column">0</property>
+ <property name="show_expanders">False</property>
+ </object>
+ </child>
</object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
</child>
</object>
</child>
@@ -150,15 +221,21 @@
<child internal-child="action_area">
<object class="GtkHButtonBox" id="dialog-action_area4">
<property name="visible">True</property>
- <property name="layout_style">GTK_BUTTONBOX_END</property>
+ <property name="layout_style">end</property>
<child>
<object class="GtkButton" id="button_cancel">
+ <property name="label">gtk-cancel</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="can_default">True</property>
- <property name="label">gtk-cancel</property>
+ <property name="receives_default">False</property>
<property name="use_stock">True</property>
</object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
</child>
<child>
<object class="GtkButton" id="button_join">
@@ -167,6 +244,7 @@
<property name="can_focus">True</property>
<property name="can_default">True</property>
<property name="has_default">True</property>
+ <property name="receives_default">False</property>
<child>
<object class="GtkAlignment" id="alignment4">
<property name="visible">True</property>
@@ -184,6 +262,7 @@
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
+ <property name="position">0</property>
</packing>
</child>
<child>
@@ -204,13 +283,16 @@
</child>
</object>
<packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
- <property name="pack_type">GTK_PACK_END</property>
+ <property name="pack_type">end</property>
+ <property name="position">0</property>
</packing>
</child>
</object>
diff --git a/src/empathy-preferences.c b/src/empathy-preferences.c
index b2388f88d..406db4c9f 100644
--- a/src/empathy-preferences.c
+++ b/src/empathy-preferences.c
@@ -14,8 +14,8 @@
*
* You should have received a copy of the GNU General Public
* License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301 USA
*
* Authors: Mikael Hallendal <micke@imendio.com>
* Richard Hult <richard@imendio.com>
@@ -64,6 +64,12 @@ typedef struct {
GtkWidget *treeview_spell_checker;
+ GtkWidget *checkbutton_location_publish;
+ GtkWidget *checkbutton_location_reduce_accuracy;
+ GtkWidget *checkbutton_location_resource_network;
+ GtkWidget *checkbutton_location_resource_cell;
+ GtkWidget *checkbutton_location_resource_gps;
+
GList *notify_ids;
} EmpathyPreferences;
@@ -247,6 +253,38 @@ preferences_setup_widgets (EmpathyPreferences *preferences)
EMPATHY_PREFS_AUTOCONNECT,
preferences->checkbutton_autoconnect);
+ preferences_hookup_toggle_button (preferences,
+ EMPATHY_PREFS_LOCATION_PUBLISH,
+ preferences->checkbutton_location_publish);
+
+ preferences_hookup_toggle_button (preferences,
+ EMPATHY_PREFS_LOCATION_RESOURCE_NETWORK,
+ preferences->checkbutton_location_resource_network);
+ preferences_hookup_sensitivity (preferences,
+ EMPATHY_PREFS_LOCATION_PUBLISH,
+ preferences->checkbutton_location_resource_network);
+
+ preferences_hookup_toggle_button (preferences,
+ EMPATHY_PREFS_LOCATION_RESOURCE_CELL,
+ preferences->checkbutton_location_resource_cell);
+ preferences_hookup_sensitivity (preferences,
+ EMPATHY_PREFS_LOCATION_PUBLISH,
+ preferences->checkbutton_location_resource_cell);
+
+ preferences_hookup_toggle_button (preferences,
+ EMPATHY_PREFS_LOCATION_RESOURCE_GPS,
+ preferences->checkbutton_location_resource_gps);
+ preferences_hookup_sensitivity (preferences,
+ EMPATHY_PREFS_LOCATION_PUBLISH,
+ preferences->checkbutton_location_resource_gps);
+
+ preferences_hookup_toggle_button (preferences,
+ EMPATHY_PREFS_LOCATION_REDUCE_ACCURACY,
+ preferences->checkbutton_location_reduce_accuracy);
+ preferences_hookup_sensitivity (preferences,
+ EMPATHY_PREFS_LOCATION_PUBLISH,
+ preferences->checkbutton_location_reduce_accuracy);
+
id = empathy_conf_notify_add (empathy_conf_get (),
EMPATHY_PREFS_UI_COMPACT_CONTACT_LIST,
preferences_compact_contact_list_changed_cb,
@@ -422,7 +460,7 @@ preferences_languages_add (EmpathyPreferences *preferences)
codes = empathy_spell_get_language_codes ();
- empathy_conf_set_bool (empathy_conf_get(),
+ empathy_conf_set_bool (empathy_conf_get (),
EMPATHY_PREFS_CHAT_SPELL_CHECKER_ENABLED,
codes != NULL);
if (!codes) {
@@ -668,7 +706,7 @@ preferences_widget_sync_string (const gchar *key, GtkWidget *widget)
enum_class = G_ENUM_CLASS (g_type_class_peek (type));
enum_value = g_enum_get_value_by_nick (enum_class, value);
- if (enum_value) {
+ if (enum_value) {
list = gtk_radio_button_get_group (GTK_RADIO_BUTTON (widget));
toggle_widget = g_slist_nth_data (list, enum_value->value);
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (toggle_widget), TRUE);
@@ -1003,12 +1041,14 @@ preferences_radio_button_toggled_cb (GtkWidget *button,
enum_value = g_enum_get_value (enum_class, g_slist_index (group, button));
if (!enum_value) {
- g_warning ("No GEnumValue for EmpathyContactListSort with GtkRadioButton index:%d",
+ g_warning ("No GEnumValue for EmpathyContactListSort with GtkRadioButton index:%d",
g_slist_index (group, button));
return;
}
value = enum_value->value_nick;
+ } else if (key && strcmp (key, EMPATHY_PREFS_CONTACTS_SORT_CRITERIUM) == 0) {
+ return;
}
empathy_conf_set_string (empathy_conf_get (), key, value);
@@ -1067,6 +1107,7 @@ empathy_preferences_show (GtkWindow *parent)
static EmpathyPreferences *preferences;
GtkBuilder *gui;
gchar *filename;
+ GtkWidget *page;
if (preferences) {
gtk_window_present (GTK_WINDOW (preferences->dialog));
@@ -1094,6 +1135,11 @@ empathy_preferences_show (GtkWindow *parent)
"checkbutton_sounds_disabled_away", &preferences->checkbutton_sounds_disabled_away,
"treeview_sounds", &preferences->treeview_sounds,
"treeview_spell_checker", &preferences->treeview_spell_checker,
+ "checkbutton_location_publish", &preferences->checkbutton_location_publish,
+ "checkbutton_location_reduce_accuracy", &preferences->checkbutton_location_reduce_accuracy,
+ "checkbutton_location_resource_network", &preferences->checkbutton_location_resource_network,
+ "checkbutton_location_resource_cell", &preferences->checkbutton_location_resource_cell,
+ "checkbutton_location_resource_gps", &preferences->checkbutton_location_resource_gps,
NULL);
g_free (filename);
@@ -1124,6 +1170,14 @@ empathy_preferences_show (GtkWindow *parent)
gtk_widget_show (page);
}
+ page = gtk_notebook_get_nth_page (GTK_NOTEBOOK (preferences->notebook), 3);
+#if HAVE_GEOCLUE
+ gtk_widget_show (page);
+#else
+ gtk_widget_hide (page);
+#endif
+
+
if (parent) {
gtk_window_set_transient_for (GTK_WINDOW (preferences->dialog),
GTK_WINDOW (parent));
diff --git a/src/empathy-preferences.h b/src/empathy-preferences.h
index 07ae6b523..6cc86d1d6 100644
--- a/src/empathy-preferences.h
+++ b/src/empathy-preferences.h
@@ -14,8 +14,8 @@
*
* You should have received a copy of the GNU General Public
* License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301 USA
*
* Authors: Mikael Hallendal <micke@imendio.com>
* Richard Hult <richard@imendio.com>
diff --git a/src/empathy-preferences.ui b/src/empathy-preferences.ui
index c20d271e2..d92fc8f88 100644
--- a/src/empathy-preferences.ui
+++ b/src/empathy-preferences.ui
@@ -308,7 +308,7 @@
<property name="label" translatable="yes">Notifications</property>
</object>
<packing>
- <property name="position">4</property>
+ <property name="position">1</property>
<property name="tab_fill">False</property>
</packing>
</child>
@@ -424,6 +424,202 @@
</packing>
</child>
<child>
+ <object class="GtkVBox" id="vbox1">
+ <property name="visible">True</property>
+ <property name="border_width">12</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">18</property>
+ <child>
+ <object class="GtkCheckButton" id="checkbutton_location_publish">
+ <property name="label" translatable="yes">_Publish location to my contacts</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="frame1">
+ <property name="visible">True</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkAlignment" id="alignment2">
+ <property name="visible">True</property>
+ <property name="top_padding">6</property>
+ <property name="left_padding">12</property>
+ <child>
+ <object class="GtkVBox" id="vbox4">
+ <property name="visible">True</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">6</property>
+ <child>
+ <object class="GtkHBox" id="hbox1">
+ <property name="visible">True</property>
+ <property name="spacing">6</property>
+ <child>
+ <object class="GtkImage" id="image1">
+ <property name="visible">True</property>
+ <property name="yalign">0</property>
+ <property name="stock">gtk-dialog-info</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label6">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">&lt;small&gt;Reduced location accuracy means that nothing more precise than your city, state and country will be published. GPS coordinates will have a random value added (&#xB1;0.25&#xB0;).&lt;/small&gt;</property>
+ <property name="use_markup">True</property>
+ <property name="wrap">True</property>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="checkbutton_location_reduce_accuracy">
+ <property name="label" translatable="yes">_Reduce location accuracy</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="active">True</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label3">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">&lt;b&gt;Privacy&lt;/b&gt;</property>
+ <property name="use_markup">True</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="frame5">
+ <property name="visible">True</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkAlignment" id="alignment4">
+ <property name="visible">True</property>
+ <property name="top_padding">6</property>
+ <property name="left_padding">12</property>
+ <child>
+ <object class="GtkVBox" id="vbox5">
+ <property name="visible">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkCheckButton" id="checkbutton_location_resource_gps">
+ <property name="label" translatable="yes">Allow _GPS usage</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="checkbutton_location_resource_cell">
+ <property name="label" translatable="yes">Allow _cellphone usage</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="active">True</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="checkbutton_location_resource_network">
+ <property name="label" translatable="yes">Allow _network usage</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="active">True</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label5">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">&lt;b&gt;Geoclue Settings&lt;/b&gt;</property>
+ <property name="use_markup">True</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child type="tab">
+ <object class="GtkLabel" id="label2">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Location</property>
+ </object>
+ <packing>
+ <property name="position">3</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
<object class="GtkVBox" id="vbox168">
<property name="visible">True</property>
<property name="border_width">12</property>
@@ -532,7 +728,7 @@
</child>
</object>
<packing>
- <property name="position">3</property>
+ <property name="position">4</property>
</packing>
</child>
<child type="tab">
@@ -541,7 +737,7 @@
<property name="label" translatable="yes">Spell Checking</property>
</object>
<packing>
- <property name="position">3</property>
+ <property name="position">4</property>
<property name="tab_fill">False</property>
</packing>
</child>
@@ -616,7 +812,7 @@
</child>
</object>
<packing>
- <property name="position">4</property>
+ <property name="position">5</property>
</packing>
</child>
<child type="tab">
@@ -625,7 +821,7 @@
<property name="label" translatable="yes">Themes</property>
</object>
<packing>
- <property name="position">4</property>
+ <property name="position">5</property>
<property name="tab_fill">False</property>
</packing>
</child>
diff --git a/src/empathy-sidebar.c b/src/empathy-sidebar.c
index a66abc757..caca6b5e3 100644
--- a/src/empathy-sidebar.c
+++ b/src/empathy-sidebar.c
@@ -3,7 +3,7 @@
* Copyright (C) 2007 The Free Software Foundation
* Copyright (C) 2008 Marco Barisione <marco@barisione.org>
*
- * Based on evince code (shell/ev-sidebar.c) by:
+ * Based on evince code (shell/ev-sidebar.c) by:
* - Jonathan Blandford <jrb@alum.mit.edu>
*
* Base on eog code (src/eog-sidebar.c) by:
@@ -21,7 +21,7 @@
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
#ifdef HAVE_CONFIG_H
@@ -102,7 +102,7 @@ empathy_sidebar_select_page (EmpathySidebar *sidebar,
gint index;
gtk_tree_model_get (sidebar->priv->page_model, iter,
- PAGE_COLUMN_TITLE, &title,
+ PAGE_COLUMN_TITLE, &title,
PAGE_COLUMN_NOTEBOOK_INDEX, &index,
-1);
@@ -397,7 +397,7 @@ empathy_sidebar_init (EmpathySidebar *sidebar)
gtk_widget_show (hbox);
sidebar->priv->select_button = gtk_toggle_button_new ();
- gtk_button_set_relief (GTK_BUTTON (sidebar->priv->select_button),
+ gtk_button_set_relief (GTK_BUTTON (sidebar->priv->select_button),
GTK_RELIEF_NONE);
g_signal_connect (sidebar->priv->select_button, "button_press_event",
@@ -514,7 +514,7 @@ empathy_sidebar_add_page (EmpathySidebar *sidebar,
-1);
gtk_list_store_move_before (GTK_LIST_STORE(sidebar->priv->page_model),
- &iter,
+ &iter,
NULL);
/* Set the first item added as active */
@@ -571,15 +571,15 @@ empathy_sidebar_remove_page (EmpathySidebar *sidebar,
if (valid)
{
- gtk_notebook_remove_page (GTK_NOTEBOOK (sidebar->priv->notebook),
+ gtk_notebook_remove_page (GTK_NOTEBOOK (sidebar->priv->notebook),
index);
gtk_container_remove (GTK_CONTAINER (sidebar->priv->menu), menu_item);
- gtk_list_store_remove (GTK_LIST_STORE (sidebar->priv->page_model),
+ gtk_list_store_remove (GTK_LIST_STORE (sidebar->priv->page_model),
&iter);
- g_signal_emit (G_OBJECT (sidebar),
+ g_signal_emit (G_OBJECT (sidebar),
signals[SIGNAL_PAGE_REMOVED], 0, main_widget);
}
}
diff --git a/src/empathy-sidebar.h b/src/empathy-sidebar.h
index 6e88e789d..095336fac 100644
--- a/src/empathy-sidebar.h
+++ b/src/empathy-sidebar.h
@@ -3,7 +3,7 @@
* Copyright (C) 2007 The Free Software Foundation
* Copyright (C) 2008 Marco Barisione <marco@barisione.org>
*
- * Based on evince code (shell/ev-sidebar.h) by:
+ * Based on evince code (shell/ev-sidebar.h) by:
* - Jonathan Blandford <jrb@alum.mit.edu>
*
* Base on eog code (src/eog-sidebar.c) by:
@@ -21,7 +21,7 @@
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
#ifndef __EMPATHY_SIDEBAR_H__
@@ -53,10 +53,10 @@ struct _EmpathySidebarClass
{
GtkVBoxClass base_class;
- void (* page_added) (EmpathySidebar *sidebar,
+ void (* page_added) (EmpathySidebar *sidebar,
GtkWidget *main_widget);
- void (* page_removed) (EmpathySidebar *sidebar,
+ void (* page_removed) (EmpathySidebar *sidebar,
GtkWidget *main_widget);
};
diff --git a/src/empathy-status-icon.c b/src/empathy-status-icon.c
index 1824be5e6..9c2194880 100644
--- a/src/empathy-status-icon.c
+++ b/src/empathy-status-icon.c
@@ -15,7 +15,7 @@
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- *
+ *
* Authors: Xavier Claessens <xclaesse@gmail.com>
*/
@@ -195,13 +195,14 @@ status_icon_update_icon (EmpathyStatusIcon *icon)
if (priv->event && priv->showing_event_icon) {
icon_name = priv->event->icon_name;
} else {
- McPresence state;
+ TpConnectionPresenceType state;
state = empathy_idle_get_state (priv->idle);
icon_name = empathy_icon_name_for_presence (state);
}
- gtk_status_icon_set_from_icon_name (priv->icon, icon_name);
+ if (icon_name != NULL)
+ gtk_status_icon_set_from_icon_name (priv->icon, icon_name);
}
static gboolean
diff --git a/src/empathy-tube-dispatch.c b/src/empathy-tube-dispatch.c
index 63b31b2b6..67db5a3a3 100644
--- a/src/empathy-tube-dispatch.c
+++ b/src/empathy-tube-dispatch.c
@@ -149,7 +149,7 @@ empathy_tube_dispatch_constructed (GObject *object)
const gchar *channel_type;
TpTubeType type;
- priv->dbus = tp_dbus_daemon_new (tp_get_bus());
+ priv->dbus = tp_dbus_daemon_new (tp_get_bus ());
channel = empathy_dispatch_operation_get_channel (priv->operation);
properties = tp_channel_borrow_immutable_properties (channel);
@@ -159,19 +159,19 @@ empathy_tube_dispatch_constructed (GObject *object)
if (channel_type == NULL)
goto failed;
- if (!tp_strdiff (channel_type, EMP_IFACE_CHANNEL_TYPE_STREAM_TUBE))
+ if (!tp_strdiff (channel_type, TP_IFACE_CHANNEL_TYPE_STREAM_TUBE))
{
type = TP_TUBE_TYPE_STREAM;
service = tp_asv_get_string (properties,
- EMP_IFACE_CHANNEL_TYPE_STREAM_TUBE ".Service");
+ TP_IFACE_CHANNEL_TYPE_STREAM_TUBE ".Service");
}
- else if (!tp_strdiff (channel_type, EMP_IFACE_CHANNEL_TYPE_DBUS_TUBE))
+ else if (!tp_strdiff (channel_type, TP_IFACE_CHANNEL_TYPE_DBUS_TUBE))
{
GError *error = NULL;
type = TP_TUBE_TYPE_DBUS;
service = tp_asv_get_string (properties,
- EMP_IFACE_CHANNEL_TYPE_DBUS_TUBE ".ServiceName");
+ TP_IFACE_CHANNEL_TYPE_DBUS_TUBE ".ServiceName");
if (!tp_dbus_check_valid_bus_name (service, TP_DBUS_NAME_TYPE_WELL_KNOWN,
&error))
diff --git a/src/empathy-tube-dispatch.h b/src/empathy-tube-dispatch.h
index f1328bb68..844c88145 100644
--- a/src/empathy-tube-dispatch.h
+++ b/src/empathy-tube-dispatch.h
@@ -44,11 +44,11 @@ struct _EmpathyTubeDispatch {
GObject parent;
};
-GType empathy_tube_dispatch_get_type(void);
+GType empathy_tube_dispatch_get_type (void);
/* TYPE MACROS */
#define EMPATHY_TYPE_TUBE_DISPATCH \
- (empathy_tube_dispatch_get_type())
+ (empathy_tube_dispatch_get_type ())
#define EMPATHY_TUBE_DISPATCH(obj) \
(G_TYPE_CHECK_INSTANCE_CAST((obj), EMPATHY_TYPE_TUBE_DISPATCH, \
EmpathyTubeDispatch))
diff --git a/src/empathy.c b/src/empathy.c
index 817b9bc37..d5be4df8d 100644
--- a/src/empathy.c
+++ b/src/empathy.c
@@ -14,9 +14,9 @@
*
* You should have received a copy of the GNU General Public
* License along with this program; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- *
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301 USA
+ *
* Authors: Xavier Claessens <xclaesse@gmail.com>
*/
@@ -31,6 +31,10 @@
#include <gtk/gtk.h>
#include <gdk/gdkx.h>
+#if HAVE_LIBCHAMPLAIN
+#include <clutter-gtk/gtk-clutter-embed.h>
+#endif
+
#include <libebook/e-book.h>
#include <libnotify/notify.h>
@@ -46,11 +50,13 @@
#include <libempathy/empathy-dispatcher.h>
#include <libempathy/empathy-dispatch-operation.h>
#include <libempathy/empathy-log-manager.h>
+#include <libempathy/empathy-ft-factory.h>
#include <libempathy/empathy-tp-chat.h>
#include <libempathy/empathy-tp-call.h>
#include <libempathy-gtk/empathy-conf.h>
#include <libempathy-gtk/empathy-ui-utils.h>
+#include <libempathy-gtk/empathy-location-manager.h>
#include "empathy-accounts-dialog.h"
#include "empathy-main-window.h"
@@ -124,15 +130,17 @@ dispatch_cb (EmpathyDispatcher *dispatcher,
factory = empathy_call_factory_get ();
empathy_call_factory_claim_channel (factory, operation);
} else if (channel_type == TP_IFACE_QUARK_CHANNEL_TYPE_FILE_TRANSFER) {
- EmpathyFTManager *ft_manager;
- EmpathyTpFile *tp_file;
+ EmpathyFTFactory *factory;
- ft_manager = empathy_ft_manager_dup_singleton ();
- tp_file = EMPATHY_TP_FILE (
- empathy_dispatch_operation_get_channel_wrapper (operation));
- empathy_ft_manager_add_tp_file (ft_manager, tp_file);
- empathy_dispatch_operation_claim (operation);
- g_object_unref (ft_manager);
+ factory = empathy_ft_factory_dup_singleton ();
+
+ /* if the operation is not incoming, don't claim it,
+ * as it might have been triggered by another client, and
+ * we are observing it.
+ */
+ if (empathy_dispatch_operation_is_incoming (operation)) {
+ empathy_ft_factory_claim_channel (factory, operation);
+ }
}
}
@@ -229,7 +237,7 @@ create_salut_account (void)
GError *error = NULL;
/* Check if we already created a salut account */
- empathy_conf_get_bool (empathy_conf_get(),
+ empathy_conf_get_bool (empathy_conf_get (),
EMPATHY_PREFS_SALUT_ACCOUNT_CREATED,
&salut_created);
if (salut_created) {
@@ -312,7 +320,7 @@ create_salut_account (void)
/* The code that handles single-instance and startup notification is
* copied from gedit.
*
- * Copyright (C) 2005 - Paolo Maggi
+ * Copyright (C) 2005 - Paolo Maggi
*/
static void
on_bacon_message_received (const char *message,
@@ -404,30 +412,61 @@ show_version_cb (const char *option_name,
}
static void
+new_incoming_transfer_cb (EmpathyFTFactory *factory,
+ EmpathyFTHandler *handler,
+ GError *error,
+ gpointer user_data)
+{
+ if (error) {
+ empathy_ft_manager_display_error (handler, error);
+ } else {
+ empathy_receive_file_with_file_chooser (handler);
+ }
+}
+
+static void
+new_ft_handler_cb (EmpathyFTFactory *factory,
+ EmpathyFTHandler *handler,
+ GError *error,
+ gpointer user_data)
+{
+ if (error) {
+ empathy_ft_manager_display_error (handler, error);
+ } else {
+ empathy_ft_manager_add_handler (handler);
+ }
+
+ g_object_unref (handler);
+}
+
+static void
new_call_handler_cb (EmpathyCallFactory *factory, EmpathyCallHandler *handler,
gboolean outgoing, gpointer user_data)
{
- EmpathyCallWindow *window;
+ EmpathyCallWindow *window;
- window = empathy_call_window_new (handler);
- gtk_widget_show (GTK_WIDGET (window));
+ window = empathy_call_window_new (handler);
+ gtk_widget_show (GTK_WIDGET (window));
}
int
main (int argc, char *argv[])
{
guint32 startup_timestamp;
+#if HAVE_GEOCLUE
+ EmpathyLocationManager *location_manager = NULL;
+#endif
EmpathyStatusIcon *icon;
EmpathyDispatcher *dispatcher;
EmpathyLogManager *log_manager;
EmpathyChatroomManager *chatroom_manager;
- EmpathyFTManager *ft_manager;
EmpathyCallFactory *call_factory;
+ EmpathyFTFactory *ft_factory;
GtkWidget *window;
MissionControl *mc;
EmpathyIdle *idle;
gboolean autoconnect = TRUE;
- gboolean no_connect = FALSE;
+ gboolean no_connect = FALSE;
gboolean hide_contact_list = FALSE;
gboolean accounts_dialog = FALSE;
GError *error = NULL;
@@ -462,10 +501,14 @@ main (int argc, char *argv[])
empathy_gtk_init ();
g_set_application_name (_(PACKAGE_NAME));
- g_setenv("PULSE_PROP_media.role", "phone", TRUE);
+ g_setenv ("PULSE_PROP_media.role", "phone", TRUE);
gst_init (&argc, &argv);
+#if HAVE_LIBCHAMPLAIN
+ gtk_clutter_init (&argc, &argv);
+#endif
+
gtk_window_set_default_icon_name ("empathy");
textdomain (GETTEXT_PACKAGE);
@@ -533,11 +576,12 @@ main (int argc, char *argv[])
use_nm_notify_cb, idle);
/* Autoconnect */
- empathy_conf_get_bool (empathy_conf_get(),
+ empathy_conf_get_bool (empathy_conf_get (),
EMPATHY_PREFS_AUTOCONNECT,
&autoconnect);
if (autoconnect && ! no_connect &&
- empathy_idle_get_state (idle) <= MC_PRESENCE_OFFLINE) {
+ tp_connection_presence_type_cmp_availability (empathy_idle_get_state
+ (idle), TP_CONNECTION_PRESENCE_TYPE_OFFLINE) <= 0) {
empathy_idle_set_state (idle, MC_PRESENCE_AVAILABLE);
}
@@ -565,17 +609,26 @@ main (int argc, char *argv[])
chatroom_manager = empathy_chatroom_manager_dup_singleton (NULL);
empathy_chatroom_manager_observe (chatroom_manager, dispatcher);
- ft_manager = empathy_ft_manager_dup_singleton ();
-
notify_init (_(PACKAGE_NAME));
/* Create the call factory */
call_factory = empathy_call_factory_initialise ();
g_signal_connect (G_OBJECT (call_factory), "new-call-handler",
G_CALLBACK (new_call_handler_cb), NULL);
+ /* Create the FT factory */
+ ft_factory = empathy_ft_factory_dup_singleton ();
+ g_signal_connect (ft_factory, "new-ft-handler",
+ G_CALLBACK (new_ft_handler_cb), NULL);
+ g_signal_connect (ft_factory, "new-incoming-transfer",
+ G_CALLBACK (new_incoming_transfer_cb), NULL);
+
+ /* Location mananger */
+#if HAVE_GEOCLUE
+ location_manager = empathy_location_manager_dup_singleton ();
+#endif
gtk_main ();
- empathy_idle_set_state (idle, MC_PRESENCE_OFFLINE);
+ empathy_idle_set_state (idle, TP_CONNECTION_PRESENCE_TYPE_OFFLINE);
g_object_unref (mc);
g_object_unref (idle);
@@ -583,7 +636,10 @@ main (int argc, char *argv[])
g_object_unref (log_manager);
g_object_unref (dispatcher);
g_object_unref (chatroom_manager);
- g_object_unref (ft_manager);
+#if HAVE_GEOCLUE
+ g_object_unref (location_manager);
+#endif
+ g_object_unref (ft_factory);
notify_uninit ();
diff --git a/src/ephy-spinner.c b/src/ephy-spinner.c
index 43b9bc990..be82ca71b 100644
--- a/src/ephy-spinner.c
+++ b/src/ephy-spinner.c
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright © 2000 Eazel, Inc.
* Copyright © 2002-2004 Marco Pesenti Gritti
* Copyright © 2004, 2006 Christian Persch
@@ -20,7 +20,7 @@
* Author: Andy Hertzfeld <andy@eazel.com>
*
* Ephy port by Marco Pesenti Gritti <marco@it.gnome.org>
- *
+ *
* $Id: ephy-spinner.c 2114 2006-12-25 12:15:00Z mr $
*/
@@ -455,7 +455,7 @@ ephy_spinner_cache_init (EphySpinnerCache *cache)
static void
ephy_spinner_cache_finalize (GObject *object)
{
- EphySpinnerCache *cache = EPHY_SPINNER_CACHE (object);
+ EphySpinnerCache *cache = EPHY_SPINNER_CACHE (object);
EphySpinnerCachePrivate *priv = cache->priv;
g_hash_table_destroy (priv->hash);
diff --git a/tools/Makefile.am b/tools/Makefile.am
index 817100087..05da7439b 100644
--- a/tools/Makefile.am
+++ b/tools/Makefile.am
@@ -1,3 +1,5 @@
+include $(top_srcdir)/tools/shave.mk
+
abs_top_builddir = @abs_top_builddir@
noinst_SCRIPTS = telepathy-glib-env
@@ -36,23 +38,23 @@ CLEANFILES = libtpcodegen.pyc libtpcodegen.pyo libglibcodegen.pyc libglibcodegen
all: $(EXTRA_DIST)
libglibcodegen.py: libtpcodegen.py
- touch $@
+ $(QUIET_GEN)touch $@
c-constants-gen.py: libglibcodegen.py
- touch $@
+ $(QUIET_GEN)touch $@
glib-client-marshaller-gen.py: libglibcodegen.py
- touch $@
+ $(QUIET_GEN)touch $@
glib-errors-enum-body-gen.py: libglibcodegen.py
- touch $@
+ $(QUIET_GEN)touch $@
glib-errors-enum-header-gen.py: libglibcodegen.py
- touch $@
+ $(QUIET_GEN)touch $@
glib-ginterface-gen.py: libglibcodegen.py
- touch $@
+ $(QUIET_GEN)touch $@
glib-gtypes-generator.py: libglibcodegen.py
- touch $@
+ $(QUIET_GEN)touch $@
glib-interfaces-gen.py: libglibcodegen.py
- touch $@
+ $(QUIET_GEN)touch $@
glib-signals-marshal-gen.py: libglibcodegen.py
- touch $@
+ $(QUIET_GEN)touch $@
TELEPATHY_SPEC_SRCDIR = $(top_srcdir)/../telepathy-spec
maintainer-update-from-telepathy-spec:
diff --git a/tools/check-whitespace.sh b/tools/check-whitespace.sh
index 534833126..84356f20b 100644
--- a/tools/check-whitespace.sh
+++ b/tools/check-whitespace.sh
@@ -8,10 +8,11 @@ then
fail=1
fi
-if grep -n ' ' "$@"
-then
- echo "^^^ The above files contain tabs"
- fail=1
-fi
+# TODO: enable tab checking once all Empathy switched to TP coding style
+#if grep -n ' ' "$@"
+#then
+# echo "^^^ The above files contain tabs"
+# fail=1
+#fi
exit $fail
diff --git a/tools/shave.mk b/tools/shave.mk
new file mode 100644
index 000000000..53cb3bf5e
--- /dev/null
+++ b/tools/shave.mk
@@ -0,0 +1 @@
+QUIET_GEN = $(Q:@=@echo ' GEN '$@;)