2 * @file purple-status.c
6 * Copyright (C) 2011-2014 SIPE Project <http://sipe.sourceforge.net/>
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
26 #include "savedstatuses.h"
28 #include "sipe-backend.h"
29 #include "sipe-core.h"
31 #include "purple-private.h"
33 guint
sipe_backend_status(struct sipe_core_public
*sipe_public
)
35 struct sipe_backend_private
*purple_private
= sipe_public
->backend_private
;
36 PurpleStatus
*status
= purple_account_get_active_status(purple_private
->account
);
37 if (!status
) return(SIPE_ACTIVITY_UNSET
);
38 return(sipe_purple_token_to_activity(purple_status_get_id(status
)));
41 gboolean
sipe_backend_status_changed(struct sipe_core_public
*sipe_public
,
45 struct sipe_backend_private
*purple_private
= sipe_public
->backend_private
;
46 PurpleStatus
*status
= purple_account_get_active_status(purple_private
->account
);
47 const gchar
*status_id
= sipe_purple_activity_to_token(activity
);
49 return(!(g_str_equal(status_id
, purple_status_get_id(status
)) &&
50 sipe_strequal(message
,
51 purple_status_get_attr_string(status
,
52 SIPE_PURPLE_STATUS_ATTR_ID_MESSAGE
))));
56 * This method motivates Purple's Host (e.g. Pidgin) to update its UI
57 * by using standard Purple's means of signals and saved statuses.
59 * Thus all UI elements get updated: Status Button with Note, docklet.
60 * This is ablolutely important as both our status and note can come
61 * inbound (roaming) or be updated programmatically (e.g. based on our
64 void sipe_backend_status_and_note(struct sipe_core_public
*sipe_public
,
68 if ((activity
== SIPE_ACTIVITY_AWAY
) && purple_savedstatus_is_idleaway()) {
69 SIPE_DEBUG_INFO_NOFORMAT("sipe_backend_status_and_notes: user is already idle-away");
71 struct sipe_backend_private
*purple_private
= sipe_public
->backend_private
;
72 PurpleAccount
*account
= purple_private
->account
;
73 const gchar
*status_id
= sipe_purple_activity_to_token(activity
);
74 PurpleSavedStatus
*saved_status
;
75 const PurpleStatusType
*acct_status_type
=
76 purple_status_type_find_with_id(purple_account_get_status_types(account
),
78 PurpleStatusPrimitive primitive
= purple_status_type_get_primitive(acct_status_type
);
80 saved_status
= purple_savedstatus_find_transient_by_type_and_message(primitive
, message
);
82 purple_savedstatus_set_substatus(saved_status
, account
, acct_status_type
, message
);
85 /* If this type+message is unique then create a new transient saved status
90 GList
*active_accts
= purple_accounts_get_all_active();
92 saved_status
= purple_savedstatus_new(NULL
, primitive
);
93 purple_savedstatus_set_message(saved_status
, message
);
95 for (tmp
= active_accts
; tmp
!= NULL
; tmp
= tmp
->next
) {
96 purple_savedstatus_set_substatus(saved_status
,
97 (PurpleAccount
*)tmp
->data
, acct_status_type
, message
);
99 g_list_free(active_accts
);
102 /* Set the status for each account */
103 purple_savedstatus_activate(saved_status
);
107 void sipe_purple_set_status(PurpleAccount
*account
,
108 PurpleStatus
*status
)
110 SIPE_DEBUG_INFO("sipe_purple_set_status[CB]: status=%s",
111 purple_status_get_id(status
));
113 if (!purple_status_is_active(status
))
116 if (purple_account_get_connection(account
)) {
117 const gchar
*status_id
= purple_status_get_id(status
);
118 const gchar
*note
= purple_status_get_attr_string(status
,
119 SIPE_PURPLE_STATUS_ATTR_ID_MESSAGE
);
120 sipe_core_status_set(PURPLE_ACCOUNT_TO_SIPE_CORE_PUBLIC
,
121 sipe_purple_token_to_activity(status_id
),
126 void sipe_purple_set_idle(PurpleConnection
*gc
,
129 SIPE_DEBUG_INFO("sipe_purple_set_idle[CB]: interval=%d", interval
);
130 if (gc
) sipe_core_status_idle(PURPLE_GC_TO_SIPE_CORE_PUBLIC
);