SDP client for myBlueUSB

Dependents:   mbed_TANK_Kinect ftusbClass

Committer:
networker
Date:
Sat Jun 11 19:43:36 2011 +0000
Revision:
4:d5c3e499603d
Parent:
3:e8d2ebb7392e
added some further server functions

Who changed what in which revision?

UserRevisionLine numberNew contents of line
networker 0:7493bf6bb1b9 1 #include "mbed.h"
networker 0:7493bf6bb1b9 2 #include "sdp_data.h"
networker 2:d5a27b2d2e08 3 #include "Utils.h"
networker 0:7493bf6bb1b9 4
networker 0:7493bf6bb1b9 5 char sdp_data::ret[12];
networker 0:7493bf6bb1b9 6
networker 0:7493bf6bb1b9 7 unsigned sdp_data::asUnsigned() {
networker 0:7493bf6bb1b9 8 switch (type) {
networker 0:7493bf6bb1b9 9 case NULL_:
networker 0:7493bf6bb1b9 10 return 0;
networker 0:7493bf6bb1b9 11 case UNSIGNED:
networker 0:7493bf6bb1b9 12 case SIGNED:
networker 0:7493bf6bb1b9 13 case BOOL:
networker 0:7493bf6bb1b9 14 return data;
networker 0:7493bf6bb1b9 15 case UUID:
networker 0:7493bf6bb1b9 16 #ifdef LONGUUID
networker 0:7493bf6bb1b9 17 return uuid[6] + uuid[7]<<16;
networker 0:7493bf6bb1b9 18 #else
networker 0:7493bf6bb1b9 19 return data;
networker 0:7493bf6bb1b9 20 #endif
networker 0:7493bf6bb1b9 21 default:
networker 0:7493bf6bb1b9 22 return 0;
networker 0:7493bf6bb1b9 23 }
networker 0:7493bf6bb1b9 24 }
networker 0:7493bf6bb1b9 25
networker 0:7493bf6bb1b9 26 const char* sdp_data::asString(bool alt) {
networker 0:7493bf6bb1b9 27 char sep = ',';
networker 0:7493bf6bb1b9 28 switch (type) {
networker 0:7493bf6bb1b9 29 case NULL_:
networker 0:7493bf6bb1b9 30 return "NULL";
networker 0:7493bf6bb1b9 31 case UNSIGNED:
networker 0:7493bf6bb1b9 32 if (alt) sprintf(ret, "0x%0*X", size*2, data);
networker 0:7493bf6bb1b9 33 else sprintf(ret, "%u", data);
networker 0:7493bf6bb1b9 34 return ret;
networker 0:7493bf6bb1b9 35 case SIGNED:
networker 0:7493bf6bb1b9 36 sprintf(ret, "%d", data);
networker 0:7493bf6bb1b9 37 return ret;
networker 0:7493bf6bb1b9 38 case BOOL:
networker 0:7493bf6bb1b9 39 return data ? "TRUE" : "FALSE";
networker 0:7493bf6bb1b9 40 case STRING:
networker 0:7493bf6bb1b9 41 case URL:
networker 0:7493bf6bb1b9 42 return str;
networker 0:7493bf6bb1b9 43 case ALTERNATIVE:
networker 0:7493bf6bb1b9 44 sep = '|';
networker 0:7493bf6bb1b9 45 case SEQUENCE: {
networker 0:7493bf6bb1b9 46 if (longstr) delete[] longstr;
networker 0:7493bf6bb1b9 47 int n = sprintf(ret, "SEQ %d { ", size) + 1;
networker 0:7493bf6bb1b9 48 longstr = new char[n];
networker 0:7493bf6bb1b9 49 strcpy(longstr, ret);
networker 0:7493bf6bb1b9 50 for (int i = 0; i < sequence.size(); i++) {
networker 0:7493bf6bb1b9 51 const char *s = sequence[i]->asString(alt);
networker 0:7493bf6bb1b9 52 n = strlen(longstr) + strlen(s) + 2;
networker 0:7493bf6bb1b9 53 char *t = new char[n];
networker 0:7493bf6bb1b9 54 strcpy(t, longstr);
networker 0:7493bf6bb1b9 55 strcat(t, s);
networker 0:7493bf6bb1b9 56 t[n-2] = sep;
networker 0:7493bf6bb1b9 57 t[n-1]='\0';
networker 0:7493bf6bb1b9 58 //printf("[%s]+[%s]+%c=[%s]\n", longstr, s, sep, t);
networker 0:7493bf6bb1b9 59 delete[] longstr;
networker 0:7493bf6bb1b9 60 longstr = t;
networker 0:7493bf6bb1b9 61 }
networker 0:7493bf6bb1b9 62 longstr[n-2] = '}';
networker 0:7493bf6bb1b9 63 }
networker 0:7493bf6bb1b9 64 return longstr;
networker 0:7493bf6bb1b9 65 case UUID:
networker 0:7493bf6bb1b9 66 #ifdef LONGUUID
networker 0:7493bf6bb1b9 67 switch (size) {
networker 0:7493bf6bb1b9 68 case 2:
networker 0:7493bf6bb1b9 69 sprintf(ret, "0x%04X", uuid[6]);
networker 0:7493bf6bb1b9 70 return ret;
networker 0:7493bf6bb1b9 71 case 4:
networker 0:7493bf6bb1b9 72 sprintf(ret, "0x%04X%04X", uuid[7],uuid[6]);
networker 0:7493bf6bb1b9 73 return ret;
networker 0:7493bf6bb1b9 74 case 16:
networker 0:7493bf6bb1b9 75 longstr = new char[35];
networker 0:7493bf6bb1b9 76 sprintf(longstr, "%04X%04X-%04X-%04X-%04X-%04X%04X%04X", uuid[7],uuid[6],uuid[5],uuid[4],uuid[3],uuid[2],uuid[1],uuid[0]);
networker 0:7493bf6bb1b9 77 return longstr;
networker 0:7493bf6bb1b9 78 }
networker 0:7493bf6bb1b9 79 #else
networker 0:7493bf6bb1b9 80 switch (size) {
networker 0:7493bf6bb1b9 81 case 2:
networker 0:7493bf6bb1b9 82 sprintf(ret, "0x%04X", data & 0xffff);
networker 0:7493bf6bb1b9 83 return ret;
networker 0:7493bf6bb1b9 84 case 4:
networker 0:7493bf6bb1b9 85 sprintf(ret, "0x%08X", data);
networker 0:7493bf6bb1b9 86 return ret;
networker 0:7493bf6bb1b9 87 case 16:
networker 0:7493bf6bb1b9 88 longstr = new char[35];
networker 0:7493bf6bb1b9 89 sprintf(longstr, "%08X-%04X-%04X-%04X-%04X%04X%04X", data,base_uuid[5],base_uuid[4],base_uuid[3],base_uuid[2],base_uuid[1],base_uuid[0]);
networker 0:7493bf6bb1b9 90 return longstr;
networker 0:7493bf6bb1b9 91 }
networker 0:7493bf6bb1b9 92 #endif
networker 0:7493bf6bb1b9 93 }
networker 0:7493bf6bb1b9 94 return "Unsupported";
networker 0:7493bf6bb1b9 95 }
networker 0:7493bf6bb1b9 96
networker 0:7493bf6bb1b9 97 unsigned sdp_data::Size() {
networker 3:e8d2ebb7392e 98 if (size==0 && type==SEQUENCE)
networker 3:e8d2ebb7392e 99 return 2;
networker 0:7493bf6bb1b9 100 if (size<3 || size==4 || size==8 || size==16)
networker 0:7493bf6bb1b9 101 return size+1;//include descriptor
networker 0:7493bf6bb1b9 102 if (size < 256) return size+2; //1 extra byte
networker 0:7493bf6bb1b9 103 if (size < 65536) return size+3; //2 extra bytes
networker 0:7493bf6bb1b9 104 return size+5; //4 extra bytes
networker 0:7493bf6bb1b9 105 }
networker 0:7493bf6bb1b9 106
networker 0:7493bf6bb1b9 107 unsigned sdp_data::sizedesc(unsigned char *buf) {
networker 0:7493bf6bb1b9 108 int desc, extra=0;
networker 0:7493bf6bb1b9 109 switch (size) {
networker 0:7493bf6bb1b9 110 case 0:
networker 3:e8d2ebb7392e 111 /* should be:
networker 3:e8d2ebb7392e 112 if (type != NULL_) {
networker 3:e8d2ebb7392e 113 desc = 5;
networker 3:e8d2ebb7392e 114 extra = 1;
networker 3:e8d2ebb7392e 115 buf[1] = 0;
networker 3:e8d2ebb7392e 116 }
networker 3:e8d2ebb7392e 117 */
networker 0:7493bf6bb1b9 118 case 1:
networker 0:7493bf6bb1b9 119 desc = 0;
networker 0:7493bf6bb1b9 120 break;
networker 0:7493bf6bb1b9 121 case 2:
networker 0:7493bf6bb1b9 122 desc = 1;
networker 0:7493bf6bb1b9 123 break;
networker 0:7493bf6bb1b9 124 case 4:
networker 0:7493bf6bb1b9 125 desc = 2;
networker 0:7493bf6bb1b9 126 break;
networker 0:7493bf6bb1b9 127 case 8:
networker 0:7493bf6bb1b9 128 desc = 3;
networker 0:7493bf6bb1b9 129 break;
networker 0:7493bf6bb1b9 130 case 16:
networker 0:7493bf6bb1b9 131 desc = 4;
networker 0:7493bf6bb1b9 132 break;
networker 0:7493bf6bb1b9 133 default:
networker 0:7493bf6bb1b9 134 if (size < 256) {
networker 0:7493bf6bb1b9 135 desc = 5;
networker 0:7493bf6bb1b9 136 extra = 1;
networker 0:7493bf6bb1b9 137 buf[1] = size;
networker 0:7493bf6bb1b9 138 } else if (size < 65536) {
networker 0:7493bf6bb1b9 139 desc = 6;
networker 0:7493bf6bb1b9 140 extra = 2;
networker 0:7493bf6bb1b9 141 *(unsigned short*)&buf[1] = size;
networker 0:7493bf6bb1b9 142 } else {
networker 0:7493bf6bb1b9 143 desc = 7;
networker 0:7493bf6bb1b9 144 extra = 4;
networker 0:7493bf6bb1b9 145 *(unsigned*)&buf[1] = size;
networker 0:7493bf6bb1b9 146 }
networker 0:7493bf6bb1b9 147 }
networker 0:7493bf6bb1b9 148 buf[0] |= desc;
networker 0:7493bf6bb1b9 149 return extra+1;
networker 0:7493bf6bb1b9 150 }
networker 0:7493bf6bb1b9 151
networker 0:7493bf6bb1b9 152 void sdp_data::revcpy(unsigned char*d, const unsigned char*s, int n) {
networker 0:7493bf6bb1b9 153 for (int i = 0; i < n; i++)
networker 0:7493bf6bb1b9 154 d[i] = s[n-i-1];
networker 0:7493bf6bb1b9 155 }
networker 0:7493bf6bb1b9 156
networker 3:e8d2ebb7392e 157 unsigned sdp_data::build(unsigned char *buf, unsigned max) {//max is ignored
networker 0:7493bf6bb1b9 158 int p = 0;
networker 3:e8d2ebb7392e 159 buf[p] = type<<3;
networker 3:e8d2ebb7392e 160 switch (type) {
networker 3:e8d2ebb7392e 161 case NULL_:
networker 3:e8d2ebb7392e 162 p++;
networker 3:e8d2ebb7392e 163 break;
networker 3:e8d2ebb7392e 164 case UNSIGNED:
networker 3:e8d2ebb7392e 165 case SIGNED:
networker 3:e8d2ebb7392e 166 case BOOL:
networker 3:e8d2ebb7392e 167 p += sizedesc(buf+p);
networker 3:e8d2ebb7392e 168 revcpy(buf+p, (unsigned char*)&data, size);
networker 3:e8d2ebb7392e 169 break;
networker 3:e8d2ebb7392e 170 case UUID:
networker 3:e8d2ebb7392e 171 p += sizedesc(buf+p);
networker 0:7493bf6bb1b9 172 #ifdef LONGUUID
networker 3:e8d2ebb7392e 173 switch (size) {
networker 3:e8d2ebb7392e 174 case 2:
networker 3:e8d2ebb7392e 175 case 4:
networker 3:e8d2ebb7392e 176 revcpy(buf+p, (unsigned char*)&uuid[6], size);
networker 3:e8d2ebb7392e 177 break;
networker 3:e8d2ebb7392e 178 case 16:
networker 3:e8d2ebb7392e 179 revcpy(buf+p, (unsigned char*)uuid, size);
networker 3:e8d2ebb7392e 180 break;
networker 3:e8d2ebb7392e 181 }
networker 0:7493bf6bb1b9 182 #else
networker 3:e8d2ebb7392e 183 switch (size) {
networker 3:e8d2ebb7392e 184 case 2:
networker 3:e8d2ebb7392e 185 case 4:
networker 3:e8d2ebb7392e 186 revcpy(buf+p, (unsigned char*)&data, size);
networker 3:e8d2ebb7392e 187 break;
networker 3:e8d2ebb7392e 188 case 16:
networker 3:e8d2ebb7392e 189 revcpy(buf+p, (unsigned char*)&data, 4);
networker 3:e8d2ebb7392e 190 revcpy(buf+p+4, base_uuid, 12);
networker 3:e8d2ebb7392e 191 break;
networker 3:e8d2ebb7392e 192 }
networker 0:7493bf6bb1b9 193 #endif
networker 3:e8d2ebb7392e 194 break;
networker 3:e8d2ebb7392e 195 case STRING:
networker 3:e8d2ebb7392e 196 case URL:
networker 3:e8d2ebb7392e 197 p += sizedesc(buf+p);
networker 3:e8d2ebb7392e 198 memcpy(buf+p, str, size);
networker 3:e8d2ebb7392e 199 break;
networker 3:e8d2ebb7392e 200 case SEQUENCE:
networker 3:e8d2ebb7392e 201 case ALTERNATIVE: {
networker 3:e8d2ebb7392e 202 if (sequence.size()==0) {//hack: should be solved in sizedesc
networker 3:e8d2ebb7392e 203 buf[p++] |= 5;
networker 3:e8d2ebb7392e 204 buf[p++] = 0;
networker 3:e8d2ebb7392e 205 break;
networker 3:e8d2ebb7392e 206 }
networker 3:e8d2ebb7392e 207 int n = 0;
networker 3:e8d2ebb7392e 208 p += sizedesc(buf+p);
networker 3:e8d2ebb7392e 209 for (int i = 0; i < sequence.size(); i++)
networker 3:e8d2ebb7392e 210 n += sequence.at(i)->build(buf+p+n, max-p);
networker 0:7493bf6bb1b9 211 }
networker 3:e8d2ebb7392e 212 break;
networker 0:7493bf6bb1b9 213 }
networker 3:e8d2ebb7392e 214 p += size;
networker 2:d5a27b2d2e08 215 // printfBytes("Build:", buf, p);
networker 0:7493bf6bb1b9 216 return p;
networker 0:7493bf6bb1b9 217 }
networker 3:e8d2ebb7392e 218
networker 3:e8d2ebb7392e 219 bool sdp_data::findUUID(unsigned uuid) {
networker 3:e8d2ebb7392e 220 if (type == UUID)
networker 3:e8d2ebb7392e 221 return asUnsigned()==uuid;
networker 3:e8d2ebb7392e 222 if (type==SEQUENCE || type==ALTERNATIVE) {
networker 3:e8d2ebb7392e 223 for (int i = 0; i < sequence.size(); i++) {
networker 3:e8d2ebb7392e 224 if (sequence[i]->findUUID(uuid))
networker 3:e8d2ebb7392e 225 return true;
networker 3:e8d2ebb7392e 226 }
networker 3:e8d2ebb7392e 227 }
networker 3:e8d2ebb7392e 228 return false;
networker 3:e8d2ebb7392e 229 }