michael@0: /* michael@0: Copyright (c) 2007, Adobe Systems, Incorporated michael@0: Copyright (c) 2013, Mozilla michael@0: michael@0: All rights reserved. michael@0: michael@0: Redistribution and use in source and binary forms, with or without michael@0: modification, are permitted provided that the following conditions are michael@0: met: michael@0: michael@0: * Redistributions of source code must retain the above copyright michael@0: notice, this list of conditions and the following disclaimer. michael@0: michael@0: * Redistributions in binary form must reproduce the above copyright michael@0: notice, this list of conditions and the following disclaimer in the michael@0: documentation and/or other materials provided with the distribution. michael@0: michael@0: * Neither the name of Adobe Systems, Network Resonance, Mozilla nor michael@0: the names of its contributors may be used to endorse or promote michael@0: products derived from this software without specific prior written michael@0: permission. michael@0: michael@0: THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS michael@0: "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT michael@0: LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR michael@0: A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT michael@0: OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, michael@0: SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT michael@0: LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, michael@0: DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY michael@0: THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT michael@0: (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE michael@0: OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. michael@0: */ michael@0: michael@0: #ifndef _nr_resolver_h michael@0: #define _nr_resolver_h michael@0: michael@0: #include "transport_addr.h" michael@0: michael@0: #define NR_RESOLVE_PROTOCOL_STUN 1 michael@0: #define NR_RESOLVE_PROTOCOL_TURN 2 michael@0: michael@0: typedef struct nr_resolver_resource_ { michael@0: char *domain_name; michael@0: UINT2 port; michael@0: int stun_turn; michael@0: UCHAR transport_protocol; michael@0: } nr_resolver_resource; michael@0: michael@0: typedef struct nr_resolver_vtbl_ { michael@0: int (*destroy)(void **obj); michael@0: int (*resolve)(void *obj, michael@0: nr_resolver_resource *resource, michael@0: int (*cb)(void *cb_arg, nr_transport_addr *addr), michael@0: void *cb_arg, michael@0: void **handle); michael@0: int (*cancel)(void *obj, void *handle); michael@0: } nr_resolver_vtbl; michael@0: michael@0: typedef struct nr_resolver_ { michael@0: void *obj; michael@0: nr_resolver_vtbl *vtbl; michael@0: } nr_resolver; michael@0: michael@0: michael@0: /* michael@0: The convention here is that the provider of this interface michael@0: must generate a void *obj, and a vtbl and then call michael@0: nr_resolver_create_int() to allocate the generic wrapper michael@0: object. michael@0: michael@0: The vtbl must contain implementations for all the functions michael@0: listed. michael@0: michael@0: The nr_resolver_destroy() function (and hence vtbl->destroy) michael@0: will be called when the consumer of the resolver is done michael@0: with it. That is the signal that it is safe to clean up michael@0: the resources associated with obj. No other function will michael@0: be called afterwards. michael@0: */ michael@0: int nr_resolver_create_int(void *obj, nr_resolver_vtbl *vtbl, michael@0: nr_resolver **resolverp); michael@0: int nr_resolver_destroy(nr_resolver **resolverp); michael@0: michael@0: /* Request resolution of a domain */ michael@0: int nr_resolver_resolve(nr_resolver *resolver, michael@0: nr_resolver_resource *resource, michael@0: int (*cb)(void *cb_arg, nr_transport_addr *addr), michael@0: void *cb_arg, michael@0: void **handle); michael@0: michael@0: /* Cancel a requested resolution. No callback will fire. */ michael@0: int nr_resolver_cancel(nr_resolver *resolver, void *handle); michael@0: #endif