00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include "transport.h"
00022 #include "libsyncml/sml_error_internals.h"
00023 #include "libsyncml/sml_support.h"
00024
00025 #include "data_sync_client.h"
00026 #include "data_sync_devinf.h"
00027
00028
00029 SmlBool smlDataSyncTransportHttpClientInit(
00030 SmlDataSyncObject *dsObject,
00031 SmlError **error)
00032 {
00033 smlTrace(TRACE_ENTRY, "%s(%p, %p)", __func__, dsObject, error);
00034 CHECK_ERROR_REF
00035
00036 if (dsObject->url != NULL &&
00037 !smlTransportSetConfigOption(
00038 dsObject->tsp,
00039 SML_TRANSPORT_CONFIG_URL, dsObject->url,
00040 error))
00041 goto error;
00042 if (dsObject->username != NULL &&
00043 !smlTransportSetConfigOption(
00044 dsObject->tsp,
00045 SML_TRANSPORT_CONFIG_USERNAME, dsObject->username,
00046 error))
00047 goto error;
00048 if (dsObject->password != NULL &&
00049 !smlTransportSetConfigOption(
00050 dsObject->tsp,
00051 SML_TRANSPORT_CONFIG_PASSWORD, dsObject->password,
00052 error))
00053 goto error;
00054
00055 smlTrace(TRACE_EXIT, "%s - TRUE", __func__);
00056 return TRUE;
00057 error:
00058 smlTrace(TRACE_EXIT_ERROR, "%s - %s", __func__, smlErrorPrint(error));
00059 return FALSE;
00060 }
00061
00062 static SmlBool smlDataSyncTransportHttpClientInitNewSession (SmlDataSyncObject *dsObject, SmlError **error)
00063 {
00064 smlTrace(TRACE_ENTRY, "%s(%p, %p)", __func__, dsObject, error);
00065 smlAssert(dsObject->url);
00066 smlAssert(dsObject->identifier);
00067 smlAssert(dsObject->tsp);
00068 smlAssert(dsObject->manager);
00069 smlAssert(dsObject->agent);
00070
00071 SmlLocation *target = NULL;
00072 SmlLocation *source = NULL;
00073
00074
00075
00076
00077
00078 if (dsObject->session) {
00079 smlErrorSet(error, SML_ERROR_GENERIC,
00080 "Only one SyncML session is allowed per SmlDataSyncObject instance.");
00081 goto error;
00082 }
00083
00084
00085
00086 target = smlLocationNew(dsObject->target, NULL, error);
00087 if (!target)
00088 goto error;
00089 source = smlLocationNew(dsObject->identifier, NULL, error);
00090 if (!source)
00091 goto error;
00092
00093 char *sessionString = smlManagerGetNewSessionID(dsObject->manager);
00094 dsObject->session = smlSessionNew(SML_SESSION_TYPE_CLIENT,
00095 dsObject->useWbxml?SML_MIMETYPE_WBXML:SML_MIMETYPE_XML,
00096 dsObject->version,
00097 SML_PROTOCOL_SYNCML,
00098 target, source,
00099 sessionString, 0, error);
00100 smlSafeCFree(&sessionString);
00101 if (!dsObject->session)
00102 goto error;
00103
00104 smlLocationUnref(target);
00105 target = NULL;
00106 smlLocationUnref(source);
00107 source = NULL;
00108
00109
00110 if (!smlManagerSessionAdd(dsObject->manager, dsObject->session, NULL, error))
00111 goto error;
00112 if (!smlDevInfAgentRegisterSession(dsObject->agent, dsObject->manager, dsObject->session, error))
00113 goto error;
00114
00115 smlTrace(TRACE_EXIT, "%s", __func__);
00116 return TRUE;
00117 error:
00118 if (target) {
00119 smlLocationUnref(target);
00120 target = NULL;
00121 }
00122 if (source) {
00123 smlLocationUnref(source);
00124 source = NULL;
00125 }
00126 smlTrace(TRACE_EXIT_ERROR, "%s - %s", __func__, smlErrorPrint(error));
00127 return FALSE;
00128 }
00129
00130 SmlBool smlDataSyncTransportHttpClientConnect(SmlDataSyncObject *dsObject, SmlError **error)
00131 {
00132 smlTrace(TRACE_ENTRY, "%s(%p, %p)", __func__, dsObject, error);
00133 CHECK_ERROR_REF
00134
00135
00136 if (!smlDataSyncTransportHttpClientInitNewSession(dsObject, error))
00137 goto error;
00138
00139
00140 if (!smlDataSyncManageDevInf(dsObject, TRUE, error))
00141 goto error;
00142 smlTrace(TRACE_INTERNAL, "%s: sent devinf", __func__);
00143
00144
00145 GList *o = dsObject->datastores;
00146 for (; o; o = o->next) {
00147 SmlDataSyncDatastore *datastore = o->data;
00148
00149 if (!smlDataSyncClientSendAlert(datastore, SML_ALERT_UNKNOWN, error))
00150 goto error;
00151 }
00152 smlTrace(TRACE_INTERNAL, "%s: all datastores created their alerts", __func__);
00153
00154
00155
00156
00157
00158
00159 dsObject->actualPackage = SML_PACKAGE_1;
00160
00161
00162 if (!smlSessionFlush(dsObject->session, TRUE, error))
00163 goto error;
00164
00165 smlTrace(TRACE_EXIT, "%s", __func__);
00166 return TRUE;
00167 error:
00168 smlTrace(TRACE_EXIT_ERROR, "%s - %s", __func__, smlErrorPrint(error));
00169 return FALSE;
00170 }
00171