748d5786ae275184bb25d559a8ec57e0e40211c2
[platform/core/uifw/at-spi2-atk.git] / login-helper / login-helper.c
1 /*
2  * AT-SPI - Assistive Technology Service Provider Interface
3  * (Gnome Accessibility Project; http://developer.gnome.org/projects/gap)
4  *
5  * LoginHelper interface 
6  * Copyright 2004 Sun Microsystems Inc.,
7  *
8  * This library is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU Library General Public
10  * License as published by the Free Software Foundation; either
11  * version 2 of the License, or (at your option) any later version.
12  *
13  * This library 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 GNU
16  * Library General Public License for more details.
17  *
18  * You should have received a copy of the GNU Library General Public
19  * License along with this library; if not, write to the
20  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
21  * Boston, MA 02111-1307, USA.
22  */
23
24 /* login-helper.c: minimal implementation of Accessibility_LoginHelper.idl */
25 #include <libbonobo.h>
26 #include "login-helper.h"
27
28 /* Our parent Gtk object type */
29 #define PARENT_TYPE BONOBO_TYPE_OBJECT
30
31 /* A pointer to our parent object class */
32 static BonoboObjectClass *bonobo_object_parent_class;
33
34 static void
35 login_helper_finalize (GObject *object)
36 {
37   LoginHelper *helper = (LoginHelper *) object;
38   CORBA_Environment ev;
39
40   (G_OBJECT_CLASS (bonobo_object_parent_class))->finalize (object);
41 }
42
43 gboolean
44 login_helper_set_safe (LoginHelper *helper, gboolean safe)
45 {
46   LoginHelperClass *klass = LOGIN_HELPER_GET_CLASS (helper);
47   
48   if (klass->set_safe)
49     return (* klass->set_safe)(helper, safe);
50   else
51     return FALSE;
52 }
53
54 static CORBA_boolean
55 impl_login_helper_set_safe (PortableServer_Servant servant,
56                             const CORBA_boolean safe,
57                             CORBA_Environment *ev)
58 {
59   LoginHelper *helper = LOGIN_HELPER (bonobo_object_from_servant (servant));
60
61   return login_helper_set_safe (helper, safe);
62 }
63
64 LoginHelperDeviceReqFlags
65 login_helper_get_device_reqs (LoginHelper *helper)
66 {
67   LoginHelperClass *klass = LOGIN_HELPER_GET_CLASS (helper);
68   
69   if (klass->get_device_reqs)
70     return  (* klass->get_device_reqs)(helper);
71   else
72     return 0;
73 }
74
75 static Accessibility_LoginHelper_DeviceReqList*
76 impl_login_helper_get_device_reqs (PortableServer_Servant servant,
77                                    CORBA_Environment *ev)
78 {
79   LoginHelper *helper = LOGIN_HELPER (bonobo_object_from_servant (servant));
80   LoginHelperDeviceReqFlags flags = 0;
81   gint n_reqs = 0, i = 1, j = 1;
82   Accessibility_LoginHelper_DeviceReqList *list;
83
84   flags = login_helper_get_device_reqs (helper);
85
86   while (i <= LOGIN_HELPER_LAST_DEFINED) 
87   {
88       if (flags & i) n_reqs++;
89       i <<= 1;
90   }
91   
92   list = Accessibility_LoginHelper_DeviceReqList__alloc ();
93   list->_length = n_reqs; 
94   list->_buffer = Accessibility_LoginHelper_DeviceReqList_allocbuf (list->_length);
95
96   for (i = 0, j = 1; i < n_reqs; i++) 
97   {
98       Accessibility_LoginHelper_DeviceReq req;
99       while ((flags & j) == 0) {
100           j <<= 1;
101       }
102       switch (j)
103       {
104           case LOGIN_HELPER_GUI_EVENTS:
105               req = Accessibility_LoginHelper_GUI_EVENTS;
106               break;
107           case LOGIN_HELPER_CORE_KEYBOARD:
108               req = Accessibility_LoginHelper_CORE_KEYBOARD;
109               break;
110           case LOGIN_HELPER_CORE_POINTER:
111               req = Accessibility_LoginHelper_CORE_POINTER;
112               break;
113           case LOGIN_HELPER_EXT_INPUT:
114               req = Accessibility_LoginHelper_EXT_INPUT;
115               break;
116           case LOGIN_HELPER_POST_WINDOWS:
117               req = Accessibility_LoginHelper_POST_WINDOWS;
118               break;
119           case LOGIN_HELPER_AUDIO_OUT:
120               req = Accessibility_LoginHelper_AUDIO_OUT;
121               break;
122           case LOGIN_HELPER_AUDIO_IN:
123               req = Accessibility_LoginHelper_AUDIO_IN;
124               break;
125           case LOGIN_HELPER_NETWORK:
126               req = Accessibility_LoginHelper_NETWORK;
127               break;
128           case LOGIN_HELPER_LOCALHOST:
129               req = Accessibility_LoginHelper_LOCALHOST;
130               break;
131           case LOGIN_HELPER_SERIAL_OUT:
132               req = Accessibility_LoginHelper_SERIAL_OUT;
133               break;
134           case LOGIN_HELPER_SERIAL_IN:
135               req = Accessibility_LoginHelper_SERIAL_IN;
136               break;
137           default:
138               req = 0;
139               break;
140       }
141       list->_buffer[i] = req;
142       j <<= 1;
143   }  
144
145   return list;
146 }
147
148 Window*
149 login_helper_get_raise_windows (LoginHelper *helper)
150 {
151   LoginHelperClass *klass = LOGIN_HELPER_GET_CLASS (helper);
152   
153   if (klass->get_raise_windows)
154     return (* klass->get_raise_windows)(helper);
155   else
156     return NULL;
157 }
158
159 static Accessibility_LoginHelper_WindowList*
160 impl_login_helper_get_raise_windows (PortableServer_Servant servant,
161                                      CORBA_Environment *ev)
162 {
163   LoginHelper *helper = LOGIN_HELPER (bonobo_object_from_servant (servant));
164   long *wids;
165   Accessibility_LoginHelper_WindowList *windows;
166
167   wids = login_helper_get_raise_windows (helper);
168
169   if (wids && *wids)
170     {
171       gint i, count = 0;
172       while (wids[count])
173         {
174           ++count;
175         }
176       windows = Accessibility_LoginHelper_WindowList__alloc ();
177       windows->_length = count;
178       windows->_buffer = Accessibility_LoginHelper_WindowList_allocbuf (windows->_length);
179       for (i = 0; i < count; ++i)
180         {
181           Accessibility_LoginHelper_WindowInfo winfo;
182           winfo.winID = wids[i];
183           windows->_buffer [i] = winfo;
184         }
185       g_free (wids);
186       return windows;
187     }
188   else
189     {
190       return NULL;
191     }
192 }
193
194 static void
195 login_helper_class_init (LoginHelperClass *klass)
196 {
197   GObjectClass * object_class = (GObjectClass *) klass;
198   POA_Accessibility_LoginHelper__epv *epv = &klass->epv;
199
200   bonobo_object_parent_class = g_type_class_peek_parent (klass);
201
202   object_class->finalize = login_helper_finalize;
203   
204   epv->getRaiseWindows = impl_login_helper_get_raise_windows;
205   epv->getDeviceReqs = impl_login_helper_get_device_reqs;
206   epv->setSafe = impl_login_helper_set_safe;
207 }
208
209 static void
210 login_helper_init (GObject *object)
211 {
212     LoginHelper *helper = LOGIN_HELPER (object);
213 }
214
215 BONOBO_TYPE_FUNC_FULL (LoginHelper,
216                        Accessibility_LoginHelper,
217                        PARENT_TYPE, login_helper)
218