• Skip to content
  • Skip to link menu
  • KDE API Reference
  • kdelibs-4.14.38 API Reference
  • KDE Home
  • Contact Us
 

KDECore

  • kdecore
  • network
k3reverseresolver.cpp
Go to the documentation of this file.
1/* -*- C++ -*-
2 * Copyright (C) 2003 Thiago Macieira <thiago@kde.org>
3 *
4 *
5 * Permission is hereby granted, free of charge, to any person obtaining
6 * a copy of this software and associated documentation files (the
7 * "Software"), to deal in the Software without restriction, including
8 * without limitation the rights to use, copy, modify, merge, publish,
9 * distribute, sublicense, and/or sell copies of the Software, and to
10 * permit persons to whom the Software is furnished to do so, subject to
11 * the following conditions:
12 *
13 * The above copyright notice and this permission notice shall be included
14 * in all copies or substantial portions of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20 * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21 * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22 * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23 */
24
25#include "k3reverseresolver.h"
26
27#include <config.h>
28#include <config-network.h>
29
30// System includes
31#include <sys/types.h>
32#include <sys/socket.h>
33#include <netdb.h>
34#include <signal.h>
35
36// Qt
37#include <QEvent>
38#include <QMutex>
39#include <QCoreApplication>
40
41// Us
42#include "k3resolver_p.h"
43#include "k3resolverworkerbase.h"
44#include "k3socketaddress.h"
45
46#ifndef HAVE_GETNAMEINFO
47// FIXME KDE4:
48// move to syssocket or adapt
49# include "netsupp.h"
50#endif
51
52using namespace KNetwork;
53using namespace KNetwork::Internal;
54
55namespace
56{
57 class ReverseThread: public KResolverWorkerBase
58 {
59 public:
60 ReverseThread(const KSocketAddress& addr, int flags)
61 : m_addr(addr), m_flags(flags), m_parent(0L)
62 { }
63
64 virtual ~ReverseThread()
65 { }
66
67 virtual bool preprocess()
68 { return true; }
69 virtual bool run();
70 virtual bool postprocess();
71
72 // input:
73 KSocketAddress m_addr;
74 int m_flags;
75 KReverseResolver *m_parent;
76
77 // output:
78 QString node;
79 QString service;
80 bool success;
81 };
82
83 class KReverseResolverEvent: public QEvent
84 {
85 public:
86 static const int myType = QEvent::User + 63; // arbitrary value
87 QString node;
88 QString service;
89 bool success;
90
91 KReverseResolverEvent(const QString& _node, const QString& _service,
92 bool _success)
93 : QEvent((Type)myType), node(_node),
94 service(_service), success(_success)
95 { }
96 };
97}
98
99class KNetwork::KReverseResolverPrivate
100{
101public:
102 QString node;
103 QString service;
104 KSocketAddress addr;
105 int flags;
106
107 ReverseThread* worker;
108 bool success;
109
110 inline KReverseResolverPrivate(const KSocketAddress& _addr)
111 : addr(_addr), worker(0L), success(false)
112 { }
113};
114
115KReverseResolver::KReverseResolver(const KSocketAddress& addr, int flags,
116 QObject *parent)
117 : QObject(parent), d(new KReverseResolverPrivate(addr))
118{
119 d->flags = flags;
120}
121
122KReverseResolver::~KReverseResolver()
123{
124 if (d->worker)
125 d->worker->m_parent = 0L;
126 delete d;
127}
128
129bool KReverseResolver::isRunning() const
130{
131 return d->worker != 0L;
132}
133
134bool KReverseResolver::success() const
135{
136 return !isRunning() && d->success;
137}
138
139bool KReverseResolver::failure() const
140{
141 return !isRunning() && !d->success;
142}
143
144QString KReverseResolver::node() const
145{
146 return d->node;
147}
148
149QString KReverseResolver::service() const
150{
151 return d->service;
152}
153
154const KSocketAddress& KReverseResolver::address() const
155{
156 return d->addr;
157}
158
159bool KReverseResolver::start()
160{
161 if (d->worker != 0L)
162 return true; // already started
163
164 d->worker = new ReverseThread(d->addr, d->flags);
165 d->worker->m_parent = this;
166
167 RequestData *req = new RequestData;
168 req->obj = 0L;
169 req->input = 0L;
170 req->requestor = 0L;
171 req->worker = d->worker;
172 KResolverManager::manager()->dispatch(req);
173 return true;
174}
175
176bool KReverseResolver::event(QEvent *e)
177{
178 if (e->type() != KReverseResolverEvent::myType)
179 return QObject::event(e); // call parent
180
181 KReverseResolverEvent *re = static_cast<KReverseResolverEvent*>(e);
182 d->node = re->node;
183 d->service = re->service;
184 d->success = re->success;
185
186 // don't delete d->worker!
187 // KResolverManager::doNotifying takes care of that, if it hasn't already
188 d->worker = 0L;
189
190 // emit signal
191 emit finished(*this);
192
193 return true;
194}
195
196bool KReverseResolver::resolve(const KSocketAddress& addr, QString& node,
197 QString& serv, int flags)
198{
199 ReverseThread th(addr, flags);
200 if (th.run())
201 {
202 node = th.node;
203 serv = th.service;
204 return true;
205 }
206 return false;
207}
208
209bool KReverseResolver::resolve(const struct sockaddr* sa, quint16 salen,
210 QString& node, QString& serv, int flags)
211{
212 return resolve(KSocketAddress(sa, salen), node, serv, flags);
213}
214
215bool ReverseThread::run()
216{
217 int err;
218 char h[NI_MAXHOST], s[NI_MAXSERV];
219 int niflags = 0;
220
221 h[0] = s[0] = '\0';
222
223 if (m_flags & KReverseResolver::NumericHost)
224 niflags |= NI_NUMERICHOST;
225 if (m_flags & KReverseResolver::NumericService)
226 niflags |= NI_NUMERICSERV;
227 if (m_flags & KReverseResolver::NodeNameOnly)
228 niflags |= NI_NOFQDN;
229 if (m_flags & KReverseResolver::Datagram)
230 niflags |= NI_DGRAM;
231 if (m_flags & KReverseResolver::ResolutionRequired)
232 niflags |= NI_NAMEREQD;
233
234 {
235#ifdef NEED_MUTEX
236 QMutexLocker locker(&::getXXbyYYmutex);
237#endif
238 err = ::getnameinfo(m_addr, m_addr.length(),
239 h, sizeof(h) - 1, s, sizeof(s) - 1, niflags);
240 }
241
242 if (err == 0)
243 {
244 node = KResolver::domainToUnicode(QLatin1String(h));
245 service = QLatin1String(s);
246 success = true;
247 }
248 else
249 {
250 node.clear(); service.clear();
251 success = false;
252 }
253
254 return success;
255}
256
257bool ReverseThread::postprocess()
258{
259 // post an event
260 if (m_parent)
261 QCoreApplication::postEvent(m_parent,
262 new KReverseResolverEvent(node, service, success));
263 return true;
264}
265
266#include "k3reverseresolver.moc"
KNetwork::Internal::KResolverManager::manager
static KResolverManager * manager() KDE_NO_EXPORT
Definition: k3resolvermanager.cpp:318
KNetwork::Internal::KResolverManager::dispatch
void dispatch(RequestData *data)
Definition: k3resolvermanager.cpp:692
KNetwork::KResolverWorkerBase
Definition: k3resolverworkerbase.h:65
KNetwork::KResolverWorkerBase::run
virtual bool run()=0
This is the function that should be overridden in derived classes.
KNetwork::KResolverWorkerBase::postprocess
virtual bool postprocess()
This function gets called during post processing for this class.
Definition: k3resolverworkerbase.cpp:105
KNetwork::KResolverWorkerBase::preprocess
virtual bool preprocess()=0
This function gets called during pre processing for this class and you must override it.
KNetwork::KResolver::domainToUnicode
static QString domainToUnicode(const QByteArray &asciiDomain)
Does the inverse of domainToAscii() and return an Unicode domain name from the given ACE-encoded doma...
Definition: k3resolver.cpp:1032
KNetwork::KReverseResolver
Run a reverse-resolution on a socket address.
Definition: k3reverseresolver.h:52
KNetwork::KReverseResolver::KReverseResolver
KReverseResolver(const KSocketAddress &addr, int flags=0, QObject *parent=0L)
Constructs this object to resolve the given socket address.
Definition: k3reverseresolver.cpp:115
KNetwork::KReverseResolver::event
virtual bool event(QEvent *)
Overrides event handling.
Definition: k3reverseresolver.cpp:176
KNetwork::KReverseResolver::resolve
static bool resolve(const KSocketAddress &addr, QString &node, QString &serv, int flags=0)
Resolves a socket address to its textual representation.
Definition: k3reverseresolver.cpp:196
KNetwork::KReverseResolver::service
QString service() const
Returns the resolved service name, if the resolution has finished successfully, or QString() otherwis...
Definition: k3reverseresolver.cpp:149
KNetwork::KReverseResolver::failure
bool failure() const
This function returns true if the processing has finished with failure, false if it's still running o...
Definition: k3reverseresolver.cpp:139
KNetwork::KReverseResolver::success
bool success() const
This function returns true if the processing has finished with success, false if it's still running o...
Definition: k3reverseresolver.cpp:134
KNetwork::KReverseResolver::finished
void finished(const KNetwork::KReverseResolver &obj)
This signal is emitted when the resolution has finished.
KNetwork::KReverseResolver::NumericHost
@ NumericHost
Definition: k3reverseresolver.h:77
KNetwork::KReverseResolver::NumericService
@ NumericService
Definition: k3reverseresolver.h:78
KNetwork::KReverseResolver::NodeNameOnly
@ NodeNameOnly
Definition: k3reverseresolver.h:79
KNetwork::KReverseResolver::ResolutionRequired
@ ResolutionRequired
Definition: k3reverseresolver.h:82
KNetwork::KReverseResolver::Datagram
@ Datagram
Definition: k3reverseresolver.h:80
KNetwork::KReverseResolver::start
bool start()
Starts the resolution.
Definition: k3reverseresolver.cpp:159
KNetwork::KReverseResolver::node
QString node() const
Returns the resolved node name, if the resolution has finished successfully, or QString() otherwise.
Definition: k3reverseresolver.cpp:144
KNetwork::KReverseResolver::address
const KSocketAddress & address() const
Returns the socket address which was subject to resolution.
Definition: k3reverseresolver.cpp:154
KNetwork::KReverseResolver::isRunning
bool isRunning() const
This function returns 'true' if the processing is still running.
Definition: k3reverseresolver.cpp:129
KNetwork::KReverseResolver::~KReverseResolver
virtual ~KReverseResolver()
Destructor.
Definition: k3reverseresolver.cpp:122
KNetwork::KSocketAddress
A generic socket address.
Definition: k3socketaddress.h:415
QObject
QString
getXXbyYYmutex
QMutex getXXbyYYmutex
Definition: k3resolver.cpp:64
k3resolver_p.h
k3resolverworkerbase.h
k3reverseresolver.h
k3socketaddress.h
KFileSystemType::Type
Type
Definition: kfilesystemtype_p.h:29
KNetwork::Internal
Definition: k3resolver.h:48
KNetwork
A namespace to store all networking-related (socket) classes.
Definition: k3bufferedsocket.h:35
netsupp.h
NI_NAMEREQD
#define NI_NAMEREQD
Definition: netsupp.h:264
NI_NUMERICHOST
#define NI_NUMERICHOST
Definition: netsupp.h:261
getnameinfo
#define getnameinfo
Definition: netsupp.h:306
NI_DGRAM
#define NI_DGRAM
Definition: netsupp.h:265
NI_NOFQDN
#define NI_NOFQDN
Definition: netsupp.h:263
NI_MAXHOST
#define NI_MAXHOST
Definition: netsupp.h:250
NI_MAXSERV
#define NI_MAXSERV
Definition: netsupp.h:251
NI_NUMERICSERV
#define NI_NUMERICSERV
Definition: netsupp.h:262
KNetwork::Internal::RequestData
Definition: k3resolver_p.h:142
KNetwork::Internal::RequestData::obj
KNetwork::KResolverPrivate * obj
Definition: k3resolver_p.h:144
KNetwork::Internal::RequestData::input
const KNetwork::Internal::InputData * input
Definition: k3resolver_p.h:145
KNetwork::Internal::RequestData::requestor
RequestData * requestor
Definition: k3resolver_p.h:147
KNetwork::Internal::RequestData::worker
KNetwork::KResolverWorkerBase * worker
Definition: k3resolver_p.h:146
This file is part of the KDE documentation.
Documentation copyright © 1996-2023 The KDE developers.
Generated on Mon Feb 20 2023 00:00:00 by doxygen 1.9.6 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

KDECore

Skip menu "KDECore"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members
  • Modules
  • Related Pages

kdelibs-4.14.38 API Reference

Skip menu "kdelibs-4.14.38 API Reference"
  • DNSSD
  • Interfaces
  •   KHexEdit
  •   KMediaPlayer
  •   KSpeech
  •   KTextEditor
  • kconf_update
  • KDE3Support
  •   KUnitTest
  • KDECore
  • KDED
  • KDEsu
  • KDEUI
  • KDEWebKit
  • KDocTools
  • KFile
  • KHTML
  • KImgIO
  • KInit
  • kio
  • KIOSlave
  • KJS
  •   KJS-API
  •   WTF
  • kjsembed
  • KNewStuff
  • KParts
  • KPty
  • Kross
  • KUnitConversion
  • KUtils
  • Nepomuk
  • Plasma
  • Solid
  • Sonnet
  • ThreadWeaver
Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal