summaryrefslogtreecommitdiff
path: root/sd/source/ui/remotecontrol
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
parent24d46ea66485ff8b5bca49ec587b41547787bf42 (diff)
avahi for linux refactored
Change-Id: I412d97bb8c57a66c1e395f9fe1b21fc0486173e7 Signed-off-by: Siqi LIU <me@siqi.fr>
Diffstat (limited to 'sd/source/ui/remotecontrol')
-rw-r--r--sd/source/ui/remotecontrol/AvahiNetworkService.cxx108
-rw-r--r--sd/source/ui/remotecontrol/AvahiNetworkService.hxx35
-rw-r--r--sd/source/ui/remotecontrol/DiscoveryService.cxx35
-rw-r--r--sd/source/ui/remotecontrol/DiscoveryService.hxx31
-rw-r--r--sd/source/ui/remotecontrol/OSXNetworkService.hxx39
-rw-r--r--sd/source/ui/remotecontrol/OSXNetworkService.mm2
-rw-r--r--sd/source/ui/remotecontrol/ZeroconfService.cxx45
-rw-r--r--sd/source/ui/remotecontrol/ZeroconfService.hxx51
8 files changed, 159 insertions, 187 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);
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