Add support for receiving iTunes streams back, got broken in the process
[deb_shairplay.git] / src / lib / dnssd.c
index 96e32dc7d561902a76f17fabcf7efb3fcfa9ba8f..dea813721152754a998a5c0f157912ba3eaad92e 100644 (file)
@@ -1,3 +1,17 @@
+/**
+ *  Copyright (C) 2011-2012  Juho Vähä-Herttua
+ *
+ *  This library is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU Lesser General Public
+ *  License as published by the Free Software Foundation; either
+ *  version 2.1 of the License, or (at your option) any later version.
+ *
+ *  This library is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ *  Lesser General Public License for more details.
+ */
+
 #include <stdlib.h>
 #include <string.h>
 #include <stdio.h>
 
 #ifndef WIN32
 # include <dns_sd.h>
+# define DNSSD_STDCALL
 #else
 # include <stdint.h>
 # if !defined(EFI32) && !defined(EFI64)
-#  define DNSSD_API __stdcall
+#  define DNSSD_STDCALL __stdcall
 # else
-#  define DNSSD_API
+#  define DNSSD_STDCALL
 # endif
 
 typedef struct _DNSServiceRef_t *DNSServiceRef;
@@ -28,7 +43,7 @@ typedef union _TXTRecordRef_t { char PrivateData[16]; char *ForceNaturalAlignmen
 typedef uint32_t DNSServiceFlags;
 typedef int32_t  DNSServiceErrorType;
 
-typedef void (DNSSD_API *DNSServiceRegisterReply)
+typedef void (DNSSD_STDCALL *DNSServiceRegisterReply)
     (
     DNSServiceRef                       sdRef,
     DNSServiceFlags                     flags,
@@ -40,7 +55,7 @@ typedef void (DNSSD_API *DNSServiceRegisterReply)
     );
 #endif
 
-typedef DNSServiceErrorType (DNSSD_API *DNSServiceRegister_t)
+typedef DNSServiceErrorType (DNSSD_STDCALL *DNSServiceRegister_t)
     (
     DNSServiceRef                       *sdRef,
     DNSServiceFlags                     flags,
@@ -55,23 +70,23 @@ typedef DNSServiceErrorType (DNSSD_API *DNSServiceRegister_t)
     DNSServiceRegisterReply             callBack,
     void                                *context
     );
-typedef void (DNSSD_API *DNSServiceRefDeallocate_t)(DNSServiceRef sdRef);
-typedef void (DNSSD_API *TXTRecordCreate_t)
+typedef void (DNSSD_STDCALL *DNSServiceRefDeallocate_t)(DNSServiceRef sdRef);
+typedef void (DNSSD_STDCALL *TXTRecordCreate_t)
     (
     TXTRecordRef     *txtRecord,
     uint16_t         bufferLen,
     void             *buffer
     );
-typedef void (DNSSD_API *TXTRecordDeallocate_t)(TXTRecordRef *txtRecord);
-typedef DNSServiceErrorType (DNSSD_API *TXTRecordSetValue_t)
+typedef void (DNSSD_STDCALL *TXTRecordDeallocate_t)(TXTRecordRef *txtRecord);
+typedef DNSServiceErrorType (DNSSD_STDCALL *TXTRecordSetValue_t)
     (
     TXTRecordRef     *txtRecord,
     const char       *key,
     uint8_t          valueSize,
     const void       *value
     );
-typedef uint16_t (DNSSD_API *TXTRecordGetLength_t)(const TXTRecordRef *txtRecord);
-typedef const void * (DNSSD_API *TXTRecordGetBytesPtr_t)(const TXTRecordRef *txtRecord);
+typedef uint16_t (DNSSD_STDCALL *TXTRecordGetLength_t)(const TXTRecordRef *txtRecord);
+typedef const void * (DNSSD_STDCALL *TXTRecordGetBytesPtr_t)(const TXTRecordRef *txtRecord);
 
 
 struct dnssd_s {
@@ -87,9 +102,6 @@ struct dnssd_s {
        TXTRecordGetBytesPtr_t     TXTRecordGetBytesPtr;
        TXTRecordDeallocate_t      TXTRecordDeallocate;
 
-       char hwaddr[MAX_HWADDR_LEN];
-       int hwaddrlen;
-
        DNSServiceRef raopService;
        DNSServiceRef airplayService;
 };
@@ -97,15 +109,11 @@ struct dnssd_s {
 
 
 dnssd_t *
-dnssd_init(const char *hwaddr, int hwaddrlen, int *error)
+dnssd_init(int *error)
 {
        dnssd_t *dnssd;
 
        if (error) *error = DNSSD_ERROR_NOERROR;
-       if (hwaddrlen > MAX_HWADDR_LEN) {
-               if (error) *error = DNSSD_ERROR_HWADDRLEN;
-               return NULL;
-       }
 
        dnssd = calloc(1, sizeof(dnssd_t));
        if (!dnssd) {
@@ -146,9 +154,6 @@ dnssd_init(const char *hwaddr, int hwaddrlen, int *error)
        dnssd->TXTRecordDeallocate = &TXTRecordDeallocate;
 #endif
 
-       memcpy(dnssd->hwaddr, hwaddr, hwaddrlen);
-       dnssd->hwaddrlen = hwaddrlen;
-
        return dnssd;
 }
 
@@ -164,13 +169,15 @@ dnssd_destroy(dnssd_t *dnssd)
 }
 
 int
-dnssd_register_raop(dnssd_t *dnssd, const char *name, unsigned short port)
+dnssd_register_raop(dnssd_t *dnssd, const char *name, unsigned short port, const char *hwaddr, int hwaddrlen, int password)
 {
        TXTRecordRef txtRecord;
        char servname[MAX_SERVNAME];
        int ret;
 
        assert(dnssd);
+       assert(name);
+       assert(hwaddr);
 
        dnssd->TXTRecordCreate(&txtRecord, 0, NULL);
        dnssd->TXTRecordSetValue(&txtRecord, "txtvers", strlen(RAOP_TXTVERS), RAOP_TXTVERS);
@@ -181,16 +188,20 @@ dnssd_register_raop(dnssd_t *dnssd, const char *name, unsigned short port)
        dnssd->TXTRecordSetValue(&txtRecord, "da", strlen(RAOP_DA), RAOP_DA);
        dnssd->TXTRecordSetValue(&txtRecord, "sr", strlen(RAOP_SR), RAOP_SR);
        dnssd->TXTRecordSetValue(&txtRecord, "ss", strlen(RAOP_SS), RAOP_SS);
-       dnssd->TXTRecordSetValue(&txtRecord, "pw", strlen(RAOP_PW), RAOP_PW);
+       if (password) {
+               dnssd->TXTRecordSetValue(&txtRecord, "pw", strlen("true"), "true");
+       } else {
+               dnssd->TXTRecordSetValue(&txtRecord, "pw", strlen("false"), "false");
+       }
        dnssd->TXTRecordSetValue(&txtRecord, "vn", strlen(RAOP_VN), RAOP_VN);
        dnssd->TXTRecordSetValue(&txtRecord, "tp", strlen(RAOP_TP), RAOP_TP);
        dnssd->TXTRecordSetValue(&txtRecord, "md", strlen(RAOP_MD), RAOP_MD);
        dnssd->TXTRecordSetValue(&txtRecord, "vs", strlen(GLOBAL_VERSION), GLOBAL_VERSION);
-       dnssd->TXTRecordSetValue(&txtRecord, "am", strlen(RAOP_AM), RAOP_AM);
-       dnssd->TXTRecordSetValue(&txtRecord, "sf", strlen(RAOP_SF), RAOP_SF);
+       dnssd->TXTRecordSetValue(&txtRecord, "sm", strlen(RAOP_SM), RAOP_SM);
+       dnssd->TXTRecordSetValue(&txtRecord, "ek", strlen(RAOP_EK), RAOP_EK);
 
        /* Convert hardware address to string */
-       ret = utils_hwaddr_raop(servname, sizeof(servname), dnssd->hwaddr, dnssd->hwaddrlen);
+       ret = utils_hwaddr_raop(servname, sizeof(servname), hwaddr, hwaddrlen);
        if (ret < 0) {
                /* FIXME: handle better */
                return -1;
@@ -220,7 +231,7 @@ dnssd_register_raop(dnssd_t *dnssd, const char *name, unsigned short port)
 }
 
 int
-dnssd_register_airplay(dnssd_t *dnssd, const char *name, unsigned short port)
+dnssd_register_airplay(dnssd_t *dnssd, const char *name, unsigned short port, const char *hwaddr, int hwaddrlen)
 {
        TXTRecordRef txtRecord;
        char deviceid[3*MAX_HWADDR_LEN];
@@ -228,9 +239,11 @@ dnssd_register_airplay(dnssd_t *dnssd, const char *name, unsigned short port)
        int ret;
 
        assert(dnssd);
+       assert(name);
+       assert(hwaddr);
 
        /* Convert hardware address to string */
-       ret = utils_hwaddr_airplay(deviceid, sizeof(deviceid), dnssd->hwaddr, dnssd->hwaddrlen);
+       ret = utils_hwaddr_airplay(deviceid, sizeof(deviceid), hwaddr, hwaddrlen);
        if (ret < 0) {
                /* FIXME: handle better */
                return -1;