summaryrefslogtreecommitdiff
path: root/src/components/transport_manager/src/tcp/dnssd_service_browser.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/components/transport_manager/src/tcp/dnssd_service_browser.cc')
-rw-r--r--src/components/transport_manager/src/tcp/dnssd_service_browser.cc183
1 files changed, 90 insertions, 93 deletions
diff --git a/src/components/transport_manager/src/tcp/dnssd_service_browser.cc b/src/components/transport_manager/src/tcp/dnssd_service_browser.cc
index 558058576..3571ac815 100644
--- a/src/components/transport_manager/src/tcp/dnssd_service_browser.cc
+++ b/src/components/transport_manager/src/tcp/dnssd_service_browser.cc
@@ -1,4 +1,4 @@
-/**
+/*
*
* Copyright (c) 2013, Ford Motor Company
* All rights reserved.
@@ -33,37 +33,41 @@
#include <algorithm>
#include <map>
+#include "utils/logger.h"
#include "transport_manager/transport_adapter/transport_adapter_impl.h"
#include "transport_manager/tcp/tcp_device.h"
#include "transport_manager/tcp/dnssd_service_browser.h"
-#include "utils/logger.h"
+
namespace transport_manager {
namespace transport_adapter {
CREATE_LOGGERPTR_GLOBAL(logger_, "TransportManager")
+
bool operator==(const DnssdServiceRecord& a, const DnssdServiceRecord& b) {
return a.name == b.name && a.type == b.type && a.interface == b.interface
- && a.protocol == b.protocol && a.domain_name == b.domain_name;
+ && a.protocol == b.protocol && a.domain_name == b.domain_name;
}
void DnssdServiceBrowser::Terminate() {
- LOG4CXX_TRACE(logger_, "enter");
+ LOG4CXX_AUTO_TRACE(logger_);
if (0 != avahi_threaded_poll_) {
avahi_threaded_poll_stop(avahi_threaded_poll_);
}
if (0 != avahi_service_browser_) {
avahi_service_browser_free(avahi_service_browser_);
+ avahi_service_browser_ = NULL;
}
if (0 != avahi_client_) {
avahi_client_free(avahi_client_);
+ avahi_client_ = NULL;
}
if (0 != avahi_threaded_poll_) {
avahi_threaded_poll_free(avahi_threaded_poll_);
+ avahi_threaded_poll_ = NULL;
}
- LOG4CXX_TRACE(logger_, "exit");
}
bool DnssdServiceBrowser::IsInitialised() const {
@@ -71,18 +75,16 @@ bool DnssdServiceBrowser::IsInitialised() const {
}
DnssdServiceBrowser::DnssdServiceBrowser(TransportAdapterController* controller)
- : controller_(controller),
- avahi_service_browser_(0),
- avahi_threaded_poll_(0),
- avahi_client_(0),
- service_records_(),
- mutex_(),
- initialised_(false) {
- pthread_mutex_init(&mutex_, 0);
+ : controller_(controller),
+ avahi_service_browser_(0),
+ avahi_threaded_poll_(0),
+ avahi_client_(0),
+ service_records_(),
+ mutex_(),
+ initialised_(false) {
}
DnssdServiceBrowser::~DnssdServiceBrowser() {
- pthread_mutex_destroy(&mutex_);
}
void DnssdServiceBrowser::OnClientConnected() {
@@ -91,7 +93,7 @@ void DnssdServiceBrowser::OnClientConnected() {
}
void DnssdServiceBrowser::OnClientFailure() {
- LOG4CXX_TRACE(logger_, "enter");
+ LOG4CXX_AUTO_TRACE(logger_);
const int avahi_errno = avahi_client_errno(avahi_client_);
if (avahi_errno == AVAHI_ERR_DISCONNECTED) {
LOG4CXX_DEBUG(logger_, "AvahiClient disconnected");
@@ -100,16 +102,16 @@ void DnssdServiceBrowser::OnClientFailure() {
LOG4CXX_ERROR(logger_,
"AvahiClient failure: " << avahi_strerror(avahi_errno));
}
- LOG4CXX_TRACE(logger_, "exit");
}
void AvahiClientCallback(AvahiClient* avahi_client,
AvahiClientState avahi_client_state, void* data) {
- LOG4CXX_TRACE(logger_,
- "enter. avahi_client " << avahi_client << "avahi_client_state " <<
- avahi_client_state << "data " << data);
+ LOG4CXX_AUTO_TRACE(logger_);
+ LOG4CXX_DEBUG(
+ logger_,
+ "avahi_client " << avahi_client << ", avahi_client_state " << avahi_client_state << ", data " << data);
DnssdServiceBrowser* dnssd_service_browser =
- static_cast<DnssdServiceBrowser*>(data);
+ static_cast<DnssdServiceBrowser*>(data);
switch (avahi_client_state) {
case AVAHI_CLIENT_S_RUNNING:
@@ -121,10 +123,10 @@ void AvahiClientCallback(AvahiClient* avahi_client,
LOG4CXX_DEBUG(logger_, "avahi_client_state: AVAHI_CLIENT_FAILURE");
break;
default: {
- LOG4CXX_ERROR(logger_, "Unknown avahi_client_state: " << avahi_client_state);
+ LOG4CXX_ERROR(logger_,
+ "Unknown avahi_client_state: " << avahi_client_state);
}
}
- LOG4CXX_TRACE(logger_, "exit");
}
void AvahiServiceBrowserCallback(AvahiServiceBrowser* avahi_service_browser,
@@ -132,21 +134,21 @@ void AvahiServiceBrowserCallback(AvahiServiceBrowser* avahi_service_browser,
AvahiBrowserEvent event, const char* name,
const char* type, const char* domain,
AvahiLookupResultFlags flags, void* data) {
- LOG4CXX_TRACE(logger_, "enter. avahi_service_browser " << avahi_service_browser <<
- " interface " << interface << " protocol " << protocol <<
- " event " << event << " name " << name << " type " << type << " domain " << domain <<
- " flags " << flags << " data " << data);
+ LOG4CXX_AUTO_TRACE(logger_);
+ LOG4CXX_DEBUG(
+ logger_,
+ "avahi_service_browser " << avahi_service_browser << " interface " << interface <<
+ " protocol " << protocol << " event " << event << " name " << name <<
+ " type " << type << " domain " << domain << " flags " << flags << " data " << data);
DnssdServiceBrowser* dnssd_service_browser =
- static_cast<DnssdServiceBrowser*>(data);
+ static_cast<DnssdServiceBrowser*>(data);
switch (event) {
case AVAHI_BROWSER_FAILURE:
LOG4CXX_ERROR(
logger_,
- "AvahiServiceBrowser failure: " << avahi_strerror(
- avahi_client_errno(
- avahi_service_browser_get_client(
- avahi_service_browser))));
+ "AvahiServiceBrowser failure: " << avahi_strerror(avahi_client_errno(
+ avahi_service_browser_get_client(avahi_service_browser))));
break;
case AVAHI_BROWSER_NEW:
@@ -163,6 +165,7 @@ void AvahiServiceBrowserCallback(AvahiServiceBrowser* avahi_service_browser,
case AVAHI_BROWSER_ALL_FOR_NOW:
LOG4CXX_DEBUG(logger_, "event: AVAHI_BROWSER_ALL_FOR_NOW");
+ break;
case AVAHI_BROWSER_CACHE_EXHAUSTED:
LOG4CXX_DEBUG(logger_, "event: AVAHI_BROWSER_CACHE_EXHAUSTED");
break;
@@ -171,33 +174,29 @@ void AvahiServiceBrowserCallback(AvahiServiceBrowser* avahi_service_browser,
}
void DnssdServiceBrowser::ServiceResolved(
- const DnssdServiceRecord& service_record) {
- LOG4CXX_TRACE(logger_, "enter");
- pthread_mutex_lock(&mutex_);
+ const DnssdServiceRecord& service_record) {
+ LOG4CXX_AUTO_TRACE(logger_);
+ sync_primitives::AutoLock locker(mutex_);
ServiceRecords::iterator service_record_it = std::find(
- service_records_.begin(), service_records_.end(), service_record);
+ service_records_.begin(), service_records_.end(), service_record);
if (service_record_it != service_records_.end()) {
*service_record_it = service_record;
}
DeviceVector device_vector = PrepareDeviceVector();
controller_->SearchDeviceDone(device_vector);
- pthread_mutex_unlock(&mutex_);
- LOG4CXX_TRACE(logger_, "exit");
}
void DnssdServiceBrowser::ServiceResolveFailed(
- const DnssdServiceRecord& service_record) {
- LOG4CXX_TRACE(logger_, "enter");
- LOG4CXX_ERROR(logger_,
+ const DnssdServiceRecord& service_record) {
+ LOG4CXX_AUTO_TRACE(logger_);
+ LOG4CXX_DEBUG(logger_,
"AvahiServiceResolver failure for: " << service_record.name);
- pthread_mutex_lock(&mutex_);
+ sync_primitives::AutoLock locker(mutex_);
ServiceRecords::iterator service_record_it = std::find(
- service_records_.begin(), service_records_.end(), service_record);
+ service_records_.begin(), service_records_.end(), service_record);
if (service_record_it != service_records_.end()) {
service_records_.erase(service_record_it);
}
- pthread_mutex_unlock(&mutex_);
- LOG4CXX_TRACE(logger_, "exit");
}
void AvahiServiceResolverCallback(AvahiServiceResolver* avahi_service_resolver,
@@ -209,14 +208,16 @@ void AvahiServiceResolverCallback(AvahiServiceResolver* avahi_service_resolver,
const AvahiAddress* avahi_address,
uint16_t port, AvahiStringList* txt,
AvahiLookupResultFlags flags, void* data) {
- LOG4CXX_TRACE(logger_, "enter. avahi_service_resolver " << avahi_service_resolver <<
- " interface " << interface <<
- " protocol " << protocol << " event " << event << " name " << name << " type " << type <<
- " domain " << domain << " host_name " << host_name <<
- " avahi_address " << avahi_address << " port " << port << " txt " << txt << " flags " <<
- flags << " data " << data);
+ LOG4CXX_AUTO_TRACE(logger_);
+ LOG4CXX_DEBUG(
+ logger_,
+ "avahi_service_resolver " << avahi_service_resolver << " interface " << interface <<
+ " protocol " << protocol << " event " << event << " name " << name <<
+ " type " << type << " domain " << domain << " host_name " << host_name <<
+ " avahi_address " << avahi_address << " port " << port <<
+ " txt " << txt << " flags " << flags << " data " << data);
DnssdServiceBrowser* dnssd_service_browser =
- static_cast<DnssdServiceBrowser*>(data);
+ static_cast<DnssdServiceBrowser*>(data);
DnssdServiceRecord service_record;
service_record.interface = interface;
@@ -239,62 +240,60 @@ void AvahiServiceResolverCallback(AvahiServiceResolver* avahi_service_resolver,
}
avahi_service_resolver_free(avahi_service_resolver);
- LOG4CXX_TRACE(logger_, "exit");
}
TransportAdapter::Error DnssdServiceBrowser::CreateAvahiClientAndBrowser() {
- LOG4CXX_TRACE(logger_, "enter");
+ LOG4CXX_AUTO_TRACE(logger_);
if (0 != avahi_service_browser_) {
avahi_service_browser_free(avahi_service_browser_);
+ avahi_service_browser_ = NULL;
}
if (0 != avahi_client_) {
avahi_client_free(avahi_client_);
+ avahi_client_ = NULL;
}
int avahi_error;
avahi_client_ = avahi_client_new(
- avahi_threaded_poll_get(avahi_threaded_poll_), AVAHI_CLIENT_NO_FAIL,
- AvahiClientCallback, this, &avahi_error);
+ avahi_threaded_poll_get(avahi_threaded_poll_), AVAHI_CLIENT_NO_FAIL,
+ AvahiClientCallback, this, &avahi_error);
if (0 == avahi_client_) {
- LOG4CXX_ERROR(logger_, "Failed to create AvahiClient: " << avahi_strerror(avahi_error));
- LOG4CXX_TRACE(logger_, "exit with TransportAdapter::FAIL");
+ LOG4CXX_ERROR(
+ logger_,
+ "Failed to create AvahiClient: " << avahi_strerror(avahi_error));
return TransportAdapter::FAIL;
}
- pthread_mutex_lock(&mutex_);
+ mutex_.Acquire();
service_records_.clear();
- pthread_mutex_unlock(&mutex_);
+ mutex_.Release();
avahi_service_browser_ = avahi_service_browser_new(
- avahi_client_, AVAHI_IF_UNSPEC, /* TODO use only required iface */
- AVAHI_PROTO_INET, DNSSD_DEFAULT_SERVICE_TYPE, NULL, /* use default domain */
- static_cast<AvahiLookupFlags>(0), AvahiServiceBrowserCallback, this);
- LOG4CXX_TRACE(logger_, "exit with TransportAdapter::OK");
+ avahi_client_, AVAHI_IF_UNSPEC, /* TODO use only required iface */
+ AVAHI_PROTO_INET, DNSSD_DEFAULT_SERVICE_TYPE, NULL, /* use default domain */
+ static_cast<AvahiLookupFlags>(0), AvahiServiceBrowserCallback, this);
return TransportAdapter::OK;
}
TransportAdapter::Error DnssdServiceBrowser::Init() {
- LOG4CXX_TRACE(logger_, "enter");
+ LOG4CXX_AUTO_TRACE(logger_);
avahi_threaded_poll_ = avahi_threaded_poll_new();
if (0 == avahi_threaded_poll_) {
LOG4CXX_ERROR(logger_, "Failed to create AvahiThreadedPoll");
- LOG4CXX_TRACE(logger_, "exit with TransportAdapter::FAIL");
return TransportAdapter::FAIL;
}
const TransportAdapter::Error err = CreateAvahiClientAndBrowser();
if (err != TransportAdapter::OK) {
- LOG4CXX_TRACE(logger_, "exit with error " << err);
+ LOG4CXX_ERROR(logger_, "Error " << err);
return err;
}
const int poll_start_status = avahi_threaded_poll_start(avahi_threaded_poll_);
if (0 != poll_start_status) {
LOG4CXX_ERROR(logger_, "Failed to start AvahiThreadedPoll");
- LOG4CXX_TRACE(logger_, "exit with TransportAdapter::FAIL. Condition: 0 != poll_start_status");
return TransportAdapter::FAIL;
}
- LOG4CXX_TRACE(logger_, "exit with TransportAdapter::OK");
return TransportAdapter::OK;
}
@@ -305,8 +304,10 @@ TransportAdapter::Error DnssdServiceBrowser::Scan() {
void DnssdServiceBrowser::AddService(AvahiIfIndex interface,
AvahiProtocol protocol, const char* name,
const char* type, const char* domain) {
- LOG4CXX_TRACE(logger_, "enter: interface " << interface << " protocol " << protocol <<
- " name " << name << " type " << type << " domain " << domain);
+ LOG4CXX_AUTO_TRACE(logger_);
+ LOG4CXX_DEBUG(
+ logger_,
+ "interface " << interface << " protocol " << protocol << " name " << name << " type " << type << " domain " << domain);
DnssdServiceRecord record;
record.interface = interface;
record.protocol = protocol;
@@ -314,25 +315,25 @@ void DnssdServiceBrowser::AddService(AvahiIfIndex interface,
record.name = name;
record.type = type;
- pthread_mutex_lock(&mutex_);
+ sync_primitives::AutoLock locker(mutex_);
if (service_records_.end()
== std::find(service_records_.begin(), service_records_.end(), record)) {
service_records_.push_back(record);
- avahi_service_resolver_new(
- avahi_client_, interface, protocol, name, type, domain,
- AVAHI_PROTO_INET, static_cast<AvahiLookupFlags>(0),
- AvahiServiceResolverCallback, this);
+ avahi_service_resolver_new(avahi_client_, interface, protocol, name, type,
+ domain, AVAHI_PROTO_INET,
+ static_cast<AvahiLookupFlags>(0),
+ AvahiServiceResolverCallback, this);
}
- pthread_mutex_unlock(&mutex_);
- LOG4CXX_TRACE(logger_, "exit");
}
void DnssdServiceBrowser::RemoveService(AvahiIfIndex interface,
AvahiProtocol protocol,
const char* name, const char* type,
const char* domain) {
- LOG4CXX_TRACE(logger_, "enter: interface " << interface << " protocol " << protocol <<
- " name " << name << " type " << type << " domain " << domain);
+ LOG4CXX_AUTO_TRACE(logger_);
+ LOG4CXX_DEBUG(
+ logger_,
+ "interface " << interface << " protocol " << protocol << " name " << name << " type " << type << " domain " << domain);
DnssdServiceRecord record;
record.interface = interface;
record.protocol = protocol;
@@ -340,42 +341,38 @@ void DnssdServiceBrowser::RemoveService(AvahiIfIndex interface,
record.type = type;
record.domain_name = domain;
- pthread_mutex_lock(&mutex_);
+ sync_primitives::AutoLock locker(mutex_);
service_records_.erase(
- std::remove(service_records_.begin(), service_records_.end(), record),
- service_records_.end());
- pthread_mutex_unlock(&mutex_);
- LOG4CXX_TRACE(logger_, "exit");
+ std::remove(service_records_.begin(), service_records_.end(), record),
+ service_records_.end());
}
DeviceVector DnssdServiceBrowser::PrepareDeviceVector() const {
- LOG4CXX_TRACE(logger_, "enter");
+ LOG4CXX_AUTO_TRACE(logger_);
std::map<uint32_t, TcpDevice*> devices;
for (ServiceRecords::const_iterator it = service_records_.begin();
- it != service_records_.end(); ++it) {
+ it != service_records_.end(); ++it) {
const DnssdServiceRecord& service_record = *it;
if (service_record.host_name.empty()) {
continue;
}
if (devices[service_record.addr] == 0) {
devices[service_record.addr] = new TcpDevice(service_record.addr,
- service_record.host_name);
+ service_record.host_name);
}
if (devices[service_record.addr] != 0) {
devices[service_record.addr]->AddDiscoveredApplication(
- service_record.port);
+ service_record.port);
}
}
DeviceVector device_vector;
device_vector.reserve(devices.size());
for (std::map<uint32_t, TcpDevice*>::const_iterator it = devices.begin();
- it != devices.end(); ++it) {
+ it != devices.end(); ++it) {
device_vector.push_back(DeviceSptr(it->second));
}
- LOG4CXX_TRACE(logger_, "exit");
return device_vector;
}
-} // namespace
-} // namespace
-
+} // namespace transport_adapter
+} // namespace transport_manager