00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include "data_sync_devinf.h"
00022 #include "libsyncml/syncml_internals.h"
00023 #include "libsyncml/sml_error_internals.h"
00024
00025 static SmlDevInfProperty *_add_ctcap_property_by_name(
00026 SmlDevInfCTCap *ctcap,
00027 const char *name,
00028 SmlError **error)
00029 {
00030 smlTrace(TRACE_ENTRY, "%s (%s)", __func__, VA_STRING(name));
00031 CHECK_ERROR_REF
00032 smlAssert(ctcap);
00033 smlAssert(name);
00034
00035 SmlDevInfProperty *prop = smlDevInfNewProperty(error);
00036 if (!prop)
00037 goto error;
00038 smlDevInfPropertySetPropName(prop, name);
00039 smlDevInfCTCapAddProperty(ctcap, prop);
00040
00041 smlTrace(TRACE_EXIT, "%s", __func__);
00042 return prop;
00043 error:
00044 smlTrace(TRACE_EXIT_ERROR, "%s: %s", __func__, smlErrorPrint(error));
00045 return NULL;
00046 }
00047
00048 static SmlDevInfProperty *_add_ctcap_property_by_name_value(
00049 SmlDevInfCTCap *ctcap,
00050 const char*name,
00051 const char *value,
00052 SmlError **error)
00053 {
00054 smlTrace(TRACE_ENTRY, "%s (%s ::= %s)", __func__, VA_STRING(name), VA_STRING(value));
00055 CHECK_ERROR_REF
00056 smlAssert(ctcap);
00057 smlAssert(name);
00058 smlAssert(value);
00059
00060 SmlDevInfProperty *prop = _add_ctcap_property_by_name(ctcap, name, error);
00061 if (!prop)
00062 goto error;
00063 smlDevInfPropertyAddValEnum(prop, value);
00064
00065 smlTrace(TRACE_EXIT, "%s", __func__);
00066 return prop;
00067 error:
00068 smlTrace(TRACE_EXIT_ERROR, "%s: %s", __func__, smlErrorPrint(error));
00069 return NULL;
00070 }
00071
00072 static SmlDevInfPropParam *_add_property_param(
00073 SmlDevInfProperty *prop,
00074 const char *name,
00075 SmlError **error)
00076 {
00077 smlTrace(TRACE_ENTRY, "%s (%s)", __func__, VA_STRING(name));
00078 CHECK_ERROR_REF
00079 smlAssert(prop);
00080 smlAssert(name);
00081
00082 SmlDevInfPropParam *param = smlDevInfNewPropParam(error);
00083 if (!param)
00084 goto error;
00085
00086 smlDevInfPropParamSetParamName(param, name);
00087 smlDevInfPropertyAddPropParam(prop, param);
00088
00089 smlTrace(TRACE_EXIT, "%s", __func__);
00090 return param;
00091 error:
00092 smlTrace(TRACE_EXIT_ERROR, "%s: %s", __func__, smlErrorPrint(error));
00093 return NULL;
00094 }
00095
00096 #define _ADD_PROPERTY_PARAM(text) \
00097 param = _add_property_param(prop, text, error); \
00098 if (!param) \
00099 goto error;
00100 #define _ADD_CTCAP_PROPERTY_BY_NAME(text) \
00101 prop = _add_ctcap_property_by_name(ctcap, text, error); \
00102 if (!prop) \
00103 goto error;
00104 #define _ADD_CTCAP_PROPERTY_BY_NAME_VALUE(name,value) \
00105 if (!_add_ctcap_property_by_name_value(ctcap, name, value, error)) \
00106 goto error;
00107
00108 static SmlBool add_devinf_ctcap(
00109 SmlDevInf *devinf,
00110 const char* cttype,
00111 const char *verct,
00112 SmlError **error)
00113 {
00114 smlTrace(TRACE_ENTRY, "%s (%s %s)", __func__, VA_STRING(cttype), VA_STRING(verct));
00115 CHECK_ERROR_REF
00116 smlAssert(devinf);
00117 smlAssert(cttype);
00118 smlAssert(verct);
00119
00120
00121 SmlDevInfContentType *ct = smlDevInfNewContentType(cttype, verct, error);
00122 if (!ct)
00123 goto error;
00124
00125 if (smlDevInfGetCTCap(devinf, ct) != NULL)
00126 {
00127 smlDevInfFreeContentType(ct);
00128 smlTrace(TRACE_EXIT, "%s - content type already present in devinf", __func__);
00129 return TRUE;
00130 } else {
00131 smlDevInfFreeContentType(ct);
00132 smlTrace(TRACE_INTERNAL, "%s: new content type detected", __func__);
00133 }
00134
00135 SmlDevInfCTCap *ctcap;
00136 SmlDevInfProperty *prop;
00137 SmlDevInfPropParam *param;
00138 if (!strcmp(cttype, SML_ELEMENT_TEXT_VCARD) &&
00139 !strcmp(verct, "2.1"))
00140 {
00141 smlTrace(TRACE_INTERNAL, "%s: vCard 2.1 detected", __func__);
00142 ctcap = smlDevInfNewCTCap(error);
00143 if (!ctcap)
00144 goto error;
00145
00146 smlDevInfCTCapSetCTType(ctcap, SML_ELEMENT_TEXT_VCARD);
00147 smlDevInfCTCapSetVerCT(ctcap, "2.1");
00148 _ADD_CTCAP_PROPERTY_BY_NAME("ADR")
00149 _ADD_PROPERTY_PARAM("TYPE")
00150 smlDevInfPropParamAddValEnum(param, "HOME");
00151 smlDevInfPropParamAddValEnum(param, "WORK");
00152 smlDevInfPropParamAddValEnum(param, "PARCEL");
00153 smlDevInfPropParamAddValEnum(param, "POSTAL");
00154 smlDevInfPropParamAddValEnum(param, "INTL");
00155 smlDevInfPropParamAddValEnum(param, "DOM");
00156 _ADD_PROPERTY_PARAM("HOME");
00157 _ADD_PROPERTY_PARAM("WORK");
00158 _ADD_PROPERTY_PARAM("PARCEL");
00159 _ADD_PROPERTY_PARAM("POSTAL");
00160 _ADD_PROPERTY_PARAM("INTL");
00161 _ADD_PROPERTY_PARAM("DOM");
00162 _ADD_CTCAP_PROPERTY_BY_NAME("AGENT")
00163 _ADD_CTCAP_PROPERTY_BY_NAME("BDAY")
00164 _ADD_CTCAP_PROPERTY_BY_NAME_VALUE("BEGIN","VCARD")
00165 _ADD_CTCAP_PROPERTY_BY_NAME_VALUE("END","VCARD")
00166 _ADD_CTCAP_PROPERTY_BY_NAME("EMAIL")
00167 _ADD_PROPERTY_PARAM("TYPE")
00168 smlDevInfPropParamAddValEnum(param, "INTERNET");
00169 _ADD_PROPERTY_PARAM("INTERNET");
00170 _ADD_CTCAP_PROPERTY_BY_NAME("FN")
00171 _ADD_CTCAP_PROPERTY_BY_NAME("GEO")
00172 _ADD_CTCAP_PROPERTY_BY_NAME("KEY")
00173 _ADD_PROPERTY_PARAM("TYPE")
00174 smlDevInfPropParamAddValEnum(param, "X509");
00175 smlDevInfPropParamAddValEnum(param, "PGP");
00176 _ADD_PROPERTY_PARAM("X509");
00177 _ADD_PROPERTY_PARAM("PGP");
00178 _ADD_CTCAP_PROPERTY_BY_NAME("LABEL")
00179 _ADD_PROPERTY_PARAM("TYPE")
00180 smlDevInfPropParamAddValEnum(param, "HOME");
00181 smlDevInfPropParamAddValEnum(param, "WORK");
00182 smlDevInfPropParamAddValEnum(param, "PARCEL");
00183 smlDevInfPropParamAddValEnum(param, "POSTAL");
00184 smlDevInfPropParamAddValEnum(param, "INTL");
00185 smlDevInfPropParamAddValEnum(param, "DOM");
00186 _ADD_PROPERTY_PARAM("HOME");
00187 _ADD_PROPERTY_PARAM("WORK");
00188 _ADD_PROPERTY_PARAM("PARCEL");
00189 _ADD_PROPERTY_PARAM("POSTAL");
00190 _ADD_PROPERTY_PARAM("INTL");
00191 _ADD_PROPERTY_PARAM("DOM");
00192 _ADD_CTCAP_PROPERTY_BY_NAME("LOGO")
00193 _ADD_PROPERTY_PARAM("TYPE")
00194 smlDevInfPropParamAddValEnum(param, "JPEG");
00195 _ADD_PROPERTY_PARAM("JPEG");
00196 _ADD_CTCAP_PROPERTY_BY_NAME("MAILER")
00197 _ADD_CTCAP_PROPERTY_BY_NAME("N")
00198 _ADD_CTCAP_PROPERTY_BY_NAME("NOTE")
00199 _ADD_CTCAP_PROPERTY_BY_NAME("ORG")
00200 _ADD_CTCAP_PROPERTY_BY_NAME("PHOTO")
00201 _ADD_PROPERTY_PARAM("TYPE")
00202 smlDevInfPropParamAddValEnum(param, "JPEG");
00203 _ADD_PROPERTY_PARAM("JPEG");
00204 _ADD_CTCAP_PROPERTY_BY_NAME("REV")
00205 _ADD_CTCAP_PROPERTY_BY_NAME("ROLE")
00206 _ADD_CTCAP_PROPERTY_BY_NAME("SOUND")
00207 _ADD_PROPERTY_PARAM("TYPE")
00208 smlDevInfPropParamAddValEnum(param, "AIFF");
00209 smlDevInfPropParamAddValEnum(param, "PCM");
00210 smlDevInfPropParamAddValEnum(param, "WAVE");
00211 _ADD_PROPERTY_PARAM("AIFF");
00212 _ADD_PROPERTY_PARAM("PCM");
00213 _ADD_PROPERTY_PARAM("WAVE");
00214 _ADD_CTCAP_PROPERTY_BY_NAME("TEL")
00215 _ADD_PROPERTY_PARAM("TYPE")
00216 smlDevInfPropParamAddValEnum(param, "WORK");
00217 smlDevInfPropParamAddValEnum(param, "VOICE");
00218 smlDevInfPropParamAddValEnum(param, "PREF");
00219 smlDevInfPropParamAddValEnum(param, "PAGER");
00220 smlDevInfPropParamAddValEnum(param, "MSG");
00221 smlDevInfPropParamAddValEnum(param, "MODEM");
00222 smlDevInfPropParamAddValEnum(param, "ISDN");
00223 smlDevInfPropParamAddValEnum(param, "HOME");
00224 smlDevInfPropParamAddValEnum(param, "FAX");
00225 smlDevInfPropParamAddValEnum(param, "CELL");
00226 smlDevInfPropParamAddValEnum(param, "CAR");
00227 smlDevInfPropParamAddValEnum(param, "BBS");
00228 _ADD_PROPERTY_PARAM("WORK");
00229 _ADD_PROPERTY_PARAM("VOICE");
00230 _ADD_PROPERTY_PARAM("PREF");
00231 _ADD_PROPERTY_PARAM("PAGER");
00232 _ADD_PROPERTY_PARAM("MSG");
00233 _ADD_PROPERTY_PARAM("MODEM");
00234 _ADD_PROPERTY_PARAM("ISDN");
00235 _ADD_PROPERTY_PARAM("HOME");
00236 _ADD_PROPERTY_PARAM("FAX");
00237 _ADD_PROPERTY_PARAM("CELL");
00238 _ADD_PROPERTY_PARAM("CAR");
00239 _ADD_PROPERTY_PARAM("BBS");
00240 _ADD_CTCAP_PROPERTY_BY_NAME("TITLE")
00241 _ADD_CTCAP_PROPERTY_BY_NAME("TZ")
00242 _ADD_CTCAP_PROPERTY_BY_NAME("UID")
00243 _ADD_CTCAP_PROPERTY_BY_NAME("URL")
00244 _ADD_PROPERTY_PARAM("TYPE")
00245 smlDevInfPropParamAddValEnum(param, "WORK");
00246 smlDevInfPropParamAddValEnum(param, "HOME");
00247 _ADD_PROPERTY_PARAM("WORK");
00248 _ADD_PROPERTY_PARAM("HOME");
00249 _ADD_CTCAP_PROPERTY_BY_NAME_VALUE("VERSION", "2.1")
00250 smlDevInfAppendCTCap(devinf, ctcap);
00251 }
00252 else if (!strcmp(cttype, SML_ELEMENT_TEXT_VCARD_30) &&
00253 !strcmp(verct, "3.0"))
00254 {
00255
00256
00257 smlTrace(TRACE_INTERNAL, "%s: vCard 3.0 detected", __func__);
00258 ctcap = smlDevInfNewCTCap(error);
00259 if (!ctcap)
00260 goto error;
00261
00262 smlDevInfCTCapSetCTType(ctcap, SML_ELEMENT_TEXT_VCARD_30);
00263 smlDevInfCTCapSetVerCT(ctcap, "3.0");
00264 _ADD_CTCAP_PROPERTY_BY_NAME_VALUE("BEGIN", "VCARD")
00265 _ADD_CTCAP_PROPERTY_BY_NAME_VALUE("END", "VCARD")
00266 _ADD_CTCAP_PROPERTY_BY_NAME_VALUE("VERSION", "3.0")
00267 _ADD_CTCAP_PROPERTY_BY_NAME("REV")
00268 _ADD_CTCAP_PROPERTY_BY_NAME("N")
00269 _ADD_CTCAP_PROPERTY_BY_NAME("TITLE")
00270 _ADD_CTCAP_PROPERTY_BY_NAME("CATEGORIES")
00271 _ADD_CTCAP_PROPERTY_BY_NAME("CLASS")
00272 _ADD_CTCAP_PROPERTY_BY_NAME("ORG")
00273 _ADD_CTCAP_PROPERTY_BY_NAME("EMAIL")
00274 _ADD_CTCAP_PROPERTY_BY_NAME("URL")
00275 _ADD_CTCAP_PROPERTY_BY_NAME("TEL")
00276 _ADD_PROPERTY_PARAM("TYPE")
00277 smlDevInfPropParamAddValEnum(param, "CELL");
00278 smlDevInfPropParamAddValEnum(param, "HOME");
00279 smlDevInfPropParamAddValEnum(param, "WORK");
00280 smlDevInfPropParamAddValEnum(param, "FAX");
00281 smlDevInfPropParamAddValEnum(param, "MODEM");
00282 smlDevInfPropParamAddValEnum(param, "VOICE");
00283 _ADD_CTCAP_PROPERTY_BY_NAME("ADR")
00284 _ADD_PROPERTY_PARAM("TYPE")
00285 smlDevInfPropParamAddValEnum(param, "HOME");
00286 smlDevInfPropParamAddValEnum(param, "WORK");
00287 _ADD_CTCAP_PROPERTY_BY_NAME("BDAY")
00288 _ADD_CTCAP_PROPERTY_BY_NAME("NOTE")
00289 _ADD_CTCAP_PROPERTY_BY_NAME("PHOTO")
00290 _ADD_PROPERTY_PARAM("TYPE")
00291 smlDevInfAppendCTCap(devinf, ctcap);
00292 }
00293
00294
00295
00296
00297
00298 else if (!strcmp(cttype, SML_ELEMENT_TEXT_VCAL) &&
00299 !strcmp(verct, "1.0"))
00300 {
00301 smlTrace(TRACE_INTERNAL, "%s: vCalendar 1.0 detected", __func__);
00302 ctcap = smlDevInfNewCTCap(error);
00303 if (!ctcap)
00304 goto error;
00305
00306 smlDevInfCTCapSetCTType(ctcap, SML_ELEMENT_TEXT_VCAL);
00307 smlDevInfCTCapSetVerCT(ctcap, "1.0");
00308 _ADD_CTCAP_PROPERTY_BY_NAME("AALARM")
00309 _ADD_CTCAP_PROPERTY_BY_NAME("ATTACH")
00310 _ADD_CTCAP_PROPERTY_BY_NAME("ATTENDEE")
00311 _ADD_PROPERTY_PARAM("EXCEPT")
00312 _ADD_PROPERTY_PARAM("RSVP")
00313 _ADD_PROPERTY_PARAM("STATUS")
00314 _ADD_PROPERTY_PARAM("ROLE")
00315 _ADD_CTCAP_PROPERTY_BY_NAME("BEGIN")
00316 smlDevInfPropertyAddValEnum(prop, "VCALENDAR");
00317 smlDevInfPropertyAddValEnum(prop, "VEVENT");
00318 smlDevInfPropertyAddValEnum(prop, "VTODO");
00319 _ADD_CTCAP_PROPERTY_BY_NAME("CATEGORIES")
00320 _ADD_CTCAP_PROPERTY_BY_NAME("COMPLETED")
00321 _ADD_CTCAP_PROPERTY_BY_NAME("CLASS")
00322 smlDevInfPropertyAddValEnum(prop, "PUBLIC");
00323 smlDevInfPropertyAddValEnum(prop, "PRIVATE");
00324 smlDevInfPropertyAddValEnum(prop, "CONFIDENTIAL");
00325 _ADD_CTCAP_PROPERTY_BY_NAME("DALARM")
00326 _ADD_CTCAP_PROPERTY_BY_NAME("DAYLIGHT")
00327 _ADD_CTCAP_PROPERTY_BY_NAME("DCREATED")
00328 _ADD_CTCAP_PROPERTY_BY_NAME("DESCRIPTION")
00329 _ADD_CTCAP_PROPERTY_BY_NAME("DTSTART")
00330 _ADD_CTCAP_PROPERTY_BY_NAME("DTEND")
00331 _ADD_CTCAP_PROPERTY_BY_NAME("DUE")
00332 _ADD_CTCAP_PROPERTY_BY_NAME("END")
00333 smlDevInfPropertyAddValEnum(prop, "VCALENDAR");
00334 smlDevInfPropertyAddValEnum(prop, "VEVENT");
00335 smlDevInfPropertyAddValEnum(prop, "VTODO");
00336 _ADD_CTCAP_PROPERTY_BY_NAME("EXDATE")
00337 _ADD_CTCAP_PROPERTY_BY_NAME("LAST-MODIFIED")
00338 _ADD_CTCAP_PROPERTY_BY_NAME("LOCATION")
00339 _ADD_CTCAP_PROPERTY_BY_NAME("PRIORITY")
00340 _ADD_CTCAP_PROPERTY_BY_NAME("RRULE")
00341 _ADD_CTCAP_PROPERTY_BY_NAME("STATUS")
00342 _ADD_CTCAP_PROPERTY_BY_NAME("SUMMARY")
00343 _ADD_CTCAP_PROPERTY_BY_NAME("UID")
00344 _ADD_CTCAP_PROPERTY_BY_NAME_VALUE("VERSION", "1.0")
00345 smlDevInfAppendCTCap(devinf, ctcap);
00346 }
00347 else if (!strcmp(cttype, SML_ELEMENT_TEXT_ICAL) &&
00348 !strcmp(verct, "2.0"))
00349 {
00350
00351
00352
00353 smlTrace(TRACE_INTERNAL, "%s: iCalendar (vCalendar 2.0) detected", __func__);
00354 ctcap = smlDevInfNewCTCap(error);
00355 if (!ctcap)
00356 goto error;
00357
00358 smlDevInfCTCapSetCTType(ctcap, SML_ELEMENT_TEXT_ICAL);
00359 smlDevInfCTCapSetVerCT(ctcap, "2.0");
00360 _ADD_CTCAP_PROPERTY_BY_NAME("AALARM")
00361 _ADD_CTCAP_PROPERTY_BY_NAME("ATTACH")
00362 _ADD_CTCAP_PROPERTY_BY_NAME("ATTENDEE")
00363 _ADD_PROPERTY_PARAM("RSVP")
00364 _ADD_PROPERTY_PARAM("PARTSTAT")
00365 _ADD_PROPERTY_PARAM("ROLE")
00366 _ADD_CTCAP_PROPERTY_BY_NAME("BEGIN")
00367 smlDevInfPropertyAddValEnum(prop, "VCALENDAR");
00368 smlDevInfPropertyAddValEnum(prop, "VEVENT");
00369 smlDevInfPropertyAddValEnum(prop, "VTODO");
00370 _ADD_CTCAP_PROPERTY_BY_NAME("CATEGORIES")
00371 _ADD_CTCAP_PROPERTY_BY_NAME("COMPLETED")
00372 _ADD_CTCAP_PROPERTY_BY_NAME("CLASS")
00373 smlDevInfPropertyAddValEnum(prop, "PUBLIC");
00374 smlDevInfPropertyAddValEnum(prop, "PRIVATE");
00375 smlDevInfPropertyAddValEnum(prop, "CONFIDENTIAL");
00376 _ADD_CTCAP_PROPERTY_BY_NAME("DALARM")
00377 _ADD_CTCAP_PROPERTY_BY_NAME("DAYLIGHT")
00378 _ADD_CTCAP_PROPERTY_BY_NAME("DCREATED")
00379 _ADD_CTCAP_PROPERTY_BY_NAME("DESCRIPTION")
00380 _ADD_CTCAP_PROPERTY_BY_NAME("DTSTART")
00381 _ADD_CTCAP_PROPERTY_BY_NAME("DTEND")
00382 _ADD_CTCAP_PROPERTY_BY_NAME("DUE")
00383 _ADD_CTCAP_PROPERTY_BY_NAME("END")
00384 smlDevInfPropertyAddValEnum(prop, "VCALENDAR");
00385 smlDevInfPropertyAddValEnum(prop, "VEVENT");
00386 smlDevInfPropertyAddValEnum(prop, "VTODO");
00387 _ADD_CTCAP_PROPERTY_BY_NAME("EXDATE")
00388 _ADD_CTCAP_PROPERTY_BY_NAME("LAST-MODIFIED")
00389 _ADD_CTCAP_PROPERTY_BY_NAME("LOCATION")
00390 _ADD_CTCAP_PROPERTY_BY_NAME("PRIORITY")
00391 _ADD_CTCAP_PROPERTY_BY_NAME("RRULE")
00392 _ADD_CTCAP_PROPERTY_BY_NAME("STATUS")
00393 _ADD_CTCAP_PROPERTY_BY_NAME("SUMMARY")
00394 _ADD_CTCAP_PROPERTY_BY_NAME("UID")
00395 _ADD_CTCAP_PROPERTY_BY_NAME_VALUE("VERSION", "2.0")
00396 smlDevInfAppendCTCap(devinf, ctcap);
00397 }
00398 else
00399 {
00400
00401 smlTrace(TRACE_INTERNAL, "%s: unknown content type - %s %s", __func__, VA_STRING(cttype), VA_STRING(verct));
00402 ctcap = smlDevInfNewCTCap(error);
00403 if (!ctcap)
00404 goto error;
00405 smlDevInfCTCapSetCTType(ctcap, cttype);
00406 smlDevInfCTCapSetVerCT(ctcap, verct);
00407 smlDevInfAppendCTCap(devinf, ctcap);
00408 }
00409
00410 smlTrace(TRACE_EXIT, "%s - content type newly added to devinf", __func__);
00411 return TRUE;
00412 error:
00413 smlTrace(TRACE_EXIT_ERROR, "%s: %s", __func__, smlErrorPrint(error));
00414 return FALSE;
00415 }
00416
00417 static void _update_session_config_from_devinf(SmlDataSyncObject *dsObject)
00418 {
00419 smlTrace(TRACE_ENTRY, "%s called", __func__);
00420 SmlDevInf *devinf = dsObject->remoteDevInf;
00421 SmlSession *session = dsObject->session;
00422
00423
00424
00425 smlSessionUseNumberOfChanges(session, smlDevInfSupportsNumberOfChanges(devinf));
00426 smlSessionUseLargeObjects(session, smlDevInfSupportsLargeObjs(devinf));
00427
00428
00429
00430 if (smlDevInfSupportsUTC(devinf))
00431 dsObject->onlyLocaltime = FALSE;
00432 else
00433 dsObject->onlyLocaltime = TRUE;
00434
00435 smlTrace(TRACE_EXIT, "%s succeeded", __func__);
00436 }
00437
00438
00439
00440 SmlBool smlDataSyncDevInfAddDatastore(
00441 SmlDevInf *devinf,
00442 SmlDataSyncDatastore *datastore,
00443 SmlError **error)
00444 {
00445 smlTrace(TRACE_ENTRY, "%s (%p, %p)", __func__, devinf, datastore);
00446 CHECK_ERROR_REF
00447 smlAssert(datastore);
00448 smlAssert(datastore->contentType);
00449 smlAssert(datastore->sourceUri);
00450
00451 SmlDevInfDataStore *ds = smlDevInfDataStoreNew(datastore->sourceUri, error);
00452 if (!ds)
00453 goto error;
00454
00455 const char *ct = datastore->contentType;
00456 SmlDevInfContentType *ctype;
00457
00458 if (!strcmp(ct, SML_ELEMENT_TEXT_VCARD))
00459 {
00460
00461
00462 ctype = smlDevInfNewContentType(SML_ELEMENT_TEXT_VCARD_30, "3.0", error);
00463 if (!ctype)
00464 goto error;
00465 smlDevInfDataStoreAddRx(ds, ctype);
00466 ctype = smlDevInfNewContentType(SML_ELEMENT_TEXT_VCARD_30, "3.0", error);
00467 if (!ctype)
00468 goto error;
00469 smlDevInfDataStoreAddTx(ds, ctype);
00470 smlDevInfDataStoreSetRxPref(ds, SML_ELEMENT_TEXT_VCARD, "2.1");
00471 smlDevInfDataStoreSetTxPref(ds, SML_ELEMENT_TEXT_VCARD, "2.1");
00472 if (!add_devinf_ctcap(devinf, SML_ELEMENT_TEXT_VCARD, "2.1", error))
00473 goto error;
00474 if (!add_devinf_ctcap(devinf, SML_ELEMENT_TEXT_VCARD_30, "3.0", error))
00475 goto error;
00476 }
00477 else if (!strcmp(ct, SML_ELEMENT_TEXT_VCARD_30))
00478 {
00479 ctype = smlDevInfNewContentType(SML_ELEMENT_TEXT_VCARD_30, "2.1", error);
00480 if (!ctype)
00481 goto error;
00482 smlDevInfDataStoreAddRx(ds, ctype);
00483 ctype = smlDevInfNewContentType(SML_ELEMENT_TEXT_VCARD_30, "2.1", error);
00484 if (!ctype)
00485 goto error;
00486 smlDevInfDataStoreAddTx(ds, ctype);
00487 smlDevInfDataStoreSetRxPref(ds, SML_ELEMENT_TEXT_VCARD_30, "3.0");
00488 smlDevInfDataStoreSetTxPref(ds, SML_ELEMENT_TEXT_VCARD_30, "3.0");
00489 if (!add_devinf_ctcap(devinf, SML_ELEMENT_TEXT_VCARD, "2.1", error))
00490 goto error;
00491 if (!add_devinf_ctcap(devinf, SML_ELEMENT_TEXT_VCARD_30, "3.0", error))
00492 goto error;
00493 }
00494 else if (!strcmp(ct, SML_ELEMENT_TEXT_VCAL))
00495 {
00496 ctype = smlDevInfNewContentType(SML_ELEMENT_TEXT_ICAL, "2.0", error);
00497 if (!ctype)
00498 goto error;
00499 smlDevInfDataStoreAddRx(ds, ctype);
00500 ctype = smlDevInfNewContentType(SML_ELEMENT_TEXT_ICAL, "2.0", error);
00501 if (!ctype)
00502 goto error;
00503 smlDevInfDataStoreAddTx(ds, ctype);
00504 smlDevInfDataStoreSetRxPref(ds, SML_ELEMENT_TEXT_VCAL, "1.0");
00505 smlDevInfDataStoreSetTxPref(ds, SML_ELEMENT_TEXT_VCAL, "1.0");
00506 if (!add_devinf_ctcap(devinf, SML_ELEMENT_TEXT_VCAL, "1.0", error))
00507 goto error;
00508 if (!add_devinf_ctcap(devinf, SML_ELEMENT_TEXT_ICAL, "2.0", error))
00509 goto error;
00510 }
00511 else if (!strcmp(ct, SML_ELEMENT_TEXT_ICAL))
00512 {
00513 ctype = smlDevInfNewContentType(SML_ELEMENT_TEXT_VCAL, "1.0", error);
00514 if (!ctype)
00515 goto error;
00516 smlDevInfDataStoreAddRx(ds, ctype);
00517 ctype = smlDevInfNewContentType(SML_ELEMENT_TEXT_VCAL, "1.0", error);
00518 if (!ctype)
00519 goto error;
00520 smlDevInfDataStoreAddTx(ds, ctype);
00521 smlDevInfDataStoreSetRxPref(ds, SML_ELEMENT_TEXT_ICAL, "2.0");
00522 smlDevInfDataStoreSetTxPref(ds, SML_ELEMENT_TEXT_ICAL, "2.0");
00523 if (!add_devinf_ctcap(devinf, SML_ELEMENT_TEXT_VCAL, "1.0", error))
00524 goto error;
00525 if (!add_devinf_ctcap(devinf, SML_ELEMENT_TEXT_ICAL, "2.0", error))
00526 goto error;
00527 }
00528 else if (!strcmp(ct, SML_ELEMENT_TEXT_PLAIN))
00529 {
00530 smlDevInfDataStoreSetRxPref(ds, SML_ELEMENT_TEXT_PLAIN, "1.0");
00531 smlDevInfDataStoreSetTxPref(ds, SML_ELEMENT_TEXT_PLAIN, "1.0");
00532 if (!add_devinf_ctcap(devinf, SML_ELEMENT_TEXT_PLAIN, "1.0", error))
00533 goto error;
00534 }
00535 else
00536 {
00537 smlTrace(TRACE_INTERNAL, "%s - unknown content type detected (%s)",
00538 __func__, VA_STRING(ct));
00539 smlDevInfDataStoreSetRxPref(ds, ct, "1.0");
00540 smlDevInfDataStoreSetTxPref(ds, ct, "1.0");
00541 if (!add_devinf_ctcap(devinf, ct, "1.0", error))
00542 goto error;
00543 }
00544
00545
00546 smlDevInfDataStoreSetSyncCap(ds, SML_DEVINF_SYNCTYPE_TWO_WAY, TRUE);
00547 smlDevInfDataStoreSetSyncCap(ds, SML_DEVINF_SYNCTYPE_SLOW_SYNC, TRUE);
00548
00549
00550 if (smlDsServerGetServerType(datastore->server) == SML_DS_CLIENT)
00551
00552 smlTrace(TRACE_INTERNAL, "%s: SyncML clients only support SLOW and TWO WAY SYNC", __func__);
00553 else
00554 smlDevInfDataStoreSetSyncCap(ds, SML_DEVINF_SYNCTYPE_SERVER_ALERTED_SYNC, TRUE);
00555
00556 smlDevInfAddDataStore(devinf, ds);
00557 smlTrace(TRACE_EXIT, "%s - content type newly added to devinf", __func__);
00558 return TRUE;
00559 error:
00560 smlTrace(TRACE_EXIT_ERROR, "%s: %s", __func__, smlErrorPrint(error));
00561 return FALSE;
00562 }
00563
00564 SmlBool smlDataSyncDevInfLoadRemote(
00565 SmlDataSyncObject *dsObject,
00566 SmlBool sendGet,
00567 SmlError **error)
00568 {
00569 smlTrace(TRACE_ENTRY, "%s(%p, %i, %p)", __func__, dsObject, sendGet, error);
00570 CHECK_ERROR_REF
00571 smlAssert(dsObject);
00572 smlAssertMsg(dsObject->session, "an active session is needed to have a remote device");
00573
00574
00575
00576
00577 if (dsObject->remoteDevInf)
00578 smlDevInfUnref(dsObject->remoteDevInf);
00579
00580 dsObject->remoteDevInf = smlDevInfAgentGetSessionDevInf(dsObject->agent, dsObject->session);
00581 if (dsObject->remoteDevInf)
00582 {
00583 smlTrace(TRACE_INTERNAL, "%s: The remote DevInf was received.", __func__);
00584 smlDevInfRef(dsObject->remoteDevInf);
00585 _update_session_config_from_devinf(dsObject);
00586
00587 if (dsObject->writeDevInfCallback) {
00588 smlTrace(TRACE_EXIT, "%s - calling writeDevInfCallback", __func__);
00589 return dsObject->writeDevInfCallback(
00590 dsObject, dsObject->remoteDevInf,
00591 dsObject->writeDevInfUserdata,
00592 error);
00593 } else {
00594 smlTrace(TRACE_EXIT, "%s - remote DevInf available", __func__);
00595 return TRUE;
00596 }
00597 } else {
00598 smlTrace(TRACE_INTERNAL, "%s: The remote DevInf was not received.", __func__);
00599
00600 if (dsObject->readDevInfCallback)
00601 {
00602 smlTrace(TRACE_INTERNAL, "%s: calling read DevInf callback", __func__);
00603 SmlDevInf *devinf = dsObject->readDevInfCallback(
00604 dsObject,
00605 smlLocationGetURI(smlSessionGetTarget(dsObject->session)),
00606 dsObject->readDevInfUserdata, error);
00607 if (!devinf && *error)
00608 goto error;
00609 if (devinf) {
00610 if (!smlDevInfAgentSetSessionDevInf(
00611 dsObject->agent,
00612 dsObject->session,
00613 devinf,
00614 error))
00615 {
00616 goto error;
00617 }
00618 dsObject->remoteDevInf = smlDevInfAgentGetSessionDevInf(
00619 dsObject->agent,
00620 dsObject->session);
00621
00622
00623
00624
00625 smlDevInfRef(dsObject->remoteDevInf);
00626 _update_session_config_from_devinf(dsObject);
00627 smlTrace(TRACE_EXIT, "%s - cached DevInf", __func__);
00628 return TRUE;
00629 }
00630 }
00631 if (sendGet)
00632 {
00633
00634 smlDevInfAgentSendDevInf(
00635 dsObject->agent,
00636 dsObject->session,
00637 error);
00638 smlDevInfAgentRequestDevInf(
00639 dsObject->agent,
00640 dsObject->session,
00641 error);
00642 }
00643 smlTrace(TRACE_EXIT, "%s - no remote DevInf available at all", __func__);
00644 return FALSE;
00645 }
00646 error:
00647 smlTrace(TRACE_EXIT_ERROR, "%s - %s", __func__, smlErrorPrint(error));
00648 return FALSE;
00649 }
00650
00651 char *smlDataSyncDevInfGetIdentifier()
00652 {
00653 smlTrace(TRACE_ENTRY, "%s", __func__);
00654 const char *user = g_get_user_name();
00655 const char *host = g_get_host_name();
00656 char *id = g_strjoin("@", user, host, NULL);
00657 smlTrace(TRACE_EXIT, "%s - %s", __func__, VA_STRING(id));
00658 return id;
00659
00660
00661
00662
00663
00664 }
00665
00666 SmlBool smlDataSyncDevInfInit(
00667 SmlDataSyncObject *dsObject,
00668 SmlDevInfDevTyp type,
00669 SmlError **error)
00670 {
00671 CHECK_ERROR_REF
00672 SmlDevInf *devinf = NULL;
00673
00674
00675 if (!dsObject->identifier)
00676 dsObject->identifier = smlDataSyncDevInfGetIdentifier();
00677
00678 if (dsObject->fakeDevice)
00679 {
00680 smlTrace(TRACE_INTERNAL, "%s: faking devinf", __func__);
00681 devinf = smlDevInfNew(dsObject->identifier, SML_DEVINF_DEVTYPE_SMARTPHONE, error);
00682 if (!devinf)
00683 goto error;
00684
00685 smlDevInfSetManufacturer(devinf, dsObject->fakeManufacturer);
00686 smlDevInfSetModel(devinf, dsObject->fakeModel);
00687 smlDevInfSetSoftwareVersion(devinf, dsObject->fakeSoftwareVersion);
00688 } else {
00689 smlTrace(TRACE_INTERNAL, "%s: not faking devinf", __func__);
00690 devinf = smlDevInfNew(dsObject->identifier, type, error);
00691 if (!devinf)
00692 goto error;
00693
00694 smlDevInfSetSoftwareVersion(devinf, dsObject->fakeSoftwareVersion);
00695 }
00696
00697 smlDevInfSetSupportsNumberOfChanges(devinf, TRUE);
00698 smlDevInfSetSupportsLargeObjs(devinf, TRUE);
00699 if (!dsObject->onlyLocaltime)
00700 smlDevInfSetSupportsUTC(devinf, TRUE);
00701 smlAssert(dsObject->maxMsgSize);
00702 smlAssert(dsObject->maxObjSize);
00703
00704 dsObject->localDevInf = devinf;
00705
00706 dsObject->agent = smlDevInfAgentNew(dsObject->localDevInf, error);
00707 if (!dsObject->agent)
00708 goto error;
00709 smlDevInfRef(dsObject->localDevInf);
00710
00711 if (!smlDevInfAgentRegister(dsObject->agent, dsObject->manager, error))
00712 goto error;
00713
00714 return TRUE;
00715 error:
00716 if (devinf)
00717 smlDevInfUnref(devinf);
00718 if (dsObject->agent)
00719 smlDevInfAgentFree(dsObject->agent);
00720 dsObject->localDevInf = NULL;
00721 dsObject->agent = NULL;
00722 return FALSE;
00723 }
00724
00725 SmlBool smlDataSyncManageDevInf(
00726 SmlDataSyncObject *dsObject,
00727 SmlBool sendGet,
00728 SmlError **error)
00729 {
00730 smlTrace(TRACE_ENTRY, "%s(%p, %i, %p)", __func__, dsObject, sendGet, error);
00731 CHECK_ERROR_REF
00732 smlAssertMsg(dsObject->session, "an active session is needed to manage device informations");
00733
00734
00735
00736
00737 if (dsObject->writeDevInfCallback)
00738 {
00739
00740 smlTrace(TRACE_INTERNAL, "%s: calling write DevInf callback", __func__);
00741 if (!dsObject->writeDevInfCallback(
00742 dsObject, dsObject->localDevInf,
00743 dsObject->writeDevInfUserdata, error))
00744 goto error;
00745 }
00746
00747
00748 if (smlDataSyncDevInfLoadRemote(dsObject, sendGet, error) &&
00749 dsObject->remoteDevInf &&
00750 dsObject->handleRemoteDevInfCallback &&
00751 !dsObject->handleRemoteDevInfCallback(
00752 dsObject,
00753 dsObject->remoteDevInf,
00754 dsObject->handleRemoteDevInfUserdata,
00755 error))
00756 {
00757
00758
00759
00760
00761 goto error;
00762 } else {
00763
00764
00765
00766 if (*error != NULL)
00767 goto error;
00768
00769
00770
00771 if (dsObject->remoteDevInf &&
00772 !smlDevInfSupportsUTC(dsObject->remoteDevInf))
00773 {
00774 smlTrace(TRACE_INTERNAL,
00775 "%s: enforcing localtime because of remote DevInf",
00776 __func__);
00777 dsObject->onlyLocaltime = TRUE;
00778 }
00779 }
00780
00781 smlTrace(TRACE_EXIT, "%s - TRUE", __func__);
00782 return TRUE;
00783 error:
00784 smlTrace(TRACE_EXIT_ERROR, "%s - %s", __func__, smlErrorPrint(error));
00785 return FALSE;
00786 }
00787