00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00031 #include <errno.h>
00032 #include <fcntl.h>
00033 #include <stdio.h>
00034 #include <stdlib.h>
00035 #include <string.h>
00036 #include <limits.h>
00037 #include <sys/param.h>
00038 #include <sys/stat.h>
00039 #include <sys/types.h>
00040 #include <unistd.h>
00041
00042 #include <glib.h>
00043
00044 #include "erreglog.h"
00045 #include "erreg.h"
00046 #include "erregnwprofiles.h"
00047 #include "erregrwlock.h"
00048 #include "erregtypes_f.h"
00049
00051
00052
00053
00055 static const gchar scNWMinSetString[] =
00056 "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"
00057 "<iLiadRegistry>\n"
00058 " <networkProfileList>\n"
00059 " <networkProfile profileID=\"NW_0\">\n"
00060 " <profileName>Wired network</profileName>\n"
00061 " <networkType>WIRED</networkType>\n"
00062 " <useProxy>false</useProxy>\n"
00063 " <useDhcp>true</useDhcp>\n"
00064 " </networkProfile>\n"
00065 " </networkProfileList>\n"
00066 "</iLiadRegistry>\n";
00067
00068 void nwRegInitXpathList(regRegistry_t *pRegistry)
00069 {
00070 ERREG_NWPROFILES_LOGPRINTF("entry");
00071 g_assert(pRegistry);
00072
00073 xpathList_t *xpaths = g_new0(xpathList_t, 1);
00074 g_assert(xpaths);
00075
00076 xpaths->networkProfiles = "/" EL_REGISTRY_ROOT "/" EL_NETWORK_PROFILES;
00077 xpaths->networkProfile = "/" EL_REGISTRY_ROOT "/" EL_NETWORK_PROFILES "/" EL_NETWORK_PROFILE;
00078 xpaths->lastConnect = "/" EL_REGISTRY_ROOT "/" EL_LAST_CONNECT;
00079 xpaths->autoConnectWlan = "/" EL_REGISTRY_ROOT "/" EL_AUTO_CONNECT_WLAN;
00080
00081 pRegistry->xpaths = xpaths;
00082 }
00083
00084 void nwRegDestroyXpathList(regRegistry_t *pRegistry)
00085 {
00086 ERREG_NWPROFILES_LOGPRINTF("entry");
00087 g_assert(pRegistry);
00088
00089 g_free(pRegistry->xpaths);
00090 pRegistry->xpaths = NULL;
00091 }
00092
00093 static regRegistry_t* nwRegLoadFromMinSet(void)
00094 {
00095 regRegistry_t *pRegistry = NULL;
00096 gboolean bRet = FALSE;
00097
00098 ERREG_NWPROFILES_LOGPRINTF("entry");
00099
00100 if (scNWMinSetString)
00101 {
00102
00103 pRegistry = g_new0(regRegistry_t, 1);
00104 g_assert(pRegistry != NULL);
00105
00106
00107 int nRet = ermXmlParseBuffer( scNWMinSetString,
00108 REG_DIR "/" REG_NWPROFILES_XML_FILE,
00109 &(pRegistry->xmlCxt) );
00110 if (RET_OK == nRet)
00111 {
00112
00113 bRet = xsdLoad(&(pRegistry->xsdCxt), REG_NWPROFILES_XSD_PATH);
00114 if (bRet)
00115 {
00116
00117 bRet = regValidate(pRegistry);
00118 }
00119 }
00120
00121
00122 if (FALSE == bRet)
00123 {
00124 regDestroy(pRegistry);
00125 pRegistry = NULL;
00126 }
00127 }
00128
00129 return pRegistry;
00130 }
00131
00132 regNetworkConfig_t *nwRegNewNetworkConfig(int size)
00133 {
00134 ERREG_NWPROFILES_LOGPRINTF("entry");
00135
00136 regNetworkConfig_t *theNetworkConfig = NULL;
00137
00138 theNetworkConfig = g_new0(regNetworkConfig_t, 1);
00139 if (theNetworkConfig)
00140 {
00141 int i = 0;
00142
00143 theNetworkConfig->size = size;
00144 theNetworkConfig->networkList = g_new0(char *, theNetworkConfig->size + 1);
00145 for (i = 0; i < size; i++)
00146 {
00147 theNetworkConfig->networkList[i] = g_strdup_printf("NW_%d", i);
00148 }
00149 theNetworkConfig->networkList[size] = NULL;
00150 }
00151 else
00152 {
00153 ERREG_NWPROFILES_ERRORPRINTF("memory allocation error");
00154 }
00155
00156 regDumpNetworkConfig(theNetworkConfig);
00157
00158 return theNetworkConfig;
00159 }
00160
00161 regNetworkProfile_t *nwRegNewNetworkProfile(const char *ID, connection_t connection)
00162 {
00163 ERREG_NWPROFILES_LOGPRINTF("%s, %d", ID, connection);
00164
00165 regNetworkProfile_t *theNetworkProfile = NULL;
00166
00167 theNetworkProfile = g_new0(regNetworkProfile_t, 1);
00168 if (theNetworkProfile)
00169 {
00170 if (wired_t == connection)
00171 {
00172 theNetworkProfile->name = g_strdup(WIRED_NETWORK_NAME);
00173 }
00174 else if (wireless_t == connection)
00175 {
00176 theNetworkProfile->name = g_strdup(WIRELESS_NETWORK_NAME);
00177 }
00178 else
00179 {
00180 theNetworkProfile->name = g_strdup(ID);
00181 }
00182
00183
00184 theNetworkProfile->connection = connection;
00185
00186
00187 theNetworkProfile->addressMode = DEFAULT_ADDRESS_MODE;
00188
00189
00190 theNetworkProfile->proxy = DEFAULT_USE_PROXY;
00191
00192 if (theNetworkProfile->connection == wireless_t)
00193 {
00194 theNetworkProfile->wirelessSettings = g_new0(regWirelessSetting_t, 1);
00195 if (theNetworkProfile->wirelessSettings)
00196 {
00197
00198 theNetworkProfile->wirelessSettings->SSID = g_strdup(DEFAULT_WLAN_SSID);
00199
00200
00201 theNetworkProfile->wirelessSettings->encrType = DEFAULT_WLAN_ENCRYPTION_TYPE;
00202 if (theNetworkProfile->wirelessSettings->encrType != encr_none_t)
00203 {
00204
00205 theNetworkProfile->wirelessSettings->encrKey = g_strdup(DEFAULT_WLAN_ENCRYPTION_KEY);
00206 }
00207
00208
00209 theNetworkProfile->wirelessSettings->broadcast = DEFAULT_WLAN_BROADCAST;
00210 }
00211 else
00212 {
00213 ERREG_NWPROFILES_ERRORPRINTF("memory allocation error");
00214 }
00215 }
00216 }
00217 else
00218 {
00219 ERREG_NWPROFILES_ERRORPRINTF("memory allocation error");
00220 }
00221
00222 regDumpNetworkProfile(ID, theNetworkProfile);
00223
00224 return theNetworkProfile;
00225 }
00226
00227
00228 void nwRegNewNetworkProfiles(regNetworkConfig_t **pNetworkConfig, regNetworkProfile_t ***pNetworks)
00229 {
00230 ERREG_NWPROFILES_LOGPRINTF("entry");
00231
00232 regNetworkConfig_t *theNetworkConfig = NULL;
00233 regNetworkProfile_t **theNetworks = NULL;
00234
00235 theNetworkConfig = nwRegNewNetworkConfig(2);
00236 if (theNetworkConfig)
00237 {
00238 theNetworks = g_new0(regNetworkProfile_t *, theNetworkConfig->size);
00239 if (theNetworks)
00240 {
00241 theNetworks[0] = nwRegNewNetworkProfile(theNetworkConfig->networkList[0], wired_t);
00242 theNetworks[1] = nwRegNewNetworkProfile(theNetworkConfig->networkList[1], wireless_t);
00243 }
00244 else
00245 {
00246 ERREG_NWPROFILES_ERRORPRINTF("memory error");
00247
00248 regFreeNetworkConfig(theNetworkConfig);
00249 theNetworkConfig = NULL;
00250 }
00251 }
00252 else
00253 {
00254 ERREG_NWPROFILES_ERRORPRINTF("memory error");
00255 }
00256
00257 *pNetworkConfig = theNetworkConfig;
00258 *pNetworks = theNetworks;
00259 }
00260
00261
00263
00264
00265
00267
00268 regLoad_t nwRegLoad (regRegistry_t** ppRegistry)
00269 {
00270 ERREG_NWPROFILES_LOGPRINTF("entry");
00271
00272 const char* path_registry = REG_DIR "/" REG_NWPROFILES_XML_FILE;
00273 const char* path_template = TEMPLATE_DIR "/" REG_NWPROFILES_XML_FILE;
00274 const char* path_xsd = REG_NWPROFILES_XSD_PATH;
00275
00276 regRegistry_t* pRegistry = NULL;
00277 regLoad_t ret = loadOk_t;
00278
00279
00280 pRegistry = regParseFiles(path_registry, path_xsd);
00281 if (pRegistry)
00282 {
00283 ERREG_NWPROFILES_LOGPRINTF("Loading nwprofiles registry succeeded.");
00284 ret = loadOk_t;
00285 }
00286 else
00287 {
00288
00289 pRegistry = regParseFiles(path_template, path_xsd);
00290 if (pRegistry)
00291 {
00292 ERREG_NWPROFILES_WARNPRINTF("Loading nwprofiles registry failed, "
00293 "but loading template succeeded.");
00294 ret = loadTemplate_t;
00295 }
00296 else
00297 {
00298 ERREG_NWPROFILES_ERRORPRINTF("Loading nwprofiles registry failed "
00299 "and loading template failed.");
00300 pRegistry = nwRegLoadFromMinSet();
00301 if (pRegistry)
00302 {
00303 ret = loadMinSet_t;
00304 }
00305 else
00306 {
00307 ERREG_NWPROFILES_ERRORPRINTF("Loading nwprofiles registry "
00308 "and template and minset failed.");
00309 ret = loadError_t;
00310 }
00311 }
00312
00313
00314 if (pRegistry)
00315 {
00316 pRegistry->changed = TRUE;
00317 if (erRegGetLockState() == lock_write)
00318 {
00319 regStore(pRegistry, path_registry);
00320 }
00321 }
00322 }
00323
00324
00325 if (pRegistry)
00326 {
00327 nwRegInitXpathList(pRegistry);
00328 }
00329
00330 *ppRegistry = pRegistry;
00331 return ret;
00332
00333 }
00334
00335 void nwRegUnload (regRegistry_t* pRegistry)
00336 {
00337 ERREG_NWPROFILES_LOGPRINTF("entry");
00338
00339 if (pRegistry)
00340 {
00341 nwRegDestroyXpathList(pRegistry);
00342 regDestroy(pRegistry);
00343 }
00344 }
00345
00346 gboolean nwRegStore(regRegistry_t* pRegistry)
00347 {
00348 g_assert(pRegistry);
00349
00350 return regStore(pRegistry, REG_DIR "/" REG_NWPROFILES_XML_FILE);
00351 }
00352
00353
00355
00356
00357
00359
00360
00361
00362
00363 int nwRegGetNetworkProfileFromList(const regNetworkConfig_t *pNetworkConfig,
00364 const char *ID)
00365 {
00366 ERREG_NWPROFILES_LOGPRINTF("entry");
00367
00368 int index = -1;
00369 int i;
00370
00371
00372 for (i = 0; i < pNetworkConfig->size; i++)
00373 {
00374 if (!strcmp(pNetworkConfig->networkList[i], ID))
00375 {
00376 index = i;
00377 break;
00378 }
00379 }
00380
00381 return index;
00382 }
00383
00384
00385
00386
00387
00388 void nwRegAddNetworkProfileToList(regNetworkConfig_t **pNetworkConfig,
00389 regNetworkProfile_t ***pNetworks,
00390 regNetworkProfile_t *pNewNetworkProfile)
00391 {
00392 ERREG_NWPROFILES_LOGPRINTF("entry");
00393
00394 regNetworkConfig_t *pNewNetworkConfig = NULL, *pOldNetworkConfig = NULL;
00395 regNetworkProfile_t **pNewNetworks = NULL, **pOldNetworks = NULL;
00396 int i;
00397
00398 pOldNetworkConfig = *pNetworkConfig;
00399 pOldNetworks = *pNetworks;
00400
00401
00402 pNewNetworkConfig = nwRegNewNetworkConfig(pOldNetworkConfig->size+1);
00403
00404
00405 pNewNetworks = g_new0(regNetworkProfile_t *, pNewNetworkConfig->size);
00406 for (i = 0; i < pOldNetworkConfig->size; i++)
00407 {
00408 pNewNetworks[i] = pOldNetworks[i];
00409 }
00410 pNewNetworks[pNewNetworkConfig->size - 1] = pNewNetworkProfile;
00411
00412
00413 regFreeNetworkConfig(pOldNetworkConfig);
00414 g_free(pOldNetworks);
00415
00416
00417 *pNetworkConfig = pNewNetworkConfig;
00418 *pNetworks = pNewNetworks;
00419 }
00420
00421
00422
00423
00424 void nwRegDeleteNetworkProfileFromList(regNetworkConfig_t **pNetworkConfig,
00425 regNetworkProfile_t ***pNetworks, const char *ID)
00426 {
00427 ERREG_NWPROFILES_LOGPRINTF("entry");
00428
00429 regNetworkConfig_t *pNewNetworkConfig = NULL, *pOldNetworkConfig = NULL;
00430 regNetworkProfile_t **pNewNetworks = NULL, **pOldNetworks = NULL;
00431 int i, index;
00432
00433 pOldNetworkConfig = *pNetworkConfig;
00434 pOldNetworks = *pNetworks;
00435
00436
00437 pNewNetworkConfig= nwRegNewNetworkConfig(pOldNetworkConfig->size-1);
00438
00439
00440 pNewNetworks = g_new0(regNetworkProfile_t *, pNewNetworkConfig->size);
00441 index = nwRegGetNetworkProfileFromList(pOldNetworkConfig, ID);
00442 for (i = 0; i < index; i++)
00443 {
00444 pNewNetworks[i] = pOldNetworks[i];
00445 }
00446 for (i = index + 1; i < pOldNetworkConfig->size; i++)
00447 {
00448 pNewNetworks[i - 1] = pOldNetworks[i];
00449 }
00450
00451
00452 regFreeNetworkConfig(pOldNetworkConfig);
00453 regFreeNetworkProfile(pOldNetworks[index]);
00454 g_free(pOldNetworks);
00455
00456
00457 *pNetworkConfig = pNewNetworkConfig;
00458 *pNetworks = pNewNetworks;
00459 }
00460
00461
00462
00463 void nwRegSetNetworkProfileDefault(regNetworkConfig_t **pNetworkConfig,
00464 regNetworkProfile_t ***pNetworks, const char *ID)
00465 {
00466 ERREG_NWPROFILES_LOGPRINTF("entry");
00467
00468 regNetworkConfig_t *pOldNetworkConfig = NULL;
00469 regNetworkProfile_t **pNewNetworks = NULL, **pOldNetworks = NULL;
00470 regNetworkProfile_t *pNetworkProfile = NULL;
00471 int i, index;
00472
00473 pOldNetworkConfig = *pNetworkConfig;
00474 pOldNetworks = *pNetworks;
00475
00476
00477 pNewNetworks = g_new0(regNetworkProfile_t *, pOldNetworkConfig->size);
00478 index = nwRegGetNetworkProfileFromList(pOldNetworkConfig, ID);
00479 for (i = 0; i < pOldNetworkConfig->size; i++)
00480 {
00481 pNetworkProfile = pOldNetworks[i];
00482
00483 if (i < index)
00484 {
00485 pNewNetworks[i + 1] = pOldNetworks[i];
00486 }
00487 else if (i == index)
00488 {
00489 pNewNetworks[0] = pNetworkProfile;
00490 }
00491 else
00492 {
00493 pNewNetworks[i] = pOldNetworks[i];
00494 }
00495 }
00496
00497
00498 g_free(pOldNetworks);
00499
00500
00501 *pNetworks = pNewNetworks;
00502 }