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