Handle<Value> dnsServiceGetAddrInfo(Arguments const& args) { HandleScope scope; if (argumentCountMismatch(args, 7)) { return throwArgumentCountMismatchException(args, 7); } if ( ! ServiceRef::HasInstance(args[0])) { return throwTypeError("argument 1 must be a DNSServiceRef (sdRef)"); } ServiceRef * serviceRef = ObjectWrap::Unwrap<ServiceRef>(args[0]->ToObject()); if (serviceRef->IsInitialized()) { return throwError("DNSServiceRef is already initialized"); } if ( ! args[1]->IsInt32()) { return throwError("argument 2 must be an integer (DNSServiceFlags)"); } DNSServiceFlags flags = args[1]->ToInteger()->Int32Value(); if ( ! args[2]->IsInt32()) { return throwTypeError("argument 3 must be an integer (interfaceIndex)"); } uint32_t interfaceIndex = args[2]->ToInteger()->Int32Value(); if ( ! args[3]->IsInt32()) { return throwTypeError("argument 4 must be an integer (DNSServiceProtocol)"); } uint32_t protocol = args[3]->ToInteger()->Int32Value(); if ( ! args[4]->IsString()) { return throwTypeError("argument 5 must be a string (hostname)"); } String::Utf8Value hostname(args[4]->ToString()); if ( ! args[5]->IsFunction()) { return throwTypeError("argument 6 must be a function (callBack)"); } serviceRef->SetCallback(Local<Function>::Cast(args[5])); if ( ! args[6]->IsNull() && ! args[6]->IsUndefined()) { serviceRef->SetContext(args[6]); } DNSServiceErrorType error = DNSServiceGetAddrInfo( & serviceRef->GetServiceRef(), flags, interfaceIndex, protocol, *hostname, OnAddressInfo, serviceRef); if (error != kDNSServiceErr_NoError) { return throwMdnsError("dnsServiceGetAddrInfo()", error); } if ( ! serviceRef->SetSocketFlags()) { return throwError("Failed to set socket flags (O_NONBLOCK, FD_CLOEXEC)"); } return Undefined(); }
Handle<Value> dnsServiceRefDeallocate(Arguments const& args) { HandleScope scope; if (argumentCountMismatch(args, 1)) { return throwArgumentCountMismatchException(args, 1); } if ( ! args[0]->IsObject() || ! ServiceRef::HasInstance(args[0]->ToObject())) { return throwTypeError("argument 1 must be a DNSServiceRef object"); } ServiceRef * ref = ObjectWrap::Unwrap<ServiceRef>(args[0]->ToObject()); if ( ! ref->IsInitialized()) { return throwError("DNSServiceRef is not initialized"); } DNSServiceRefDeallocate( ref->GetServiceRef()); ref->SetServiceRef(NULL); return Undefined(); }
Handle<Value> DNSServiceEnumerateDomains(Arguments const& args) { HandleScope scope; if (argumentCountMismatch(args, 5)) { return throwArgumentCountMismatchException(args, 5); } if ( ! ServiceRef::HasInstance(args[0])) { return throwTypeError("argument 1 must be a DNSServiceRef (sdRef)"); } ServiceRef * serviceRef = ObjectWrap::Unwrap<ServiceRef>(args[0]->ToObject()); if (serviceRef->IsInitialized()) { return throwError("DNSServiceRef is already initialized"); } if ( ! args[1]->IsInt32()) { return throwError("argument 2 must be an integer (DNSServiceFlags)"); } DNSServiceFlags flags = args[1]->ToInteger()->Int32Value(); if ( ! args[2]->IsInt32()) { return throwTypeError("argument 3 must be an integer (interfaceIndex)"); } uint32_t interfaceIndex = args[2]->ToInteger()->Int32Value(); if ( ! args[3]->IsFunction()) { return throwTypeError("argument 4 must be a function (callBack)"); } serviceRef->SetCallback(Local<Function>::Cast(args[3])); serviceRef->SetContext(args[4]); DNSServiceErrorType error = DNSServiceEnumerateDomains( & serviceRef->GetServiceRef(), flags, interfaceIndex, OnEnumeration, serviceRef); if (error != kDNSServiceErr_NoError) { return throwMdnsError(error); } if ( ! serviceRef->SetSocketFlags()) { return throwError("Failed to set socket flags (O_NONBLOCK, FD_CLOEXEC)"); } return Undefined(); }
Handle<Value> DNSServiceRegister(Arguments const& args) { HandleScope scope; if (argumentCountMismatch(args, 11)) { return throwArgumentCountMismatchException(args, 11); } if ( ! ServiceRef::HasInstance(args[0])) { return throwTypeError("argument 1 must be a DNSServiceRef (sdRef)"); } ServiceRef * serviceRef = ObjectWrap::Unwrap<ServiceRef>(args[0]->ToObject()); if (serviceRef->IsInitialized()) { return throwError("DNSServiceRef is already initialized"); } if ( ! args[1]->IsInt32()) { return throwError("argument 2 must be an integer (DNSServiceFlags)"); } DNSServiceFlags flags = args[1]->ToInteger()->Int32Value(); if ( ! args[2]->IsInt32()) { return throwTypeError("argument 3 must be an integer (interfaceIndex)"); } uint32_t interfaceIndex = args[2]->ToInteger()->Int32Value(); bool has_name = false; if ( ! args[3]->IsNull() && ! args[3]->IsUndefined()) { if ( ! args[3]->IsString()) { return throwTypeError("argument 4 must be a string (name)"); } has_name = true; } String::Utf8Value name(args[3]); if ( ! args[4]->IsString()) { return throwTypeError("argument 5 must be a string (service type)"); } String::Utf8Value serviceType(args[4]->ToString()); bool has_domain = false; if ( ! args[5]->IsNull() && ! args[5]->IsUndefined()) { if ( ! args[5]->IsString()) { return throwTypeError("argument 6 must be a string (domain)"); } has_domain = true; } String::Utf8Value domain(args[5]); bool has_host = false; if ( ! args[6]->IsNull() && ! args[6]->IsUndefined()) { if ( ! args[6]->IsString()) { return throwTypeError("argument 7 must be a string (host)"); } has_host = true; } String::Utf8Value host(args[6]); if ( ! args[7]->IsInt32()) { return throwTypeError("argument 8 must be an integer (port)"); } int raw_port = args[7]->ToInteger()->Int32Value(); if (raw_port > std::numeric_limits<uint16_t>::max() || raw_port < 0) { return throwError("argument 8: port number is out of bounds."); } uint16_t port = static_cast<uint16_t>(raw_port); uint16_t txtLen(0); const void * txtRecord(NULL); if ( ! args[8]->IsNull() && ! args[8]->IsUndefined()) { if (Buffer::HasInstance(args[8])) { Local<Object> bufferObject = args[8]->ToObject(); txtRecord = Buffer::Data(bufferObject); txtLen = Buffer::Length(bufferObject); } else if (TxtRecordRef::HasInstance(args[8])) { TxtRecordRef * ref = ObjectWrap::Unwrap<TxtRecordRef>(args[8]->ToObject()); txtLen = TXTRecordGetLength( & ref->GetTxtRecordRef()); txtRecord = TXTRecordGetBytesPtr( & ref->GetTxtRecordRef()); } else { return throwTypeError("argument 9 must be a buffer or a dns_sd.TXTRecordRef"); } } if ( ! args[9]->IsNull() && ! args[9]->IsUndefined()) { if ( ! args[9]->IsFunction()) { return throwTypeError("argument 10 must be a function (callBack)"); } serviceRef->SetCallback(Local<Function>::Cast(args[9])); } if ( ! args[10]->IsNull() && ! args[10]->IsUndefined()) { serviceRef->SetContext(args[10]); } // eleven arguments ... srsly? DNSServiceErrorType error = DNSServiceRegister( & serviceRef->GetServiceRef(), flags, interfaceIndex, has_name ? * name : NULL, *serviceType, has_domain ? * domain : NULL, has_host ? * host : NULL, htons(port), txtLen, txtRecord, args[9]->IsFunction() ? OnServiceRegistered : NULL, serviceRef); if (error != kDNSServiceErr_NoError) { return throwMdnsError("DNSServiceRegister()", error); } if ( ! serviceRef->SetSocketFlags()) { return throwError("Failed to set socket flags (O_NONBLOCK, FD_CLOEXEC)"); } return Undefined(); }
Handle<Value> dnsServiceRegister(Arguments const& args) { HandleScope scope; if (argumentCountMismatch(args, 11)) { return throwArgumentCountMismatchException(args, 11); } if ( ! ServiceRef::HasInstance(args[0])) { return throwTypeError("argument 1 must be a DNSServiceRef (sdRef)"); } ServiceRef * serviceRef = ObjectWrap::Unwrap<ServiceRef>(args[0]->ToObject()); if (serviceRef->IsInitialized()) { return throwError("DNSServiceRef is already initialized"); } if ( ! args[1]->IsInt32()) { return throwError("argument 2 must be an integer (DNSServiceFlags)"); } DNSServiceFlags flags = args[1]->ToInteger()->Int32Value(); if ( ! args[2]->IsInt32()) { return throwTypeError("argument 3 must be an integer (interfaceIndex)"); } uint32_t interfaceIndex = args[2]->ToInteger()->Int32Value(); bool has_name = false; if ( ! args[3]->IsNull() && ! args[3]->IsUndefined()) { if ( ! args[3]->IsString()) { return throwTypeError("argument 4 must be a string (name)"); } has_name = true; } String::Utf8Value name(args[3]); if ( ! args[4]->IsString()) { return throwTypeError("argument 5 must be a string (regtype)"); } String::Utf8Value regtype(args[4]->ToString()); bool has_domain = false; if ( ! args[5]->IsNull() && ! args[5]->IsUndefined()) { if ( ! args[5]->IsString()) { return throwTypeError("argument 6 must be a string (domain)"); } has_domain = true; } String::Utf8Value domain(args[5]); bool has_host = false; if ( ! args[6]->IsNull() && ! args[6]->IsUndefined()) { if ( ! args[6]->IsString()) { return throwTypeError("argument 7 must be a string (host)"); } has_host = true; } String::Utf8Value host(args[6]); if ( ! args[7]->IsInt32()) { return throwTypeError("argument 8 must be an integer (port)"); } int raw_port = args[7]->ToInteger()->Int32Value(); if (raw_port > std::numeric_limits<uint16_t>::max() || raw_port < 0) { return throwError("argument 8: port number is out of bounds."); } uint16_t port = static_cast<uint16_t>(raw_port); scopedTXTRecord record; if (! args[8]->IsNull() && ! args[8]->IsUndefined()) { if (args[8]->IsObject()) { record.initialize(); Local<Object> object = args[8]->ToObject(); if (! createTXTRecord(record, object)) { return throwTypeError("argument 9 is not a valid TXT Record"); } } else { return throwTypeError("argument 9 must be an object (txtRecord)"); } } if ( ! args[9]->IsNull() && ! args[9]->IsUndefined()) { if ( ! args[9]->IsFunction()) { return throwTypeError("argument 10 must be a function (callBack)"); } serviceRef->SetCallback(Local<Function>::Cast(args[9])); } if ( ! args[10]->IsNull() && ! args[10]->IsUndefined()) { serviceRef->SetContext(args[10]); } DNSServiceErrorType error = DNSServiceRegister( & serviceRef->GetServiceRef(), flags, interfaceIndex, has_name ? * name : NULL, *regtype, has_domain ? * domain : NULL, has_host ? * host : NULL, htons(port), record.getSize(), record.getTXTRecord(), OnServiceRegistered, serviceRef); if (error != kDNSServiceErr_NoError) { return throwMdnsError("dnsServiceRegister()", error); } if ( ! serviceRef->SetSocketFlags()) { return throwError("Failed to set socket flags (O_NONBLOCK, FD_CLOEXEC)"); } return Undefined(); }