Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : */
9 : #include <stdlib.h>
10 : #include <algorithm>
11 : #include <vector>
12 :
13 : #include <comphelper/processfactory.hxx>
14 : #include <rtl/strbuf.hxx>
15 : #include <string.h>
16 :
17 : #include "DiscoveryService.hxx"
18 :
19 : #ifdef WIN32
20 : // LO vs WinAPI conflict
21 : #undef WB_LEFT
22 : #undef WB_RIGHT
23 :
24 : #include <winsock2.h>
25 : #include <ws2tcpip.h>
26 : typedef int socklen_t;
27 : #else
28 : #include <sys/types.h>
29 : #include <sys/socket.h>
30 : #include <netinet/in.h>
31 : #include <arpa/inet.h>
32 : #endif
33 :
34 : using namespace osl;
35 : using namespace rtl;
36 : using namespace sd;
37 :
38 0 : DiscoveryService::DiscoveryService() :
39 0 : mSocket(0)
40 : {
41 0 : mSocket = socket( AF_INET, SOCK_DGRAM, IPPROTO_UDP );
42 :
43 : sockaddr_in aAddr;
44 0 : aAddr.sin_family = AF_INET;
45 0 : aAddr.sin_addr.s_addr = htonl(INADDR_ANY);
46 0 : aAddr.sin_port = htons( PORT_DISCOVERY );
47 :
48 0 : bind( mSocket, (sockaddr*) &aAddr, sizeof(sockaddr_in) );
49 :
50 : struct ip_mreq multicastRequest;
51 :
52 0 : multicastRequest.imr_multiaddr.s_addr = inet_addr( "239.0.0.1" );
53 0 : multicastRequest.imr_interface.s_addr = htonl(INADDR_ANY);
54 :
55 : setsockopt( mSocket, IPPROTO_IP, IP_ADD_MEMBERSHIP,
56 : #ifdef WNT
57 : (const char*)
58 : #endif
59 0 : &multicastRequest, sizeof(multicastRequest));
60 0 : }
61 :
62 0 : DiscoveryService::~DiscoveryService()
63 : {
64 0 : }
65 :
66 0 : void SAL_CALL DiscoveryService::run()
67 : {
68 : char aBuffer[BUFFER_SIZE];
69 0 : while ( true )
70 : {
71 0 : memset( aBuffer, 0, sizeof(char) * BUFFER_SIZE );
72 : sockaddr_in aAddr;
73 0 : socklen_t aLen = sizeof( aAddr );
74 0 : recvfrom( mSocket, aBuffer, BUFFER_SIZE, 0, (sockaddr*) &aAddr, &aLen );
75 0 : OString aString( aBuffer, strlen( "LOREMOTE_SEARCH" ) );
76 0 : if ( aString.compareTo( "LOREMOTE_SEARCH" ) == 0 )
77 : {
78 0 : OStringBuffer aStringBuffer("LOREMOTE_ADVERTISE\n");
79 : aStringBuffer.append( OUStringToOString(
80 0 : osl::SocketAddr::getLocalHostname(), RTL_TEXTENCODING_UTF8 ) )
81 0 : .append( "\n\n" );
82 0 : if ( sendto( mSocket, aStringBuffer.getStr(),
83 0 : aStringBuffer.getLength(), 0, (sockaddr*) &aAddr,
84 0 : sizeof(aAddr) ) <= 0 )
85 : {
86 : // Read error or closed socket -- we are done.
87 0 : return;
88 0 : }
89 : }
90 0 : }
91 : }
92 :
93 : DiscoveryService *sd::DiscoveryService::spService = NULL;
94 :
95 0 : void DiscoveryService::setup()
96 : {
97 0 : if (spService)
98 0 : return;
99 :
100 0 : spService = new DiscoveryService();
101 0 : spService->create();
102 : }
103 :
104 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|