diff options
author | Siqi <me@siqi.fr> | 2013-07-25 15:45:19 +0200 |
---|---|---|
committer | Siqi LIU <me@siqi.fr> | 2013-07-25 17:28:01 +0200 |
commit | 6100d94078d37cb1413a0e45460cee480ba3e211 (patch) | |
tree | 10210f7394550966ab84a04d41bd8f0a6e46dac4 /sd | |
parent | 24d46ea66485ff8b5bca49ec587b41547787bf42 (diff) |
avahi for linux refactored
Change-Id: I412d97bb8c57a66c1e395f9fe1b21fc0486173e7
Signed-off-by: Siqi LIU <me@siqi.fr>
Diffstat (limited to 'sd')
-rw-r--r-- | sd/Library_sd.mk | 4 | ||||
-rw-r--r-- | sd/source/ui/remotecontrol/AvahiNetworkService.cxx | 108 | ||||
-rw-r--r-- | sd/source/ui/remotecontrol/AvahiNetworkService.hxx | 35 | ||||
-rw-r--r-- | sd/source/ui/remotecontrol/DiscoveryService.cxx | 35 | ||||
-rw-r--r-- | sd/source/ui/remotecontrol/DiscoveryService.hxx | 31 | ||||
-rw-r--r-- | sd/source/ui/remotecontrol/OSXNetworkService.hxx | 39 | ||||
-rw-r--r-- | sd/source/ui/remotecontrol/OSXNetworkService.mm | 2 | ||||
-rw-r--r-- | sd/source/ui/remotecontrol/ZeroconfService.cxx | 45 | ||||
-rw-r--r-- | sd/source/ui/remotecontrol/ZeroconfService.hxx | 51 |
9 files changed, 163 insertions, 187 deletions
diff --git a/sd/Library_sd.mk b/sd/Library_sd.mk index e4234c2b78da..a6b759092909 100644 --- a/sd/Library_sd.mk +++ b/sd/Library_sd.mk @@ -537,6 +537,10 @@ $(eval $(call gb_Library_add_objcxxobjects,sd,\ sd/source/ui/remotecontrol/OSXNetworkService \ )) +$(eval $(call gb_Library_add_exception_objects,sd,\ + sd/source/ui/remotecontrol/OSXNetworkService \ +)) + else ifeq ($(OS),LINUX) diff --git a/sd/source/ui/remotecontrol/AvahiNetworkService.cxx b/sd/source/ui/remotecontrol/AvahiNetworkService.cxx index 8947e8d3a024..5cb52de68749 100644 --- a/sd/source/ui/remotecontrol/AvahiNetworkService.cxx +++ b/sd/source/ui/remotecontrol/AvahiNetworkService.cxx @@ -1,9 +1,5 @@ -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - #include <time.h> -#include <stdio.h> +#include <iostream> #include <stdlib.h> #include <assert.h> @@ -17,14 +13,16 @@ #include <avahi-common/thread-watch.h> #include "AvahiNetworkService.hxx" +#include "ZeroconfService.hxx" + +using namespace sd; static AvahiClient *client = NULL; static AvahiThreadedPoll *threaded_poll = NULL; static AvahiEntryGroup *group = NULL; -static char *name = NULL; +static AvahiNetworkService *avahiService = NULL; static void create_services(AvahiClient *c); -static void client_callback(AvahiClient *c, AvahiClientState state, AVAHI_GCC_UNUSED void * userdata); static void entry_group_callback(AvahiEntryGroup *g, AvahiEntryGroupState state, AVAHI_GCC_UNUSED void *userdata) { assert(g == group || group == NULL); @@ -35,7 +33,7 @@ static void entry_group_callback(AvahiEntryGroup *g, AvahiEntryGroupState state, switch (state) { case AVAHI_ENTRY_GROUP_ESTABLISHED : /* The entry group has been established successfully */ - fprintf(stderr, "Service '%s' successfully established.\n", name); + std::cerr << "Service " << avahiService->getName().c_str() << " successfully established.\n"; break; case AVAHI_ENTRY_GROUP_COLLISION : { @@ -43,11 +41,10 @@ static void entry_group_callback(AvahiEntryGroup *g, AvahiEntryGroupState state, /* A service name collision with a remote service * happened. Let's pick a new name */ - n = avahi_alternative_service_name(name); - avahi_free(name); - name = n; + n = avahi_alternative_service_name(avahiService->getName().c_str()); + avahiService->setName(n); - fprintf(stderr, "Service name collision, renaming service to '%s'\n", name); + std::cerr << "Service name collision, renaming service to " << avahiService->getName() << std::endl; /* And recreate the services */ create_services(avahi_entry_group_get_client(g)); @@ -79,59 +76,43 @@ static void create_services(AvahiClient *c) { if (!group) if (!(group = avahi_entry_group_new(c, entry_group_callback, NULL))) { fprintf(stderr, "avahi_entry_group_new() failed: %s\n", avahi_strerror(avahi_client_errno(c))); - goto fail; + avahiService->clear(); } /* If the group is empty (either because it was just created, or * because it was reset previously, add our entries. */ if (avahi_entry_group_is_empty(group)) { - fprintf(stderr, "Adding service '%s'\n", name); - - /* Create some random TXT data */ + fprintf(stderr, "Adding service '%s'\n", avahiService->getName().c_str()); snprintf(r, sizeof(r), "random=%i", rand()); + if ((ret = avahi_entry_group_add_service(group, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, static_cast<AvahiPublishFlags>(0), avahiService->getName().c_str(), "_impressremote._tcp", NULL, NULL, 1599, "local", r, NULL)) < 0) { - /* We will now add two services and one subtype to the entry - * group. The two services have the same name, but differ in - * the service type (IPP vs. BSD LPR). Only services with the - * same name should be put in the same entry group. */ + if (ret == AVAHI_ERR_COLLISION){ + /* A service name collision with a local service happened. Let's + * pick a new name */ + n = avahi_alternative_service_name(avahiService->getName().c_str()); + avahiService->setName(n); - /* Add the service for IPP */ - if ((ret = avahi_entry_group_add_service(group, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, static_cast<AvahiPublishFlags>(0), name, "_impressremote._libreoffice._tcp", NULL, NULL, 1599, "local", r, NULL)) < 0) { + fprintf(stderr, "Service name collision, renaming service to '%s'\n", avahiService->getName().c_str()); - if (ret == AVAHI_ERR_COLLISION) - goto collision; + avahi_entry_group_reset(group); - fprintf(stderr, "Failed to add _impressremote._libreoffice._tcp service: %s\n", avahi_strerror(ret)); - goto fail; + create_services(c); + return; + } + + fprintf(stderr, "Failed to add _impressremote._tcp service: %s\n", avahi_strerror(ret)); + avahiService->clear(); } /* Tell the server to register the service */ if ((ret = avahi_entry_group_commit(group)) < 0) { fprintf(stderr, "Failed to commit entry group: %s\n", avahi_strerror(ret)); - goto fail; + avahiService->clear(); } } return; - -collision: - - /* A service name collision with a local service happened. Let's - * pick a new name */ - n = avahi_alternative_service_name(name); - avahi_free(name); - name = n; - - fprintf(stderr, "Service name collision, renaming service to '%s'\n", name); - - avahi_entry_group_reset(group); - - create_services(c); - return; - -fail: - avahi_shutdown(); } static void client_callback(AvahiClient *c, AvahiClientState state, AVAHI_GCC_UNUSED void * userdata) { @@ -141,51 +122,27 @@ static void client_callback(AvahiClient *c, AvahiClientState state, AVAHI_GCC_UN switch (state) { case AVAHI_CLIENT_S_RUNNING: - - /* The server has startup successfully and registered its host - * name on the network, so it's time to create our services */ create_services(c); break; - case AVAHI_CLIENT_FAILURE: - fprintf(stderr, "Client failure: %s\n", avahi_strerror(avahi_client_errno(c))); - avahi_shutdown(); - + avahiService->clear(); break; - case AVAHI_CLIENT_S_COLLISION: - - /* Let's drop our registered services. When the server is back - * in AVAHI_SERVER_RUNNING state we will register them - * again with the new host name. */ - case AVAHI_CLIENT_S_REGISTERING: - - /* The server records are now being established. This - * might be caused by a host name change. We need to wait - * for our own records to register until the host name is - * properly esatblished. */ - if (group) avahi_entry_group_reset(group); - break; - case AVAHI_CLIENT_CONNECTING: ; } } - - - -void avahi_setup(const char * sname) { - /* Call this when the application starts up. */ +void AvahiNetworkService::setup() { int error = 0; - name = avahi_strdup( sname ); + avahiService = this; if (!(threaded_poll = avahi_threaded_poll_new())) { - fprintf(stderr, "avahi_threaded_poll_new '%s' failed.\n", name); + fprintf(stderr, "avahi_threaded_poll_new '%s' failed.\n", avahi_strdup( avahiService->getName().c_str() )); return; } @@ -201,13 +158,10 @@ void avahi_setup(const char * sname) { fprintf(stderr, "avahi_threaded_poll_start failed.\n"); return; } - - fprintf(stderr, "setup done.\n"); } -void avahi_shutdown(void) { +void AvahiNetworkService::clear() { /* Call this when the app shuts down */ - avahi_threaded_poll_stop(threaded_poll); avahi_client_free(client); avahi_threaded_poll_free(threaded_poll); diff --git a/sd/source/ui/remotecontrol/AvahiNetworkService.hxx b/sd/source/ui/remotecontrol/AvahiNetworkService.hxx index 64feb9948043..62809afda229 100644 --- a/sd/source/ui/remotecontrol/AvahiNetworkService.hxx +++ b/sd/source/ui/remotecontrol/AvahiNetworkService.hxx @@ -1,6 +1,37 @@ #ifndef AVAHI_NETWORK_SERVICE_H #define AVAHI_NETWORK_SERVICE_H - void avahi_setup(const char *); - void avahi_shutdown(void); + +#include <errno.h> +#include <stdlib.h> +#include <string.h> +#include <algorithm> +#include <vector> +#include <thread> +#include <iostream> + +#include <avahi-client/client.h> +#include <avahi-client/publish.h> +#include <avahi-common/thread-watch.h> + +#include <avahi-common/alternative.h> +#include <avahi-common/malloc.h> +#include <avahi-common/error.h> +#include <avahi-common/timeval.h> + +#include "ZeroconfService.hxx" + +namespace sd { + + class AvahiNetworkService : public ZeroconfService + { + public: + AvahiNetworkService(const std::string& aname = "", uint aport = 1599) + : ZeroconfService(aname, aport){} + ~AvahiNetworkService(); + + void clear(); + void setup(); + }; +} #endif diff --git a/sd/source/ui/remotecontrol/DiscoveryService.cxx b/sd/source/ui/remotecontrol/DiscoveryService.cxx index 1e2472c1c81b..eba3aa07605c 100644 --- a/sd/source/ui/remotecontrol/DiscoveryService.cxx +++ b/sd/source/ui/remotecontrol/DiscoveryService.cxx @@ -10,6 +10,7 @@ #include <errno.h> #include <stdlib.h> #include <string.h> +#include <unistd.h> #include <algorithm> #include <vector> #include <thread> @@ -40,7 +41,7 @@ #include <premac.h> #import <CoreFoundation/CoreFoundation.h> #include <postmac.h> - #import "OSXNetworkService.h" + #import "OSXNetworkService.hxx" #endif #ifdef LINUX @@ -54,19 +55,21 @@ using namespace sd; DiscoveryService::DiscoveryService() { #ifdef MACOSX -// Bonjour for OSX - osxservice = [[OSXNetworkService alloc] init]; - [osxservice publishImpressRemoteServiceOnLocalNetworkWithName: @""]; + // Bonjour for OSX + zService = new OSXNetworkService(); #endif #ifdef LINUX -// Avahi for Linux + // Avahi for Linux char hostname[1024]; hostname[1023] = '\0'; gethostname(hostname, 1023); - std::cerr << " AVAHI SETUP Called" << std::endl; - avahi_setup(hostname); + + zService = new AvahiNetworkService(hostname); #endif + zService->setup(); + + // Old implementation for backward compatibility matter mSocket = socket( AF_INET, SOCK_DGRAM, IPPROTO_UDP ); sockaddr_in aAddr; @@ -89,9 +92,9 @@ DiscoveryService::DiscoveryService() multicastRequest.imr_interface.s_addr = htonl(INADDR_ANY); rc = setsockopt( mSocket, IPPROTO_IP, IP_ADD_MEMBERSHIP, - #ifdef WNT + #ifdef WNT (const char*) - #endif + #endif &multicastRequest, sizeof(multicastRequest)); if (rc) @@ -99,28 +102,22 @@ DiscoveryService::DiscoveryService() SAL_WARN("sd", "DiscoveryService: setsockopt failed: " << errno); return; // would be better to throw, but unsure if caller handles that } -// #endif } DiscoveryService::~DiscoveryService() { - #ifdef LINUX - avahi_shutdown(); - #endif - - #ifdef MACOSX - [osxservice dealloc]; - #endif - #ifdef WNT closesocket( mSocket ); #else - close( mSocket ); + close( mSocket ); #endif + + zService->clear(); } void SAL_CALL DiscoveryService::run() { + // Kept for backwrad compatibility char aBuffer[BUFFER_SIZE]; while ( true ) { diff --git a/sd/source/ui/remotecontrol/DiscoveryService.hxx b/sd/source/ui/remotecontrol/DiscoveryService.hxx index 15e98cc6e249..ce851c2b38d9 100644 --- a/sd/source/ui/remotecontrol/DiscoveryService.hxx +++ b/sd/source/ui/remotecontrol/DiscoveryService.hxx @@ -11,39 +11,16 @@ #include <stdio.h> #include <stdlib.h> -#ifndef _WIN32 -#include <unistd.h> -#endif -#include <sys/types.h> #include <osl/socket.hxx> -#include <rtl/ref.hxx> #include <osl/thread.hxx> -#ifdef MACOSX - #include <osl/conditn.hxx> // Include this early to avoid error as check() gets defined by some SDK header to empty - #include <premac.h> - #import <CoreFoundation/CoreFoundation.h> - #include <postmac.h> - #import "OSXNetworkService.h" -#endif - - -/** -* The port for use for the main communication between LibO and remote control app. -*/ -#define PORT_DISCOVERY 1598 -#define BUFFER_SIZE 200 - -#define CHARSET RTL_TEXTENCODING_UTF8 +#include "ZeroconfService.hxx" struct sockaddr_in; namespace sd { - - - class DiscoveryService : public osl::Thread { public: @@ -55,13 +32,9 @@ namespace sd static DiscoveryService *spService; virtual void SAL_CALL run(); - - // osl::DatagramSocket mSocket; - #ifdef MACOSX - OSXNetworkService * osxservice; - #endif int mSocket; + ZeroconfService * zService; }; } diff --git a/sd/source/ui/remotecontrol/OSXNetworkService.hxx b/sd/source/ui/remotecontrol/OSXNetworkService.hxx new file mode 100644 index 000000000000..6659d7530182 --- /dev/null +++ b/sd/source/ui/remotecontrol/OSXNetworkService.hxx @@ -0,0 +1,39 @@ +#ifndef OSX_NETWORK_SERVICE_HXX +#define OSX_NETWORK_SERVICE_HXX + + +#include <errno.h> +#include <stdlib.h> +#include <string.h> +#include <algorithm> +#include <vector> +#include <thread> +#include <iostream> + +#include <osl/conditn.hxx> // Include this early to avoid error as check() gets defined by some SDK header to empty +#include <premac.h> +#import <CoreFoundation/CoreFoundation.h> +#include <postmac.h> +#import "OSXNetworkService.h" + +#include "ZeroconfService.hxx" + +namespace sd { + class OSXNetworkService : public ZeroconfService + { + private: + OSXNetworkService osxservice; + public: + OSXNetworkService(const string& aname = "", uint aport = 1599) + : ZeroconfService(aname, aport){} + + void clear() { + [osxservice dealloc]; + } + void setup() { + osxservice = [[OSXNetworkService alloc] init]; + [osxservice publishImpressRemoteServiceOnLocalNetworkWithName: @""]; + }; + }; +} +#endif
\ No newline at end of file diff --git a/sd/source/ui/remotecontrol/OSXNetworkService.mm b/sd/source/ui/remotecontrol/OSXNetworkService.mm index f4feb3e72cae..8e81def93ef4 100644 --- a/sd/source/ui/remotecontrol/OSXNetworkService.mm +++ b/sd/source/ui/remotecontrol/OSXNetworkService.mm @@ -17,7 +17,7 @@ - (void) publishImpressRemoteServiceOnLocalNetworkWithName:(NSString *)sName { - netService = [[NSNetService alloc] initWithDomain:@"local" type:@"_impressremote._libreoffice._tcp" name:sName port:1599]; + netService = [[NSNetService alloc] initWithDomain:@"local" type:@"_impressremote._tcp" name:sName port:1599]; if (netService != nil) { diff --git a/sd/source/ui/remotecontrol/ZeroconfService.cxx b/sd/source/ui/remotecontrol/ZeroconfService.cxx deleted file mode 100644 index 9c105a7e0071..000000000000 --- a/sd/source/ui/remotecontrol/ZeroconfService.cxx +++ /dev/null @@ -1,45 +0,0 @@ -#include "ZeroconfService.hxx" -#include <string> - - -ZeroconfService::ZeroconfService(string aname = "", uint aport = 1599) - :port(aport), name(aname) -{ - // Defined in subclasses - this->setup(); - - mSocket = socket( AF_INET, SOCK_DGRAM, IPPROTO_UDP ); - - sockaddr_in aAddr; - memset(&aAddr, 0, sizeof(aAddr)); - aAddr.sin_family = AF_INET; - aAddr.sin_addr.s_addr = htonl(INADDR_ANY); - aAddr.sin_port = htons( PORT_DISCOVERY ); - - int rc = bind( mSocket, (sockaddr*) &aAddr, sizeof(sockaddr_in) ); - - if (rc) - { - SAL_WARN("sd", "DiscoveryService: bind failed: " << errno); - return; // would be better to throw, but unsure if caller handles that - } - - struct ip_mreq multicastRequest; - - multicastRequest.imr_multiaddr.s_addr = inet_addr( "239.0.0.1" ); - multicastRequest.imr_interface.s_addr = htonl(INADDR_ANY); - - rc = setsockopt( mSocket, IPPROTO_IP, IP_ADD_MEMBERSHIP, - #ifdef WNT - (const char*) - #endif - &multicastRequest, sizeof(multicastRequest)); - - if (rc) - { - SAL_WARN("sd", "DiscoveryService: setsockopt failed: " << errno); - return; // would be better to throw, but unsure if caller handles that - } - - SAL_WARN("sd", "ZeroconfService created: " << name << " port:"<< port); -}
\ No newline at end of file diff --git a/sd/source/ui/remotecontrol/ZeroconfService.hxx b/sd/source/ui/remotecontrol/ZeroconfService.hxx index f7dc1b56d32c..2952fa4be4f6 100644 --- a/sd/source/ui/remotecontrol/ZeroconfService.hxx +++ b/sd/source/ui/remotecontrol/ZeroconfService.hxx @@ -2,20 +2,43 @@ #define ZEROCONF_SERVICE #include <string> +#include <stdio.h> +#include <stdlib.h> -class ZeroconfService -{ -private: - string name; - uint port; - -public: - ZeroconfService(string aname = "", uint aport = 1599); - ~ZeroconfService(); - // Clean up the service when closing - virtual void clear() = 0; - // Bonjour for OSX, Avahi for Linux - virtual void setup() = 0; -}; +/** +* The port for use for the main communication between LibO and remote control app. +*/ +#define PORT_DISCOVERY 1598 +#define BUFFER_SIZE 200 +#define CHARSET RTL_TEXTENCODING_UTF8 + +struct sockaddr_in; + +namespace sd{ + + class ZeroconfService + { + private: + int mSocket; + + protected: + std::string name; + uint port; + + public: + explicit ZeroconfService(const std::string& aname, uint aport) + :name(aname), port(aport){} + + std::string getName() const {return name;} + void setName(const char * n) {name = n;} + uint getPort() const {return port;} + + // Clean up the service when closing + virtual void clear() = 0; + // Bonjour for OSX, Avahi for Linux + virtual void setup() = 0; + }; + +} #endif |