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/source/ui/remotecontrol/AvahiNetworkService.cxx | |
parent | 24d46ea66485ff8b5bca49ec587b41547787bf42 (diff) |
avahi for linux refactored
Change-Id: I412d97bb8c57a66c1e395f9fe1b21fc0486173e7
Signed-off-by: Siqi LIU <me@siqi.fr>
Diffstat (limited to 'sd/source/ui/remotecontrol/AvahiNetworkService.cxx')
-rw-r--r-- | sd/source/ui/remotecontrol/AvahiNetworkService.cxx | 108 |
1 files changed, 31 insertions, 77 deletions
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); |