summaryrefslogtreecommitdiff
path: root/telepathy-glib/channel-internal.h
blob: 77cf215aecfd1c6b030893adefab3af327b537a7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
/*<private_header>*/
/*
 * TpChannel - proxy for a Telepathy channel (internals)
 *
 * Copyright (C) 2007-2008 Collabora Ltd. <http://www.collabora.co.uk/>
 * Copyright (C) 2007-2008 Nokia Corporation
 *
 * 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 TP_CHANNEL_INTERNAL_H
#define TP_CHANNEL_INTERNAL_H

#include <telepathy-glib/channel.h>

G_BEGIN_DECLS

typedef void (*TpChannelProc) (TpChannel *self);

typedef struct {
    TpContact *actor_contact;
    TpHandle actor;
    TpChannelGroupChangeReason reason;
    gchar *message;
} LocalPendingInfo;

typedef struct _ContactsQueueItem ContactsQueueItem;

struct _TpChannelPrivate {
    gulong conn_invalidated_id;

    TpConnection *connection;

    /* GQueue of TpChannelProc */
    GQueue *introspect_needed;

    GQuark channel_type;
    TpHandleType handle_type;
    TpHandle handle;
    gchar *identifier;
    /* owned string (iface + "." + prop) => slice-allocated GValue */
    GHashTable *channel_properties;

    /* Set until introspection discovers which to use; both NULL after one has
     * been disconnected.
     */
    TpProxySignalConnection *members_changed_sig;
    TpProxySignalConnection *members_changed_detailed_sig;
    TpProxySignalConnection *self_handle_changed_sig;
    TpProxySignalConnection *self_contact_changed_sig;
    TpProxySignalConnection *handle_owners_changed_sig;
    TpProxySignalConnection *handle_owners_changed_detailed_sig;

    TpHandle group_self_handle;
    TpChannelGroupFlags group_flags;
    /* NULL if members not discovered yet */
    TpIntset *group_members;
    TpIntset *group_local_pending;
    TpIntset *group_remote_pending;
    /* (TpHandle => LocalPendingInfo), or NULL if members not discovered yet */
    GHashTable *group_local_pending_info;

    /* reason the self-handle left */
    GError *group_remove_error /* implicitly zero-initialized */ ;
    /* guint => guint, NULL if not discovered yet */
    GHashTable *group_handle_owners;

    /* reffed TpContact */
    TpContact *target_contact;
    TpContact *initiator_contact;
    TpContact *group_self_contact;
    /* TpHandle -> reffed TpContact */
    GHashTable *group_members_contacts;
    GHashTable *group_local_pending_contacts;
    GHashTable *group_remote_pending_contacts;
    /* the TpContact can be NULL if the owner is unknown */
    GHashTable *group_contact_owners;
    gboolean cm_too_old_for_contacts;

    /* Queue of GSimpleAsyncResult with ContactsQueueItem payload */
    GQueue *contacts_queue;
    /* Item currently being prepared, not part of contacts_queue anymore */
    GSimpleAsyncResult *current_contacts_queue_result;

    /* NULL, or TpHandle => TpChannelChatState;
     * if non-NULL, we're watching for ChatStateChanged */
    GHashTable *chat_states;

    /* These are really booleans, but gboolean is signed. Thanks, GLib */

    /* channel-ready */
    unsigned ready:1;
    /* Enough method calls have succeeded that we believe that the channel
     * exists (implied by ready) */
    unsigned exists:1;
    /* GetGroupFlags has returned */
    unsigned have_group_flags:1;

    TpChannelPasswordFlags password_flags;
};

/* channel.c internals */

void _tp_channel_continue_introspection (TpChannel *self);
void _tp_channel_abort_introspection (TpChannel *self,
    const gchar *debug,
    const GError *error);
GHashTable *_tp_channel_get_immutable_properties (TpChannel *self);

/* channel-group.c internals */

void _tp_channel_get_group_properties (TpChannel *self);

/* channel-contacts.c internals */

void _tp_channel_contacts_init (TpChannel *self);
void _tp_channel_contacts_group_init (TpChannel *self, GHashTable *identifiers);
void _tp_channel_contacts_members_changed (TpChannel *self,
    const GArray *added, const GArray *removed, const GArray *local_pending,
    const GArray *remote_pending, guint actor, GHashTable *details);
void _tp_channel_contacts_handle_owners_changed (TpChannel *self,
    GHashTable *added, const GArray *removed, GHashTable *identifiers);
void _tp_channel_contacts_self_contact_changed (TpChannel *self,
    guint self_handle, const gchar *identifier);
void _tp_channel_contacts_prepare_async (TpProxy *proxy,
    const TpProxyFeature *feature,
    GAsyncReadyCallback callback,
    gpointer user_data);

void _tp_channel_contacts_queue_prepare_async (TpChannel *self,
    GPtrArray *contacts,
    GAsyncReadyCallback callback,
    gpointer user_data);
void _tp_channel_contacts_queue_prepare_by_id_async (TpChannel *self,
    GPtrArray *ids,
    GAsyncReadyCallback callback,
    gpointer user_data);
void _tp_channel_contacts_queue_prepare_by_handle_async (TpChannel *self,
    GArray *handles,
    GAsyncReadyCallback callback,
    gpointer user_data);
gboolean _tp_channel_contacts_queue_prepare_finish (TpChannel *self,
    GAsyncResult *result,
    GPtrArray **contacts,
    GError **error);

G_END_DECLS

#endif