static void DNSSD_API enum_reply(DNSServiceRef client, const DNSServiceFlags flags, uint32_t ifIndex, DNSServiceErrorType errorCode, const char *replyDomain, void *context) { DNSServiceFlags partialflags = flags & ~(kDNSServiceFlagsMoreComing | kDNSServiceFlagsAdd | kDNSServiceFlagsDefault); int labels = 0, depth = 0, i, initial = 0; char text[64]; const char *label[128]; (void)client; // Unused (void)ifIndex; // Unused (void)context; // Unused // 1. Print the header if (num_printed++ == 0) printf("Timestamp Recommended %s domain\n", operation == 'E' ? "Registration" : "Browsing"); printtimestamp(); if (errorCode) printf("Error code %d\n", errorCode); else if (!*replyDomain) printf("Error: No reply domain\n"); else { printf("%-10s", DomainMsg(flags)); printf("%-8s", (flags & kDNSServiceFlagsMoreComing) ? "(More)" : ""); if (partialflags) printf("Flags: %4X ", partialflags); else printf(" "); // 2. Count the labels while (*replyDomain) { label[labels++] = replyDomain; replyDomain = GetNextLabel(replyDomain, text); } // 3. Decide if we're going to clump the last two or three labels (e.g. "apple.com", or "nicta.com.au") if (labels >= 3 && replyDomain - label[labels-1] <= 3 && label[labels-1] - label[labels-2] <= 4) initial = 3; else if (labels >= 2 && replyDomain - label[labels-1] <= 4) initial = 2; else initial = 1; labels -= initial; // 4. Print the initial one-, two- or three-label clump for (i=0; i<initial; i++) { GetNextLabel(label[labels+i], text); if (i>0) printf("."); printf("%s", text); } printf("\n"); // 5. Print the remainder of the hierarchy for (depth=0; depth<labels; depth++) { printf(" "); for (i=0; i<=depth; i++) printf("- "); GetNextLabel(label[labels-1-depth], text); printf("> %s\n", text); } } if (!(flags & kDNSServiceFlagsMoreComing)) fflush(stdout); }
OSStatus CConfigPropertySheet::DecodeDomainName( const char * raw, CString & decoded ) { char nextLabel[128] = "\0"; char decodedDomainString[kDNSServiceMaxDomainName]; char * buffer = (char *) raw; int labels = 0, i; char text[64]; const char *label[128]; OSStatus err; // Initialize decodedDomainString[0] = '\0'; // Count the labels while ( *buffer ) { label[labels++] = buffer; buffer = (char *) GetNextLabel(buffer, text); } buffer = (char*) raw; for (i = 0; i < labels; i++) { buffer = (char *)GetNextLabel(buffer, nextLabel); strcat(decodedDomainString, nextLabel); strcat(decodedDomainString, "."); } // Remove trailing dot from domain name. decodedDomainString[ strlen( decodedDomainString ) - 1 ] = '\0'; // Convert to Unicode err = UTF8StringToStringObject( decodedDomainString, decoded ); return err; }
/// \brief /// Indicate that this memory is unbound from GPU usage. inline void EndUse() { VASSERT( m_uiInUse > 0 ); --m_uiInUse; if ( m_uiInUse == 0 ) m_label = GetNextLabel(); }