• Skip to content
  • Skip to link menu
Trinity API Reference
  • Trinity API Reference
  • tdecore
 

tdecore

  • tdecore
  • network
kreverseresolver.cpp
1/*
2 * Copyright (C) 2003 Thiago Macieira <thiago.macieira@kdemail.net>
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 "config.h"
26
27// System includes
28#include <sys/types.h>
29#include <sys/socket.h>
30#include <netdb.h>
31#include <signal.h>
32
33// Qt
34#include <tqevent.h>
35#include <tqmutex.h>
36#include <tqapplication.h>
37
38// Us
39#include "kreverseresolver.h"
40#include "kresolver_p.h"
41#include "kresolverworkerbase.h"
42#include "tdesocketaddress.h"
43
44#ifndef HAVE_GETNAMEINFO
45// FIXME KDE4:
46// move to syssocket or adapt
47# include "netsupp.h"
48#endif
49
50using namespace KNetwork;
51using namespace KNetwork::Internal;
52
53namespace
54{
55 class ReverseThread: public KResolverWorkerBase
56 {
57 public:
58 ReverseThread(const TDESocketAddress& addr, int flags)
59 : m_addr(addr), m_flags(flags), m_parent(0L)
60 { }
61
62 virtual ~ReverseThread()
63 { }
64
65 virtual bool preprocess()
66 { return true; }
67 virtual bool run();
68 virtual bool postprocess();
69
70 // input:
71 TDESocketAddress m_addr;
72 int m_flags;
73 KReverseResolver *m_parent;
74
75 // output:
76 TQString node;
77 TQString service;
78 bool success;
79 };
80
81 class KReverseResolverEvent: public TQEvent
82 {
83 public:
84 static const int myType = TQEvent::User + 63; // arbitrary value
85 TQString node;
86 TQString service;
87 bool success;
88
89 KReverseResolverEvent(const TQString& _node, const TQString& _service,
90 bool _success)
91 : TQEvent((Type)myType), node(_node),
92 service(_service), success(_success)
93 { }
94 };
95}
96
97class KNetwork::KReverseResolverPrivate
98{
99public:
100 TQString node;
101 TQString service;
102 TDESocketAddress addr;
103 int flags;
104
105 ReverseThread* worker;
106 bool success;
107
108 inline KReverseResolverPrivate(const TDESocketAddress& _addr)
109 : addr(_addr), worker(0L), success(false)
110 { }
111};
112
113KReverseResolver::KReverseResolver(const TDESocketAddress& addr, int flags,
114 TQObject *parent, const char* name)
115 : TQObject(parent, name), d(new KReverseResolverPrivate(addr))
116{
117 d->flags = flags;
118}
119
120KReverseResolver::~KReverseResolver()
121{
122 if (d->worker)
123 d->worker->m_parent = 0L;
124}
125
126bool KReverseResolver::isRunning() const
127{
128 return d->worker != 0L;
129}
130
131bool KReverseResolver::success() const
132{
133 return !isRunning() && d->success;
134}
135
136bool KReverseResolver::failure() const
137{
138 return !isRunning() && !d->success;
139}
140
141TQString KReverseResolver::node() const
142{
143 return d->node;
144}
145
146TQString KReverseResolver::service() const
147{
148 return d->service;
149}
150
151const TDESocketAddress& KReverseResolver::address() const
152{
153 return d->addr;
154}
155
156bool KReverseResolver::start()
157{
158 if (d->worker != 0L)
159 return true; // already started
160
161 d->worker = new ReverseThread(d->addr, d->flags);
162 d->worker->m_parent = this;
163
164 RequestData *req = new RequestData;
165 req->obj = 0L;
166 req->input = 0L;
167 req->requestor = 0L;
168 req->worker = d->worker;
169 KResolverManager::manager()->dispatch(req);
170 return true;
171}
172
173bool KReverseResolver::event(TQEvent *e)
174{
175 if (e->type() != KReverseResolverEvent::myType)
176 return TQObject::event(e); // call parent
177
178 KReverseResolverEvent *re = static_cast<KReverseResolverEvent*>(e);
179 d->node = re->node;
180 d->service = re->service;
181 d->success = re->success;
182
183 // don't delete d->worker!
184 // KResolverManager::doNotifying takes care of that, if it hasn't already
185 d->worker = 0L;
186
187 // emit signal
188 emit finished(*this);
189
190 return true;
191}
192
193bool KReverseResolver::resolve(const TDESocketAddress& addr, TQString& node,
194 TQString& serv, int flags)
195{
196 ReverseThread th(addr, flags);
197 if (th.run())
198 {
199 node = th.node;
200 serv = th.service;
201 return true;
202 }
203 return false;
204}
205
206bool KReverseResolver::resolve(const struct sockaddr* sa, TQ_UINT16 salen,
207 TQString& node, TQString& serv, int flags)
208{
209 return resolve(TDESocketAddress(sa, salen), node, serv, flags);
210}
211
212bool ReverseThread::run()
213{
214 int err;
215 char h[NI_MAXHOST], s[NI_MAXSERV];
216 int niflags = 0;
217
218 h[0] = s[0] = '\0';
219
220 if (m_flags & KReverseResolver::NumericHost)
221 niflags |= NI_NUMERICHOST;
222 if (m_flags & KReverseResolver::NumericService)
223 niflags |= NI_NUMERICSERV;
224 if (m_flags & KReverseResolver::NodeNameOnly)
225 niflags |= NI_NOFQDN;
226 if (m_flags & KReverseResolver::Datagram)
227 niflags |= NI_DGRAM;
228 if (m_flags & KReverseResolver::ResolutionRequired)
229 niflags |= NI_NAMEREQD;
230
231 {
232#ifdef NEED_MUTEX
233 TQMutexLocker locker(&::getXXbyYYmutex);
234#endif
235 err = ::getnameinfo(m_addr, m_addr.length(),
236 h, sizeof(h) - 1, s, sizeof(s) - 1, niflags);
237 }
238
239 if (err == 0)
240 {
241 node = KResolver::domainToUnicode(TQString::fromLatin1(h));
242 service = TQString::fromLatin1(s);
243 success = true;
244 }
245 else
246 {
247 node = service = TQString::null;
248 success = false;
249 }
250
251 return success;
252}
253
254bool ReverseThread::postprocess()
255{
256 // post an event
257 if (m_parent)
258 TQApplication::postEvent(m_parent,
259 new KReverseResolverEvent(node, service, success));
260 return true;
261}
262
263#include "kreverseresolver.moc"
KNetwork::KResolver::domainToUnicode
static TQString domainToUnicode(const TQCString &asciiDomain)
Does the inverse of domainToAscii and return an Unicode domain name from the given ACE-encoded domain...
Definition: kresolver.cpp:1073
KNetwork::KReverseResolver
Run a reverse-resolution on a socket address.
Definition: kreverseresolver.h:51
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: kreverseresolver.cpp:136
KNetwork::KReverseResolver::resolve
static bool resolve(const TDESocketAddress &addr, TQString &node, TQString &serv, int flags=0)
Resolves a socket address to its textual representation.
Definition: kreverseresolver.cpp:193
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: kreverseresolver.cpp:131
KNetwork::KReverseResolver::service
TQString service() const
Returns the resolved service name, if the resolution has finished successfully, or TQString::null oth...
Definition: kreverseresolver.cpp:146
KNetwork::KReverseResolver::node
TQString node() const
Returns the resolved node name, if the resolution has finished successfully, or TQString::null otherw...
Definition: kreverseresolver.cpp:141
KNetwork::KReverseResolver::start
bool start()
Starts the resolution.
Definition: kreverseresolver.cpp:156
KNetwork::KReverseResolver::address
const TDESocketAddress & address() const
Returns the socket address which was subject to resolution.
Definition: kreverseresolver.cpp:151
KNetwork::KReverseResolver::event
virtual bool event(TQEvent *)
Overrides event handling.
Definition: kreverseresolver.cpp:173
KNetwork::KReverseResolver::isRunning
bool isRunning() const
This function returns 'true' if the processing is still running.
Definition: kreverseresolver.cpp:126
KNetwork::KReverseResolver::finished
void finished(const KReverseResolver &obj)
This signal is emitted when the resolution has finished.
KNetwork::KReverseResolver::~KReverseResolver
virtual ~KReverseResolver()
Destructor.
Definition: kreverseresolver.cpp:120
KNetwork::TDESocketAddress
A generic socket address.
Definition: tdesocketaddress.h:424
KNetwork
A namespace to store all networking-related (socket) classes.
Definition: kbufferedsocket.h:36

tdecore

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

tdecore

Skip menu "tdecore"
  • arts
  • dcop
  • dnssd
  • interfaces
  •   kspeech
  •     interface
  •     library
  •   tdetexteditor
  • kate
  • kded
  • kdoctools
  • kimgio
  • kjs
  • libtdemid
  • libtdescreensaver
  • tdeabc
  • tdecmshell
  • tdecore
  • tdefx
  • tdehtml
  • tdeinit
  • tdeio
  •   bookmarks
  •   httpfilter
  •   kpasswdserver
  •   kssl
  •   tdefile
  •   tdeio
  •   tdeioexec
  • tdeioslave
  •   http
  • tdemdi
  •   tdemdi
  • tdenewstuff
  • tdeparts
  • tdeprint
  • tderandr
  • tderesources
  • tdespell2
  • tdesu
  • tdeui
  • tdeunittest
  • tdeutils
  • tdewallet
Generated for tdecore by doxygen 1.9.4
This website is maintained by Timothy Pearson.