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

KDECore

  • sources
  • kde-4.14
  • kdelibs
  • 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 
52 using namespace KNetwork;
53 using namespace KNetwork::Internal;
54 
55 namespace
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 
99 class KNetwork::KReverseResolverPrivate
100 {
101 public:
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 
115 KReverseResolver::KReverseResolver(const KSocketAddress& addr, int flags,
116  QObject *parent)
117  : QObject(parent), d(new KReverseResolverPrivate(addr))
118 {
119  d->flags = flags;
120 }
121 
122 KReverseResolver::~KReverseResolver()
123 {
124  if (d->worker)
125  d->worker->m_parent = 0L;
126  delete d;
127 }
128 
129 bool KReverseResolver::isRunning() const
130 {
131  return d->worker != 0L;
132 }
133 
134 bool KReverseResolver::success() const
135 {
136  return !isRunning() && d->success;
137 }
138 
139 bool KReverseResolver::failure() const
140 {
141  return !isRunning() && !d->success;
142 }
143 
144 QString KReverseResolver::node() const
145 {
146  return d->node;
147 }
148 
149 QString KReverseResolver::service() const
150 {
151  return d->service;
152 }
153 
154 const KSocketAddress& KReverseResolver::address() const
155 {
156  return d->addr;
157 }
158 
159 bool 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 
176 bool 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 
196 bool 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 
209 bool 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 
215 bool 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 
257 bool 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"
k3resolverworkerbase.h
k3socketaddress.h
QEvent
KNetwork::KReverseResolver::~KReverseResolver
virtual ~KReverseResolver()
Destructor.
Definition: k3reverseresolver.cpp:122
QEvent::type
Type type() const
KFileSystemType::Type
Type
Definition: kfilesystemtype_p.h:28
KNetwork::KReverseResolver::NumericService
Definition: k3reverseresolver.h:78
k3reverseresolver.h
getXXbyYYmutex
QMutex getXXbyYYmutex
Definition: k3resolver.cpp:64
KNetwork::KReverseResolver::finished
void finished(const KNetwork::KReverseResolver &obj)
This signal is emitted when the resolution has finished.
KNetwork::KSocketAddress
A generic socket address.
Definition: k3socketaddress.h:414
NI_MAXHOST
#define NI_MAXHOST
Definition: netsupp.h:250
KNetwork::KReverseResolver::NumericHost
Definition: k3reverseresolver.h:77
NI_NAMEREQD
#define NI_NAMEREQD
Definition: netsupp.h:264
KNetwork::Internal::RequestData::obj
KNetwork::KResolverPrivate * obj
Definition: k3resolver_p.h:144
QObject::event
virtual bool event(QEvent *e)
netsupp.h
KNetwork::KReverseResolver::Datagram
Definition: k3reverseresolver.h:80
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
QObject
KNetwork::KReverseResolver::ResolutionRequired
Definition: k3reverseresolver.h:82
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::NodeNameOnly
Definition: k3reverseresolver.h:79
KNetwork::KReverseResolver::address
const KSocketAddress & address() const
Returns the socket address which was subject to resolution.
Definition: k3reverseresolver.cpp:154
NI_DGRAM
#define NI_DGRAM
Definition: netsupp.h:265
KNetwork::KReverseResolver::event
virtual bool event(QEvent *)
Overrides event handling.
Definition: k3reverseresolver.cpp:176
QtConcurrent::run
QFuture< T > run(Function function,...)
NI_NUMERICSERV
#define NI_NUMERICSERV
Definition: netsupp.h:262
QString
KNetwork::Internal::RequestData::requestor
RequestData * requestor
Definition: k3resolver_p.h:147
getnameinfo
int getnameinfo(const struct sockaddr *sa, kde_socklen_t salen, char *host, size_t hostlen, char *serv, size_t servlen, int flags)
Definition: netsupp.cpp:944
NI_MAXSERV
#define NI_MAXSERV
Definition: netsupp.h:251
KNetwork::Internal::RequestData::input
const KNetwork::Internal::InputData * input
Definition: k3resolver_p.h:145
KNetwork::KReverseResolver::isRunning
bool isRunning() const
This function returns 'true' if the processing is still running.
Definition: k3reverseresolver.cpp:129
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
NI_NUMERICHOST
#define NI_NUMERICHOST
Definition: netsupp.h:261
KNetwork::Internal::RequestData
Definition: k3resolver_p.h:141
QLatin1String
QMutexLocker
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::service
QString service() const
Returns the resolved service name, if the resolution has finished successfully, or QString() otherwis...
Definition: k3reverseresolver.cpp:149
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::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::start
bool start()
Starts the resolution.
Definition: k3reverseresolver.cpp:159
KNetwork::Internal::RequestData::worker
KNetwork::KResolverWorkerBase * worker
Definition: k3resolver_p.h:146
KNetwork::KReverseResolver
Run a reverse-resolution on a socket address.
Definition: k3reverseresolver.h:51
KNetwork::KResolverWorkerBase
Definition: k3resolverworkerbase.h:64
QCoreApplication::postEvent
void postEvent(QObject *receiver, QEvent *event)
NI_NOFQDN
#define NI_NOFQDN
Definition: netsupp.h:263
k3resolver_p.h
This file is part of the KDE documentation.
Documentation copyright © 1996-2020 The KDE developers.
Generated on Mon Jun 22 2020 13:22:10 by doxygen 1.8.7 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 API Reference

Skip menu "kdelibs 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

Search



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