SDP client for myBlueUSB
Dependents: mbed_TANK_Kinect ftusbClass
sdp.h@0:7493bf6bb1b9, 2011-04-04 (annotated)
- Committer:
- networker
- Date:
- Mon Apr 04 16:45:20 2011 +0000
- Revision:
- 0:7493bf6bb1b9
- Child:
- 1:70ee392bcfd4
initial revision
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
networker | 0:7493bf6bb1b9 | 1 | #ifndef SDP_H |
networker | 0:7493bf6bb1b9 | 2 | #define SDP_H |
networker | 0:7493bf6bb1b9 | 3 | |
networker | 0:7493bf6bb1b9 | 4 | #include <map> |
networker | 0:7493bf6bb1b9 | 5 | #define OFFSET 8 |
networker | 0:7493bf6bb1b9 | 6 | |
networker | 0:7493bf6bb1b9 | 7 | class SDPManager; |
networker | 0:7493bf6bb1b9 | 8 | extern SDPManager SDP; |
networker | 0:7493bf6bb1b9 | 9 | typedef map<unsigned short, sdp_data*> serv_rec; |
networker | 0:7493bf6bb1b9 | 10 | |
networker | 0:7493bf6bb1b9 | 11 | void attribHandler(serv_rec *r); |
networker | 0:7493bf6bb1b9 | 12 | |
networker | 0:7493bf6bb1b9 | 13 | //at the moment, SDP can handle only one connection at a time |
networker | 0:7493bf6bb1b9 | 14 | class SDPManager: public SocketHandler { |
networker | 0:7493bf6bb1b9 | 15 | int _l2cap; |
networker | 0:7493bf6bb1b9 | 16 | int sdp_socket; //at the moment the only socket |
networker | 0:7493bf6bb1b9 | 17 | unsigned char l2cap_buf[100+OFFSET]; |
networker | 0:7493bf6bb1b9 | 18 | unsigned char* buf; |
networker | 0:7493bf6bb1b9 | 19 | unsigned txid; |
networker | 0:7493bf6bb1b9 | 20 | sdp_data *tree;//root of the entire service tree |
networker | 0:7493bf6bb1b9 | 21 | map<unsigned, serv_rec*> services;//the set of supported services <handle, service> |
networker | 0:7493bf6bb1b9 | 22 | map<unsigned, serv_rec*>::iterator index; |
networker | 0:7493bf6bb1b9 | 23 | public: |
networker | 0:7493bf6bb1b9 | 24 | SDPManager(): _l2cap(0), txid(1), tree(0) { |
networker | 0:7493bf6bb1b9 | 25 | ErrorResponse=errorhandler; |
networker | 0:7493bf6bb1b9 | 26 | ServiceSearchResponse=0; |
networker | 0:7493bf6bb1b9 | 27 | ServiceAttributeResponse=attribHandler; |
networker | 0:7493bf6bb1b9 | 28 | ServiceSearchAttributeResponse=0; |
networker | 0:7493bf6bb1b9 | 29 | buf = l2cap_buf+OFFSET; |
networker | 0:7493bf6bb1b9 | 30 | } |
networker | 0:7493bf6bb1b9 | 31 | |
networker | 0:7493bf6bb1b9 | 32 | //Called as: Socket_Open(SOCKET_SDP, addr, callback, userdata(this)) |
networker | 0:7493bf6bb1b9 | 33 | virtual int Open(SocketInternal* sock, SocketAddrHdr* addr) { |
networker | 0:7493bf6bb1b9 | 34 | L2CAPAddr* ad = (L2CAPAddr*)addr; |
networker | 0:7493bf6bb1b9 | 35 | if (_l2cap) { |
networker | 0:7493bf6bb1b9 | 36 | printf("This SDP supports only one connection at a time\n"); |
networker | 0:7493bf6bb1b9 | 37 | return 0; |
networker | 0:7493bf6bb1b9 | 38 | } |
networker | 0:7493bf6bb1b9 | 39 | //BD_ADDR* a = &ad->bdaddr; |
networker | 0:7493bf6bb1b9 | 40 | sdp_socket = sock->ID; |
networker | 0:7493bf6bb1b9 | 41 | for (index = services.begin(); index != services.end(); index++) |
networker | 0:7493bf6bb1b9 | 42 | delete (*index).second; |
networker | 0:7493bf6bb1b9 | 43 | services.clear(); |
networker | 0:7493bf6bb1b9 | 44 | ad->psm = L2CAP_PSM_SDP;//open the l2cap channel |
networker | 0:7493bf6bb1b9 | 45 | _l2cap = Socket_Open(SOCKET_L2CAP, addr, OnSdpRsp, this);//this is the socket between SDP and the L2CAP layer |
networker | 0:7493bf6bb1b9 | 46 | if (_l2cap <= 0) { |
networker | 0:7493bf6bb1b9 | 47 | printf("Opening L2CAP channel failed\n"); |
networker | 0:7493bf6bb1b9 | 48 | return _l2cap; |
networker | 0:7493bf6bb1b9 | 49 | } |
networker | 0:7493bf6bb1b9 | 50 | printf("Successfully opened L2CAP channel for SDP on socket %d\n", _l2cap); |
networker | 0:7493bf6bb1b9 | 51 | return sock->ID; |
networker | 0:7493bf6bb1b9 | 52 | } |
networker | 0:7493bf6bb1b9 | 53 | |
networker | 0:7493bf6bb1b9 | 54 | virtual int Send(SocketInternal* sock, const u8* data, int len) { |
networker | 0:7493bf6bb1b9 | 55 | printf("SDPManager::Send should not be called directly\n"); |
networker | 0:7493bf6bb1b9 | 56 | return Socket_Send(_l2cap, data, len); |
networker | 0:7493bf6bb1b9 | 57 | } |
networker | 0:7493bf6bb1b9 | 58 | |
networker | 0:7493bf6bb1b9 | 59 | virtual int Close(SocketInternal* sock) { |
networker | 0:7493bf6bb1b9 | 60 | printf("SDP socket %d and L2CAP socket %d closed\n", sock->ID, _l2cap); |
networker | 0:7493bf6bb1b9 | 61 | return Socket_Close(_l2cap); |
networker | 0:7493bf6bb1b9 | 62 | } |
networker | 0:7493bf6bb1b9 | 63 | |
networker | 0:7493bf6bb1b9 | 64 | virtual char* Name() { |
networker | 0:7493bf6bb1b9 | 65 | return "SDPManager SocketHandler"; |
networker | 0:7493bf6bb1b9 | 66 | } |
networker | 0:7493bf6bb1b9 | 67 | |
networker | 0:7493bf6bb1b9 | 68 | //this function is called when the L2CAP layer receives SDP packets (see SDPManager::Open), userdata is the sdpmanager instance |
networker | 0:7493bf6bb1b9 | 69 | static void OnSdpRsp(int socket, SocketState state, const u8* data, int len, void* userData) ; |
networker | 0:7493bf6bb1b9 | 70 | //this function is called when the SDP sockets receives data (see HCICallback in TestShell), |
networker | 0:7493bf6bb1b9 | 71 | //currently does not happen because not forwarded from OnSdpRsp, can be used to handle multiple connections |
networker | 0:7493bf6bb1b9 | 72 | static void OnSockCallback(int socket, SocketState state, const u8* data, int len, void* userData) ; |
networker | 0:7493bf6bb1b9 | 73 | static void errorhandler(unsigned err); |
networker | 0:7493bf6bb1b9 | 74 | |
networker | 0:7493bf6bb1b9 | 75 | void (*ErrorResponse)(unsigned) ; |
networker | 0:7493bf6bb1b9 | 76 | void (*ServiceSearchResponse)() ; |
networker | 0:7493bf6bb1b9 | 77 | void (*ServiceAttributeResponse)(serv_rec*) ; |
networker | 0:7493bf6bb1b9 | 78 | void (*ServiceSearchAttributeResponse)() ; |
networker | 0:7493bf6bb1b9 | 79 | int ServiceSearchRequest(sdp_data *sp, unsigned count, unsigned cs=0); |
networker | 0:7493bf6bb1b9 | 80 | int ServiceAttributeRequest(unsigned handle, unsigned count, sdp_data* al, unsigned cs=0) ; |
networker | 0:7493bf6bb1b9 | 81 | int ServiceSearchAttributeRequest(sdp_data *sp, unsigned count, sdp_data* al, unsigned cs=0); |
networker | 0:7493bf6bb1b9 | 82 | private: |
networker | 0:7493bf6bb1b9 | 83 | unsigned length(const unsigned char *el, unsigned &p); |
networker | 0:7493bf6bb1b9 | 84 | unsigned getval(const unsigned char *p, int n) ; |
networker | 0:7493bf6bb1b9 | 85 | unsigned parse (const unsigned char *el, unsigned count, sdp_data* &result, serv_rec* &record) ; |
networker | 0:7493bf6bb1b9 | 86 | int parseRsp(const unsigned char*rsp, int len) ; |
networker | 0:7493bf6bb1b9 | 87 | }; |
networker | 0:7493bf6bb1b9 | 88 | |
networker | 0:7493bf6bb1b9 | 89 | #endif |