📄 obex.c
字号:
* @self: OBEX handle * @nice: If true an OBEX Abort will be sent if beeing client * or OBEX_RSP_UNAUTHORIZED as reponse if beeing server. * * */int OBEX_CancelRequest(obex_t *self, int nice){ obex_return_val_if_fail(self != NULL, -1); return obex_cancelrequest(self, nice);}/** * OBEX_ObjectNew - Create a new OBEX Object * @self: OBEX handle * @cmd: command of object * * Returns a pointer to a new OBEX Object or %NULL on error. */obex_object_t *OBEX_ObjectNew(obex_t *self, uint8_t cmd){ obex_object_t *object; object = obex_object_new(); if(object == NULL) return NULL; obex_object_setcmd(object, cmd, (uint8_t) (cmd | OBEX_FINAL)); /* Need some special woodoo magic on connect-frame */ if(cmd == OBEX_CMD_CONNECT) { if(obex_insert_connectframe(self, object) < 0) { obex_object_delete(object); object = NULL; } } return object;}/** * OBEX_ObjectDelete - Delete an OBEX object * @self: OBEX handle * @object: object to delete. * * Note that as soon as you have passed an object to the lib using * OBEX_Request(), you shall not delete it yourself. */int OBEX_ObjectDelete(obex_t *self, obex_object_t *object){ obex_return_val_if_fail(object != NULL, -1); return obex_object_delete(object);}/** * OBEX_ObjectAddHeader - Attach a header to an object * @self: OBEX handle * @object: OBEX object * @hi: Header identifier * @hv: Header value * @hv_size: Header size * @flags: See obex.h for possible values * * Add a new header to an object. * * If you want all headers to fit in one packet, use the flag * %OBEX_FL_FIT_ONE_PACKET on all headers you add to an object. * * To stream a body add a body header with hv.bs = %NULL and set the flag * %OBEX_FL_STREAM_START. You will now get %OBEX_EV_STREAMEMPTY events as * soon as the the parser wants you to feed it with more data. * * When you get an %OBEX_EV_STREAMEMPTY event give the parser some data by * adding a body-header and set the flag %OBEX_EV_STREAM_DATA. When you * have no more data to send set the flag %OBEX_EV_STREAM_DATAEND instead. * * After adding a header you are free to do whatever you want with the buffer * if you are NOT streaming. If you are streaming you may not touch the * buffer until you get another %OBEX_EV_STREAMEMTPY or until the request * finishes. * * The headers will be sent in the order you add them. */int OBEX_ObjectAddHeader(obex_t *self, obex_object_t *object, uint8_t hi, obex_headerdata_t hv, uint32_t hv_size, unsigned int flags){ obex_return_val_if_fail(object != NULL, -1); return obex_object_addheader(self, object, hi, hv, hv_size, flags);}/** * OBEX_ObjectGetNextHeader - Get next available header from an object * @self: OBEX handle * @object: OBEX object * @hi: Pointer to header identifier * @hv: Pointer to hv * @hv_size: Pointer to hv_size * * Returns 0 when no more headers are available. * * All headers are read-only. * * You will get the headers in the received order. */int OBEX_ObjectGetNextHeader(obex_t *self, obex_object_t *object, uint8_t *hi, obex_headerdata_t *hv, uint32_t *hv_size){ obex_return_val_if_fail(self != NULL, -1); obex_return_val_if_fail(object != NULL, -1); return obex_object_getnextheader(self, object, hi, hv, hv_size);}/** * OBEX_ObjectReParseHeaders - Allow the user to parse again the rx headers * @self: OBEX handle * @object: OBEX object * * The user must have extracted all headers from the object before * calling this function (until %OBEX_ObjectGetNextHeader() returns 0). * Next call to %OBEX_ObjectGetNextHeader() will return the first received * header. * * Returns 1 on success * Returns 0 if failed due previous parsing not completed. */int OBEX_ObjectReParseHeaders(obex_t *self, obex_object_t *object){ obex_return_val_if_fail(self != NULL, -1); obex_return_val_if_fail(object != NULL, -1); return obex_object_reparseheaders(self, object);}/** * OBEX_ObjectReadStream - Read data from body stream * @self: OBEX handle * @object: OBEX object * @buf: A pointer to a pointer which this function will set to a buffer which * shall be read (and ONLY read) after this function returns. * * To recieve the body as a stream call this function with buf = %NULL as soon * as you get an OBEX_EV_REQHINT event. * * You will now recieve %OBEX_EV_STREAMAVAIL events when data is available * for you. Call this function to get the data. * * Note! When receiving a stream data is not buffered so if you don't call this * function when you get an %OBEX_EV_STREAMAVAIL event data will be lost. * * Returns the number of bytes in buffer, or 0 for end-of-stream. */int OBEX_ObjectReadStream(obex_t *self, obex_object_t *object, const uint8_t **buf){ obex_return_val_if_fail(self != NULL, -1); obex_return_val_if_fail(object != NULL, -1); return obex_object_readstream(self, object, buf);}/** * OBEX_ObjectSetRsp - Sets the response to a received request. * @self: OBEX handle * @object: OBEX object * @rsp: Respose code in non-last packets * @lastrsp: Response code in last packet * * Returns -1 on error. */int OBEX_ObjectSetRsp(obex_object_t *object, uint8_t rsp, uint8_t lastrsp){ obex_return_val_if_fail(object != NULL, -1); return obex_object_setrsp(object, rsp, lastrsp);}/** * OBEX_ObjectGetNonHdrData - Get any data which was before headers * @object: OBEX object * @buffer: Pointer to a pointer which will point to a read-only buffer * * Returns the size of the buffer or -1 for error. */int OBEX_ObjectGetNonHdrData(obex_object_t *object, uint8_t **buffer){ obex_return_val_if_fail(object != NULL, -1); if(!object->rx_nonhdr_data) return 0; *buffer = object->rx_nonhdr_data->data; return object->rx_nonhdr_data->len;}/** * OBEX_ObjectSetNonHdrData - Set data to send before headers * @object: OBEX object * @buffer: Data to send * @len: Length to data * * Some commands (notably SetPath) send data before headers. Use this * function to set this data. */int OBEX_ObjectSetNonHdrData(obex_object_t *object, const uint8_t *buffer, unsigned int len){ //TODO: Check that we actually can send len bytes without violating MTU obex_return_val_if_fail(object != NULL, -1); obex_return_val_if_fail(buffer != NULL, -1); if(object->tx_nonhdr_data) return -1; object->tx_nonhdr_data = g_netbuf_new(len); if(object->tx_nonhdr_data == NULL) return -1; g_netbuf_put_data(object->tx_nonhdr_data, (uint8_t *)buffer, len); return 1;}/** * OBEX_ObjectSetHdrOffset - Set headeroffset * @object: OBEX object * @offset: Desired offset * * Call this function when you get a OBEX_EV_REQHINT and you know that the * command has data before the headers comes. You do NOT need to use this * function on Connect and SetPath, they are handled automatically. */int OBEX_ObjectSetHdrOffset(obex_object_t *object, unsigned int offset){ obex_return_val_if_fail(object != NULL, -1); object->headeroffset = offset; return 1;}/** * OBEX_UnicodeToChar - Simple unicode to char function. * @c: Destination (char) * @uc: Source (unicode) * @size: Length of destination buffer, at least half the size of source * * Buffers may not overlap. Returns -1 on error. */int OBEX_UnicodeToChar(uint8_t *c, const uint8_t *uc, int size){ int n; DEBUG(4, "\n"); obex_return_val_if_fail(uc != NULL, -1); obex_return_val_if_fail(c != NULL, -1); // Make sure buffer is big enough! for(n = 0; uc[n*2+1] != 0; n++); obex_return_val_if_fail(n < size, -1); for(n = 0; uc[n*2+1] != 0; n++) c[n] = uc[n*2+1]; c[n] = 0; return 0;}/** * OBEX_CharToUnicode - Simple char to unicode function. * @uc: Destination (unicode) * @c: Source (char) * @size: Length of destination buffer, at least twice the size of source * * Buffers may not overlap. Returns -1 on error. */int OBEX_CharToUnicode(uint8_t *uc, const uint8_t *c, int size){ int len, n; DEBUG(4, "\n"); obex_return_val_if_fail(uc != NULL, -1); obex_return_val_if_fail(c != NULL, -1); len = n = strlen(c); obex_return_val_if_fail(n*2+2 <= size, -1); uc[n*2+1] = 0; uc[n*2] = 0; while(n--) { uc[n*2+1] = c[n]; uc[n*2] = 0; } return (len*2)+2 ;}/** * OBEX_ResponseToString - Return a human understandable string from a response-code. * @rsp: Response code. * * The returned char must not be freed. Returns %NULL on error. */char *OBEX_ResponseToString(int rsp){ DEBUG(4, "\n"); return obex_response_to_string(rsp);}/** * OBEX_GetResponseMessage - Return a human understandable string from a response-code. * @self: OBEX handle * @rsp: Response code. * * The returned char must not be freed. Returns %NULL on error. */char* OBEX_GetResponseMessage(obex_t *self, int rsp){ DEBUG(4, "\n"); return obex_response_to_string(rsp);}/* ---------------------------------------------------------------- *//** * OBEX_SetCustomData - Set customdata of an OBEX handle * @self: OBEX handle * @data: Custom Transport data * * Note : this call is *reserved* to the Custom Transport and should not * be use by the user/client. It allow to update the Custom Transport data * originally set via OBEX_RegisterCTransport(). * The Custom Transport data (or instance handle) is used to store data * relative to the specific instance (i.e. connection), such as file * descriptors, offsets and others, so that the Custom Transport can manage * multiple connections transparently (i.e. without a lookup table). * - Jean II */void OBEX_SetCustomData(obex_t *self, void * data){ obex_return_if_fail(self != NULL); self->ctrans.customdata = data;}/** * OBEX_GetCustomData - Read the customdata from an OBEX handle * @self: OBEX handle * * Returns Custom Transport data */void * OBEX_GetCustomData(obex_t *self){ obex_return_val_if_fail(self != NULL, 0); return self->ctrans.customdata;}/** * InOBEX_ServerRegister - Start listening for incoming connections * @self: OBEX handle * * An easier server function to use for TCP/IP (InOBEX) only. * * Returns -1 on error. */int InOBEX_ServerRegister(obex_t *self){ DEBUG(3, "\n"); obex_return_val_if_fail(self != NULL, -1); inobex_prepare_listen(self); return obex_transport_listen(self);}/** * InOBEX_TransportConnect - Connect Inet transport * @self: OBEX handle * * An easier connect function to use for TCP/IP (InOBEX) only. * * Note : I would like feedback on this API to know which input * parameter make most sense. Thanks... */int InOBEX_TransportConnect(obex_t *self, struct sockaddr *saddr, int addrlen){ DEBUG(4, "\n"); if (self->object) { DEBUG(1, "We are busy.\n"); return -EBUSY; } obex_return_val_if_fail(self != NULL, -1); obex_return_val_if_fail(saddr != NULL, -1); inobex_prepare_connect(self, saddr, addrlen); return obex_transport_connect_request(self);}/** * IrOBEX_ServerRegister - Start listening for incoming connections * @self: OBEX handle * @service: Service to bind to. * * An easier server function to use for IrDA (IrOBEX) only. * * Returns -1 on error. */int IrOBEX_ServerRegister(obex_t *self, const char *service){ DEBUG(3, "\n"); obex_return_val_if_fail(self != NULL, -1); obex_return_val_if_fail(service != NULL, -1);#ifdef HAVE_IRDA irobex_prepare_listen(self, service); return obex_transport_listen(self);#else return -ESOCKTNOSUPPORT;#endif /* HAVE_IRDA */}/** * IrOBEX_TransportConnect - Connect Irda transport * @self: OBEX handle * @service: IrIAS service name to connect to * * An easier connect function to use for IrDA (IrOBEX) only. */int IrOBEX_TransportConnect(obex_t *self, const char *service){ DEBUG(4, "\n"); if (self->object) { DEBUG(1, "We are busy.\n"); return -EBUSY; } obex_return_val_if_fail(self != NULL, -1);#ifdef HAVE_IRDA irobex_prepare_connect(self, service); return obex_transport_connect_request(self);#else return -ESOCKTNOSUPPORT;#endif /* HAVE_IRDA */}/** * BtOBEX_ServerRegister - Start listening for incoming connections * @self: OBEX handle * @service: Service to bind to. **FIXME** * * An easier server function to use for Bluetooth (Bluetooth OBEX) only. * * Returns -1 on error. */int BtOBEX_ServerRegister(obex_t *self, bdaddr_t *src, uint8_t channel){ DEBUG(3, "\n"); obex_return_val_if_fail(self != NULL, -1);#ifdef HAVE_BLUETOOTH if(src == NULL) src = BDADDR_ANY; btobex_prepare_listen(self, src, channel); return obex_transport_listen(self);#else return -ESOCKTNOSUPPORT;#endif /* HAVE_BLUETOOTH */}/** * BtOBEX_TransportConnect - Connect Bluetooth transport * @self: OBEX handle * @service: IrIAS service name to connect to **FIXME** * * An easier connect function to use for Bluetooth (Bluetooth OBEX) only. */int BtOBEX_TransportConnect(obex_t *self, bdaddr_t *src, bdaddr_t *dst, uint8_t channel){ DEBUG(4, "\n"); if (self->object) { DEBUG(1, "We are busy.\n"); return -EBUSY; } obex_return_val_if_fail(self != NULL, -1); obex_return_val_if_fail(dst != NULL, -1);#ifdef HAVE_BLUETOOTH if(src == NULL) src = BDADDR_ANY; btobex_prepare_connect(self, src, dst, channel); return obex_transport_connect_request(self);#else return -ESOCKTNOSUPPORT;#endif /* HAVE_BLUETOOTH */}/* * FdOBEX_TransportSetup - setup descriptors for OBEX_TRANS_FD transport * * @self: OBEX handle * @rfd: descriptor to read * @wfd: descriptor to write * @mtu: transport mtu: 0 - default */int FdOBEX_TransportSetup(obex_t *self, int rfd, int wfd, int mtu){ DEBUG(4, "\n"); if (self->object) { DEBUG(1, "We are busy.\n"); return -EBUSY; } obex_return_val_if_fail(self != NULL, -1); self->fd = rfd; self->writefd = wfd; self->trans.mtu = mtu ? mtu : self->mtu_tx_max; return obex_transport_connect_request(self);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -