00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #include <map>
00018 #include <string>
00019
00020 using namespace std;
00021
00022 typedef map<unsigned int, dtn_handle_t> HandleMap;
00023
00024 HandleMap Handles;
00025 static unsigned int HandleID = 1;
00026
00027
00028 int
00029 dtn_open()
00030 {
00031 dtn_handle_t ret = 0;
00032 int err = dtn_open(&ret);
00033 if (err != DTN_SUCCESS) {
00034 return -1;
00035 }
00036
00037 unsigned int i = HandleID++;
00038 Handles[i] = ret;
00039 return i;
00040 }
00041
00042
00043 static dtn_handle_t
00044 find_handle(int i)
00045 {
00046 HandleMap::iterator iter = Handles.find(i);
00047 if (iter == Handles.end())
00048 return NULL;
00049 return iter->second;
00050 }
00051
00052
00053 void
00054 dtn_close(int handle)
00055 {
00056 dtn_handle_t h = find_handle(handle);
00057 if (!h) return;
00058 dtn_close(h);
00059 }
00060
00061
00062 int
00063 dtn_errno(int handle)
00064 {
00065 dtn_handle_t h = find_handle(handle);
00066 if (!h) return DTN_EINVAL;
00067 return dtn_errno(h);
00068 }
00069
00070
00071 string
00072 dtn_build_local_eid(int handle, const char* service_tag)
00073 {
00074 dtn_handle_t h = find_handle(handle);
00075 if (!h) return "";
00076
00077 dtn_endpoint_id_t eid;
00078 memset(&eid, 0, sizeof(eid));
00079 dtn_build_local_eid(h, &eid, service_tag);
00080 return string(eid.uri);
00081 }
00082
00083
00084 static int
00085 build_reginfo(dtn_reg_info_t* reginfo,
00086 const string& endpoint,
00087 unsigned int flags,
00088 unsigned int expiration,
00089 bool init_passive,
00090 const string& script)
00091 {
00092 memset(reginfo, 0, sizeof(dtn_reg_info_t));
00093
00094 strcpy(reginfo->endpoint.uri, endpoint.c_str());
00095 reginfo->flags = flags;
00096 reginfo->expiration = expiration;
00097 reginfo->init_passive = init_passive;
00098 reginfo->script.script_len = script.length();
00099 reginfo->script.script_val = (char*)script.c_str();
00100
00101 return 0;
00102 }
00103
00104
00105 int
00106 dtn_register(int handle,
00107 const string& endpoint,
00108 unsigned int flags,
00109 int expiration,
00110 bool init_passive,
00111 const string& script)
00112 {
00113 dtn_handle_t h = find_handle(handle);
00114 if (!h) return -1;
00115
00116 dtn_reg_info_t reginfo;
00117 build_reginfo(®info, endpoint, flags, expiration,
00118 init_passive, script);
00119
00120 dtn_reg_id_t regid = 0;
00121 int ret = dtn_register(h, ®info, ®id);
00122 if (ret != DTN_SUCCESS) {
00123 return -1;
00124 }
00125 return regid;
00126 }
00127
00128
00129 int
00130 dtn_unregister(int handle, dtn_reg_id_t regid)
00131 {
00132 dtn_handle_t h = find_handle(handle);
00133 if (!h) return -1;
00134
00135 return dtn_unregister(h, regid);
00136 }
00137
00138
00139 int
00140 dtn_find_registration(int handle, const string& endpoint)
00141 {
00142 dtn_handle_t h = find_handle(handle);
00143 if (!h) return -1;
00144
00145 dtn_endpoint_id_t eid;
00146 strcpy(eid.uri, endpoint.c_str());
00147
00148 dtn_reg_id_t regid = 0;
00149
00150 int err = dtn_find_registration(h, &eid, ®id);
00151 if (err != DTN_SUCCESS) {
00152 return -1;
00153 }
00154
00155 return regid;
00156 }
00157
00158
00159 int
00160 dtn_change_registration(int handle,
00161 dtn_reg_id_t regid,
00162 const string& endpoint,
00163 unsigned int action,
00164 int expiration,
00165 bool init_passive,
00166 const string& script)
00167 {
00168 dtn_handle_t h = find_handle(handle);
00169 if (!h) return -1;
00170
00171 dtn_reg_info_t reginfo;
00172 build_reginfo(®info, endpoint, action, expiration,
00173 init_passive, script);
00174
00175 return dtn_change_registration(h, regid, ®info);
00176 }
00177
00178
00179 int
00180 dtn_bind(int handle, int regid)
00181 {
00182 dtn_handle_t h = find_handle(handle);
00183 if (!h) return -1;
00184 return dtn_bind(h, regid);
00185 }
00186
00187
00188 int
00189 dtn_unbind(int handle, int regid)
00190 {
00191 dtn_handle_t h = find_handle(handle);
00192 if (!h) return -1;
00193 return dtn_unbind(h, regid);
00194 }
00195
00196
00197 struct dtn_bundle_id {
00198 string source;
00199 unsigned int creation_secs;
00200 unsigned int creation_seqno;
00201 };
00202
00203
00204 dtn_bundle_id*
00205 dtn_send(int handle,
00206 int regid,
00207 const string& source,
00208 const string& dest,
00209 const string& replyto,
00210 unsigned int priority,
00211 unsigned int dopts,
00212 unsigned int expiration,
00213 unsigned int payload_location,
00214 const string& payload_data,
00215 const string& sequence_id = "",
00216 const string& obsoletes_id = "")
00217 {
00218 dtn_handle_t h = find_handle(handle);
00219 if (!h) return NULL;
00220
00221 dtn_bundle_spec_t spec;
00222 memset(&spec, 0, sizeof(spec));
00223
00224 strcpy(spec.source.uri, source.c_str());
00225 strcpy(spec.dest.uri, dest.c_str());
00226 strcpy(spec.replyto.uri, replyto.c_str());
00227 spec.priority = (dtn_bundle_priority_t)priority;
00228 spec.dopts = dopts;
00229 spec.expiration = expiration;
00230
00231 if (sequence_id.length() != 0) {
00232 spec.sequence_id.data.data_val = const_cast<char*>(sequence_id.c_str());
00233 spec.sequence_id.data.data_len = sequence_id.length();
00234 }
00235
00236 if (obsoletes_id.length() != 0) {
00237 spec.obsoletes_id.data.data_val = const_cast<char*>(obsoletes_id.c_str());
00238 spec.obsoletes_id.data.data_len = obsoletes_id.length();
00239 }
00240
00241 dtn_bundle_payload_t payload;
00242 memset(&payload, 0, sizeof(payload));
00243
00244 switch (payload_location) {
00245 case DTN_PAYLOAD_MEM:
00246 payload.location = DTN_PAYLOAD_MEM;
00247 payload.buf.buf_val = (char*)payload_data.data();
00248 payload.buf.buf_len = payload_data.length();
00249 break;
00250 case DTN_PAYLOAD_FILE:
00251 payload.location = DTN_PAYLOAD_FILE;
00252 payload.filename.filename_val = (char*)payload_data.data();
00253 payload.filename.filename_len = payload_data.length();
00254 break;
00255 case DTN_PAYLOAD_TEMP_FILE:
00256 payload.location = DTN_PAYLOAD_TEMP_FILE;
00257 payload.filename.filename_val = (char*)payload_data.data();
00258 payload.filename.filename_len = payload_data.length();
00259 break;
00260 default:
00261 dtn_set_errno(h, DTN_EINVAL);
00262 return NULL;
00263 }
00264
00265 dtn_bundle_id_t id;
00266 memset(&id, 0, sizeof(id));
00267 int err = dtn_send(h, regid, &spec, &payload, &id);
00268 if (err != DTN_SUCCESS) {
00269 return NULL;
00270 }
00271
00272 dtn_bundle_id* ret = new dtn_bundle_id();
00273 ret->source = id.source.uri;
00274 ret->creation_secs = id.creation_ts.secs;
00275 ret->creation_seqno = id.creation_ts.seqno;
00276
00277 return ret;
00278 }
00279
00280
00281 int
00282 dtn_cancel(int handle, const dtn_bundle_id& id)
00283 {
00284 dtn_handle_t h = find_handle(handle);
00285 if (!h) return -1;
00286
00287 dtn_bundle_id_t id2;
00288 strcpy(id2.source.uri, id.source.c_str());
00289 id2.creation_ts.secs = id.creation_secs;
00290 id2.creation_ts.seqno = id.creation_seqno;
00291 return dtn_cancel(h, &id2);
00292 }
00293
00294
00295 struct dtn_status_report {
00296 dtn_bundle_id bundle_id;
00297 unsigned int reason;
00298 unsigned int flags;
00299 unsigned int receipt_ts_secs;
00300 unsigned int receipt_ts_seqno;
00301 unsigned int custody_ts_secs;
00302 unsigned int custody_ts_seqno;
00303 unsigned int forwarding_ts_secs;
00304 unsigned int forwarding_ts_seqno;
00305 unsigned int delivery_ts_secs;
00306 unsigned int delivery_ts_seqno;
00307 unsigned int deletion_ts_secs;
00308 unsigned int deletion_ts_seqno;
00309 unsigned int ack_by_app_ts_secs;
00310 unsigned int ack_by_app_ts_seqno;
00311 };
00312
00313
00314 string
00315 dtn_status_report_reason_to_str(unsigned int reason)
00316 {
00317 return dtn_status_report_reason_to_str((dtn_status_report_reason_t)reason);
00318 }
00319
00320
00321 struct dtn_bundle {
00322 string source;
00323 string dest;
00324 string replyto;
00325 unsigned int priority;
00326 unsigned int dopts;
00327 unsigned int expiration;
00328 unsigned int creation_secs;
00329 unsigned int creation_seqno;
00330 unsigned int delivery_regid;
00331 string sequence_id;
00332 string obsoletes_id;
00333 string payload;
00334 dtn_status_report* status_report;
00335 };
00336
00337
00338 dtn_bundle*
00339 dtn_recv(int handle, unsigned int payload_location, int timeout)
00340 {
00341 dtn_handle_t h = find_handle(handle);
00342 if (!h) return NULL;
00343
00344 dtn_bundle_spec_t spec;
00345 memset(&spec, 0, sizeof(spec));
00346
00347 dtn_bundle_payload_t payload;
00348 memset(&payload, 0, sizeof(payload));
00349
00350 dtn_bundle_payload_location_t location =
00351 (dtn_bundle_payload_location_t)payload_location;
00352
00353 int err = dtn_recv(h, &spec, location, &payload, timeout);
00354 if (err != DTN_SUCCESS) {
00355 return NULL;
00356 }
00357
00358 dtn_bundle* bundle = new dtn_bundle();
00359 bundle->source = spec.source.uri;
00360 bundle->dest = spec.dest.uri;
00361 bundle->replyto = spec.replyto.uri;
00362 bundle->priority = spec.priority;
00363 bundle->dopts = spec.dopts;
00364 bundle->expiration = spec.expiration;
00365 bundle->creation_secs = spec.creation_ts.secs;
00366 bundle->creation_seqno = spec.creation_ts.seqno;
00367 bundle->delivery_regid = spec.delivery_regid;
00368
00369 switch(location) {
00370 case DTN_PAYLOAD_MEM:
00371 bundle->payload.assign(payload.buf.buf_val,
00372 payload.buf.buf_len);
00373 break;
00374 case DTN_PAYLOAD_FILE:
00375 case DTN_PAYLOAD_TEMP_FILE:
00376 bundle->payload.assign(payload.filename.filename_val,
00377 payload.filename.filename_len);
00378 break;
00379 default:
00380 dtn_set_errno(h, DTN_EINVAL);
00381 return NULL;
00382 }
00383
00384 if (payload.status_report) {
00385 dtn_status_report* sr_dst = new dtn_status_report();
00386 dtn_bundle_status_report_t* sr_src = payload.status_report;
00387
00388 sr_dst->bundle_id.source = sr_src->bundle_id.source.uri;
00389 sr_dst->bundle_id.creation_secs = sr_src->bundle_id.creation_ts.secs;
00390 sr_dst->bundle_id.creation_seqno = sr_src->bundle_id.creation_ts.seqno;
00391 sr_dst->reason = sr_src->reason;
00392 sr_dst->flags = sr_src->flags;
00393 sr_dst->receipt_ts_secs = sr_src->receipt_ts.secs;
00394 sr_dst->receipt_ts_seqno = sr_src->receipt_ts.seqno;
00395 sr_dst->custody_ts_secs = sr_src->custody_ts.secs;
00396 sr_dst->custody_ts_seqno = sr_src->custody_ts.seqno;
00397 sr_dst->forwarding_ts_secs = sr_src->forwarding_ts.secs;
00398 sr_dst->forwarding_ts_seqno = sr_src->forwarding_ts.seqno;
00399 sr_dst->delivery_ts_secs = sr_src->delivery_ts.secs;
00400 sr_dst->delivery_ts_seqno = sr_src->delivery_ts.seqno;
00401 sr_dst->deletion_ts_secs = sr_src->deletion_ts.secs;
00402 sr_dst->deletion_ts_seqno = sr_src->deletion_ts.seqno;
00403 sr_dst->ack_by_app_ts_secs = sr_src->ack_by_app_ts.secs;
00404 sr_dst->ack_by_app_ts_seqno = sr_src->ack_by_app_ts.seqno;
00405
00406 bundle->status_report = sr_dst;
00407 } else {
00408 bundle->status_report = NULL;
00409 }
00410
00411 return bundle;
00412 }
00413
00414
00415 struct dtn_session_info {
00416 unsigned int status;
00417 string session;
00418 };
00419
00420
00421 dtn_session_info*
00422 dtn_session_update(int handle, int timeout)
00423 {
00424 dtn_handle_t h = find_handle(handle);
00425 if (!h) return NULL;
00426
00427 unsigned int status = 0;
00428 dtn_endpoint_id_t session;
00429 memset(&session, 0, sizeof(session));
00430
00431 int err = dtn_session_update(h, &status, &session, timeout);
00432 if (err != DTN_SUCCESS) {
00433 return NULL;
00434 }
00435
00436 dtn_session_info* s = new dtn_session_info();
00437 s->status = status;
00438 s->session = session.uri;
00439
00440 return s;
00441 }
00442
00443
00444 int
00445 dtn_poll_fd(int handle)
00446 {
00447 dtn_handle_t h = find_handle(handle);
00448 if (!h) return DTN_EINVAL;
00449
00450 return dtn_poll_fd(h);
00451 }
00452
00453
00454 int
00455 dtn_begin_poll(int handle, int timeout)
00456 {
00457 dtn_handle_t h = find_handle(handle);
00458 if (!h) return DTN_EINVAL;
00459
00460 return dtn_begin_poll(h, timeout);
00461 }
00462
00463
00464 int
00465 dtn_cancel_poll(int handle)
00466 {
00467 dtn_handle_t h = find_handle(handle);
00468 if (!h) return DTN_EINVAL;
00469
00470 return dtn_cancel_poll(h);
00471 }