int obex_setpath(int od, const char *path, uint8_t flags) { unsigned char taildata[2] = { 0x00, 0x00 }; obex_t *handle = obex_handles[0]; struct obex_context *context; char unicode[200]; int err, size; obex_object_t *object; obex_headerdata_t hd; if (!(context = OBEX_GetUserData(handle))) return -1; if (context->state != OBEX_CONNECTED) return -1; if (context->mode != OBEX_IDLE) return -1; context->mode = OBEX_REQUEST; if (!(object = OBEX_ObjectNew(handle, OBEX_CMD_SETPATH))) return -1; if (context->cid > 0) { hd.bq4 = context->cid; OBEX_ObjectAddHeader(handle, object, OBEX_HDR_CONNECTION, hd, 4, OBEX_FL_FIT_ONE_PACKET); } if (path) { size = OBEX_CharToUnicode((uint8_t *) unicode, (uint8_t *) path, sizeof(unicode)); hd.bs = (uint8_t *) unicode; OBEX_ObjectAddHeader(handle, object, OBEX_HDR_NAME, hd, size, OBEX_FL_FIT_ONE_PACKET); } taildata[0] = flags; OBEX_ObjectSetNonHdrData(object, taildata, sizeof(taildata)); if ((err = OBEX_Request(handle, object)) < 0) return err; while (1) { OBEX_HandleInput(handle, OBEX_TIMEOUT); if (context->mode == OBEX_ERROR) { err = -EIO; break; } if (context->mode == OBEX_DONE) break; } context->mode = OBEX_IDLE; return err; }
// // Do OBEX SetPath // static int ircp_setpath(ircp_client_t *cli, char *name, int up) { obex_object_t *object; obex_headerdata_t hdd; uint8_t setpath_nohdr_data[2] = {0,}; uint8_t *ucname; int ucname_len; int ret; DEBUG(4, "%s\n", name); object = OBEX_ObjectNew(cli->obexhandle, OBEX_CMD_SETPATH); if(up) { setpath_nohdr_data[0] = 1; } else { ucname_len = strlen(name)*2 + 2; ucname = malloc(ucname_len); if(ucname == NULL) { OBEX_ObjectDelete(cli->obexhandle, object); return -1; } ucname_len = OBEX_CharToUnicode(ucname, (uint8_t *) name, ucname_len); hdd.bs = ucname; OBEX_ObjectAddHeader(cli->obexhandle, object, OBEX_HDR_NAME, hdd, ucname_len, 0); free(ucname); } OBEX_ObjectSetNonHdrData(object, setpath_nohdr_data, 2); ret = cli_sync_request(cli, object); return ret; }
int obex_delete(obex_t *handle, const char *name) { obex_context_t *context = OBEX_GetUserData(handle); obex_object_t *object; obex_headerdata_t hd; int err; g_return_val_if_fail(context != NULL, -1); if (context->state != OBEX_OPEN && context->state != OBEX_CONNECT && context->state != OBEX_CONNECTED) return -ENOTCONN; object = OBEX_ObjectNew(handle, OBEX_CMD_PUT); if (!object) return -ENOMEM; if (context->cid != CID_INVALID) { hd.bq4 = context->cid; OBEX_ObjectAddHeader(handle, object, OBEX_HDR_CONNECTION, hd, 4, OBEX_FL_FIT_ONE_PACKET); } if (name) { int len, ulen = (strlen(name) + 1) * 2; uint8_t *unicode = malloc(ulen); if (!unicode) { OBEX_ObjectDelete(handle, object); return -ENOMEM; } len = OBEX_CharToUnicode(unicode, (uint8_t *) name, ulen); hd.bs = unicode; err = OBEX_ObjectAddHeader(handle, object, OBEX_HDR_NAME, hd, len, OBEX_FL_FIT_ONE_PACKET); if (err < 0) { OBEX_ObjectDelete(handle, object); free(unicode); return err; } free(unicode); } err = obex_send_or_queue(handle, object); if (err < 0) OBEX_ObjectDelete(handle, object); return err; }
// // Create an object from a file. Attach some info-headers to it // obex_object_t *build_object_from_file(obex_t *handle, const char *localname, const char *remotename) { obex_object_t *object = NULL; obex_headerdata_t hdd; uint8_t *ucname; int ucname_len, size; char lastmod[21*2] = {"1970-01-01T00:00:00Z"}; /* Get filesize and modification-time */ size = get_fileinfo(localname, lastmod); object = OBEX_ObjectNew(handle, OBEX_CMD_PUT); if(object == NULL) return NULL; ucname_len = strlen(remotename)*2 + 2; ucname = malloc(ucname_len); if(ucname == NULL) goto err; ucname_len = OBEX_CharToUnicode(ucname, remotename, ucname_len); hdd.bs = ucname; OBEX_ObjectAddHeader(handle, object, OBEX_HDR_NAME, hdd, ucname_len, 0); free(ucname); hdd.bq4 = size; OBEX_ObjectAddHeader(handle, object, OBEX_HDR_LENGTH, hdd, sizeof(uint32_t), 0); #if 0 /* Win2k excpects this header to be in unicode. I suspect this in incorrect so this will have to wait until that's investigated */ hdd.bs = lastmod; OBEX_ObjectAddHeader(handle, object, OBEX_HDR_TIME, hdd, strlen(lastmod)+1, 0); #endif hdd.bs = NULL; OBEX_ObjectAddHeader(handle, object, OBEX_HDR_BODY, hdd, 0, OBEX_FL_STREAM_START); DEBUG(4, "Lastmod = %s\n", lastmod); return object; err: if(object != NULL) OBEX_ObjectDelete(handle, object); return NULL; }
obex_object_t *build_object_from_file(obex_t *handle, const char *filename, uint32_t creator_id) { obex_headerdata_t hdd; uint8_t unicode_buf[200]; int namebuf_len; obex_object_t *object; //uint32_t creator_id; int file_size; char *name = NULL; uint8_t *buf; buf = easy_readfile(filename, &file_size); if(buf == NULL) return NULL; /* Set Memopad as the default creator ID */ if(creator_id == 0) creator_id = MEMO_PAD; /* Find the . in the filename */ name = strchr(filename, '.'); if (name) { name++; if (strcmp(name, "vcf") == 0) { printf( "This is a Address Book file\n"); creator_id = ADDRESS_BOOK; } else if (strcmp(name, "vcs") == 0) { printf( "This is a Date Book file\n"); creator_id = DATE_BOOK; } else if (strcmp(name, "txt") == 0) { printf("This is a Memo pad file\n"); creator_id = MEMO_PAD; } else if (strcmp(name, "prc") == 0) { printf("This is a Pilot resource file\n"); creator_id = PILOT_RESOURCE; } } /* Build object */ object = OBEX_ObjectNew(handle, OBEX_CMD_PUT); namebuf_len = OBEX_CharToUnicode(unicode_buf, (uint8_t *) filename, sizeof(unicode_buf)); hdd.bs = unicode_buf; OBEX_ObjectAddHeader(handle, object, OBEX_HDR_NAME, hdd, namebuf_len, 0); hdd.bq4 = file_size; OBEX_ObjectAddHeader(handle, object, OBEX_HDR_LENGTH, hdd, sizeof(uint32_t), 0); #if 0 /* Optional header for win95 irxfer, allows date to be set on file */ OBEX_ObjectAddHeader(handle, object, OBEX_HDR_TIME2, (obex_headerdata_t) (uint32_t) stats.st_mtime, sizeof(uint32_t), 0); #endif if (obex_protocol_type != 1) { /* Optional header for Palm Pilot */ /* win95 irxfer does not seem to like this one */ hdd.bq4 = creator_id; OBEX_ObjectAddHeader(handle, object, HEADER_CREATOR_ID, hdd, sizeof(uint32_t), 0); } hdd.bs = buf; OBEX_ObjectAddHeader(handle, object, OBEX_HDR_BODY, hdd, file_size, 0); free(buf); return object; }
int obex_setpath(obex_t *handle, const char *path, int create) { obex_context_t *context = OBEX_GetUserData(handle); obex_object_t *object; obex_headerdata_t hd; obex_setpath_hdr_t sphdr; int ret; g_return_val_if_fail(context != NULL, -1); if (context->state != OBEX_CONNECTED) return -ENOTCONN; object = OBEX_ObjectNew(handle, OBEX_CMD_SETPATH); if (!object) return -ENOMEM; if (context->cid != CID_INVALID) { hd.bq4 = context->cid; OBEX_ObjectAddHeader(handle, object, OBEX_HDR_CONNECTION, hd, 4, 0); } memset(&sphdr, 0, sizeof(obex_setpath_hdr_t)); if (strcmp(path, "..") == 0) { /* Can't create parent dir */ if (create) return -EINVAL; sphdr.flags = 0x03; } else { int len, ulen = (strlen(path) + 1) * 2; uint8_t *unicode = malloc(ulen); if (!create) sphdr.flags = 0x02; if (!unicode) { OBEX_ObjectDelete(handle, object); return -ENOMEM; } len = OBEX_CharToUnicode(unicode, (uint8_t *) path, ulen); hd.bs = unicode; ret = OBEX_ObjectAddHeader(handle, object, OBEX_HDR_NAME, hd, len, 0); if (ret < 0) { OBEX_ObjectDelete(handle, object); free(unicode); return ret; } free(unicode); } OBEX_ObjectSetNonHdrData(object, (uint8_t *) &sphdr, 2); ret = obex_send_or_queue(handle, object); if (ret < 0) OBEX_ObjectDelete(handle, object); return ret; }
int obex_get(obex_t *handle, const char *type, const char *name) { obex_context_t *context = OBEX_GetUserData(handle); obex_object_t *object; obex_headerdata_t hd; int err, cmd; g_return_val_if_fail(context != NULL, -1); if (context->state != OBEX_OPEN && context->state != OBEX_CONNECT && context->state != OBEX_CONNECTED) return -ENOTCONN; cmd = OBEX_ObjectGetCommand(handle, NULL); if (cmd == OBEX_CMD_GET || cmd == OBEX_CMD_PUT) return -EBUSY; /* Initialize transfer variables */ context->data_start = 0; context->data_length = 0; context->counter = 0; context->target_size = -1; context->modtime = -1; context->close = 0; object = OBEX_ObjectNew(handle, OBEX_CMD_GET); if (!object) return -ENOMEM; if (context->cid != CID_INVALID) { hd.bq4 = context->cid; OBEX_ObjectAddHeader(handle, object, OBEX_HDR_CONNECTION, hd, 4, OBEX_FL_FIT_ONE_PACKET); } if (type) { int len = strlen(type) + 1; hd.bs = (uint8_t *) type; err = OBEX_ObjectAddHeader(handle, object, OBEX_HDR_TYPE, hd, len, OBEX_FL_FIT_ONE_PACKET); if (err < 0) { OBEX_ObjectDelete(handle, object); return err; } } if (name) { int len, ulen = (strlen(name) + 1) * 2; uint8_t *unicode = malloc(ulen); if (!unicode) { OBEX_ObjectDelete(handle, object); return -ENOMEM; } len = OBEX_CharToUnicode(unicode, (uint8_t *) name, ulen); hd.bs = unicode; err = OBEX_ObjectAddHeader(handle, object, OBEX_HDR_NAME, hd, len, OBEX_FL_FIT_ONE_PACKET); if (err < 0) { OBEX_ObjectDelete(handle, object); free(unicode); return err; } free(unicode); } OBEX_ObjectReadStream(handle, object, NULL); err = obex_send_or_queue(handle, object); if (err < 0) OBEX_ObjectDelete(handle, object); return err; }
int obex_put(obex_t *handle, const char *type, const char *name, int size, time_t mtime) { obex_context_t *context = OBEX_GetUserData(handle); obex_object_t *object; obex_headerdata_t hd; int err, cmd; g_return_val_if_fail(context != NULL, -1); if (context->state != OBEX_OPEN && context->state != OBEX_CONNECT && context->state != OBEX_CONNECTED) return -ENOTCONN; cmd = OBEX_ObjectGetCommand(handle, NULL); if (cmd == OBEX_CMD_GET || cmd == OBEX_CMD_PUT) return -EBUSY; /* Initialize transfer variables */ context->data_start = 0; context->data_length = 0; context->counter = 0; context->target_size = size; context->modtime = mtime; context->close = 0; object = OBEX_ObjectNew(handle, OBEX_CMD_PUT); if (!object) return -ENOMEM; if (context->cid != CID_INVALID) { hd.bq4 = context->cid; OBEX_ObjectAddHeader(handle, object, OBEX_HDR_CONNECTION, hd, 4, OBEX_FL_FIT_ONE_PACKET); } if (type) { int len = strlen(type) + 1; hd.bs = (uint8_t *) type; err = OBEX_ObjectAddHeader(handle, object, OBEX_HDR_TYPE, hd, len, OBEX_FL_FIT_ONE_PACKET); if (err < 0) { OBEX_ObjectDelete(handle, object); return err; } } if (name) { int len, ulen = (strlen(name) + 1) * 2; uint8_t *unicode = malloc(ulen); if (!unicode) { OBEX_ObjectDelete(handle, object); return -ENOMEM; } len = OBEX_CharToUnicode(unicode, (uint8_t *) name, ulen); hd.bs = unicode; err = OBEX_ObjectAddHeader(handle, object, OBEX_HDR_NAME, hd, len, OBEX_FL_FIT_ONE_PACKET); if (err < 0) { OBEX_ObjectDelete(handle, object); free(unicode); return err; } free(unicode); } /* Add a time header if possible */ if (context->modtime >= 0) { char tstr[17]; int len; len = make_iso8601(context->modtime, tstr, sizeof(tstr)); if (len >= 0) { debug("Adding time header: %s", tstr); hd.bs = (uint8_t *) tstr; OBEX_ObjectAddHeader(handle, object, OBEX_HDR_TIME, hd, len, 0); } } /* Add a length header if possible */ if (context->target_size > 0) { debug("Adding length header: %d", context->target_size); hd.bq4 = (uint32_t) context->target_size; OBEX_ObjectAddHeader(handle, object, OBEX_HDR_LENGTH, hd, 4, 0); } hd.bs = NULL; OBEX_ObjectAddHeader(handle, object, OBEX_HDR_BODY, hd, 0, OBEX_FL_STREAM_START); /* We need to suspend until the user has provided some data * by calling obex_client_write */ debug("OBEX_SuspendRequest"); OBEX_SuspendRequest(handle, object); err = obex_send_or_queue(handle, object); if (err < 0) OBEX_ObjectDelete(handle, object); return err; }
int obex_get(int od, const char *type, const char *name, unsigned char **data, size_t *size) { obex_t *handle = obex_handles[0]; struct obex_context *context; char *unicode; int err, len, ulen; obex_object_t *object; obex_headerdata_t hd; if (!(context = OBEX_GetUserData(handle))) return -1; if (context->state != OBEX_CONNECTED) return -1; if (context->mode != OBEX_IDLE) return -1; context->command = OBEX_CMD_GET; context->response = 0; if (!(object = OBEX_ObjectNew(handle, OBEX_CMD_GET))) return -1; if (context->cid > 0) { hd.bq4 = context->cid; OBEX_ObjectAddHeader(handle, object, OBEX_HDR_CONNECTION, hd, 4, OBEX_FL_FIT_ONE_PACKET); } if (type) { hd.bs = (uint8_t *) type; OBEX_ObjectAddHeader(handle, object, OBEX_HDR_TYPE, hd, strlen(type) + 1, OBEX_FL_FIT_ONE_PACKET); } if (name) { ulen = (strlen(name) + 1) * 2; unicode = malloc(ulen); if (!unicode) { OBEX_ObjectDelete(handle, object); return -1; } len = OBEX_CharToUnicode((uint8_t *) unicode, (uint8_t *) name, ulen); hd.bs = (uint8_t *) unicode; OBEX_ObjectAddHeader(handle, object, OBEX_HDR_NAME, hd, len, OBEX_FL_FIT_ONE_PACKET); free(unicode); } if ((err = OBEX_Request(handle, object)) < 0) return err; context->time = time(0); while (1) { OBEX_HandleInput(handle, OBEX_TIMEOUT); if (context->response) break; } //printf("Rsp: %02x\n", context->response); //printf("Err: %s\n", strerror(obex_error(context->response))); if (context->response == OBEX_RSP_SUCCESS) { *data = context->data_buf; *size = context->data_len; } else { free(context->data_buf); err = -1; } context->mode = OBEX_IDLE; return err; }