• 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 
50 using namespace KNetwork;
51 using namespace KNetwork::Internal;
52 
53 namespace
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 
97 class KNetwork::KReverseResolverPrivate
98 {
99 public:
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 
113 KReverseResolver::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 
120 KReverseResolver::~KReverseResolver()
121 {
122  if (d->worker)
123  d->worker->m_parent = 0L;
124 }
125 
126 bool KReverseResolver::isRunning() const
127 {
128  return d->worker != 0L;
129 }
130 
131 bool KReverseResolver::success() const
132 {
133  return !isRunning() && d->success;
134 }
135 
136 bool KReverseResolver::failure() const
137 {
138  return !isRunning() && !d->success;
139 }
140 
141 TQString KReverseResolver::node() const
142 {
143  return d->node;
144 }
145 
146 TQString KReverseResolver::service() const
147 {
148  return d->service;
149 }
150 
151 const TDESocketAddress& KReverseResolver::address() const
152 {
153  return d->addr;
154 }
155 
156 bool 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 
173 bool 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 
193 bool 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 
206 bool 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 
212 bool 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 
254 bool 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::TDESocketAddress
A generic socket address.
Definition: tdesocketaddress.h:423
KNetwork::KReverseResolver::~KReverseResolver
virtual ~KReverseResolver()
Destructor.
Definition: kreverseresolver.cpp:120
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::node
TQString node() const
Returns the resolved node name, if the resolution has finished successfully, or TQString::null otherw...
Definition: kreverseresolver.cpp:141
KNetwork::Internal
Definition: kresolver.h:47
KNetwork::KReverseResolver::event
virtual bool event(TQEvent *)
Overrides event handling.
Definition: kreverseresolver.cpp:173
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::finished
void finished(const KReverseResolver &obj)
This signal is emitted when the resolution has finished.
KNetwork
A namespace to store all networking-related (socket) classes.
Definition: kbufferedsocket.h:36
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::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::isRunning
bool isRunning() const
This function returns 'true' if the processing is still running.
Definition: kreverseresolver.cpp:126
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::KReverseResolver
KReverseResolver(const TDESocketAddress &addr, int flags=0, TQObject *=0L, const char *=0L)
Constructs this object to resolve the given socket address.
Definition: kreverseresolver.cpp:113
KNetwork::KReverseResolver::address
const TDESocketAddress & address() const
Returns the socket address which was subject to resolution.
Definition: kreverseresolver.cpp:151
KNetwork::KReverseResolver::start
bool start()
Starts the resolution.
Definition: kreverseresolver.cpp:156
KNetwork::KReverseResolver
Run a reverse-resolution on a socket address.
Definition: kreverseresolver.h:50

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
  •     tdecore
  • tdeabc
  • tdecmshell
  • tdecore
  • tdefx
  • tdehtml
  • tdeinit
  • tdeio
  •   bookmarks
  •   httpfilter
  •   kpasswdserver
  •   kssl
  • tdeioslave
  •   http
  •   tdefile
  •   tdeio
  •   tdeioexec
  • tdemdi
  •   tdemdi
  • tdenewstuff
  • tdeparts
  • tdeprint
  • tderandr
  • tderesources
  • tdespell2
  • tdesu
  • tdeui
  • tdeunittest
  • tdeutils
  • tdewallet
Generated for tdecore by doxygen 1.8.8
This website is maintained by Timothy Pearson.