void PhidFromTXT(CPhidgetHandle phid, uint16_t txtLen, const char *txtRecord) { int i = 0; short txtver; uint8_t valLen = 0; const char *valPtr = NULL; //txt version if(!(valPtr = TXTRecordGetValuePtr(txtLen, txtRecord, "txtvers", &valLen))) return; txtver = (short)strtol(valPtr, NULL, 10); //Serial Number if(!(valPtr = TXTRecordGetValuePtr(txtLen, txtRecord, "serial", &valLen))) return; phid->serialNumber = strtol(valPtr, NULL, 10); phid->specificDevice = PTRUE; //version if(!(valPtr = TXTRecordGetValuePtr(txtLen, txtRecord, "version", &valLen))) return; phid->deviceVersion = strtol(valPtr, NULL, 10); //label if(!(valPtr = TXTRecordGetValuePtr(txtLen, txtRecord, "label", &valLen))) return; if(valLen > 10) valLen = 10; memcpy(phid->label, valPtr, valLen); phid->label[valLen] = '\0'; //server_id if(!(valPtr = TXTRecordGetValuePtr(txtLen, txtRecord, "server_id", &valLen))) return; free(phid->networkInfo->zeroconf_server_id); if(!(phid->networkInfo->zeroconf_server_id = malloc(valLen+1))) return; ZEROMEM(phid->networkInfo->zeroconf_server_id, valLen+1); memcpy(phid->networkInfo->zeroconf_server_id, valPtr, valLen); // things added in version 2 of the txt if(txtver >= 2) { //Device ID if(!(valPtr = TXTRecordGetValuePtr(txtLen, txtRecord, "id", &valLen))) return; phid->deviceIDSpec = strtol(valPtr, NULL, 10); for(i = 1;i<PHIDGET_DEVICE_COUNT;i++) if(phid->deviceIDSpec == Phid_Device_Def[i].pdd_sdid) break; phid->deviceDef = &Phid_Device_Def[i]; phid->attr = Phid_Device_Def[i].pdd_attr; //Device Class if(!(valPtr = TXTRecordGetValuePtr(txtLen, txtRecord, "class", &valLen))) return; phid->deviceID = strtol(valPtr, NULL, 10); phid->deviceType = Phid_DeviceName[phid->deviceID]; } //Old version uses string searching, but some devices have the same name with different IDs else { char *name = NULL; char *type = NULL; //name if(!(valPtr = TXTRecordGetValuePtr(txtLen, txtRecord, "name", &valLen))) return; if(!(name = malloc(valLen+1))) return; ZEROMEM(name, valLen+1); memcpy(name, valPtr, valLen); for(i = 0;i<PHIDGET_DEVICE_COUNT;i++) { if(!strcmp(name, Phid_Device_Def[i].pdd_name)) { phid->deviceIDSpec = Phid_Device_Def[i].pdd_sdid; phid->deviceDef = &Phid_Device_Def[i]; phid->attr = Phid_Device_Def[i].pdd_attr; break; } } free(name); //type if(!(valPtr = TXTRecordGetValuePtr(txtLen, txtRecord, "type", &valLen))) return; if(!(type = malloc(valLen+1))) return; ZEROMEM(type, valLen+1); memcpy(type, valPtr, valLen); phid->deviceID = phidget_type_to_id(type); phid->deviceType = Phid_DeviceName[phid->deviceID]; free(type); } phid->networkInfo->mdns = PTRUE; }
void PhidFromTXT(CPhidgetHandle phid, uint16_t txtLen, const char *txtRecord) { int i = 0; char *type = NULL; char *serial = NULL; char *version = NULL; char *name = NULL; uint8_t valLen = 0; const char *valPtr = NULL; //Serial Number if(!(valPtr = TXTRecordGetValuePtr(txtLen, txtRecord, "serial", &valLen))) return; if(!(serial = malloc(valLen+1))) return; ZEROMEM(serial, valLen+1); memcpy(serial, valPtr, valLen); phid->serialNumber = strtol(serial, NULL, 10); phid->specificDevice = PTRUE; free(serial); //name if(!(valPtr = TXTRecordGetValuePtr(txtLen, txtRecord, "name", &valLen))) return; if(!(name = malloc(valLen+1))) return; ZEROMEM(name, valLen+1); memcpy(name, valPtr, valLen); for(i = 0;i<PHIDGET_DEVICE_COUNT;i++) { if(!strcmp(name, Phid_DeviceSpecificName[i])) { phid->deviceIDSpec = i; phid->attr = Phid_Device_Def[i].pdd_attr; break; } } free(name); //type if(!(valPtr = TXTRecordGetValuePtr(txtLen, txtRecord, "type", &valLen))) return; if(!(type = malloc(valLen+1))) return; ZEROMEM(type, valLen+1); memcpy(type, valPtr, valLen); phid->deviceID = phidget_type_to_id(type); phid->deviceType = Phid_DeviceName[phid->deviceID]; free(type); //version if(!(valPtr = TXTRecordGetValuePtr(txtLen, txtRecord, "version", &valLen))) return; if(!(version = malloc(valLen+1))) return; ZEROMEM(version, valLen+1); memcpy(version, valPtr, valLen); phid->deviceVersion = strtol(version, NULL, 10); free(version); //label if(!(valPtr = TXTRecordGetValuePtr(txtLen, txtRecord, "label", &valLen))) return; if(valLen > 10) valLen = 10; memcpy(phid->label, valPtr, valLen); phid->label[valLen] = '\0'; //server_id if(!(valPtr = TXTRecordGetValuePtr(txtLen, txtRecord, "server_id", &valLen))) return; if(!(phid->networkInfo->zeroconf_server_id = malloc(valLen+1))) return; ZEROMEM(phid->networkInfo->zeroconf_server_id, valLen+1); memcpy(phid->networkInfo->zeroconf_server_id, valPtr, valLen); phid->networkInfo->mdns = PTRUE; }