/*
 * This file is part of the Nice GLib ICE library.
 *
 * (C) 2006-2020 Collabora Ltd.
 *  Contact: Youness Alaoui
 *  Contact: Olivier Crete
 * (C) 2006-2009 Nokia Corporation. All rights reserved.
 *  Contact: Kai Vehmanen
 *
 * The contents of this file are subject to the Mozilla Public License Version
 * 1.1 (the "License"); you may not use this file except in compliance with
 * the License. You may obtain a copy of the License at
 * http://www.mozilla.org/MPL/
 *
 * Software distributed under the License is distributed on an "AS IS" basis,
 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
 * for the specific language governing rights and limitations under the
 * License.
 *
 * The Original Code is the Nice GLib ICE library.
 *
 * The Initial Developers of the Original Code are Collabora Ltd and Nokia
 * Corporation. All Rights Reserved.
 *
 * Contributors:
 *   Dafydd Harries, Collabora Ltd.
 *   Youness Alaoui, Collabora Ltd.
 *   Kai Vehmanen, Nokia
 *
 * Alternatively, the contents of this file may be used under the terms of the
 * the GNU Lesser General Public License Version 2.1 (the "LGPL"), in which
 * case the provisions of LGPL are applicable instead of those above. If you
 * wish to allow use of your version of this file only under the terms of the
 * LGPL and not to allow others to use your version of this file under the
 * MPL, indicate your decision by deleting the provisions above and replace
 * them with the notice and other provisions required by the LGPL. If you do
 * not delete the provisions above, a recipient may use your version of this
 * file under either the MPL or the LGPL.
 */

#ifndef __LIBNICE_CANDIDATE_PRIV_H__
#define __LIBNICE_CANDIDATE_PRIV_H__

#include <glib.h>
#include <glib-object.h>

#include "candidate.h"
#include "socket/socket.h"

G_BEGIN_DECLS


/* Constants for determining candidate priorities */
#define NICE_CANDIDATE_TYPE_PREF_HOST                 120
#define NICE_CANDIDATE_TYPE_PREF_PEER_REFLEXIVE       110
#define NICE_CANDIDATE_TYPE_PREF_NAT_ASSISTED         105
#define NICE_CANDIDATE_TYPE_PREF_SERVER_REFLEXIVE     100
#define NICE_CANDIDATE_TYPE_PREF_RELAYED_UDP           30
#define NICE_CANDIDATE_TYPE_PREF_RELAYED               20

/* Priority preference constants for MS-ICE compatibility */
#define NICE_CANDIDATE_TRANSPORT_MS_PREF_UDP           15
#define NICE_CANDIDATE_TRANSPORT_MS_PREF_TCP            6
#define NICE_CANDIDATE_DIRECTION_MS_PREF_PASSIVE        2
#define NICE_CANDIDATE_DIRECTION_MS_PREF_ACTIVE         5

typedef struct _NiceCandidateImpl NiceCandidateImpl;
typedef struct _TurnServer TurnServer;

/**
 * TurnServer:
 * @ref_count: Reference count for the structure.
 * @server: The #NiceAddress of the TURN server
 * @server_address: The unresolved server address
 * @username: The TURN username
 * @password: The TURN password
 * @decoded_username: The base64 decoded TURN username
 * @decoded_password: The base64 decoded TURN password
 * @decoded_username_len: The length of @decoded_username
 * @decoded_password_len: The length of @decoded_password
 * @type: The #NiceRelayType of the server
 * @preference: A unique identifier used to compute priority
 *
 * A structure to store the TURN relay settings
 */
struct _TurnServer
{
  gint ref_count;

  NiceAddress server;
  gchar *server_address;
  guint server_port;
  gchar *username;
  gchar *password;
  guint8 *decoded_username;
  guint8 *decoded_password;
  gsize decoded_username_len;
  gsize decoded_password_len;
  NiceRelayType type;
  guint preference;

  gboolean resolution_failed;
};


/**
 * NiceCandidateImpl:
 * @c: The #NiceCandidate
 * @turn: The #TurnServer settings if the candidate is
 * of type %NICE_CANDIDATE_TYPE_RELAYED
 * @sockptr: The underlying socket
 * @keepalive_next_tick: The timestamp for the next keepalive
 * @stun_server: The STUN server address, if the candidate is
 * of type %NICE_CANDIDATE_TYPE_SERVER_REFLEXIVE
 *
 * A structure to represent an ICE candidate
 */
struct _NiceCandidateImpl
{
  NiceCandidate c;
  TurnServer *turn;
  NiceSocket *sockptr;
  guint64 keepalive_next_tick; /* next tick timestamp */
  NiceAddress *stun_server;
};


G_END_DECLS

#endif /* __LIBNICE_CANDIDATE_H__ */
