1 /* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
2 /* gnome-keyring-callback.c - run callbacks
3
4 Copyright (C) 2009 Stefan Walter
5
6 The Gnome Keyring Library is free software; you can redistribute it and/or
7 modify it under the terms of the GNU Library General Public License as
8 published by the Free Software Foundation; either version 2 of the
9 License, or (at your option) any later version.
10
11 The Gnome Keyring Library is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 Library General Public License for more details.
15
16 You should have received a copy of the GNU Library General Public
17 License along with the Gnome Library; see the file COPYING.LIB. If not,
18 write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19 Boston, MA 02111-1307, USA.
20
21 Author: Stef Walter <stef@memberwebs.com>
22 */
23
24 #include "config.h"
25
26 #include "gnome-keyring.h"
27 #include "gnome-keyring-private.h"
28
29 GkrCallback*
gkr_callback_new(GkrOperation * op,gpointer callback,GkrCallbackType callback_type,gpointer user_data,GDestroyNotify destroy_func)30 gkr_callback_new (GkrOperation *op, gpointer callback, GkrCallbackType callback_type,
31 gpointer user_data, GDestroyNotify destroy_func)
32 {
33 GkrCallback *cb = g_slice_new (GkrCallback);
34 cb->operation = op;
35 cb->callback = callback;
36 cb->destroy_func = destroy_func;
37 cb->type = callback_type;
38 cb->user_data = user_data;
39 return cb;
40 }
41
42 void
gkr_callback_free(gpointer data)43 gkr_callback_free (gpointer data)
44 {
45 GkrCallback *cb = data;
46 if (cb == NULL)
47 return;
48 if (cb->user_data && cb->destroy_func)
49 (cb->destroy_func) (cb->user_data);
50 g_slice_free (GkrCallback, cb);
51 }
52
53 void
gkr_callback_empty(GnomeKeyringResult res,gpointer user_data)54 gkr_callback_empty (GnomeKeyringResult res, gpointer user_data)
55 {
56 /* Nothing happening */
57 }
58
59 typedef void (*OpMsgCallback) (GkrOperation*, DBusMessage*, gpointer);
60
61 void
gkr_callback_invoke_op_msg(GkrCallback * cb,DBusMessage * msg)62 gkr_callback_invoke_op_msg (GkrCallback *cb, DBusMessage *msg)
63 {
64 g_assert (cb);
65 g_assert (cb->type == GKR_CALLBACK_OP_MSG);
66 g_assert (cb->callback);
67 g_assert (cb->operation);
68 cb->type = 0;
69 ((OpMsgCallback)(cb->callback)) (cb->operation, msg, cb->user_data);
70 }
71
72 typedef void (*OpSessionCallback) (GkrOperation*, GkrSession*, gpointer);
73
74 void
gkr_callback_invoke_op_session(GkrCallback * cb,GkrSession * session)75 gkr_callback_invoke_op_session (GkrCallback *cb, GkrSession *session)
76 {
77 g_assert (cb);
78 g_assert (cb->type == GKR_CALLBACK_OP_SESSION);
79 g_assert (cb->callback);
80 g_assert (cb->operation);
81 cb->type = 0;
82 ((OpSessionCallback)(cb->callback)) (cb->operation, session, cb->user_data);
83 }
84
85 typedef void (*OpStringCallback) (GkrOperation*, const gchar*, gpointer);
86
87 void
gkr_callback_invoke_op_string(GkrCallback * cb,const gchar * value)88 gkr_callback_invoke_op_string (GkrCallback *cb, const gchar *value)
89 {
90 g_assert (cb);
91 g_assert (cb->type == GKR_CALLBACK_OP_STRING);
92 g_assert (cb->callback);
93 g_assert (cb->operation);
94 cb->type = 0;
95 ((OpStringCallback)(cb->callback)) (cb->operation, value, cb->user_data);
96 }
97
98 void
gkr_callback_invoke_res(GkrCallback * cb,GnomeKeyringResult res)99 gkr_callback_invoke_res (GkrCallback *cb,
100 GnomeKeyringResult res)
101 {
102 g_assert (cb != NULL);
103 g_assert (cb->callback != NULL);
104
105 if (cb->operation && !gkr_operation_set_result (cb->operation, res))
106 return;
107
108 gkr_callback_invoke_bare (cb, res);
109 }
110
111 void
gkr_callback_invoke_bare(GkrCallback * cb,GnomeKeyringResult res)112 gkr_callback_invoke_bare (GkrCallback *cb,
113 GnomeKeyringResult res)
114 {
115 gint type;
116
117 g_assert (cb != NULL);
118 g_assert (cb->callback != NULL);
119
120 /* When successful can only call one kind of callback */
121 if (res == GNOME_KEYRING_RESULT_OK) {
122 g_assert (cb->type == GKR_CALLBACK_RES);
123 cb->type = 0;
124 ((GnomeKeyringOperationDoneCallback)cb->callback) (res, cb->user_data);
125
126 /* When failing, we can call anything with a res */
127 } else {
128 type = cb->type;
129 cb->type = 0;
130 switch (type) {
131 case GKR_CALLBACK_RES:
132 ((GnomeKeyringOperationDoneCallback)cb->callback) (res, cb->user_data);
133 break;
134 case GKR_CALLBACK_RES_STRING:
135 ((GnomeKeyringOperationGetStringCallback)cb->callback) (res, NULL, cb->user_data);
136 break;
137 case GKR_CALLBACK_RES_UINT:
138 ((GnomeKeyringOperationGetIntCallback)cb->callback) (res, 0, cb->user_data);
139 break;
140 case GKR_CALLBACK_RES_LIST:
141 ((GnomeKeyringOperationGetListCallback)cb->callback) (res, NULL, cb->user_data);
142 break;
143 case GKR_CALLBACK_RES_KEYRING_INFO:
144 ((GnomeKeyringOperationGetKeyringInfoCallback)cb->callback) (res, NULL, cb->user_data);
145 break;
146 case GKR_CALLBACK_RES_ITEM_INFO:
147 ((GnomeKeyringOperationGetItemInfoCallback)cb->callback) (res, NULL, cb->user_data);
148 break;
149 case GKR_CALLBACK_RES_ATTRIBUTES:
150 ((GnomeKeyringOperationGetAttributesCallback)cb->callback) (res, NULL, cb->user_data);
151 break;
152 default:
153 g_assert_not_reached ();
154 }
155 }
156 }
157
158 void
gkr_callback_invoke_ok_string(GkrCallback * cb,const gchar * value)159 gkr_callback_invoke_ok_string (GkrCallback *cb, const gchar *value)
160 {
161 g_assert (cb);
162 g_assert (cb->type == GKR_CALLBACK_RES_STRING);
163 cb->type = 0;
164 if (!cb->operation || gkr_operation_set_result (cb->operation, GNOME_KEYRING_RESULT_OK))
165 ((GnomeKeyringOperationGetStringCallback)cb->callback) (GNOME_KEYRING_RESULT_OK, value, cb->user_data);
166 }
167
168
169 void
gkr_callback_invoke_ok_uint(GkrCallback * cb,guint32 value)170 gkr_callback_invoke_ok_uint (GkrCallback *cb, guint32 value)
171 {
172 g_assert (cb);
173 g_assert (cb->type == GKR_CALLBACK_RES_UINT);
174 g_assert (cb->callback);
175 cb->type = 0;
176 if (!cb->operation || gkr_operation_set_result (cb->operation, GNOME_KEYRING_RESULT_OK))
177 ((GnomeKeyringOperationGetIntCallback)cb->callback) (GNOME_KEYRING_RESULT_OK, value, cb->user_data);
178 }
179
180 void
gkr_callback_invoke_ok_list(GkrCallback * cb,GList * value)181 gkr_callback_invoke_ok_list (GkrCallback *cb, GList *value)
182 {
183 g_assert (cb);
184 g_assert (cb->type == GKR_CALLBACK_RES_LIST);
185 g_assert (cb->callback);
186 cb->type = 0;
187 if (!cb->operation || gkr_operation_set_result (cb->operation, GNOME_KEYRING_RESULT_OK))
188 ((GnomeKeyringOperationGetListCallback)cb->callback) (GNOME_KEYRING_RESULT_OK, value, cb->user_data);
189 }
190
191 void
gkr_callback_invoke_ok_keyring_info(GkrCallback * cb,GnomeKeyringInfo * value)192 gkr_callback_invoke_ok_keyring_info (GkrCallback *cb, GnomeKeyringInfo *value)
193 {
194 g_assert (cb);
195 g_assert (cb->type == GKR_CALLBACK_RES_KEYRING_INFO);
196 g_assert (cb->callback);
197 cb->type = 0;
198 if (!cb->operation || gkr_operation_set_result (cb->operation, GNOME_KEYRING_RESULT_OK))
199 ((GnomeKeyringOperationGetKeyringInfoCallback)cb->callback) (GNOME_KEYRING_RESULT_OK, value, cb->user_data);
200 }
201
202 void
gkr_callback_invoke_ok_item_info(GkrCallback * cb,GnomeKeyringItemInfo * value)203 gkr_callback_invoke_ok_item_info (GkrCallback *cb, GnomeKeyringItemInfo *value)
204 {
205 g_assert (cb);
206 g_assert (cb->type == GKR_CALLBACK_RES_ITEM_INFO);
207 g_assert (cb->callback);
208 cb->type = 0;
209 if (!cb->operation || gkr_operation_set_result (cb->operation, GNOME_KEYRING_RESULT_OK))
210 ((GnomeKeyringOperationGetItemInfoCallback)cb->callback) (GNOME_KEYRING_RESULT_OK, value, cb->user_data);
211 }
212
213 void
gkr_callback_invoke_ok_attributes(GkrCallback * cb,GnomeKeyringAttributeList * value)214 gkr_callback_invoke_ok_attributes (GkrCallback *cb, GnomeKeyringAttributeList *value)
215 {
216 g_assert (cb);
217 g_assert (cb->type == GKR_CALLBACK_RES_ATTRIBUTES);
218 g_assert (cb->callback);
219 cb->type = 0;
220 if (!cb->operation || gkr_operation_set_result (cb->operation, GNOME_KEYRING_RESULT_OK))
221 ((GnomeKeyringOperationGetAttributesCallback)cb->callback) (GNOME_KEYRING_RESULT_OK, value, cb->user_data);
222 }
223