void SBCFromTXT(CPhidgetSBCHandle sbc, uint16_t txtLen, const char *txtRecord) { char *hversion = NULL, *txtver = NULL; uint8_t valLen = 0; const char *valPtr = NULL; //txt version if(!(valPtr = TXTRecordGetValuePtrPtr(txtLen, txtRecord, "txtvers", &valLen))) return; if(!(txtver = malloc(valLen+1))) return; ZEROMEM(txtver, valLen+1); memcpy(txtver, valPtr, valLen); sbc->txtver = (short)strtol(txtver, NULL, 10); free(txtver); //Firmware version if(!(valPtr = TXTRecordGetValuePtrPtr(txtLen, txtRecord, "fversion", &valLen))) return; if(valLen > 12) valLen = 12; memcpy(sbc->fversion, valPtr, valLen); sbc->fversion[valLen] = '\0'; //Hardware version if(!(valPtr = TXTRecordGetValuePtrPtr(txtLen, txtRecord, "hversion", &valLen))) return; if(!(hversion = malloc(valLen+1))) return; ZEROMEM(hversion, valLen+1); memcpy(hversion, valPtr, valLen); sbc->hversion = (short)strtol(hversion, NULL, 10); free(hversion); // things added in version 2 of the txt if(sbc->txtver >= 2) { //Hostname if(!(valPtr = TXTRecordGetValuePtrPtr(txtLen, txtRecord, "hostname", &valLen))) return; if(valLen > 128) valLen = 128; memcpy(sbc->hostname, valPtr, valLen); sbc->hostname[valLen] = '\0'; } // things added in version 3 of the txt if(sbc->txtver >= 3) { //Device Name if(!(valPtr = TXTRecordGetValuePtrPtr(txtLen, txtRecord, "name", &valLen))) return; if(valLen > 128) valLen = 128; memcpy(sbc->deviceName, valPtr, valLen); sbc->deviceName[valLen] = '\0'; } else { sprintf(sbc->deviceName, "PhidgetSBC"); } }
void DNSServiceQueryRecord_ws_CallBack ( DNSServiceRef DNSServiceRef, DNSServiceFlags flags, uint32_t interfaceIndex, DNSServiceErrorType errorCode, const char *fullname, uint16_t rrtype, uint16_t rrclass, uint16_t rdlen, const void *rdata, uint32_t ttl, void *context ) { if (errorCode != kDNSServiceErr_NoError) LOG(PHIDGET_LOG_ERROR, "DNSServiceQueryRecord_ws_CallBack returned error: %d\n", errorCode); else { uint8_t valLen = 0; const char *valPtr = NULL; CPhidgetRemoteHandle networkInfo = (CPhidgetRemoteHandle)context; LOG(PHIDGET_LOG_INFO, "DNSServiceQueryRecord_ws_CallBack: %s",fullname); //server_id if(!(valPtr = TXTRecordGetValuePtrPtr(rdlen, rdata, "server_id", &valLen))) return; if(!(networkInfo->zeroconf_server_id = malloc(valLen+1))) return; ZEROMEM(networkInfo->zeroconf_server_id, valLen+1); memcpy(networkInfo->zeroconf_server_id, valPtr, valLen); } }
void PhidFromTXT(CPhidgetHandle phid, uint16_t txtLen, const char *txtRecord) { int i = 0; short txtver; //char *label = NULL; //char temp[128]; //unsigned int labelLen = 0; uint8_t valLen = 0; const char *valPtr = NULL; //txt version if(!(valPtr = TXTRecordGetValuePtrPtr(txtLen, txtRecord, "txtvers", &valLen))) return; txtver = (short)strtol(valPtr, NULL, 10); //Serial Number if(!(valPtr = TXTRecordGetValuePtrPtr(txtLen, txtRecord, "serial", &valLen))) return; phid->serialNumber = strtol(valPtr, NULL, 10); phid->specificDevice = PHIDGETOPEN_SERIAL; //version if(!(valPtr = TXTRecordGetValuePtrPtr(txtLen, txtRecord, "version", &valLen))) return; phid->deviceVersion = strtol(valPtr, NULL, 10); //label if(!(valPtr = TXTRecordGetValuePtrPtr(txtLen, txtRecord, "label", &valLen))) return; if(valLen >= MAX_LABEL_STORAGE) valLen = MAX_LABEL_STORAGE-1; memcpy(phid->label, valPtr, valLen); phid->label[valLen] = '\0'; /* memcpy(temp, valPtr, valLen); temp[valLen] = '\0'; unescape(temp, &label, &labelLen); if(labelLen > MAX_LABEL_STORAGE-1) labelLen = MAX_LABEL_STORAGE-1; memcpy(phid->label, label, labelLen); phid->label[labelLen] = '\0'; free(label);*/ //server_id if(!(valPtr = TXTRecordGetValuePtrPtr(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 = TXTRecordGetValuePtrPtr(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 = TXTRecordGetValuePtrPtr(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 = TXTRecordGetValuePtrPtr(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 = TXTRecordGetValuePtrPtr(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 = TXTRecordGetValuePtrPtr(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 = TXTRecordGetValuePtrPtr(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 = TXTRecordGetValuePtrPtr(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 = TXTRecordGetValuePtrPtr(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 = TXTRecordGetValuePtrPtr(txtLen, txtRecord, "label", &valLen))) return; if(valLen > 10) valLen = 10; memcpy(phid->label, valPtr, valLen); phid->label[valLen] = '\0'; //server_id if(!(valPtr = TXTRecordGetValuePtrPtr(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; }