bool MDNS::setService(String protocol, String service, uint16_t port, String instance) { bool success = protocol.length() < MAX_LABEL_SIZE - 1 && service.length() < MAX_LABEL_SIZE - 1 && instance.length() < MAX_LABEL_SIZE && isAlphaDigitHyphen(protocol) && isAlphaDigitHyphen(service) && isNetUnicode(instance); Label * protoLabel; if (success) { protoLabel = new Label("_" + protocol, LOCAL); success = protoLabel->getSize() == protocol.length() + 1; } if (success) { labels[SERVICE_NAME] = new Label("_" + service, protoLabel); success = labels[SERVICE_NAME]->getSize() == service.length() + 1; } if (success) { labels[INSTANCE_NAME] = new Label(instance, labels[SERVICE_NAME], true); success = labels[INSTANCE_NAME]->getSize() == instance.length(); } this->port = port; return success; }
bool MDNS::addService(String protocol, String service, uint16_t port, String instance, std::vector<String> subServices) { bool success = true; String status = "Ok"; if (!labels[HOSTNAME]) { status = "Hostname not set"; success = false; } if (success && protocol.length() < MAX_LABEL_SIZE - 1 && service.length() < MAX_LABEL_SIZE - 1 && instance.length() < MAX_LABEL_SIZE && isAlphaDigitHyphen(protocol) && isAlphaDigitHyphen(service) && isNetUnicode(instance)) { PTRRecord * ptrRecord = new PTRRecord(); SRVRecord * srvRecord = new SRVRecord(); txtRecord = new TXTRecord(); InstanceNSECRecord * instanceNSECRecord = new InstanceNSECRecord(); records.push_back(ptrRecord); records.push_back(srvRecord); records.push_back(txtRecord); records.push_back(instanceNSECRecord); String serviceString = "_" + service + "._" + protocol; Label * protocolLabel = new Label("_" + protocol, LOCAL); if (labels[serviceString] == NULL) { labels[serviceString] = new ServiceLabel(aRecord, "_" + service, protocolLabel); } ((ServiceLabel *) labels[serviceString])->addInstance(ptrRecord, srvRecord, txtRecord); String instanceString = instance + "._" + service + "._" + protocol; labels[instanceString] = new InstanceLabel(srvRecord, txtRecord, instanceNSECRecord, aRecord, instance, labels[serviceString], true); for (std::vector<String>::const_iterator i = subServices.begin(); i != subServices.end(); ++i) { String subServiceString = "_" + *i + "._sub." + serviceString; if (labels[subServiceString] == NULL) { labels[subServiceString] = new ServiceLabel(aRecord, "_" + *i, new Label("_sub", labels[serviceString])); } PTRRecord * subPTRRecord = new PTRRecord(); subPTRRecord->setLabel(labels[subServiceString]); subPTRRecord->setInstanceLabel(labels[instanceString]); records.push_back(subPTRRecord); ((ServiceLabel *) labels[subServiceString])->addInstance(subPTRRecord, srvRecord, txtRecord); } ptrRecord->setLabel(labels[serviceString]); ptrRecord->setInstanceLabel(labels[instanceString]); srvRecord->setLabel(labels[instanceString]); srvRecord->setPort(port); srvRecord->setHostLabel(labels[HOSTNAME]); txtRecord->setLabel(labels[instanceString]); instanceNSECRecord->setLabel(labels[instanceString]); } else { status = success? "Invalid name" : status; success = false; } return success; }