00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00030 #include <errno.h>
00031 #include <fcntl.h>
00032 #include <limits.h>
00033 #include <stdio.h>
00034 #include <stdlib.h>
00035 #include <string.h>
00036 #include <sys/param.h>
00037 #include <sys/stat.h>
00038 #include <sys/types.h>
00039 #include <unistd.h>
00040
00041 #include <glib.h>
00042
00043 #include "erreglog.h"
00044 #include "erreg.h"
00045 #include "erregbasis.h"
00046 #include "erregrwlock.h"
00047 #include "erregtypes_f.h"
00048
00049
00050
00052
00053
00054
00056 static const gchar scMinsetString[] =
00057 "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"
00058 "<iLiadRegistry>\n"
00059 " <version>\n"
00060 " <registry>21002</registry>\n"
00061 " </version>\n"
00062 " <userProfile>\n"
00063 " <name/>\n"
00064 " <email/>\n"
00065 " <password/>\n"
00066 " <redirectUrl>https://ids.irexnet.com:443/redirector</redirectUrl>\n"
00067 " </userProfile>\n"
00068 " <userSetting>\n"
00069 " <language>en_US</language>\n"
00070 " <sound>\n"
00071 " <enable>false</enable>\n"
00072 " <volume>75</volume>\n"
00073 " </sound>\n"
00074 " <longKeyPressTimeout>1000</longKeyPressTimeout>\n"
00075 " <flipbarDirection>true</flipbarDirection>\n"
00076 " <keyBuffering>\n"
00077 " <enable>false</enable>\n"
00078 " <numberOfKeys>5</numberOfKeys>\n"
00079 " </keyBuffering>\n"
00080 " </userSetting>\n"
00081 " <pcProfileList>\n"
00082 " <pcProfile profileID=\"PC_0\">\n"
00083 " <profileName/>\n"
00084 " <pcName>MyComputer</pcName>\n"
00085 " <shareName>iLiad</shareName>\n"
00086 " <workgroup>mshome</workgroup>\n"
00087 " <userName/>\n"
00088 " <password/>\n"
00089 " </pcProfile>\n"
00090 " </pcProfileList>\n"
00091 " <autoConnect>\n"
00092 " <serverType>IDS</serverType>\n"
00093 " <background>\n"
00094 " <interval>15</interval>\n"
00095 " <enable>false</enable>\n"
00096 " </background>\n"
00097 " <timedIds>\n"
00098 " <enable>false</enable>\n"
00099 " <timeSet>\n"
00100 " <time>13:00:00</time>\n"
00101 " </timeSet>\n"
00102 " <swUpdate>false</swUpdate>\n"
00103 " <switchOff>false</switchOff>\n"
00104 " </timedIds>\n"
00105 " </autoConnect>\n"
00106 " <categories>\n"
00107 " <category type=\"MODE\">\n"
00108 " <location>/var/mode</location>\n"
00109 " <sort>\n"
00110 " <field>FSNAME</field>\n"
00111 " <ascending>true</ascending>\n"
00112 " </sort>\n"
00113 " </category>\n"
00114 " </categories>\n"
00115 " <usbExport>MAIN</usbExport>\n"
00116 " <applications>\n"
00117 " <application type=\"SETUP\">\n"
00118 " <appCategory>setup</appCategory>\n"
00119 " <execute>/usr/bin/setup</execute>\n"
00120 " <argMask/>\n"
00121 " <xResourceName>setup</xResourceName>\n"
00122 " <ipcChannel>3</ipcChannel>\n"
00123 " <appIconPath/>\n"
00124 " </application>\n"
00125 " <application type=\"PROFILES\">\n"
00126 " <appCategory>setup</appCategory>\n"
00127 " <argMask/>\n"
00128 " <execute>/usr/bin/connectionMgr --edit-only</execute>\n"
00129 " <xResourceName>connectionMgr</xResourceName>\n"
00130 " <ipcChannel>12</ipcChannel>\n"
00131 " <appIconPath/>\n"
00132 " </application>\n"
00133 " </applications>\n"
00134 " <startup>\n"
00135 " <behaviour>DEVICE_MANAGER</behaviour>\n"
00136 " <documentPath/>\n"
00137 " </startup>\n"
00138 "</iLiadRegistry>\n";
00139
00140 void basisRegInitXpathList(regRegistry_t * pRegistry)
00141 {
00142 ERREG_BASIS_LOGPRINTF("entry");
00143 g_assert(pRegistry);
00144
00145 xpathList_t *xpaths = g_new0(xpathList_t, 1);
00146 g_assert(xpaths);
00147
00148 xpaths->version = "/" EL_REGISTRY_ROOT "/" EL_VERSION;
00149 xpaths->userProfile = "/" EL_REGISTRY_ROOT "/" EL_USER_PROFILE;
00150 xpaths->userSetting = "/" EL_REGISTRY_ROOT "/" EL_USER_SETTING;
00151 xpaths->pcProfiles = "/" EL_REGISTRY_ROOT "/" EL_PC_PROFILES;
00152 xpaths->pcProfile = "/" EL_REGISTRY_ROOT "/" EL_PC_PROFILES "/" EL_PC_PROFILE;
00153 xpaths->autoConnect = "/" EL_REGISTRY_ROOT "/" EL_AUTO_CONNECT;
00154 xpaths->category = "/" EL_REGISTRY_ROOT "/" EL_CATEGORIES "/" EL_CATEGORY;
00155 xpaths->usbExport = "/" EL_REGISTRY_ROOT "/" EL_EXPORT_MEMORYTYPE;
00156 xpaths->lastRead = "/" EL_REGISTRY_ROOT "/" EL_LASTREADS "/" EL_LASTREAD;
00157 xpaths->application = "/" EL_REGISTRY_ROOT "/" EL_APPLICATIONS "/" EL_APPLICATION;
00158 xpaths->extensionInfos = "/" EL_REGISTRY_ROOT "/" EL_EXTENSION_INFOS;
00159 xpaths->extensionInfo = "/" EL_REGISTRY_ROOT "/" EL_EXTENSION_INFOS "/" EL_EXTENSION_INFO;
00160 xpaths->startup = "/" EL_REGISTRY_ROOT "/" EL_START_UP;
00161
00162 pRegistry->xpaths = xpaths;
00163 }
00164
00165 void basisRegDestroyXpathList(regRegistry_t * pRegistry)
00166 {
00167 ERREG_BASIS_LOGPRINTF("entry");
00168 g_assert(pRegistry);
00169
00170 g_free(pRegistry->xpaths);
00171 pRegistry->xpaths = NULL;
00172 }
00173
00174 static regRegistry_t* basisRegLoadFromMinSet(void)
00175 {
00176 ERREG_BASIS_LOGPRINTF("entry");
00177
00178 regRegistry_t *pRegistry = NULL;
00179 gboolean bRet = FALSE;
00180
00181 if (scMinsetString)
00182 {
00183
00184 pRegistry = g_new0(regRegistry_t, 1);
00185 g_assert(pRegistry != NULL);
00186
00187
00188 int nRet = ermXmlParseBuffer( scMinsetString,
00189 REG_DIR "/" REG_BASIS_XML_FILE,
00190 &(pRegistry->xmlCxt) );
00191 if (RET_OK == nRet)
00192 {
00193
00194 bRet = xsdLoad(&(pRegistry->xsdCxt), REG_BASIS_XSD_PATH);
00195 if (bRet)
00196 {
00197
00198 bRet = regValidate(pRegistry);
00199 }
00200 }
00201
00202
00203 if (FALSE == bRet)
00204 {
00205 regDestroy(pRegistry);
00206 pRegistry = NULL;
00207 }
00208 }
00209
00210 return pRegistry;
00211 }
00212
00213
00214 regPCConfig_t *basisRegNewPCConfig(int size)
00215 {
00216 ERREG_BASIS_LOGPRINTF("entry");
00217
00218 regPCConfig_t *thePCConfig = NULL;
00219
00220 thePCConfig = g_new0(regPCConfig_t, 1);
00221 if (thePCConfig)
00222 {
00223 int i = 0;
00224
00225 thePCConfig->size = size;
00226 thePCConfig->pcList = g_new0(char *, thePCConfig->size + 1);
00227 for (i = 0; i < size; i++)
00228 {
00229 thePCConfig->pcList[i] = g_strdup_printf("PC_%d", i);
00230 }
00231 thePCConfig->pcList[size] = NULL;
00232 }
00233 else
00234 {
00235 ERREG_BASIS_ERRORPRINTF("memory allocation error");
00236 }
00237
00238 regDumpPCConfig(thePCConfig);
00239
00240 return thePCConfig;
00241 }
00242
00243
00245
00246
00247
00249
00250 regLoad_t basisRegLoad(regRegistry_t** ppRegistry)
00251 {
00252 ERREG_BASIS_LOGPRINTF("entry");
00253
00254 const char* path_registry = REG_DIR "/" REG_BASIS_XML_FILE;
00255 const char* path_template = TEMPLATE_DIR "/" REG_BASIS_XML_FILE;
00256 const char* path_xsd = REG_BASIS_XSD_PATH;
00257
00258 regRegistry_t* pRegistry = NULL;
00259 int ret = loadOk_t;
00260
00261
00262 pRegistry = regParseFiles(path_registry, path_xsd);
00263 if (pRegistry)
00264 {
00265 ERREG_BASIS_LOGPRINTF("Loading basis registry succeeded.");
00266 ret = loadOk_t;
00267 }
00268 else
00269 {
00270
00271 pRegistry = regParseFiles(path_template, path_xsd);
00272 if (pRegistry)
00273 {
00274 ERREG_BASIS_WARNPRINTF("Loading basis registry failed, "
00275 "but loading template registry succeeded.");
00276 ret = loadTemplate_t;
00277 }
00278 else
00279 {
00280
00281 ERREG_BASIS_ERRORPRINTF("Loading basis registry failed "
00282 "and loading template failed.");
00283 pRegistry = basisRegLoadFromMinSet();
00284 if (pRegistry)
00285 {
00286 ret = loadMinSet_t;
00287 }
00288 else
00289 {
00290 ERREG_BASIS_ERRORPRINTF("Loading basis registry "
00291 "and template and minset failed.");
00292 ret = loadError_t;
00293 }
00294 }
00295
00296
00297 if (pRegistry)
00298 {
00299 pRegistry->changed = TRUE;
00300 if (erRegGetLockState() == lock_write)
00301 {
00302 regStore(pRegistry, path_registry);
00303 }
00304 }
00305 }
00306
00307
00308 if (pRegistry)
00309 {
00310 basisRegInitXpathList(pRegistry);
00311 }
00312
00313 *ppRegistry = pRegistry;
00314 return ret;
00315 }
00316
00317
00318 void basisRegUnload(regRegistry_t* pRegistry)
00319 {
00320 ERREG_BASIS_LOGPRINTF("entry");
00321
00322 if (pRegistry)
00323 {
00324 basisRegDestroyXpathList(pRegistry);
00325 regDestroy(pRegistry);
00326 }
00327 }
00328
00329
00330 gboolean basisRegStore(regRegistry_t* pRegistry)
00331 {
00332 g_assert(pRegistry);
00333
00334 return regStore(pRegistry, REG_DIR "/" REG_BASIS_XML_FILE);
00335 }
00336
00337
00339
00340
00341
00343
00344
00345
00346 regPCProfile_t *basisRegGetPCProfileFromList(regPCConfig_t * pPCConfig,
00347 regPCProfile_t ** pPCs, const char *ID, int *index)
00348 {
00349 ERREG_BASIS_LOGPRINTF("entry");
00350
00351 int i;
00352 gboolean bExist = FALSE;
00353 regPCProfile_t *thePCProfile = NULL;
00354
00355
00356 for (i = 0; i < pPCConfig->size; i++)
00357 {
00358 if (!strcmp(pPCConfig->pcList[i], ID))
00359 {
00360 bExist = TRUE;
00361 *index = i;
00362 break;
00363 }
00364 }
00365
00366 if (bExist)
00367 {
00368 thePCProfile = pPCs[*index];
00369 }
00370
00371 return thePCProfile;
00372 }
00373
00374
00375
00376
00377
00378 void basisRegAddPCProfileToList(regPCConfig_t ** pPCConfig,
00379 regPCProfile_t *** pPCs, regPCProfile_t * pNewPCProfile)
00380 {
00381 ERREG_BASIS_LOGPRINTF("entry");
00382
00383 regPCConfig_t *pNewPCConfig = NULL, *pOldPCConfig = NULL;
00384 regPCProfile_t **pNewPCs = NULL, **pOldPCs = NULL;
00385 int i;
00386
00387 pOldPCConfig = *pPCConfig;
00388 pOldPCs = *pPCs;
00389
00390
00391 pNewPCConfig = basisRegNewPCConfig(pOldPCConfig->size+1);
00392
00393
00394 pNewPCs = g_new0(regPCProfile_t *, pNewPCConfig->size);
00395 for (i = 0; i < pOldPCConfig->size; i++)
00396 {
00397 pNewPCs[i] = pOldPCs[i];
00398 }
00399 pNewPCs[pNewPCConfig->size - 1] = pNewPCProfile;
00400
00401
00402 regFreePCConfig(pOldPCConfig);
00403 g_free(pOldPCs);
00404
00405
00406 *pPCConfig = pNewPCConfig;
00407 *pPCs = pNewPCs;
00408 }
00409
00410
00411
00412
00413
00414 void basisRegDeletePCProfileFromList(regPCConfig_t ** pPCConfig,
00415 regPCProfile_t *** pPCs, const char *ID)
00416 {
00417 ERREG_BASIS_LOGPRINTF("entry");
00418
00419 regPCConfig_t *pNewPCConfig = NULL, *pOldPCConfig = NULL;
00420 regPCProfile_t **pNewPCs = NULL, **pOldPCs = NULL;
00421 int i, index;
00422
00423 pOldPCConfig = *pPCConfig;
00424 pOldPCs = *pPCs;
00425
00426
00427 pNewPCConfig = basisRegNewPCConfig(pOldPCConfig->size-1);
00428
00429
00430 pNewPCs = g_new0(regPCProfile_t *, pNewPCConfig->size);
00431
00432 regPCProfile_t *pPCProfile = basisRegGetPCProfileFromList(pOldPCConfig, pOldPCs, ID, &index);
00433
00434 for (i = 0; i < index; i++)
00435 {
00436 pNewPCs[i] = pOldPCs[i];
00437 }
00438
00439 for (i = index + 1; i < pOldPCConfig->size; i++)
00440 {
00441 pPCProfile = pOldPCs[i];
00442 pNewPCs[i - 1] = pPCProfile;
00443 }
00444
00445
00446 regFreePCConfig(pOldPCConfig);
00447 regFreePCProfile(pOldPCs[index]);
00448 g_free(pOldPCs);
00449
00450
00451 *pPCConfig = pNewPCConfig;
00452 *pPCs = pNewPCs;
00453 }
00454
00455
00456
00457 void basisRegSetPCProfileDefault(regPCConfig_t ** pPCConfig,
00458 regPCProfile_t *** pPCs, const char *ID)
00459 {
00460 ERREG_BASIS_LOGPRINTF("entry");
00461
00462 regPCConfig_t *pOldPCConfig = NULL;
00463 regPCProfile_t **pNewPCs = NULL, **pOldPCs = NULL;
00464 int i, index;
00465
00466 pOldPCConfig = *pPCConfig;
00467 pOldPCs = *pPCs;
00468
00469
00470 pNewPCs = g_new0(regPCProfile_t *, pOldPCConfig->size);
00471
00472 regPCProfile_t *pPCProfile = basisRegGetPCProfileFromList(pOldPCConfig, pOldPCs, ID, &index);
00473 for (i = 0; i < pOldPCConfig->size; i++)
00474 {
00475 pPCProfile = pOldPCs[i];
00476
00477 if (i < index)
00478 {
00479 pNewPCs[i + 1] = pOldPCs[i];
00480 }
00481 else if (i == index)
00482 {
00483 pNewPCs[0] = pPCProfile;
00484 }
00485 else
00486 {
00487 pNewPCs[i] = pOldPCs[i];
00488 }
00489 }
00490
00491
00492 g_free(pOldPCs);
00493
00494
00495 *pPCs = pNewPCs;
00496 }
00497