DNSServiceErrorType DNSSD_API TXTRecordSetValue ( TXTRecordRef *txtRecord, const char *key, uint8_t valueSize, const void *value ) { uint8_t *start, *p; const char *k; unsigned long keysize, keyvalsize; for (k = key; *k; k++) if (*k < 0x20 || *k > 0x7E || *k == '=') return(kDNSServiceErr_Invalid); keysize = (unsigned long)(k - key); keyvalsize = 1 + keysize + (value ? (1 + valueSize) : 0); if (keysize < 1 || keyvalsize > 255) return(kDNSServiceErr_Invalid); (void)TXTRecordRemoveValue(txtRecord, key); if (txtRec->datalen + keyvalsize > txtRec->buflen) { unsigned char *newbuf; unsigned long newlen = txtRec->datalen + keyvalsize; if (newlen > 0xFFFF) return(kDNSServiceErr_Invalid); newbuf = malloc((size_t)newlen); if (!newbuf) return(kDNSServiceErr_NoMemory); memcpy(newbuf, txtRec->buffer, txtRec->datalen); if (txtRec->malloced) free(txtRec->buffer); txtRec->buffer = newbuf; txtRec->buflen = (uint16_t)(newlen); txtRec->malloced = 1; } start = txtRec->buffer + txtRec->datalen; p = start + 1; memcpy(p, key, keysize); p += keysize; if (value) { *p++ = '='; memcpy(p, value, valueSize); p += valueSize; } *start = (uint8_t)(p - start - 1); txtRec->datalen += p - start; return(kDNSServiceErr_NoError); }
STDMETHODIMP CTXTRecord::RemoveValue(BSTR key) { HRESULT hr = S_OK; if ( m_allocated ) { std::string keyUTF8; BOOL ok; DNSServiceErrorType err; ok = BSTRToUTF8( key, keyUTF8 ); require_action( ok, exit, hr = S_FALSE ); err = TXTRecordRemoveValue( &m_tref, keyUTF8.c_str() ); require_action( !err, exit, hr = S_FALSE ); } exit: return hr; }
int main(AVAHI_GCC_UNUSED int argc, AVAHI_GCC_UNUSED char *argv[]) { const char *r; TXTRecordRef ref; uint8_t l; const void *p; char k[256]; TXTRecordCreate(&ref, 0, NULL); hexdump(TXTRecordGetBytesPtr(&ref), TXTRecordGetLength(&ref)); TXTRecordSetValue(&ref, "foo", 7, "lennart"); hexdump(TXTRecordGetBytesPtr(&ref), TXTRecordGetLength(&ref)); TXTRecordSetValue(&ref, "waldo", 5, "rocks"); hexdump(TXTRecordGetBytesPtr(&ref), TXTRecordGetLength(&ref)); TXTRecordSetValue(&ref, "quux", 9, "the_house"); hexdump(TXTRecordGetBytesPtr(&ref), TXTRecordGetLength(&ref)); TXTRecordSetValue(&ref, "yeah", 0, NULL); hexdump(TXTRecordGetBytesPtr(&ref), TXTRecordGetLength(&ref)); TXTRecordSetValue(&ref, "waldo", 6, "rocked"); hexdump(TXTRecordGetBytesPtr(&ref), TXTRecordGetLength(&ref)); TXTRecordRemoveValue(&ref, "foo"); hexdump(TXTRecordGetBytesPtr(&ref), TXTRecordGetLength(&ref)); TXTRecordRemoveValue(&ref, "waldo"); hexdump(TXTRecordGetBytesPtr(&ref), TXTRecordGetLength(&ref)); TXTRecordSetValue(&ref, "kawumm", 6, "bloerb"); hexdump(TXTRecordGetBytesPtr(&ref), TXTRecordGetLength(&ref)); TXTRecordSetValue(&ref, "one", 1, "1"); hexdump(TXTRecordGetBytesPtr(&ref), TXTRecordGetLength(&ref)); TXTRecordSetValue(&ref, "two", 1, "2"); hexdump(TXTRecordGetBytesPtr(&ref), TXTRecordGetLength(&ref)); TXTRecordSetValue(&ref, "three", 1, "3"); hexdump(TXTRecordGetBytesPtr(&ref), TXTRecordGetLength(&ref)); assert(TXTRecordContainsKey(TXTRecordGetLength(&ref), TXTRecordGetBytesPtr(&ref), "two")); assert(!TXTRecordContainsKey(TXTRecordGetLength(&ref), TXTRecordGetBytesPtr(&ref), "four")); r = TXTRecordGetValuePtr(TXTRecordGetLength(&ref), TXTRecordGetBytesPtr(&ref), "kawumm", &l); hexdump(r, l); assert(TXTRecordGetCount(TXTRecordGetLength(&ref), TXTRecordGetBytesPtr(&ref)) == 6); TXTRecordGetItemAtIndex(TXTRecordGetLength(&ref), TXTRecordGetBytesPtr(&ref), 2, sizeof(k), k, &l, &p); fprintf(stderr, "key=<%s>\n", k); hexdump(p, l); assert(TXTRecordGetItemAtIndex(TXTRecordGetLength(&ref), TXTRecordGetBytesPtr(&ref), 20, sizeof(k), k, &l, &p) == kDNSServiceErr_Invalid); TXTRecordDeallocate(&ref); }