STDMETHODIMP CTXTRecord::ContainsKey(BSTR key, VARIANT_BOOL* retval) { std::string keyUTF8; int ret = 0; HRESULT err = S_OK; if ( m_byteArray.size() > 0 ) { BOOL ok; ok = BSTRToUTF8( key, keyUTF8 ); require_action( ok, exit, err = S_FALSE ); ret = TXTRecordContainsKey( ( uint16_t ) m_byteArray.size(), &m_byteArray[ 0 ], keyUTF8.c_str() ); } *retval = ( ret ) ? VARIANT_TRUE : VARIANT_FALSE; exit: return err; }
OSStatus CPrinterSetupWizardSheet::ParseTextRecord( Service * service, Queue * q, uint16_t inTXTSize, const char * inTXT ) { check( service ); check( q ); // <rdar://problem/3946587> Use TXTRecord APIs declared in dns_sd.h bool qtotalDefined = false; const void * val; char buf[256]; uint8_t len; OSStatus err = kNoErr; // <rdar://problem/3987680> Default to queue "lp" q->name = L"lp"; // <rdar://problem/4003710> Default pdl key to be "application/postscript" q->pdl = L"application/postscript"; if ( ( val = TXTRecordGetValuePtr( inTXTSize, inTXT, "rp", &len ) ) != NULL ) { // Stringize val ( doesn't have trailing '\0' yet ) memcpy( buf, val, len ); buf[len] = '\0'; err = UTF8StringToStringObject( buf, q->name ); require_noerr( err, exit ); } if ( ( val = TXTRecordGetValuePtr( inTXTSize, inTXT, "pdl", &len ) ) != NULL ) { // Stringize val ( doesn't have trailing '\0' yet ) memcpy( buf, val, len ); buf[len] = '\0'; err = UTF8StringToStringObject( buf, q->pdl ); require_noerr( err, exit ); } if ( ( ( val = TXTRecordGetValuePtr( inTXTSize, inTXT, "usb_mfg", &len ) ) != NULL ) || ( ( val = TXTRecordGetValuePtr( inTXTSize, inTXT, "usb_manufacturer", &len ) ) != NULL ) ) { // Stringize val ( doesn't have trailing '\0' yet ) memcpy( buf, val, len ); buf[len] = '\0'; err = UTF8StringToStringObject( buf, q->usb_MFG ); require_noerr( err, exit ); } if ( ( ( val = TXTRecordGetValuePtr( inTXTSize, inTXT, "usb_mdl", &len ) ) != NULL ) || ( ( val = TXTRecordGetValuePtr( inTXTSize, inTXT, "usb_model", &len ) ) != NULL ) ) { // Stringize val ( doesn't have trailing '\0' yet ) memcpy( buf, val, len ); buf[len] = '\0'; err = UTF8StringToStringObject( buf, q->usb_MDL ); require_noerr( err, exit ); } if ( ( val = TXTRecordGetValuePtr( inTXTSize, inTXT, "ty", &len ) ) != NULL ) { // Stringize val ( doesn't have trailing '\0' yet ) memcpy( buf, val, len ); buf[len] = '\0'; err = UTF8StringToStringObject( buf, q->description ); require_noerr( err, exit ); } if ( ( val = TXTRecordGetValuePtr( inTXTSize, inTXT, "product", &len ) ) != NULL ) { // Stringize val ( doesn't have trailing '\0' yet ) memcpy( buf, val, len ); buf[len] = '\0'; err = UTF8StringToStringObject( buf, q->product ); require_noerr( err, exit ); } if ( ( val = TXTRecordGetValuePtr( inTXTSize, inTXT, "note", &len ) ) != NULL ) { // Stringize val ( doesn't have trailing '\0' yet ) memcpy( buf, val, len ); buf[len] = '\0'; err = UTF8StringToStringObject( buf, q->location ); require_noerr( err, exit ); } if ( ( val = TXTRecordGetValuePtr( inTXTSize, inTXT, "qtotal", &len ) ) != NULL ) { // Stringize val ( doesn't have trailing '\0' yet ) memcpy( buf, val, len ); buf[len] = '\0'; service->qtotal = (unsigned short) atoi( buf ); qtotalDefined = true; } if ( ( val = TXTRecordGetValuePtr( inTXTSize, inTXT, "priority", &len ) ) != NULL ) { // Stringize val ( doesn't have trailing '\0' yet ) memcpy( buf, val, len ); buf[len] = '\0'; q->priority = atoi( buf ); } // <rdar://problem/4124524> Was this printer discovered via OS X Printer Sharing? if ( TXTRecordContainsKey( inTXTSize, inTXT, "printer-state" ) || TXTRecordContainsKey( inTXTSize, inTXT, "printer-type" ) ) { service->printer->isSharedFromOSX = true; } exit: // The following code is to fix a problem with older HP // printers that don't include "qtotal" in their text // record. We'll check to see if the q->name is "TEXT" // and if so, we're going to modify it to be "lp" so // that we don't use the wrong queue if ( !err && !qtotalDefined && ( q->name == L"TEXT" ) ) { q->name = "lp"; } return err; }
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); }