Line data Source code
1 : /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 : /* vim: set ts=2 et sw=2 tw=80: */
3 : /* This Source Code Form is subject to the terms of the Mozilla Public
4 : * License, v. 2.0. If a copy of the MPL was not distributed with this file,
5 : * You can obtain one at http://mozilla.org/MPL/2.0/. */
6 :
7 :
8 : // Original authors: jib@mozilla.com, ekr@rtfm.com
9 :
10 : // Some of this code is cut-and-pasted from nICEr. Copyright is:
11 :
12 : /*
13 : Copyright (c) 2007, Adobe Systems, Incorporated
14 : All rights reserved.
15 :
16 : Redistribution and use in source and binary forms, with or without
17 : modification, are permitted provided that the following conditions are
18 : met:
19 :
20 : * Redistributions of source code must retain the above copyright
21 : notice, this list of conditions and the following disclaimer.
22 :
23 : * Redistributions in binary form must reproduce the above copyright
24 : notice, this list of conditions and the following disclaimer in the
25 : documentation and/or other materials provided with the distribution.
26 :
27 : * Neither the name of Adobe Systems, Network Resonance nor the names of its
28 : contributors may be used to endorse or promote products derived from
29 : this software without specific prior written permission.
30 :
31 : THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32 : "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33 : LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
34 : A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35 : OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
36 : SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
37 : LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
38 : DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
39 : THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
40 : (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
41 : OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
42 : */
43 :
44 : #ifndef nriceresolver_h__
45 : #define nriceresolver_h__
46 :
47 : #include <map>
48 : #include <string>
49 : #include "nspr.h"
50 : #include "prnetdb.h"
51 : #include "nsIDNSService.h"
52 : #include "nsIDNSListener.h"
53 : #include "nsICancelable.h"
54 :
55 : typedef struct nr_resolver_ nr_resolver;
56 : typedef struct nr_resolver_vtbl_ nr_resolver_vtbl;
57 : typedef struct nr_transport_addr_ nr_transport_addr;
58 : typedef struct nr_resolver_resource_ nr_resolver_resource;
59 :
60 : namespace mozilla {
61 :
62 : class NrIceResolver
63 : {
64 : private:
65 : ~NrIceResolver();
66 : public:
67 : NrIceResolver();
68 :
69 : nsresult Init();
70 : nr_resolver *AllocateResolver();
71 : void DestroyResolver();
72 0 : NS_INLINE_DECL_THREADSAFE_REFCOUNTING(NrIceResolver)
73 :
74 : int resolve(nr_resolver_resource *resource,
75 : int (*cb)(void *cb_arg, nr_transport_addr *addr),
76 : void *cb_arg, void **handle);
77 :
78 : private:
79 : // Implementations of vtbl functions
80 : static int destroy(void **objp);
81 : static int resolve(void *obj, nr_resolver_resource *resource,
82 : int (*cb)(void *cb_arg, nr_transport_addr *addr),
83 : void *cb_arg, void **handle);
84 : static void resolve_cb(NR_SOCKET s, int how, void *cb_arg);
85 : static int cancel(void *obj, void *handle);
86 :
87 : class PendingResolution : public nsIDNSListener
88 : {
89 : public:
90 0 : PendingResolution(nsIEventTarget *thread,
91 : uint16_t port,
92 : int transport,
93 : int (*cb)(void *cb_arg, nr_transport_addr *addr),
94 0 : void *cb_arg) :
95 : thread_(thread),
96 : port_(port),
97 : transport_(transport),
98 0 : cb_(cb), cb_arg_(cb_arg) {}
99 : NS_IMETHOD OnLookupComplete(nsICancelable *request, nsIDNSRecord *record,
100 : nsresult status) override;
101 : int cancel();
102 : nsCOMPtr<nsICancelable> request_;
103 : NS_DECL_THREADSAFE_ISUPPORTS
104 :
105 : private:
106 0 : virtual ~PendingResolution(){};
107 : nsCOMPtr<nsIEventTarget> thread_;
108 : uint16_t port_;
109 : int transport_;
110 : int (*cb_)(void *cb_arg, nr_transport_addr *addr);
111 : void *cb_arg_;
112 : };
113 :
114 : nr_resolver_vtbl* vtbl_;
115 : nsCOMPtr<nsIEventTarget> sts_thread_;
116 : nsCOMPtr<nsIDNSService> dns_;
117 : #ifdef DEBUG
118 : int allocated_resolvers_;
119 : #endif
120 : };
121 :
122 : } // End of namespace mozilla
123 : #endif
|