summaryrefslogtreecommitdiff
path: root/sd/source/ui/remotecontrol/AvahiNetworkService.cxx
diff options
context:
space:
mode:
authorSiqi <me@siqi.fr>2013-07-25 15:45:19 +0200
committerSiqi LIU <me@siqi.fr>2013-07-25 17:28:01 +0200
commit6100d94078d37cb1413a0e45460cee480ba3e211 (patch)
tree10210f7394550966ab84a04d41bd8f0a6e46dac4 /sd/source/ui/remotecontrol/AvahiNetworkService.cxx
parent24d46ea66485ff8b5bca49ec587b41547787bf42 (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.cxx108
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);