HostDnsService.cpp revision d9241a9515e03c7c95a170b2106b365411df0c4e
/* $Id$ */
/** @file
* Base class for Host DNS & Co services.
*/
/*
* Copyright (C) 2013-2014 Oracle Corporation
*
* This file is part of VirtualBox Open Source Edition (OSE), as
* available from http://www.virtualbox.org. This file is free software;
* General Public License (GPL) as published by the Free Software
* Foundation, in version 2 as it comes in the "COPYING" file of the
* VirtualBox OSE distribution. VirtualBox OSE is distributed in the
* hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
*/
#include "Logging.h"
#include "VirtualBoxImpl.h"
#include <iprt/semaphore.h>
#include <iprt/critsect.h>
#include <algorithm>
#include <string>
#include "HostDnsService.h"
static HostDnsMonitor *g_monitor;
static void dumpHostDnsInformation(const HostDnsInformation&);
/* Lockee */
{
}
{
}
{
return &mLock;
}
/* ALock */
{
}
{
}
{
size_t i = 0;
}
struct HostDnsMonitor::Data
{
const bool fThreaded;
};
struct HostDnsMonitorProxy::Data
{
, fModified(true)
{}
virtual ~Data()
{
if (info)
{
delete info;
}
}
const VirtualBox *virtualbox;
const HostDnsMonitor *monitor;
bool fModified;
};
: m(NULL)
{
}
{
if (m)
{
delete m;
m = NULL;
}
}
{
/* XXX: Moved initialization from HostImpl.cpp */
if (!g_monitor)
{
# if defined (RT_OS_DARWIN)
g_monitor = new HostDnsServiceDarwin();
# elif defined(RT_OS_WINDOWS)
g_monitor = new HostDnsServiceWin();
# elif defined(RT_OS_LINUX)
g_monitor = new HostDnsServiceLinux();
# elif defined(RT_OS_SOLARIS)
g_monitor = new HostDnsServiceSolaris();
# elif defined(RT_OS_FREEBSD)
g_monitor = new HostDnsServiceFreebsd();
g_monitor = new HostDnsServiceOs2();
# else
g_monitor = new HostDnsService();
# endif
}
return g_monitor;
}
{
ALock l(this);
}
{
ALock l(this);
return;
}
void HostDnsMonitor::shutdown()
{
if (g_monitor)
{
delete g_monitor;
}
}
{
return m->info;
}
void HostDnsMonitor::notifyAll() const
{
ALock l(this);
}
{
ALock l(this);
}
{
if (m->fThreaded)
{
}
return S_OK;
}
{
}
{
return pThis->monitorWorker();
}
/* HostDnsMonitorProxy */
: m(NULL)
{
}
{
if (m)
{
if (m->monitor)
m->monitor->releaseMonitorProxy(this);
delete m;
m = NULL;
}
}
{
m->monitor->addMonitorProxy(this);
updateInfo();
}
void HostDnsMonitorProxy::notify() const
{
m->fModified = true;
}
{
ALock l(this);
if (m->fModified)
updateInfo();
LogRel(("HostDnsMonitorProxy::GetNameServers:\n"));
return S_OK;
}
{
ALock l(this);
if (m->fModified)
updateInfo();
return S_OK;
}
{
ALock l(this);
if (m->fModified)
updateInfo();
LogRel(("HostDnsMonitorProxy::GetSearchStrings:\n"));
return S_OK;
}
{
if (!m || !rhs->m)
return false;
/**
* we've assigned to the same instance of VirtualBox.
*/
}
void HostDnsMonitorProxy::updateInfo()
{
LogRel(("HostDnsMonitorProxy: Host's DNS information updated:\n"));
if (old)
{
LogRel(("HostDnsMonitorProxy: Old host information:\n"));
delete old;
}
m->fModified = false;
}
{
}
{
int i = 1;
++it, ++i)
}