|
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 public: |
|
65 NrIceResolver(); |
|
66 ~NrIceResolver(); |
|
67 |
|
68 nsresult Init(); |
|
69 nr_resolver *AllocateResolver(); |
|
70 void DestroyResolver(); |
|
71 NS_INLINE_DECL_THREADSAFE_REFCOUNTING(NrIceResolver) |
|
72 |
|
73 private: |
|
74 // Implementations of vtbl functions |
|
75 static int destroy(void **objp); |
|
76 static int resolve(void *obj, nr_resolver_resource *resource, |
|
77 int (*cb)(void *cb_arg, nr_transport_addr *addr), |
|
78 void *cb_arg, void **handle); |
|
79 static void resolve_cb(NR_SOCKET s, int how, void *cb_arg); |
|
80 static int cancel(void *obj, void *handle); |
|
81 |
|
82 int resolve(nr_resolver_resource *resource, |
|
83 int (*cb)(void *cb_arg, nr_transport_addr *addr), |
|
84 void *cb_arg, void **handle); |
|
85 |
|
86 class PendingResolution : public nsIDNSListener |
|
87 { |
|
88 public: |
|
89 PendingResolution(nsIEventTarget *thread, |
|
90 uint16_t port, |
|
91 int transport, |
|
92 int (*cb)(void *cb_arg, nr_transport_addr *addr), |
|
93 void *cb_arg) : |
|
94 thread_(thread), |
|
95 port_(port), |
|
96 transport_(transport), |
|
97 cb_(cb), cb_arg_(cb_arg), |
|
98 canceled_ (false) {} |
|
99 virtual ~PendingResolution(){}; |
|
100 NS_IMETHOD OnLookupComplete(nsICancelable *request, nsIDNSRecord *record, |
|
101 nsresult status); |
|
102 int cancel(); |
|
103 nsCOMPtr<nsICancelable> request_; |
|
104 NS_DECL_THREADSAFE_ISUPPORTS |
|
105 |
|
106 private: |
|
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 bool canceled_; |
|
113 }; |
|
114 |
|
115 nr_resolver_vtbl* vtbl_; |
|
116 nsCOMPtr<nsIEventTarget> sts_thread_; |
|
117 nsCOMPtr<nsIDNSService> dns_; |
|
118 #ifdef DEBUG |
|
119 int allocated_resolvers_; |
|
120 #endif |
|
121 }; |
|
122 |
|
123 } // End of namespace mozilla |
|
124 #endif |