1 /**************************************************************************
3 xserver-xorg-module-lazyload
5 Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
7 Contact: Sung-Jin Park <sj76.park@samsung.com>
8 Sangjin LEE <lsj119@samsung.com>
10 Permission is hereby granted, free of charge, to any person obtaining a
11 copy of this software and associated documentation files (the
12 "Software"), to deal in the Software without restriction, including
13 without limitation the rights to use, copy, modify, merge, publish,
14 distribute, sub license, and/or sell copies of the Software, and to
15 permit persons to whom the Software is furnished to do so, subject to
16 the following conditions:
18 The above copyright notice and this permission notice (including the
19 next paragraph) shall be included in all copies or substantial portions
22 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
23 OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
24 MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
25 IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
26 ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
27 TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
28 SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
30 **************************************************************************/
38 #include <dbus/dbus.h>
39 #include "module_lazyload_main.h"
40 #include "module_lazyload_dbus.h"
42 extern Bool noInputInit;
43 extern Bool xf86LoadModules(char **list, pointer *optlist);
45 static ModuleLazyloadDbusMethod method;
48 moduleLazyloadCommand (void *data, int argc, char **argv, char *reply, int *len)
50 ModuleLazyload *pMod = (ModuleLazyload*)data;
52 XDBG_DEBUG (MLAZY, "%p\n", pMod);
58 moduleLazyloadMain (ModuleLazyload *pMod, pointer opts)
63 char *reentrant_tmp = NULL;
64 char *reentrant_optVal = NULL;
67 const char **opt_pointer = NULL;
68 XF86OptionPtr options = NULL;
71 char **modulelist = NULL;
72 pointer *optarray = NULL;
74 OsSignal(SIGINT, SIG_IGN);
76 if(!(XF86OptionPtr)opts)
78 xf86Msg(X_INFO, "[%s] No options for lazyload module.\n", __FUNCTION__);
82 for(pOpt = (XF86OptionPtr)opts ; pOpt ; pOpt = xf86NextOption(pOpt))
85 /* dead_error_condition: The condition is cannot be true. */
89 xf86Msg(X_INFO, "[%s] Module count is zero.\n", __FUNCTION__);
93 modulelist = malloc((module_count + 1) * sizeof(char *));
94 optarray = malloc((module_count + 1) * sizeof(pointer));
96 if(!modulelist || !optarray)
98 xf86Msg(X_INFO, "[%s] Failed to allocate memory for (modulelist/optarray)\n", __FUNCTION__);
102 for(pOpt = (XF86OptionPtr)opts ; pOpt ; pOpt = xf86NextOption(pOpt))
105 char *opt_name = xf86OptionName(pOpt);
106 char *opt_val = xf86OptionValue(pOpt);
108 if(!opt_name || !opt_val)
110 xf86Msg(X_INFO, "[%s] opt_name or opt_val is NULL\n", __FUNCTION__);
114 //Input intialization
115 if(!strncmp("init_input", opt_name, sizeof("init_input")) && !strncmp("1", opt_val, 1))
119 xf86Msg(X_INFO, "[%s] Begin InitInput\n", __FUNCTION__);
120 InitInput((int)0, (char **)NULL);
121 xf86Msg(X_INFO, "[%s] End InitInput\n", __FUNCTION__);
127 modulelist[mod_count] = opt_name;
128 xf86Msg(X_INFO, "[%s] module [%d] = %s\n", __FUNCTION__, mod_count, modulelist[mod_count]);
130 //count number of options
132 len = strlen(opt_val);
133 tmp = malloc((len+1)*sizeof(char));
137 xf86Msg(X_INFO, "[%s] Failed to allocate memory\n", __FUNCTION__);
141 strncpy(tmp, opt_val, len);
144 //Count number of options
146 token = strtok_r (tmp, " ,", &reentrant_tmp);
147 while (token != NULL)
150 token = strtok_r (NULL, " ,", &reentrant_tmp);
155 opt_pointer = calloc(opt_count+1, sizeof(char*));
159 xf86Msg(X_INFO, "[%s] Failed to allocate memory for option pointer\n", __FUNCTION__);
164 //set option value(s)
166 token = strtok_r (opt_val, " ,", &reentrant_optVal);
167 while (token != NULL)
169 opt_pointer[opt_count] = token;
170 xf86Msg(X_INFO, "[%s] option [%d]=%s\n", __FUNCTION__, opt_count, opt_pointer[opt_count]);
173 token = strtok_r (NULL, " ,", &reentrant_optVal);
175 /* Terminate with NULL */
176 opt_pointer[opt_count] = NULL;
178 options = xf86OptionListCreate(opt_pointer, -1, 0);
179 optarray[mod_count] = options;
181 //Increase number of modules
185 modulelist[mod_count] = NULL;
186 optarray[mod_count] = NULL;
190 xf86Msg(X_INFO, "[%s] Begin xf86LoadModules\n", __FUNCTION__);
191 xf86LoadModules(modulelist, optarray);
192 xf86Msg(X_INFO, "[%s] End xf86LoadModules\n", __FUNCTION__);
194 xf86Msg(X_INFO, "[%s] Lazy load of modules has been done.\n", __FUNCTION__);
197 if(opt_pointer) free(opt_pointer);
198 if(modulelist) free(modulelist);
199 if(optarray) free(optarray);
202 moduleLazyloadDbusConnect ();
203 snprintf (method.name, sizeof (method.name), "%s", LAZYLOAD_DBUS_METHOD);
204 method.func = moduleLazyloadCommand;
206 moduleLazyloadDbusAddMethod (&method);
211 if(opt_pointer) free(opt_pointer);
212 if(modulelist) free(modulelist);
213 if(optarray) free(optarray);
216 moduleLazyloadDbusRemoveMethod (&method);
217 moduleLazyloadDbusDisconnect ();
219 xf86Msg(X_INFO, "[%s] Failed to do lazy load !\n", __FUNCTION__);
224 moduleLazyloadMainExit (ModuleLazyload *pMod)
226 moduleLazyloadDbusRemoveMethod (&method);
227 moduleLazyloadDbusDisconnect ();