gst_plugins_base/gst-libs/gst/rtsp/gstrtspconnection.c
author hgs
Wed, 24 Mar 2010 18:04:17 -0500
changeset 16 8e837d1bf446
parent 0 0e761a78d257
child 30 7e817e7e631c
permissions -rw-r--r--
201009
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
     1
/* GStreamer
16
hgs
parents: 0
diff changeset
     2
 * Copyright (C) <2005-2009> Wim Taymans <wim.taymans@gmail.com>
0
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
     3
 *
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
     4
 * This library is free software; you can redistribute it and/or
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
     5
 * modify it under the terms of the GNU Library General Public
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
     6
 * License as published by the Free Software Foundation; either
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
     7
 * version 2 of the License, or (at your option) any later version.
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
     8
 *
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
     9
 * This library is distributed in the hope that it will be useful,
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    10
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    11
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    12
 * Library General Public License for more details.
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    13
 *
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    14
 * You should have received a copy of the GNU Library General Public
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    15
 * License along with this library; if not, write to the
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    16
 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    17
 * Boston, MA 02111-1307, USA.
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    18
 */
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    19
/*
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    20
 * Unless otherwise indicated, Source Code is licensed under MIT license.
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    21
 * See further explanation attached in License Statement (distributed in the file
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    22
 * LICENSE).
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    23
 *
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    24
 * Permission is hereby granted, free of charge, to any person obtaining a copy of
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    25
 * this software and associated documentation files (the "Software"), to deal in
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    26
 * the Software without restriction, including without limitation the rights to
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    27
 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    28
 * of the Software, and to permit persons to whom the Software is furnished to do
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    29
 * so, subject to the following conditions:
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    30
 *
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    31
 * The above copyright notice and this permission notice shall be included in all
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    32
 * copies or substantial portions of the Software.
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    33
 *
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    34
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    35
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    36
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    37
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    38
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    39
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    40
 * SOFTWARE.
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    41
 */
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    42
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    43
/**
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    44
 * SECTION:gstrtspconnection
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    45
 * @short_description: manage RTSP connections
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    46
 * @see_also: gstrtspurl
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    47
 *  
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    48
 * <refsect2>
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    49
 * <para>
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    50
 * This object manages the RTSP connection to the server. It provides function
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    51
 * to receive and send bytes and messages.
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    52
 * </para>
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    53
 * </refsect2>
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    54
 *  
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    55
 * Last reviewed on 2007-07-24 (0.10.14)
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    56
 */
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    57
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    58
#ifdef HAVE_CONFIG_H
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    59
#  include <config.h>
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    60
#endif
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    61
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    62
#include <stdio.h>
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    63
#include <errno.h>
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    64
#include <stdlib.h>
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    65
#include <string.h>
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    66
#include <time.h>
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    67
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    68
#ifdef HAVE_UNISTD_H
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    69
#include <unistd.h>
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    70
#endif
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    71
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    72
/* we include this here to get the G_OS_* defines */
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    73
#include <glib.h>
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    74
#include <gst/gst.h>
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    75
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    76
#ifdef G_OS_WIN32
16
hgs
parents: 0
diff changeset
    77
/* ws2_32.dll has getaddrinfo and freeaddrinfo on Windows XP and later.
hgs
parents: 0
diff changeset
    78
 * minwg32 headers check WINVER before allowing the use of these */
hgs
parents: 0
diff changeset
    79
#ifndef WINVER
hgs
parents: 0
diff changeset
    80
#define WINVER 0x0501
hgs
parents: 0
diff changeset
    81
#endif
0
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    82
#include <winsock2.h>
16
hgs
parents: 0
diff changeset
    83
#include <ws2tcpip.h>
0
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    84
#define EINPROGRESS WSAEINPROGRESS
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    85
#else
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    86
#include <sys/ioctl.h>
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    87
#include <netdb.h>
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    88
#include <sys/socket.h>
16
hgs
parents: 0
diff changeset
    89
#include <fcntl.h>
0
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    90
#include <netinet/in.h>
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    91
#endif
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    92
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    93
#ifdef HAVE_FIONREAD_IN_SYS_FILIO
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    94
#include <sys/filio.h>
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    95
#endif
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    96
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    97
#include "gstrtspconnection.h"
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    98
#include "gstrtspbase64.h"
16
hgs
parents: 0
diff changeset
    99
#include "md5.h"
hgs
parents: 0
diff changeset
   100
hgs
parents: 0
diff changeset
   101
union gst_sockaddr
hgs
parents: 0
diff changeset
   102
{
hgs
parents: 0
diff changeset
   103
  struct sockaddr sa;
hgs
parents: 0
diff changeset
   104
  struct sockaddr_in sa_in;
hgs
parents: 0
diff changeset
   105
  struct sockaddr_in6 sa_in6;
hgs
parents: 0
diff changeset
   106
  struct sockaddr_storage sa_stor;
hgs
parents: 0
diff changeset
   107
};
hgs
parents: 0
diff changeset
   108
hgs
parents: 0
diff changeset
   109
typedef struct
hgs
parents: 0
diff changeset
   110
{
hgs
parents: 0
diff changeset
   111
  gint state;
hgs
parents: 0
diff changeset
   112
  guint save;
hgs
parents: 0
diff changeset
   113
  guchar out[3];                /* the size must be evenly divisible by 3 */
hgs
parents: 0
diff changeset
   114
  guint cout;
hgs
parents: 0
diff changeset
   115
  guint coutl;
hgs
parents: 0
diff changeset
   116
} DecodeCtx;
hgs
parents: 0
diff changeset
   117
hgs
parents: 0
diff changeset
   118
static GstRTSPResult read_line (gint fd, guint8 * buffer, guint * idx,
hgs
parents: 0
diff changeset
   119
    guint size, DecodeCtx * ctxp);
hgs
parents: 0
diff changeset
   120
static GstRTSPResult parse_key_value (guint8 * buffer, gchar * key,
hgs
parents: 0
diff changeset
   121
    guint keysize, gchar ** value);
hgs
parents: 0
diff changeset
   122
static void parse_string (gchar * dest, gint size, gchar ** src);
0
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   123
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   124
#ifdef G_OS_WIN32
16
hgs
parents: 0
diff changeset
   125
#define READ_SOCKET(fd, buf, len) recv (fd, (char *)buf, len, 0)
hgs
parents: 0
diff changeset
   126
#define WRITE_SOCKET(fd, buf, len) send (fd, (const char *)buf, len, 0)
hgs
parents: 0
diff changeset
   127
#define SETSOCKOPT(sock, level, name, val, len) setsockopt (sock, level, name, (const char *)val, len)
0
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   128
#define CLOSE_SOCKET(sock) closesocket (sock)
16
hgs
parents: 0
diff changeset
   129
#define ERRNO_IS_EAGAIN (WSAGetLastError () == WSAEWOULDBLOCK)
hgs
parents: 0
diff changeset
   130
#define ERRNO_IS_EINTR (WSAGetLastError () == WSAEINTR)
0
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   131
/* According to Microsoft's connect() documentation this one returns
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   132
 * WSAEWOULDBLOCK and not WSAEINPROGRESS. */
16
hgs
parents: 0
diff changeset
   133
#define ERRNO_IS_EINPROGRESS (WSAGetLastError () == WSAEWOULDBLOCK)
0
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   134
#else
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   135
#define READ_SOCKET(fd, buf, len) read (fd, buf, len)
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   136
#define WRITE_SOCKET(fd, buf, len) write (fd, buf, len)
16
hgs
parents: 0
diff changeset
   137
#define SETSOCKOPT(sock, level, name, val, len) setsockopt (sock, level, name, val, len)
0
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   138
#define CLOSE_SOCKET(sock) close (sock)
16
hgs
parents: 0
diff changeset
   139
#define ERRNO_IS_EAGAIN (errno == EAGAIN)
hgs
parents: 0
diff changeset
   140
#define ERRNO_IS_EINTR (errno == EINTR)
hgs
parents: 0
diff changeset
   141
#define ERRNO_IS_EINPROGRESS (errno == EINPROGRESS)
0
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   142
#endif
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   143
16
hgs
parents: 0
diff changeset
   144
#define ADD_POLLFD(fdset, pfd, fd)        \
hgs
parents: 0
diff changeset
   145
G_STMT_START {                            \
hgs
parents: 0
diff changeset
   146
  (pfd)->fd = fd;                         \
hgs
parents: 0
diff changeset
   147
  gst_poll_add_fd (fdset, pfd);           \
hgs
parents: 0
diff changeset
   148
} G_STMT_END
hgs
parents: 0
diff changeset
   149
hgs
parents: 0
diff changeset
   150
#define REMOVE_POLLFD(fdset, pfd)          \
hgs
parents: 0
diff changeset
   151
G_STMT_START {                             \
hgs
parents: 0
diff changeset
   152
  if ((pfd)->fd != -1) {                   \
hgs
parents: 0
diff changeset
   153
    GST_DEBUG ("remove fd %d", (pfd)->fd); \
hgs
parents: 0
diff changeset
   154
    gst_poll_remove_fd (fdset, pfd);       \
hgs
parents: 0
diff changeset
   155
    CLOSE_SOCKET ((pfd)->fd);              \
hgs
parents: 0
diff changeset
   156
    (pfd)->fd = -1;                        \
hgs
parents: 0
diff changeset
   157
  }                                        \
hgs
parents: 0
diff changeset
   158
} G_STMT_END
hgs
parents: 0
diff changeset
   159
hgs
parents: 0
diff changeset
   160
typedef enum
hgs
parents: 0
diff changeset
   161
{
hgs
parents: 0
diff changeset
   162
  TUNNEL_STATE_NONE,
hgs
parents: 0
diff changeset
   163
  TUNNEL_STATE_GET,
hgs
parents: 0
diff changeset
   164
  TUNNEL_STATE_POST,
hgs
parents: 0
diff changeset
   165
  TUNNEL_STATE_COMPLETE
hgs
parents: 0
diff changeset
   166
} GstRTSPTunnelState;
hgs
parents: 0
diff changeset
   167
hgs
parents: 0
diff changeset
   168
#define TUNNELID_LEN   24
hgs
parents: 0
diff changeset
   169
hgs
parents: 0
diff changeset
   170
struct _GstRTSPConnection
0
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   171
{
16
hgs
parents: 0
diff changeset
   172
  /*< private > */
hgs
parents: 0
diff changeset
   173
  /* URL for the connection */
hgs
parents: 0
diff changeset
   174
  GstRTSPUrl *url;
hgs
parents: 0
diff changeset
   175
hgs
parents: 0
diff changeset
   176
  /* connection state */
hgs
parents: 0
diff changeset
   177
  GstPollFD fd0;
hgs
parents: 0
diff changeset
   178
  GstPollFD fd1;
hgs
parents: 0
diff changeset
   179
hgs
parents: 0
diff changeset
   180
  GstPollFD *readfd;
hgs
parents: 0
diff changeset
   181
  GstPollFD *writefd;
hgs
parents: 0
diff changeset
   182
hgs
parents: 0
diff changeset
   183
  gchar tunnelid[TUNNELID_LEN];
hgs
parents: 0
diff changeset
   184
  gboolean tunneled;
hgs
parents: 0
diff changeset
   185
  GstRTSPTunnelState tstate;
hgs
parents: 0
diff changeset
   186
hgs
parents: 0
diff changeset
   187
  GstPoll *fdset;
hgs
parents: 0
diff changeset
   188
  gchar *ip;
hgs
parents: 0
diff changeset
   189
hgs
parents: 0
diff changeset
   190
  /* Session state */
hgs
parents: 0
diff changeset
   191
  gint cseq;                    /* sequence number */
hgs
parents: 0
diff changeset
   192
  gchar session_id[512];        /* session id */
hgs
parents: 0
diff changeset
   193
  gint timeout;                 /* session timeout in seconds */
hgs
parents: 0
diff changeset
   194
  GTimer *timer;                /* timeout timer */
hgs
parents: 0
diff changeset
   195
hgs
parents: 0
diff changeset
   196
  /* Authentication */
hgs
parents: 0
diff changeset
   197
  GstRTSPAuthMethod auth_method;
hgs
parents: 0
diff changeset
   198
  gchar *username;
hgs
parents: 0
diff changeset
   199
  gchar *passwd;
hgs
parents: 0
diff changeset
   200
  GHashTable *auth_params;
hgs
parents: 0
diff changeset
   201
hgs
parents: 0
diff changeset
   202
  DecodeCtx ctx;
hgs
parents: 0
diff changeset
   203
  DecodeCtx *ctxp;
hgs
parents: 0
diff changeset
   204
hgs
parents: 0
diff changeset
   205
  gchar *proxy_host;
hgs
parents: 0
diff changeset
   206
  guint proxy_port;
hgs
parents: 0
diff changeset
   207
};
hgs
parents: 0
diff changeset
   208
hgs
parents: 0
diff changeset
   209
enum
hgs
parents: 0
diff changeset
   210
{
hgs
parents: 0
diff changeset
   211
  STATE_START = 0,
hgs
parents: 0
diff changeset
   212
  STATE_DATA_HEADER,
hgs
parents: 0
diff changeset
   213
  STATE_DATA_BODY,
hgs
parents: 0
diff changeset
   214
  STATE_READ_LINES,
hgs
parents: 0
diff changeset
   215
  STATE_END,
hgs
parents: 0
diff changeset
   216
  STATE_LAST
hgs
parents: 0
diff changeset
   217
};
hgs
parents: 0
diff changeset
   218
hgs
parents: 0
diff changeset
   219
/* a structure for constructing RTSPMessages */
hgs
parents: 0
diff changeset
   220
typedef struct
hgs
parents: 0
diff changeset
   221
{
hgs
parents: 0
diff changeset
   222
  gint state;
hgs
parents: 0
diff changeset
   223
  guint8 buffer[4096];
hgs
parents: 0
diff changeset
   224
  guint offset;
hgs
parents: 0
diff changeset
   225
hgs
parents: 0
diff changeset
   226
  guint line;
hgs
parents: 0
diff changeset
   227
  guint8 *body_data;
hgs
parents: 0
diff changeset
   228
  glong body_len;
hgs
parents: 0
diff changeset
   229
} GstRTSPBuilder;
hgs
parents: 0
diff changeset
   230
hgs
parents: 0
diff changeset
   231
static void
hgs
parents: 0
diff changeset
   232
build_reset (GstRTSPBuilder * builder)
hgs
parents: 0
diff changeset
   233
{
hgs
parents: 0
diff changeset
   234
  g_free (builder->body_data);
hgs
parents: 0
diff changeset
   235
  memset (builder, 0, sizeof (GstRTSPBuilder));
0
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   236
}
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   237
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   238
/**
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   239
 * gst_rtsp_connection_create:
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   240
 * @url: a #GstRTSPUrl 
16
hgs
parents: 0
diff changeset
   241
 * @conn: storage for a #GstRTSPConnection
0
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   242
 *
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   243
 * Create a newly allocated #GstRTSPConnection from @url and store it in @conn.
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   244
 * The connection will not yet attempt to connect to @url, use
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   245
 * gst_rtsp_connection_connect().
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   246
 *
16
hgs
parents: 0
diff changeset
   247
 * A copy of @url will be made.
hgs
parents: 0
diff changeset
   248
 *
0
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   249
 * Returns: #GST_RTSP_OK when @conn contains a valid connection.
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   250
 */
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   251
GstRTSPResult
16
hgs
parents: 0
diff changeset
   252
gst_rtsp_connection_create (const GstRTSPUrl * url, GstRTSPConnection ** conn)
0
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   253
{
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   254
  GstRTSPConnection *newconn;
16
hgs
parents: 0
diff changeset
   255
#ifdef G_OS_WIN32
hgs
parents: 0
diff changeset
   256
  WSADATA w;
hgs
parents: 0
diff changeset
   257
  int error;
hgs
parents: 0
diff changeset
   258
#endif
0
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   259
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   260
  g_return_val_if_fail (conn != NULL, GST_RTSP_EINVAL);
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   261
16
hgs
parents: 0
diff changeset
   262
#ifdef G_OS_WIN32
hgs
parents: 0
diff changeset
   263
  error = WSAStartup (0x0202, &w);
hgs
parents: 0
diff changeset
   264
hgs
parents: 0
diff changeset
   265
  if (error)
hgs
parents: 0
diff changeset
   266
    goto startup_error;
hgs
parents: 0
diff changeset
   267
hgs
parents: 0
diff changeset
   268
  if (w.wVersion != 0x0202)
hgs
parents: 0
diff changeset
   269
    goto version_error;
hgs
parents: 0
diff changeset
   270
#endif
hgs
parents: 0
diff changeset
   271
0
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   272
  newconn = g_new0 (GstRTSPConnection, 1);
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   273
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   274
  if ((newconn->fdset = gst_poll_new (TRUE)) == NULL)
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   275
    goto no_fdset;
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   276
16
hgs
parents: 0
diff changeset
   277
  newconn->url = gst_rtsp_url_copy (url);
hgs
parents: 0
diff changeset
   278
  newconn->fd0.fd = -1;
hgs
parents: 0
diff changeset
   279
  newconn->fd1.fd = -1;
0
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   280
  newconn->timer = g_timer_new ();
16
hgs
parents: 0
diff changeset
   281
  newconn->timeout = 60;
hgs
parents: 0
diff changeset
   282
  newconn->cseq = 1;
0
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   283
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   284
  newconn->auth_method = GST_RTSP_AUTH_NONE;
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   285
  newconn->username = NULL;
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   286
  newconn->passwd = NULL;
16
hgs
parents: 0
diff changeset
   287
  newconn->auth_params = NULL;
hgs
parents: 0
diff changeset
   288
hgs
parents: 0
diff changeset
   289
  *conn = newconn;
hgs
parents: 0
diff changeset
   290
hgs
parents: 0
diff changeset
   291
  return GST_RTSP_OK;
hgs
parents: 0
diff changeset
   292
hgs
parents: 0
diff changeset
   293
  /* ERRORS */
hgs
parents: 0
diff changeset
   294
#ifdef G_OS_WIN32
hgs
parents: 0
diff changeset
   295
startup_error:
hgs
parents: 0
diff changeset
   296
  {
hgs
parents: 0
diff changeset
   297
    g_warning ("Error %d on WSAStartup", error);
hgs
parents: 0
diff changeset
   298
    return GST_RTSP_EWSASTART;
hgs
parents: 0
diff changeset
   299
  }
hgs
parents: 0
diff changeset
   300
version_error:
hgs
parents: 0
diff changeset
   301
  {
hgs
parents: 0
diff changeset
   302
    g_warning ("Windows sockets are not version 0x202 (current 0x%x)",
hgs
parents: 0
diff changeset
   303
        w.wVersion);
hgs
parents: 0
diff changeset
   304
    WSACleanup ();
hgs
parents: 0
diff changeset
   305
    return GST_RTSP_EWSAVERSION;
hgs
parents: 0
diff changeset
   306
  }
hgs
parents: 0
diff changeset
   307
#endif
hgs
parents: 0
diff changeset
   308
no_fdset:
hgs
parents: 0
diff changeset
   309
  {
hgs
parents: 0
diff changeset
   310
    g_free (newconn);
hgs
parents: 0
diff changeset
   311
#ifdef G_OS_WIN32
hgs
parents: 0
diff changeset
   312
    WSACleanup ();
hgs
parents: 0
diff changeset
   313
#endif
hgs
parents: 0
diff changeset
   314
    return GST_RTSP_ESYS;
hgs
parents: 0
diff changeset
   315
  }
hgs
parents: 0
diff changeset
   316
}
hgs
parents: 0
diff changeset
   317
hgs
parents: 0
diff changeset
   318
/**
hgs
parents: 0
diff changeset
   319
 * gst_rtsp_connection_accept:
hgs
parents: 0
diff changeset
   320
 * @sock: a socket
hgs
parents: 0
diff changeset
   321
 * @conn: storage for a #GstRTSPConnection
hgs
parents: 0
diff changeset
   322
 *
hgs
parents: 0
diff changeset
   323
 * Accept a new connection on @sock and create a new #GstRTSPConnection for
hgs
parents: 0
diff changeset
   324
 * handling communication on new socket.
hgs
parents: 0
diff changeset
   325
 *
hgs
parents: 0
diff changeset
   326
 * Returns: #GST_RTSP_OK when @conn contains a valid connection.
hgs
parents: 0
diff changeset
   327
 *
hgs
parents: 0
diff changeset
   328
 * Since: 0.10.23
hgs
parents: 0
diff changeset
   329
 */
hgs
parents: 0
diff changeset
   330
GstRTSPResult
hgs
parents: 0
diff changeset
   331
gst_rtsp_connection_accept (gint sock, GstRTSPConnection ** conn)
hgs
parents: 0
diff changeset
   332
{
hgs
parents: 0
diff changeset
   333
  int fd;
hgs
parents: 0
diff changeset
   334
  GstRTSPConnection *newconn = NULL;
hgs
parents: 0
diff changeset
   335
  union gst_sockaddr sa;
hgs
parents: 0
diff changeset
   336
  socklen_t slen = sizeof (sa);
hgs
parents: 0
diff changeset
   337
  gchar ip[INET6_ADDRSTRLEN];
hgs
parents: 0
diff changeset
   338
  GstRTSPUrl *url;
hgs
parents: 0
diff changeset
   339
#ifdef G_OS_WIN32
hgs
parents: 0
diff changeset
   340
  gulong flags = 1;
hgs
parents: 0
diff changeset
   341
#endif
hgs
parents: 0
diff changeset
   342
hgs
parents: 0
diff changeset
   343
  memset (&sa, 0, slen);
hgs
parents: 0
diff changeset
   344
hgs
parents: 0
diff changeset
   345
#ifndef G_OS_WIN32
hgs
parents: 0
diff changeset
   346
  fd = accept (sock, &sa.sa, &slen);
hgs
parents: 0
diff changeset
   347
#else
hgs
parents: 0
diff changeset
   348
  fd = accept (sock, &sa.sa, (gint *) & slen);
hgs
parents: 0
diff changeset
   349
#endif /* G_OS_WIN32 */
hgs
parents: 0
diff changeset
   350
  if (fd == -1)
hgs
parents: 0
diff changeset
   351
    goto accept_failed;
hgs
parents: 0
diff changeset
   352
hgs
parents: 0
diff changeset
   353
  if (getnameinfo (&sa.sa, slen, ip, sizeof (ip), NULL, 0, NI_NUMERICHOST) != 0)
hgs
parents: 0
diff changeset
   354
    goto getnameinfo_failed;
hgs
parents: 0
diff changeset
   355
  if (sa.sa.sa_family != AF_INET && sa.sa.sa_family != AF_INET6)
hgs
parents: 0
diff changeset
   356
    goto wrong_family;
hgs
parents: 0
diff changeset
   357
hgs
parents: 0
diff changeset
   358
  /* set to non-blocking mode so that we can cancel the communication */
hgs
parents: 0
diff changeset
   359
#ifndef G_OS_WIN32
hgs
parents: 0
diff changeset
   360
  fcntl (fd, F_SETFL, O_NONBLOCK);
hgs
parents: 0
diff changeset
   361
#else
hgs
parents: 0
diff changeset
   362
  ioctlsocket (fd, FIONBIO, &flags);
hgs
parents: 0
diff changeset
   363
#endif /* G_OS_WIN32 */
hgs
parents: 0
diff changeset
   364
hgs
parents: 0
diff changeset
   365
  /* create a url for the client address */
hgs
parents: 0
diff changeset
   366
  url = g_new0 (GstRTSPUrl, 1);
hgs
parents: 0
diff changeset
   367
  url->host = g_strdup (ip);
hgs
parents: 0
diff changeset
   368
  if (sa.sa.sa_family == AF_INET)
hgs
parents: 0
diff changeset
   369
    url->port = sa.sa_in.sin_port;
hgs
parents: 0
diff changeset
   370
  else
hgs
parents: 0
diff changeset
   371
    url->port = sa.sa_in6.sin6_port;
hgs
parents: 0
diff changeset
   372
hgs
parents: 0
diff changeset
   373
  /* now create the connection object */
hgs
parents: 0
diff changeset
   374
  gst_rtsp_connection_create (url, &newconn);
hgs
parents: 0
diff changeset
   375
  gst_rtsp_url_free (url);
hgs
parents: 0
diff changeset
   376
hgs
parents: 0
diff changeset
   377
  ADD_POLLFD (newconn->fdset, &newconn->fd0, fd);
hgs
parents: 0
diff changeset
   378
hgs
parents: 0
diff changeset
   379
  /* both read and write initially */
hgs
parents: 0
diff changeset
   380
  newconn->readfd = &newconn->fd0;
hgs
parents: 0
diff changeset
   381
  newconn->writefd = &newconn->fd0;
0
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   382
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   383
  *conn = newconn;
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   384
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   385
  return GST_RTSP_OK;
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   386
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   387
  /* ERRORS */
16
hgs
parents: 0
diff changeset
   388
accept_failed:
hgs
parents: 0
diff changeset
   389
  {
hgs
parents: 0
diff changeset
   390
    return GST_RTSP_ESYS;
hgs
parents: 0
diff changeset
   391
  }
hgs
parents: 0
diff changeset
   392
getnameinfo_failed:
hgs
parents: 0
diff changeset
   393
wrong_family:
hgs
parents: 0
diff changeset
   394
  {
hgs
parents: 0
diff changeset
   395
    close (fd);
hgs
parents: 0
diff changeset
   396
    return GST_RTSP_ERROR;
hgs
parents: 0
diff changeset
   397
  }
hgs
parents: 0
diff changeset
   398
}
hgs
parents: 0
diff changeset
   399
hgs
parents: 0
diff changeset
   400
static gchar *
hgs
parents: 0
diff changeset
   401
do_resolve (const gchar * host)
hgs
parents: 0
diff changeset
   402
{
hgs
parents: 0
diff changeset
   403
  static gchar ip[INET6_ADDRSTRLEN];
hgs
parents: 0
diff changeset
   404
  struct addrinfo *aires;
hgs
parents: 0
diff changeset
   405
  struct addrinfo *ai;
hgs
parents: 0
diff changeset
   406
  gint aierr;
hgs
parents: 0
diff changeset
   407
hgs
parents: 0
diff changeset
   408
  aierr = getaddrinfo (host, NULL, NULL, &aires);
hgs
parents: 0
diff changeset
   409
  if (aierr != 0)
hgs
parents: 0
diff changeset
   410
    goto no_addrinfo;
hgs
parents: 0
diff changeset
   411
hgs
parents: 0
diff changeset
   412
  for (ai = aires; ai; ai = ai->ai_next) {
hgs
parents: 0
diff changeset
   413
    if (ai->ai_family == AF_INET || ai->ai_family == AF_INET6) {
hgs
parents: 0
diff changeset
   414
      break;
hgs
parents: 0
diff changeset
   415
    }
hgs
parents: 0
diff changeset
   416
  }
hgs
parents: 0
diff changeset
   417
  if (ai == NULL)
hgs
parents: 0
diff changeset
   418
    goto no_family;
hgs
parents: 0
diff changeset
   419
hgs
parents: 0
diff changeset
   420
  aierr = getnameinfo (ai->ai_addr, ai->ai_addrlen, ip, sizeof (ip), NULL, 0,
hgs
parents: 0
diff changeset
   421
      NI_NUMERICHOST | NI_NUMERICSERV);
hgs
parents: 0
diff changeset
   422
  if (aierr != 0)
hgs
parents: 0
diff changeset
   423
    goto no_address;
hgs
parents: 0
diff changeset
   424
hgs
parents: 0
diff changeset
   425
  freeaddrinfo (aires);
hgs
parents: 0
diff changeset
   426
hgs
parents: 0
diff changeset
   427
  return g_strdup (ip);
hgs
parents: 0
diff changeset
   428
hgs
parents: 0
diff changeset
   429
  /* ERRORS */
hgs
parents: 0
diff changeset
   430
no_addrinfo:
hgs
parents: 0
diff changeset
   431
  {
hgs
parents: 0
diff changeset
   432
    GST_ERROR ("no addrinfo found for %s: %s", host, gai_strerror (aierr));
hgs
parents: 0
diff changeset
   433
    return NULL;
hgs
parents: 0
diff changeset
   434
  }
hgs
parents: 0
diff changeset
   435
no_family:
hgs
parents: 0
diff changeset
   436
  {
hgs
parents: 0
diff changeset
   437
    GST_ERROR ("no family found for %s", host);
hgs
parents: 0
diff changeset
   438
    freeaddrinfo (aires);
hgs
parents: 0
diff changeset
   439
    return NULL;
hgs
parents: 0
diff changeset
   440
  }
hgs
parents: 0
diff changeset
   441
no_address:
hgs
parents: 0
diff changeset
   442
  {
hgs
parents: 0
diff changeset
   443
    GST_ERROR ("no address found for %s: %s", host, gai_strerror (aierr));
hgs
parents: 0
diff changeset
   444
    freeaddrinfo (aires);
hgs
parents: 0
diff changeset
   445
    return NULL;
hgs
parents: 0
diff changeset
   446
  }
hgs
parents: 0
diff changeset
   447
}
hgs
parents: 0
diff changeset
   448
hgs
parents: 0
diff changeset
   449
static GstRTSPResult
hgs
parents: 0
diff changeset
   450
do_connect (const gchar * ip, guint16 port, GstPollFD * fdout,
hgs
parents: 0
diff changeset
   451
    GstPoll * fdset, GTimeVal * timeout)
hgs
parents: 0
diff changeset
   452
{
hgs
parents: 0
diff changeset
   453
  gint fd;
hgs
parents: 0
diff changeset
   454
  struct addrinfo hints;
hgs
parents: 0
diff changeset
   455
  struct addrinfo *aires;
hgs
parents: 0
diff changeset
   456
  struct addrinfo *ai;
hgs
parents: 0
diff changeset
   457
  gint aierr;
hgs
parents: 0
diff changeset
   458
  gchar service[NI_MAXSERV];
hgs
parents: 0
diff changeset
   459
  gint ret;
hgs
parents: 0
diff changeset
   460
#ifdef G_OS_WIN32
hgs
parents: 0
diff changeset
   461
  unsigned long flags = 1;
hgs
parents: 0
diff changeset
   462
#endif /* G_OS_WIN32 */
hgs
parents: 0
diff changeset
   463
  GstClockTime to;
hgs
parents: 0
diff changeset
   464
  gint retval;
hgs
parents: 0
diff changeset
   465
hgs
parents: 0
diff changeset
   466
  memset (&hints, 0, sizeof hints);
hgs
parents: 0
diff changeset
   467
  hints.ai_flags = AI_NUMERICHOST;
hgs
parents: 0
diff changeset
   468
  hints.ai_family = AF_UNSPEC;
hgs
parents: 0
diff changeset
   469
  hints.ai_socktype = SOCK_STREAM;
hgs
parents: 0
diff changeset
   470
  g_snprintf (service, sizeof (service) - 1, "%hu", port);
hgs
parents: 0
diff changeset
   471
  service[sizeof (service) - 1] = '\0';
hgs
parents: 0
diff changeset
   472
hgs
parents: 0
diff changeset
   473
  aierr = getaddrinfo (ip, service, &hints, &aires);
hgs
parents: 0
diff changeset
   474
  if (aierr != 0)
hgs
parents: 0
diff changeset
   475
    goto no_addrinfo;
hgs
parents: 0
diff changeset
   476
hgs
parents: 0
diff changeset
   477
  for (ai = aires; ai; ai = ai->ai_next) {
hgs
parents: 0
diff changeset
   478
    if (ai->ai_family == AF_INET || ai->ai_family == AF_INET6) {
hgs
parents: 0
diff changeset
   479
      break;
hgs
parents: 0
diff changeset
   480
    }
hgs
parents: 0
diff changeset
   481
  }
hgs
parents: 0
diff changeset
   482
  if (ai == NULL)
hgs
parents: 0
diff changeset
   483
    goto no_family;
hgs
parents: 0
diff changeset
   484
hgs
parents: 0
diff changeset
   485
  fd = socket (ai->ai_family, SOCK_STREAM, 0);
hgs
parents: 0
diff changeset
   486
  if (fd == -1)
hgs
parents: 0
diff changeset
   487
    goto no_socket;
hgs
parents: 0
diff changeset
   488
hgs
parents: 0
diff changeset
   489
  /* set to non-blocking mode so that we can cancel the connect */
hgs
parents: 0
diff changeset
   490
#ifndef G_OS_WIN32
hgs
parents: 0
diff changeset
   491
  fcntl (fd, F_SETFL, O_NONBLOCK);
hgs
parents: 0
diff changeset
   492
#else
hgs
parents: 0
diff changeset
   493
  ioctlsocket (fd, FIONBIO, &flags);
hgs
parents: 0
diff changeset
   494
#endif /* G_OS_WIN32 */
hgs
parents: 0
diff changeset
   495
hgs
parents: 0
diff changeset
   496
  /* add the socket to our fdset */
hgs
parents: 0
diff changeset
   497
  ADD_POLLFD (fdset, fdout, fd);
hgs
parents: 0
diff changeset
   498
hgs
parents: 0
diff changeset
   499
  /* we are going to connect ASYNC now */
hgs
parents: 0
diff changeset
   500
  ret = connect (fd, ai->ai_addr, ai->ai_addrlen);
hgs
parents: 0
diff changeset
   501
  if (ret == 0)
hgs
parents: 0
diff changeset
   502
    goto done;
hgs
parents: 0
diff changeset
   503
  if (!ERRNO_IS_EINPROGRESS)
hgs
parents: 0
diff changeset
   504
    goto sys_error;
hgs
parents: 0
diff changeset
   505
hgs
parents: 0
diff changeset
   506
  /* wait for connect to complete up to the specified timeout or until we got
hgs
parents: 0
diff changeset
   507
   * interrupted. */
hgs
parents: 0
diff changeset
   508
  gst_poll_fd_ctl_write (fdset, fdout, TRUE);
hgs
parents: 0
diff changeset
   509
hgs
parents: 0
diff changeset
   510
  to = timeout ? GST_TIMEVAL_TO_TIME (*timeout) : GST_CLOCK_TIME_NONE;
hgs
parents: 0
diff changeset
   511
hgs
parents: 0
diff changeset
   512
  do {
hgs
parents: 0
diff changeset
   513
    retval = gst_poll_wait (fdset, to);
hgs
parents: 0
diff changeset
   514
  } while (retval == -1 && (errno == EINTR || errno == EAGAIN));
hgs
parents: 0
diff changeset
   515
hgs
parents: 0
diff changeset
   516
  if (retval == 0)
hgs
parents: 0
diff changeset
   517
    goto timeout;
hgs
parents: 0
diff changeset
   518
  else if (retval == -1)
hgs
parents: 0
diff changeset
   519
    goto sys_error;
hgs
parents: 0
diff changeset
   520
hgs
parents: 0
diff changeset
   521
  /* we can still have an error connecting on windows */
hgs
parents: 0
diff changeset
   522
  if (gst_poll_fd_has_error (fdset, fdout)) {
hgs
parents: 0
diff changeset
   523
    socklen_t len = sizeof (errno);
hgs
parents: 0
diff changeset
   524
#ifndef G_OS_WIN32
hgs
parents: 0
diff changeset
   525
    getsockopt (fd, SOL_SOCKET, SO_ERROR, &errno, &len);
hgs
parents: 0
diff changeset
   526
#else
hgs
parents: 0
diff changeset
   527
    getsockopt (fd, SOL_SOCKET, SO_ERROR, (char *) &errno, &len);
hgs
parents: 0
diff changeset
   528
#endif
hgs
parents: 0
diff changeset
   529
    goto sys_error;
hgs
parents: 0
diff changeset
   530
  }
hgs
parents: 0
diff changeset
   531
hgs
parents: 0
diff changeset
   532
  gst_poll_fd_ignored (fdset, fdout);
hgs
parents: 0
diff changeset
   533
hgs
parents: 0
diff changeset
   534
done:
hgs
parents: 0
diff changeset
   535
  freeaddrinfo (aires);
hgs
parents: 0
diff changeset
   536
hgs
parents: 0
diff changeset
   537
  return GST_RTSP_OK;
hgs
parents: 0
diff changeset
   538
hgs
parents: 0
diff changeset
   539
  /* ERRORS */
hgs
parents: 0
diff changeset
   540
no_addrinfo:
hgs
parents: 0
diff changeset
   541
  {
hgs
parents: 0
diff changeset
   542
    GST_ERROR ("no addrinfo found for %s: %s", ip, gai_strerror (aierr));
hgs
parents: 0
diff changeset
   543
    return GST_RTSP_ERROR;
hgs
parents: 0
diff changeset
   544
  }
hgs
parents: 0
diff changeset
   545
no_family:
hgs
parents: 0
diff changeset
   546
  {
hgs
parents: 0
diff changeset
   547
    GST_ERROR ("no family found for %s", ip);
hgs
parents: 0
diff changeset
   548
    freeaddrinfo (aires);
hgs
parents: 0
diff changeset
   549
    return GST_RTSP_ERROR;
hgs
parents: 0
diff changeset
   550
  }
hgs
parents: 0
diff changeset
   551
no_socket:
hgs
parents: 0
diff changeset
   552
  {
hgs
parents: 0
diff changeset
   553
    GST_ERROR ("no socket %d (%s)", errno, g_strerror (errno));
hgs
parents: 0
diff changeset
   554
    freeaddrinfo (aires);
hgs
parents: 0
diff changeset
   555
    return GST_RTSP_ESYS;
hgs
parents: 0
diff changeset
   556
  }
hgs
parents: 0
diff changeset
   557
sys_error:
hgs
parents: 0
diff changeset
   558
  {
hgs
parents: 0
diff changeset
   559
    GST_ERROR ("system error %d (%s)", errno, g_strerror (errno));
hgs
parents: 0
diff changeset
   560
    REMOVE_POLLFD (fdset, fdout);
hgs
parents: 0
diff changeset
   561
    freeaddrinfo (aires);
hgs
parents: 0
diff changeset
   562
    return GST_RTSP_ESYS;
hgs
parents: 0
diff changeset
   563
  }
hgs
parents: 0
diff changeset
   564
timeout:
0
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   565
  {
16
hgs
parents: 0
diff changeset
   566
    GST_ERROR ("timeout");
hgs
parents: 0
diff changeset
   567
    REMOVE_POLLFD (fdset, fdout);
hgs
parents: 0
diff changeset
   568
    freeaddrinfo (aires);
hgs
parents: 0
diff changeset
   569
    return GST_RTSP_ETIMEOUT;
hgs
parents: 0
diff changeset
   570
  }
hgs
parents: 0
diff changeset
   571
}
hgs
parents: 0
diff changeset
   572
hgs
parents: 0
diff changeset
   573
static GstRTSPResult
hgs
parents: 0
diff changeset
   574
setup_tunneling (GstRTSPConnection * conn, GTimeVal * timeout)
hgs
parents: 0
diff changeset
   575
{
hgs
parents: 0
diff changeset
   576
  gint i;
hgs
parents: 0
diff changeset
   577
  GstRTSPResult res;
hgs
parents: 0
diff changeset
   578
  gchar *str;
hgs
parents: 0
diff changeset
   579
  guint idx, line;
hgs
parents: 0
diff changeset
   580
  gint retval;
hgs
parents: 0
diff changeset
   581
  GstClockTime to;
hgs
parents: 0
diff changeset
   582
  gchar *ip, *url_port_str;
hgs
parents: 0
diff changeset
   583
  guint16 port, url_port;
hgs
parents: 0
diff changeset
   584
  gchar codestr[4], *resultstr;
hgs
parents: 0
diff changeset
   585
  gint code;
hgs
parents: 0
diff changeset
   586
  GstRTSPUrl *url;
hgs
parents: 0
diff changeset
   587
  gchar *hostparam;
hgs
parents: 0
diff changeset
   588
hgs
parents: 0
diff changeset
   589
  /* create a random sessionid */
hgs
parents: 0
diff changeset
   590
  for (i = 0; i < TUNNELID_LEN; i++)
hgs
parents: 0
diff changeset
   591
    conn->tunnelid[i] = g_random_int_range ('a', 'z');
hgs
parents: 0
diff changeset
   592
  conn->tunnelid[TUNNELID_LEN - 1] = '\0';
hgs
parents: 0
diff changeset
   593
hgs
parents: 0
diff changeset
   594
  url = conn->url;
hgs
parents: 0
diff changeset
   595
  /* get the port from the url */
hgs
parents: 0
diff changeset
   596
  gst_rtsp_url_get_port (url, &url_port);
hgs
parents: 0
diff changeset
   597
hgs
parents: 0
diff changeset
   598
  if (conn->proxy_host) {
hgs
parents: 0
diff changeset
   599
    hostparam = g_strdup_printf ("Host: %s:%d\r\n", url->host, url_port);
hgs
parents: 0
diff changeset
   600
    url_port_str = g_strdup_printf (":%d", url_port);
hgs
parents: 0
diff changeset
   601
    ip = conn->proxy_host;
hgs
parents: 0
diff changeset
   602
    port = conn->proxy_port;
hgs
parents: 0
diff changeset
   603
  } else {
hgs
parents: 0
diff changeset
   604
    hostparam = NULL;
hgs
parents: 0
diff changeset
   605
    url_port_str = NULL;
hgs
parents: 0
diff changeset
   606
    ip = conn->ip;
hgs
parents: 0
diff changeset
   607
    port = url_port;
hgs
parents: 0
diff changeset
   608
  }
hgs
parents: 0
diff changeset
   609
hgs
parents: 0
diff changeset
   610
  /* */
hgs
parents: 0
diff changeset
   611
  str = g_strdup_printf ("GET %s%s%s%s%s%s HTTP/1.0\r\n"
hgs
parents: 0
diff changeset
   612
      "%s"
hgs
parents: 0
diff changeset
   613
      "x-sessioncookie: %s\r\n"
hgs
parents: 0
diff changeset
   614
      "Accept: application/x-rtsp-tunnelled\r\n"
hgs
parents: 0
diff changeset
   615
      "Pragma: no-cache\r\n"
hgs
parents: 0
diff changeset
   616
      "Cache-Control: no-cache\r\n" "\r\n",
hgs
parents: 0
diff changeset
   617
      conn->proxy_host ? "http://" : "",
hgs
parents: 0
diff changeset
   618
      conn->proxy_host ? url->host : "",
hgs
parents: 0
diff changeset
   619
      conn->proxy_host ? url_port_str : "",
hgs
parents: 0
diff changeset
   620
      url->abspath, url->query ? "?" : "", url->query ? url->query : "",
hgs
parents: 0
diff changeset
   621
      hostparam ? hostparam : "", conn->tunnelid);
hgs
parents: 0
diff changeset
   622
hgs
parents: 0
diff changeset
   623
  /* we start by writing to this fd */
hgs
parents: 0
diff changeset
   624
  conn->writefd = &conn->fd0;
hgs
parents: 0
diff changeset
   625
hgs
parents: 0
diff changeset
   626
  res = gst_rtsp_connection_write (conn, (guint8 *) str, strlen (str), timeout);
hgs
parents: 0
diff changeset
   627
  g_free (str);
hgs
parents: 0
diff changeset
   628
  if (res != GST_RTSP_OK)
hgs
parents: 0
diff changeset
   629
    goto write_failed;
hgs
parents: 0
diff changeset
   630
hgs
parents: 0
diff changeset
   631
  gst_poll_fd_ctl_write (conn->fdset, &conn->fd0, FALSE);
hgs
parents: 0
diff changeset
   632
  gst_poll_fd_ctl_read (conn->fdset, &conn->fd0, TRUE);
hgs
parents: 0
diff changeset
   633
hgs
parents: 0
diff changeset
   634
  to = timeout ? GST_TIMEVAL_TO_TIME (*timeout) : GST_CLOCK_TIME_NONE;
hgs
parents: 0
diff changeset
   635
hgs
parents: 0
diff changeset
   636
  line = 0;
hgs
parents: 0
diff changeset
   637
  while (TRUE) {
hgs
parents: 0
diff changeset
   638
    guint8 buffer[4096];
hgs
parents: 0
diff changeset
   639
hgs
parents: 0
diff changeset
   640
    idx = 0;
hgs
parents: 0
diff changeset
   641
    while (TRUE) {
hgs
parents: 0
diff changeset
   642
      res = read_line (conn->fd0.fd, buffer, &idx, sizeof (buffer), NULL);
hgs
parents: 0
diff changeset
   643
      if (res == GST_RTSP_EEOF)
hgs
parents: 0
diff changeset
   644
        goto eof;
hgs
parents: 0
diff changeset
   645
      if (res == GST_RTSP_OK)
hgs
parents: 0
diff changeset
   646
        break;
hgs
parents: 0
diff changeset
   647
      if (res != GST_RTSP_EINTR)
hgs
parents: 0
diff changeset
   648
        goto read_error;
hgs
parents: 0
diff changeset
   649
hgs
parents: 0
diff changeset
   650
      do {
hgs
parents: 0
diff changeset
   651
        retval = gst_poll_wait (conn->fdset, to);
hgs
parents: 0
diff changeset
   652
      } while (retval == -1 && (errno == EINTR || errno == EAGAIN));
hgs
parents: 0
diff changeset
   653
hgs
parents: 0
diff changeset
   654
      /* check for timeout */
hgs
parents: 0
diff changeset
   655
      if (retval == 0)
hgs
parents: 0
diff changeset
   656
        goto timeout;
hgs
parents: 0
diff changeset
   657
hgs
parents: 0
diff changeset
   658
      if (retval == -1) {
hgs
parents: 0
diff changeset
   659
        if (errno == EBUSY)
hgs
parents: 0
diff changeset
   660
          goto stopped;
hgs
parents: 0
diff changeset
   661
        else
hgs
parents: 0
diff changeset
   662
          goto select_error;
hgs
parents: 0
diff changeset
   663
      }
hgs
parents: 0
diff changeset
   664
    }
hgs
parents: 0
diff changeset
   665
hgs
parents: 0
diff changeset
   666
    /* check for last line */
hgs
parents: 0
diff changeset
   667
    if (buffer[0] == '\r')
hgs
parents: 0
diff changeset
   668
      buffer[0] = '\0';
hgs
parents: 0
diff changeset
   669
    if (buffer[0] == '\0')
hgs
parents: 0
diff changeset
   670
      break;
hgs
parents: 0
diff changeset
   671
hgs
parents: 0
diff changeset
   672
    if (line == 0) {
hgs
parents: 0
diff changeset
   673
      /* first line, parse response */
hgs
parents: 0
diff changeset
   674
      gchar versionstr[20];
hgs
parents: 0
diff changeset
   675
      gchar *bptr;
hgs
parents: 0
diff changeset
   676
hgs
parents: 0
diff changeset
   677
      bptr = (gchar *) buffer;
hgs
parents: 0
diff changeset
   678
hgs
parents: 0
diff changeset
   679
      parse_string (versionstr, sizeof (versionstr), &bptr);
hgs
parents: 0
diff changeset
   680
      parse_string (codestr, sizeof (codestr), &bptr);
hgs
parents: 0
diff changeset
   681
      code = atoi (codestr);
hgs
parents: 0
diff changeset
   682
hgs
parents: 0
diff changeset
   683
      while (g_ascii_isspace (*bptr))
hgs
parents: 0
diff changeset
   684
        bptr++;
hgs
parents: 0
diff changeset
   685
hgs
parents: 0
diff changeset
   686
      resultstr = bptr;
hgs
parents: 0
diff changeset
   687
hgs
parents: 0
diff changeset
   688
      if (code != GST_RTSP_STS_OK)
hgs
parents: 0
diff changeset
   689
        goto wrong_result;
hgs
parents: 0
diff changeset
   690
    } else {
hgs
parents: 0
diff changeset
   691
      gchar key[32];
hgs
parents: 0
diff changeset
   692
      gchar *value;
hgs
parents: 0
diff changeset
   693
hgs
parents: 0
diff changeset
   694
      /* other lines, parse key/value */
hgs
parents: 0
diff changeset
   695
      res = parse_key_value (buffer, key, sizeof (key), &value);
hgs
parents: 0
diff changeset
   696
      if (res == GST_RTSP_OK) {
hgs
parents: 0
diff changeset
   697
        /* we got a new ip address */
hgs
parents: 0
diff changeset
   698
        if (g_ascii_strcasecmp (key, "x-server-ip-address") == 0) {
hgs
parents: 0
diff changeset
   699
          if (conn->proxy_host) {
hgs
parents: 0
diff changeset
   700
            /* if we use a proxy we need to change the destination url */
hgs
parents: 0
diff changeset
   701
            g_free (url->host);
hgs
parents: 0
diff changeset
   702
            url->host = g_strdup (value);
hgs
parents: 0
diff changeset
   703
            g_free (hostparam);
hgs
parents: 0
diff changeset
   704
            g_free (url_port_str);
hgs
parents: 0
diff changeset
   705
            hostparam =
hgs
parents: 0
diff changeset
   706
                g_strdup_printf ("Host: %s:%d\r\n", url->host, url_port);
hgs
parents: 0
diff changeset
   707
            url_port_str = g_strdup_printf (":%d", url_port);
hgs
parents: 0
diff changeset
   708
          } else {
hgs
parents: 0
diff changeset
   709
            /* and resolve the new ip address */
hgs
parents: 0
diff changeset
   710
            if (!(ip = do_resolve (conn->ip)))
hgs
parents: 0
diff changeset
   711
              goto not_resolved;
hgs
parents: 0
diff changeset
   712
            g_free (conn->ip);
hgs
parents: 0
diff changeset
   713
            conn->ip = ip;
hgs
parents: 0
diff changeset
   714
          }
hgs
parents: 0
diff changeset
   715
        }
hgs
parents: 0
diff changeset
   716
      }
hgs
parents: 0
diff changeset
   717
    }
hgs
parents: 0
diff changeset
   718
    line++;
hgs
parents: 0
diff changeset
   719
  }
hgs
parents: 0
diff changeset
   720
hgs
parents: 0
diff changeset
   721
  /* connect to the host/port */
hgs
parents: 0
diff changeset
   722
  res = do_connect (ip, port, &conn->fd1, conn->fdset, timeout);
hgs
parents: 0
diff changeset
   723
  if (res != GST_RTSP_OK)
hgs
parents: 0
diff changeset
   724
    goto connect_failed;
hgs
parents: 0
diff changeset
   725
hgs
parents: 0
diff changeset
   726
  /* this is now our writing socket */
hgs
parents: 0
diff changeset
   727
  conn->writefd = &conn->fd1;
hgs
parents: 0
diff changeset
   728
hgs
parents: 0
diff changeset
   729
  /* */
hgs
parents: 0
diff changeset
   730
  str = g_strdup_printf ("POST %s%s%s%s%s%s HTTP/1.0\r\n"
hgs
parents: 0
diff changeset
   731
      "%s"
hgs
parents: 0
diff changeset
   732
      "x-sessioncookie: %s\r\n"
hgs
parents: 0
diff changeset
   733
      "Content-Type: application/x-rtsp-tunnelled\r\n"
hgs
parents: 0
diff changeset
   734
      "Pragma: no-cache\r\n"
hgs
parents: 0
diff changeset
   735
      "Cache-Control: no-cache\r\n"
hgs
parents: 0
diff changeset
   736
      "Content-Length: 32767\r\n"
hgs
parents: 0
diff changeset
   737
      "Expires: Sun, 9 Jan 1972 00:00:00 GMT\r\n"
hgs
parents: 0
diff changeset
   738
      "\r\n",
hgs
parents: 0
diff changeset
   739
      conn->proxy_host ? "http://" : "",
hgs
parents: 0
diff changeset
   740
      conn->proxy_host ? url->host : "",
hgs
parents: 0
diff changeset
   741
      conn->proxy_host ? url_port_str : "",
hgs
parents: 0
diff changeset
   742
      url->abspath, url->query ? "?" : "", url->query ? url->query : "",
hgs
parents: 0
diff changeset
   743
      hostparam ? hostparam : "", conn->tunnelid);
hgs
parents: 0
diff changeset
   744
hgs
parents: 0
diff changeset
   745
  res = gst_rtsp_connection_write (conn, (guint8 *) str, strlen (str), timeout);
hgs
parents: 0
diff changeset
   746
  g_free (str);
hgs
parents: 0
diff changeset
   747
  if (res != GST_RTSP_OK)
hgs
parents: 0
diff changeset
   748
    goto write_failed;
hgs
parents: 0
diff changeset
   749
hgs
parents: 0
diff changeset
   750
exit:
hgs
parents: 0
diff changeset
   751
  g_free (hostparam);
hgs
parents: 0
diff changeset
   752
  g_free (url_port_str);
hgs
parents: 0
diff changeset
   753
hgs
parents: 0
diff changeset
   754
  return res;
hgs
parents: 0
diff changeset
   755
hgs
parents: 0
diff changeset
   756
  /* ERRORS */
hgs
parents: 0
diff changeset
   757
write_failed:
hgs
parents: 0
diff changeset
   758
  {
hgs
parents: 0
diff changeset
   759
    GST_ERROR ("write failed (%d)", res);
hgs
parents: 0
diff changeset
   760
    goto exit;
hgs
parents: 0
diff changeset
   761
  }
hgs
parents: 0
diff changeset
   762
eof:
hgs
parents: 0
diff changeset
   763
  {
hgs
parents: 0
diff changeset
   764
    res = GST_RTSP_EEOF;
hgs
parents: 0
diff changeset
   765
    goto exit;
hgs
parents: 0
diff changeset
   766
  }
hgs
parents: 0
diff changeset
   767
read_error:
hgs
parents: 0
diff changeset
   768
  {
hgs
parents: 0
diff changeset
   769
    goto exit;
hgs
parents: 0
diff changeset
   770
  }
hgs
parents: 0
diff changeset
   771
timeout:
hgs
parents: 0
diff changeset
   772
  {
hgs
parents: 0
diff changeset
   773
    res = GST_RTSP_ETIMEOUT;
hgs
parents: 0
diff changeset
   774
    goto exit;
hgs
parents: 0
diff changeset
   775
  }
hgs
parents: 0
diff changeset
   776
select_error:
hgs
parents: 0
diff changeset
   777
  {
hgs
parents: 0
diff changeset
   778
    res = GST_RTSP_ESYS;
hgs
parents: 0
diff changeset
   779
    goto exit;
hgs
parents: 0
diff changeset
   780
  }
hgs
parents: 0
diff changeset
   781
stopped:
hgs
parents: 0
diff changeset
   782
  {
hgs
parents: 0
diff changeset
   783
    res = GST_RTSP_EINTR;
hgs
parents: 0
diff changeset
   784
    goto exit;
hgs
parents: 0
diff changeset
   785
  }
hgs
parents: 0
diff changeset
   786
wrong_result:
hgs
parents: 0
diff changeset
   787
  {
hgs
parents: 0
diff changeset
   788
    GST_ERROR ("got failure response %d %s", code, resultstr);
hgs
parents: 0
diff changeset
   789
    res = GST_RTSP_ERROR;
hgs
parents: 0
diff changeset
   790
    goto exit;
hgs
parents: 0
diff changeset
   791
  }
hgs
parents: 0
diff changeset
   792
not_resolved:
hgs
parents: 0
diff changeset
   793
  {
hgs
parents: 0
diff changeset
   794
    GST_ERROR ("could not resolve %s", conn->ip);
hgs
parents: 0
diff changeset
   795
    res = GST_RTSP_ENET;
hgs
parents: 0
diff changeset
   796
    goto exit;
hgs
parents: 0
diff changeset
   797
  }
hgs
parents: 0
diff changeset
   798
connect_failed:
hgs
parents: 0
diff changeset
   799
  {
hgs
parents: 0
diff changeset
   800
    GST_ERROR ("failed to connect");
hgs
parents: 0
diff changeset
   801
    goto exit;
0
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   802
  }
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   803
}
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   804
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   805
/**
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   806
 * gst_rtsp_connection_connect:
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   807
 * @conn: a #GstRTSPConnection 
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   808
 * @timeout: a #GTimeVal timeout
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   809
 *
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   810
 * Attempt to connect to the url of @conn made with
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   811
 * gst_rtsp_connection_create(). If @timeout is #NULL this function can block
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   812
 * forever. If @timeout contains a valid timeout, this function will return
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   813
 * #GST_RTSP_ETIMEOUT after the timeout expired.
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   814
 *
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   815
 * This function can be cancelled with gst_rtsp_connection_flush().
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   816
 *
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   817
 * Returns: #GST_RTSP_OK when a connection could be made.
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   818
 */
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   819
GstRTSPResult
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   820
gst_rtsp_connection_connect (GstRTSPConnection * conn, GTimeVal * timeout)
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   821
{
16
hgs
parents: 0
diff changeset
   822
  GstRTSPResult res;
hgs
parents: 0
diff changeset
   823
  gchar *ip;
0
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   824
  guint16 port;
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   825
  GstRTSPUrl *url;
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   826
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   827
  g_return_val_if_fail (conn != NULL, GST_RTSP_EINVAL);
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   828
  g_return_val_if_fail (conn->url != NULL, GST_RTSP_EINVAL);
16
hgs
parents: 0
diff changeset
   829
  g_return_val_if_fail (conn->fd0.fd < 0, GST_RTSP_EINVAL);
0
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   830
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   831
  url = conn->url;
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   832
16
hgs
parents: 0
diff changeset
   833
  if (conn->proxy_host && conn->tunneled) {
hgs
parents: 0
diff changeset
   834
    if (!(ip = do_resolve (conn->proxy_host))) {
hgs
parents: 0
diff changeset
   835
      GST_ERROR ("could not resolve %s", conn->proxy_host);
hgs
parents: 0
diff changeset
   836
      goto not_resolved;
hgs
parents: 0
diff changeset
   837
    }
hgs
parents: 0
diff changeset
   838
    port = conn->proxy_port;
hgs
parents: 0
diff changeset
   839
    g_free (conn->proxy_host);
hgs
parents: 0
diff changeset
   840
    conn->proxy_host = ip;
0
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   841
  } else {
16
hgs
parents: 0
diff changeset
   842
    if (!(ip = do_resolve (url->host))) {
hgs
parents: 0
diff changeset
   843
      GST_ERROR ("could not resolve %s", url->host);
hgs
parents: 0
diff changeset
   844
      goto not_resolved;
hgs
parents: 0
diff changeset
   845
    }
hgs
parents: 0
diff changeset
   846
    /* get the port from the url */
hgs
parents: 0
diff changeset
   847
    gst_rtsp_url_get_port (url, &port);
hgs
parents: 0
diff changeset
   848
hgs
parents: 0
diff changeset
   849
    g_free (conn->ip);
hgs
parents: 0
diff changeset
   850
    conn->ip = ip;
0
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   851
  }
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   852
16
hgs
parents: 0
diff changeset
   853
  /* connect to the host/port */
hgs
parents: 0
diff changeset
   854
  res = do_connect (ip, port, &conn->fd0, conn->fdset, timeout);
hgs
parents: 0
diff changeset
   855
  if (res != GST_RTSP_OK)
hgs
parents: 0
diff changeset
   856
    goto connect_failed;
hgs
parents: 0
diff changeset
   857
hgs
parents: 0
diff changeset
   858
  /* this is our read URL */
hgs
parents: 0
diff changeset
   859
  conn->readfd = &conn->fd0;
hgs
parents: 0
diff changeset
   860
hgs
parents: 0
diff changeset
   861
  if (conn->tunneled) {
hgs
parents: 0
diff changeset
   862
    res = setup_tunneling (conn, timeout);
hgs
parents: 0
diff changeset
   863
    if (res != GST_RTSP_OK)
hgs
parents: 0
diff changeset
   864
      goto tunneling_failed;
hgs
parents: 0
diff changeset
   865
  } else {
hgs
parents: 0
diff changeset
   866
    conn->writefd = &conn->fd0;
hgs
parents: 0
diff changeset
   867
  }
0
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   868
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   869
  return GST_RTSP_OK;
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   870
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   871
not_resolved:
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   872
  {
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   873
    return GST_RTSP_ENET;
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   874
  }
16
hgs
parents: 0
diff changeset
   875
connect_failed:
0
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   876
  {
16
hgs
parents: 0
diff changeset
   877
    GST_ERROR ("failed to connect");
hgs
parents: 0
diff changeset
   878
    return res;
0
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   879
  }
16
hgs
parents: 0
diff changeset
   880
tunneling_failed:
0
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   881
  {
16
hgs
parents: 0
diff changeset
   882
    GST_ERROR ("failed to setup tunneling");
hgs
parents: 0
diff changeset
   883
    return res;
hgs
parents: 0
diff changeset
   884
  }
hgs
parents: 0
diff changeset
   885
}
hgs
parents: 0
diff changeset
   886
hgs
parents: 0
diff changeset
   887
static void
hgs
parents: 0
diff changeset
   888
md5_digest_to_hex_string (unsigned char digest[16], char string[33])
hgs
parents: 0
diff changeset
   889
{
hgs
parents: 0
diff changeset
   890
  static const char hexdigits[] = "0123456789abcdef";
hgs
parents: 0
diff changeset
   891
  int i;
hgs
parents: 0
diff changeset
   892
hgs
parents: 0
diff changeset
   893
  for (i = 0; i < 16; i++) {
hgs
parents: 0
diff changeset
   894
    string[i * 2] = hexdigits[(digest[i] >> 4) & 0x0f];
hgs
parents: 0
diff changeset
   895
    string[i * 2 + 1] = hexdigits[digest[i] & 0x0f];
0
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   896
  }
16
hgs
parents: 0
diff changeset
   897
  string[32] = 0;
hgs
parents: 0
diff changeset
   898
}
hgs
parents: 0
diff changeset
   899
hgs
parents: 0
diff changeset
   900
static void
hgs
parents: 0
diff changeset
   901
auth_digest_compute_hex_urp (const gchar * username,
hgs
parents: 0
diff changeset
   902
    const gchar * realm, const gchar * password, gchar hex_urp[33])
hgs
parents: 0
diff changeset
   903
{
hgs
parents: 0
diff changeset
   904
  struct MD5Context md5_context;
hgs
parents: 0
diff changeset
   905
  unsigned char digest[16];
hgs
parents: 0
diff changeset
   906
hgs
parents: 0
diff changeset
   907
  MD5Init (&md5_context);
hgs
parents: 0
diff changeset
   908
  MD5Update (&md5_context, username, strlen (username));
hgs
parents: 0
diff changeset
   909
  MD5Update (&md5_context, ":", 1);
hgs
parents: 0
diff changeset
   910
  MD5Update (&md5_context, realm, strlen (realm));
hgs
parents: 0
diff changeset
   911
  MD5Update (&md5_context, ":", 1);
hgs
parents: 0
diff changeset
   912
  MD5Update (&md5_context, password, strlen (password));
hgs
parents: 0
diff changeset
   913
  MD5Final (digest, &md5_context);
hgs
parents: 0
diff changeset
   914
  md5_digest_to_hex_string (digest, hex_urp);
hgs
parents: 0
diff changeset
   915
}
hgs
parents: 0
diff changeset
   916
hgs
parents: 0
diff changeset
   917
static void
hgs
parents: 0
diff changeset
   918
auth_digest_compute_response (const gchar * method,
hgs
parents: 0
diff changeset
   919
    const gchar * uri, const gchar * hex_a1, const gchar * nonce,
hgs
parents: 0
diff changeset
   920
    gchar response[33])
hgs
parents: 0
diff changeset
   921
{
hgs
parents: 0
diff changeset
   922
  char hex_a2[33];
hgs
parents: 0
diff changeset
   923
  struct MD5Context md5_context;
hgs
parents: 0
diff changeset
   924
  unsigned char digest[16];
hgs
parents: 0
diff changeset
   925
hgs
parents: 0
diff changeset
   926
  /* compute A2 */
hgs
parents: 0
diff changeset
   927
  MD5Init (&md5_context);
hgs
parents: 0
diff changeset
   928
  MD5Update (&md5_context, method, strlen (method));
hgs
parents: 0
diff changeset
   929
  MD5Update (&md5_context, ":", 1);
hgs
parents: 0
diff changeset
   930
  MD5Update (&md5_context, uri, strlen (uri));
hgs
parents: 0
diff changeset
   931
  MD5Final (digest, &md5_context);
hgs
parents: 0
diff changeset
   932
  md5_digest_to_hex_string (digest, hex_a2);
hgs
parents: 0
diff changeset
   933
hgs
parents: 0
diff changeset
   934
  /* compute KD */
hgs
parents: 0
diff changeset
   935
  MD5Init (&md5_context);
hgs
parents: 0
diff changeset
   936
  MD5Update (&md5_context, hex_a1, strlen (hex_a1));
hgs
parents: 0
diff changeset
   937
  MD5Update (&md5_context, ":", 1);
hgs
parents: 0
diff changeset
   938
  MD5Update (&md5_context, nonce, strlen (nonce));
hgs
parents: 0
diff changeset
   939
  MD5Update (&md5_context, ":", 1);
hgs
parents: 0
diff changeset
   940
hgs
parents: 0
diff changeset
   941
  MD5Update (&md5_context, hex_a2, 32);
hgs
parents: 0
diff changeset
   942
  MD5Final (digest, &md5_context);
hgs
parents: 0
diff changeset
   943
  md5_digest_to_hex_string (digest, response);
0
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   944
}
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   945
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   946
static void
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   947
add_auth_header (GstRTSPConnection * conn, GstRTSPMessage * message)
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   948
{
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   949
  switch (conn->auth_method) {
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   950
    case GST_RTSP_AUTH_BASIC:{
16
hgs
parents: 0
diff changeset
   951
      gchar *user_pass;
hgs
parents: 0
diff changeset
   952
      gchar *user_pass64;
hgs
parents: 0
diff changeset
   953
      gchar *auth_string;
hgs
parents: 0
diff changeset
   954
hgs
parents: 0
diff changeset
   955
      user_pass = g_strdup_printf ("%s:%s", conn->username, conn->passwd);
hgs
parents: 0
diff changeset
   956
      user_pass64 = g_base64_encode ((guchar *) user_pass, strlen (user_pass));
hgs
parents: 0
diff changeset
   957
      auth_string = g_strdup_printf ("Basic %s", user_pass64);
hgs
parents: 0
diff changeset
   958
hgs
parents: 0
diff changeset
   959
      gst_rtsp_message_take_header (message, GST_RTSP_HDR_AUTHORIZATION,
0
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   960
          auth_string);
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   961
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   962
      g_free (user_pass);
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   963
      g_free (user_pass64);
16
hgs
parents: 0
diff changeset
   964
      break;
hgs
parents: 0
diff changeset
   965
    }
hgs
parents: 0
diff changeset
   966
    case GST_RTSP_AUTH_DIGEST:{
hgs
parents: 0
diff changeset
   967
      gchar response[33], hex_urp[33];
hgs
parents: 0
diff changeset
   968
      gchar *auth_string, *auth_string2;
hgs
parents: 0
diff changeset
   969
      gchar *realm;
hgs
parents: 0
diff changeset
   970
      gchar *nonce;
hgs
parents: 0
diff changeset
   971
      gchar *opaque;
hgs
parents: 0
diff changeset
   972
      const gchar *uri;
hgs
parents: 0
diff changeset
   973
      const gchar *method;
hgs
parents: 0
diff changeset
   974
hgs
parents: 0
diff changeset
   975
      /* we need to have some params set */
hgs
parents: 0
diff changeset
   976
      if (conn->auth_params == NULL)
hgs
parents: 0
diff changeset
   977
        break;
hgs
parents: 0
diff changeset
   978
hgs
parents: 0
diff changeset
   979
      /* we need the realm and nonce */
hgs
parents: 0
diff changeset
   980
      realm = (gchar *) g_hash_table_lookup (conn->auth_params, "realm");
hgs
parents: 0
diff changeset
   981
      nonce = (gchar *) g_hash_table_lookup (conn->auth_params, "nonce");
hgs
parents: 0
diff changeset
   982
      if (realm == NULL || nonce == NULL)
hgs
parents: 0
diff changeset
   983
        break;
hgs
parents: 0
diff changeset
   984
hgs
parents: 0
diff changeset
   985
      auth_digest_compute_hex_urp (conn->username, realm, conn->passwd,
hgs
parents: 0
diff changeset
   986
          hex_urp);
hgs
parents: 0
diff changeset
   987
hgs
parents: 0
diff changeset
   988
      method = gst_rtsp_method_as_text (message->type_data.request.method);
hgs
parents: 0
diff changeset
   989
      uri = message->type_data.request.uri;
hgs
parents: 0
diff changeset
   990
hgs
parents: 0
diff changeset
   991
      /* Assume no qop, algorithm=md5, stale=false */
hgs
parents: 0
diff changeset
   992
      /* For algorithm MD5, a1 = urp. */
hgs
parents: 0
diff changeset
   993
      auth_digest_compute_response (method, uri, hex_urp, nonce, response);
hgs
parents: 0
diff changeset
   994
      auth_string = g_strdup_printf ("Digest username=\"%s\", "
hgs
parents: 0
diff changeset
   995
          "realm=\"%s\", nonce=\"%s\", uri=\"%s\", response=\"%s\"",
hgs
parents: 0
diff changeset
   996
          conn->username, realm, nonce, uri, response);
hgs
parents: 0
diff changeset
   997
hgs
parents: 0
diff changeset
   998
      opaque = (gchar *) g_hash_table_lookup (conn->auth_params, "opaque");
hgs
parents: 0
diff changeset
   999
      if (opaque) {
hgs
parents: 0
diff changeset
  1000
        auth_string2 = g_strdup_printf ("%s, opaque=\"%s\"", auth_string,
hgs
parents: 0
diff changeset
  1001
            opaque);
hgs
parents: 0
diff changeset
  1002
        g_free (auth_string);
hgs
parents: 0
diff changeset
  1003
        auth_string = auth_string2;
hgs
parents: 0
diff changeset
  1004
      }
hgs
parents: 0
diff changeset
  1005
      gst_rtsp_message_take_header (message, GST_RTSP_HDR_AUTHORIZATION,
hgs
parents: 0
diff changeset
  1006
          auth_string);
0
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1007
      break;
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1008
    }
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1009
    default:
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1010
      /* Nothing to do */
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1011
      break;
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1012
  }
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1013
}
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1014
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1015
static void
16
hgs
parents: 0
diff changeset
  1016
gen_date_string (gchar * date_string, guint len)
0
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1017
{
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1018
  GTimeVal tv;
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1019
  time_t t;
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1020
#ifdef HAVE_GMTIME_R
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1021
  struct tm tm_;
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1022
#endif
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1023
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1024
  g_get_current_time (&tv);
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1025
  t = (time_t) tv.tv_sec;
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1026
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1027
#ifdef HAVE_GMTIME_R
16
hgs
parents: 0
diff changeset
  1028
  strftime (date_string, len, "%a, %d %b %Y %H:%M:%S GMT", gmtime_r (&t, &tm_));
0
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1029
#else
16
hgs
parents: 0
diff changeset
  1030
  strftime (date_string, len, "%a, %d %b %Y %H:%M:%S GMT", gmtime (&t));
0
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1031
#endif
16
hgs
parents: 0
diff changeset
  1032
}
hgs
parents: 0
diff changeset
  1033
hgs
parents: 0
diff changeset
  1034
static GstRTSPResult
hgs
parents: 0
diff changeset
  1035
write_bytes (gint fd, const guint8 * buffer, guint * idx, guint size)
hgs
parents: 0
diff changeset
  1036
{
hgs
parents: 0
diff changeset
  1037
  guint left;
hgs
parents: 0
diff changeset
  1038
hgs
parents: 0
diff changeset
  1039
  if (G_UNLIKELY (*idx > size))
hgs
parents: 0
diff changeset
  1040
    return GST_RTSP_ERROR;
hgs
parents: 0
diff changeset
  1041
hgs
parents: 0
diff changeset
  1042
  left = size - *idx;
hgs
parents: 0
diff changeset
  1043
hgs
parents: 0
diff changeset
  1044
  while (left) {
hgs
parents: 0
diff changeset
  1045
    gint r;
hgs
parents: 0
diff changeset
  1046
hgs
parents: 0
diff changeset
  1047
    r = WRITE_SOCKET (fd, &buffer[*idx], left);
hgs
parents: 0
diff changeset
  1048
    if (G_UNLIKELY (r == 0)) {
hgs
parents: 0
diff changeset
  1049
      return GST_RTSP_EINTR;
hgs
parents: 0
diff changeset
  1050
    } else if (G_UNLIKELY (r < 0)) {
hgs
parents: 0
diff changeset
  1051
      if (ERRNO_IS_EAGAIN)
hgs
parents: 0
diff changeset
  1052
        return GST_RTSP_EINTR;
hgs
parents: 0
diff changeset
  1053
      if (!ERRNO_IS_EINTR)
hgs
parents: 0
diff changeset
  1054
        return GST_RTSP_ESYS;
hgs
parents: 0
diff changeset
  1055
    } else {
hgs
parents: 0
diff changeset
  1056
      left -= r;
hgs
parents: 0
diff changeset
  1057
      *idx += r;
hgs
parents: 0
diff changeset
  1058
    }
hgs
parents: 0
diff changeset
  1059
  }
hgs
parents: 0
diff changeset
  1060
  return GST_RTSP_OK;
hgs
parents: 0
diff changeset
  1061
}
hgs
parents: 0
diff changeset
  1062
hgs
parents: 0
diff changeset
  1063
static gint
hgs
parents: 0
diff changeset
  1064
fill_bytes (gint fd, guint8 * buffer, guint size, DecodeCtx * ctx)
hgs
parents: 0
diff changeset
  1065
{
hgs
parents: 0
diff changeset
  1066
  gint out = 0;
hgs
parents: 0
diff changeset
  1067
hgs
parents: 0
diff changeset
  1068
  if (ctx) {
hgs
parents: 0
diff changeset
  1069
    while (size > 0) {
hgs
parents: 0
diff changeset
  1070
      guint8 in[sizeof (ctx->out) * 4 / 3];
hgs
parents: 0
diff changeset
  1071
      gint r;
hgs
parents: 0
diff changeset
  1072
hgs
parents: 0
diff changeset
  1073
      while (size > 0 && ctx->cout < ctx->coutl) {
hgs
parents: 0
diff changeset
  1074
        /* we have some leftover bytes */
hgs
parents: 0
diff changeset
  1075
        *buffer++ = ctx->out[ctx->cout++];
hgs
parents: 0
diff changeset
  1076
        size--;
hgs
parents: 0
diff changeset
  1077
        out++;
hgs
parents: 0
diff changeset
  1078
      }
hgs
parents: 0
diff changeset
  1079
hgs
parents: 0
diff changeset
  1080
      /* got what we needed? */
hgs
parents: 0
diff changeset
  1081
      if (size == 0)
hgs
parents: 0
diff changeset
  1082
        break;
hgs
parents: 0
diff changeset
  1083
hgs
parents: 0
diff changeset
  1084
      /* try to read more bytes */
hgs
parents: 0
diff changeset
  1085
      r = READ_SOCKET (fd, in, sizeof (in));
hgs
parents: 0
diff changeset
  1086
      if (r <= 0) {
hgs
parents: 0
diff changeset
  1087
        if (out == 0)
hgs
parents: 0
diff changeset
  1088
          out = r;
hgs
parents: 0
diff changeset
  1089
        break;
hgs
parents: 0
diff changeset
  1090
      }
hgs
parents: 0
diff changeset
  1091
hgs
parents: 0
diff changeset
  1092
      ctx->cout = 0;
hgs
parents: 0
diff changeset
  1093
      ctx->coutl =
hgs
parents: 0
diff changeset
  1094
          g_base64_decode_step ((gchar *) in, r, ctx->out, &ctx->state,
hgs
parents: 0
diff changeset
  1095
          &ctx->save);
hgs
parents: 0
diff changeset
  1096
    }
hgs
parents: 0
diff changeset
  1097
  } else {
hgs
parents: 0
diff changeset
  1098
    out = READ_SOCKET (fd, buffer, size);
hgs
parents: 0
diff changeset
  1099
  }
hgs
parents: 0
diff changeset
  1100
hgs
parents: 0
diff changeset
  1101
  return out;
hgs
parents: 0
diff changeset
  1102
}
hgs
parents: 0
diff changeset
  1103
hgs
parents: 0
diff changeset
  1104
static GstRTSPResult
hgs
parents: 0
diff changeset
  1105
read_bytes (gint fd, guint8 * buffer, guint * idx, guint size, DecodeCtx * ctx)
hgs
parents: 0
diff changeset
  1106
{
hgs
parents: 0
diff changeset
  1107
  guint left;
hgs
parents: 0
diff changeset
  1108
hgs
parents: 0
diff changeset
  1109
  if (G_UNLIKELY (*idx > size))
hgs
parents: 0
diff changeset
  1110
    return GST_RTSP_ERROR;
hgs
parents: 0
diff changeset
  1111
hgs
parents: 0
diff changeset
  1112
  left = size - *idx;
hgs
parents: 0
diff changeset
  1113
hgs
parents: 0
diff changeset
  1114
  while (left) {
hgs
parents: 0
diff changeset
  1115
    gint r;
hgs
parents: 0
diff changeset
  1116
hgs
parents: 0
diff changeset
  1117
    r = fill_bytes (fd, &buffer[*idx], left, ctx);
hgs
parents: 0
diff changeset
  1118
    if (G_UNLIKELY (r == 0)) {
hgs
parents: 0
diff changeset
  1119
      return GST_RTSP_EEOF;
hgs
parents: 0
diff changeset
  1120
    } else if (G_UNLIKELY (r < 0)) {
hgs
parents: 0
diff changeset
  1121
      if (ERRNO_IS_EAGAIN)
hgs
parents: 0
diff changeset
  1122
        return GST_RTSP_EINTR;
hgs
parents: 0
diff changeset
  1123
      if (!ERRNO_IS_EINTR)
hgs
parents: 0
diff changeset
  1124
        return GST_RTSP_ESYS;
hgs
parents: 0
diff changeset
  1125
    } else {
hgs
parents: 0
diff changeset
  1126
      left -= r;
hgs
parents: 0
diff changeset
  1127
      *idx += r;
hgs
parents: 0
diff changeset
  1128
    }
hgs
parents: 0
diff changeset
  1129
  }
hgs
parents: 0
diff changeset
  1130
  return GST_RTSP_OK;
hgs
parents: 0
diff changeset
  1131
}
hgs
parents: 0
diff changeset
  1132
hgs
parents: 0
diff changeset
  1133
static GstRTSPResult
hgs
parents: 0
diff changeset
  1134
read_line (gint fd, guint8 * buffer, guint * idx, guint size, DecodeCtx * ctx)
hgs
parents: 0
diff changeset
  1135
{
hgs
parents: 0
diff changeset
  1136
  while (TRUE) {
hgs
parents: 0
diff changeset
  1137
    guint8 c;
hgs
parents: 0
diff changeset
  1138
    gint r;
hgs
parents: 0
diff changeset
  1139
hgs
parents: 0
diff changeset
  1140
    r = fill_bytes (fd, &c, 1, ctx);
hgs
parents: 0
diff changeset
  1141
    if (G_UNLIKELY (r == 0)) {
hgs
parents: 0
diff changeset
  1142
      return GST_RTSP_EEOF;
hgs
parents: 0
diff changeset
  1143
    } else if (G_UNLIKELY (r < 0)) {
hgs
parents: 0
diff changeset
  1144
      if (ERRNO_IS_EAGAIN)
hgs
parents: 0
diff changeset
  1145
        return GST_RTSP_EINTR;
hgs
parents: 0
diff changeset
  1146
      if (!ERRNO_IS_EINTR)
hgs
parents: 0
diff changeset
  1147
        return GST_RTSP_ESYS;
hgs
parents: 0
diff changeset
  1148
    } else {
hgs
parents: 0
diff changeset
  1149
      if (c == '\n')            /* end on \n */
hgs
parents: 0
diff changeset
  1150
        break;
hgs
parents: 0
diff changeset
  1151
      if (c == '\r')            /* ignore \r */
hgs
parents: 0
diff changeset
  1152
        continue;
hgs
parents: 0
diff changeset
  1153
hgs
parents: 0
diff changeset
  1154
      if (G_LIKELY (*idx < size - 1))
hgs
parents: 0
diff changeset
  1155
        buffer[(*idx)++] = c;
hgs
parents: 0
diff changeset
  1156
    }
hgs
parents: 0
diff changeset
  1157
  }
hgs
parents: 0
diff changeset
  1158
  buffer[*idx] = '\0';
hgs
parents: 0
diff changeset
  1159
hgs
parents: 0
diff changeset
  1160
  return GST_RTSP_OK;
0
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1161
}
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1162
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1163
/**
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1164
 * gst_rtsp_connection_write:
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1165
 * @conn: a #GstRTSPConnection
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1166
 * @data: the data to write
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1167
 * @size: the size of @data
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1168
 * @timeout: a timeout value or #NULL
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1169
 *
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1170
 * Attempt to write @size bytes of @data to the connected @conn, blocking up to
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1171
 * the specified @timeout. @timeout can be #NULL, in which case this function
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1172
 * might block forever.
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1173
 * 
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1174
 * This function can be cancelled with gst_rtsp_connection_flush().
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1175
 *
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1176
 * Returns: #GST_RTSP_OK on success.
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1177
 */
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1178
GstRTSPResult
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1179
gst_rtsp_connection_write (GstRTSPConnection * conn, const guint8 * data,
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1180
    guint size, GTimeVal * timeout)
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1181
{
16
hgs
parents: 0
diff changeset
  1182
  guint offset;
0
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1183
  gint retval;
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1184
  GstClockTime to;
16
hgs
parents: 0
diff changeset
  1185
  GstRTSPResult res;
0
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1186
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1187
  g_return_val_if_fail (conn != NULL, GST_RTSP_EINVAL);
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1188
  g_return_val_if_fail (data != NULL || size == 0, GST_RTSP_EINVAL);
16
hgs
parents: 0
diff changeset
  1189
  g_return_val_if_fail (conn->writefd != NULL, GST_RTSP_EINVAL);
0
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1190
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1191
  gst_poll_set_controllable (conn->fdset, TRUE);
16
hgs
parents: 0
diff changeset
  1192
  gst_poll_fd_ctl_write (conn->fdset, conn->writefd, TRUE);
hgs
parents: 0
diff changeset
  1193
  gst_poll_fd_ctl_read (conn->fdset, conn->readfd, FALSE);
hgs
parents: 0
diff changeset
  1194
  /* clear all previous poll results */
hgs
parents: 0
diff changeset
  1195
  gst_poll_fd_ignored (conn->fdset, conn->writefd);
hgs
parents: 0
diff changeset
  1196
  gst_poll_fd_ignored (conn->fdset, conn->readfd);
0
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1197
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1198
  to = timeout ? GST_TIMEVAL_TO_TIME (*timeout) : GST_CLOCK_TIME_NONE;
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1199
16
hgs
parents: 0
diff changeset
  1200
  offset = 0;
hgs
parents: 0
diff changeset
  1201
hgs
parents: 0
diff changeset
  1202
  while (TRUE) {
hgs
parents: 0
diff changeset
  1203
    /* try to write */
hgs
parents: 0
diff changeset
  1204
    res = write_bytes (conn->writefd->fd, data, &offset, size);
hgs
parents: 0
diff changeset
  1205
    if (G_LIKELY (res == GST_RTSP_OK))
hgs
parents: 0
diff changeset
  1206
      break;
hgs
parents: 0
diff changeset
  1207
    if (G_UNLIKELY (res != GST_RTSP_EINTR))
hgs
parents: 0
diff changeset
  1208
      goto write_error;
hgs
parents: 0
diff changeset
  1209
hgs
parents: 0
diff changeset
  1210
    /* not all is written, wait until we can write more */
0
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1211
    do {
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1212
      retval = gst_poll_wait (conn->fdset, to);
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1213
    } while (retval == -1 && (errno == EINTR || errno == EAGAIN));
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1214
16
hgs
parents: 0
diff changeset
  1215
    if (G_UNLIKELY (retval == 0))
0
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1216
      goto timeout;
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1217
16
hgs
parents: 0
diff changeset
  1218
    if (G_UNLIKELY (retval == -1)) {
0
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1219
      if (errno == EBUSY)
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1220
        goto stopped;
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1221
      else
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1222
        goto select_error;
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1223
    }
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1224
  }
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1225
  return GST_RTSP_OK;
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1226
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1227
  /* ERRORS */
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1228
timeout:
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1229
  {
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1230
    return GST_RTSP_ETIMEOUT;
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1231
  }
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1232
select_error:
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1233
  {
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1234
    return GST_RTSP_ESYS;
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1235
  }
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1236
stopped:
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1237
  {
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1238
    return GST_RTSP_EINTR;
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1239
  }
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1240
write_error:
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1241
  {
16
hgs
parents: 0
diff changeset
  1242
    return res;
0
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1243
  }
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1244
}
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1245
16
hgs
parents: 0
diff changeset
  1246
static GString *
hgs
parents: 0
diff changeset
  1247
message_to_string (GstRTSPConnection * conn, GstRTSPMessage * message)
0
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1248
{
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1249
  GString *str = NULL;
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1250
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1251
  str = g_string_new ("");
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1252
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1253
  switch (message->type) {
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1254
    case GST_RTSP_MESSAGE_REQUEST:
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1255
      /* create request string, add CSeq */
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1256
      g_string_append_printf (str, "%s %s RTSP/1.0\r\n"
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1257
          "CSeq: %d\r\n",
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1258
          gst_rtsp_method_as_text (message->type_data.request.method),
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1259
          message->type_data.request.uri, conn->cseq++);
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1260
      /* add session id if we have one */
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1261
      if (conn->session_id[0] != '\0') {
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1262
        gst_rtsp_message_add_header (message, GST_RTSP_HDR_SESSION,
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1263
            conn->session_id);
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1264
      }
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1265
      /* add any authentication headers */
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1266
      add_auth_header (conn, message);
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1267
      break;
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1268
    case GST_RTSP_MESSAGE_RESPONSE:
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1269
      /* create response string */
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1270
      g_string_append_printf (str, "RTSP/1.0 %d %s\r\n",
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1271
          message->type_data.response.code, message->type_data.response.reason);
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1272
      break;
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1273
    case GST_RTSP_MESSAGE_DATA:
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1274
    {
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1275
      guint8 data_header[4];
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1276
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1277
      /* prepare data header */
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1278
      data_header[0] = '$';
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1279
      data_header[1] = message->type_data.data.channel;
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1280
      data_header[2] = (message->body_size >> 8) & 0xff;
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1281
      data_header[3] = message->body_size & 0xff;
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1282
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1283
      /* create string with header and data */
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1284
      str = g_string_append_len (str, (gchar *) data_header, 4);
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1285
      str =
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1286
          g_string_append_len (str, (gchar *) message->body,
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1287
          message->body_size);
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1288
      break;
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1289
    }
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1290
    default:
16
hgs
parents: 0
diff changeset
  1291
      g_string_free (str, TRUE);
hgs
parents: 0
diff changeset
  1292
      g_return_val_if_reached (NULL);
0
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1293
      break;
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1294
  }
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1295
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1296
  /* append headers and body */
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1297
  if (message->type != GST_RTSP_MESSAGE_DATA) {
16
hgs
parents: 0
diff changeset
  1298
    gchar date_string[100];
hgs
parents: 0
diff changeset
  1299
hgs
parents: 0
diff changeset
  1300
    gen_date_string (date_string, sizeof (date_string));
hgs
parents: 0
diff changeset
  1301
0
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1302
    /* add date header */
16
hgs
parents: 0
diff changeset
  1303
    gst_rtsp_message_add_header (message, GST_RTSP_HDR_DATE, date_string);
0
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1304
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1305
    /* append headers */
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1306
    gst_rtsp_message_append_headers (message, str);
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1307
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1308
    /* append Content-Length and body if needed */
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1309
    if (message->body != NULL && message->body_size > 0) {
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1310
      gchar *len;
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1311
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1312
      len = g_strdup_printf ("%d", message->body_size);
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1313
      g_string_append_printf (str, "%s: %s\r\n",
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1314
          gst_rtsp_header_as_text (GST_RTSP_HDR_CONTENT_LENGTH), len);
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1315
      g_free (len);
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1316
      /* header ends here */
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1317
      g_string_append (str, "\r\n");
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1318
      str =
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1319
          g_string_append_len (str, (gchar *) message->body,
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1320
          message->body_size);
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1321
    } else {
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1322
      /* just end headers */
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1323
      g_string_append (str, "\r\n");
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1324
    }
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1325
  }
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1326
16
hgs
parents: 0
diff changeset
  1327
  return str;
hgs
parents: 0
diff changeset
  1328
}
hgs
parents: 0
diff changeset
  1329
hgs
parents: 0
diff changeset
  1330
/**
hgs
parents: 0
diff changeset
  1331
 * gst_rtsp_connection_send:
hgs
parents: 0
diff changeset
  1332
 * @conn: a #GstRTSPConnection
hgs
parents: 0
diff changeset
  1333
 * @message: the message to send
hgs
parents: 0
diff changeset
  1334
 * @timeout: a timeout value or #NULL
hgs
parents: 0
diff changeset
  1335
 *
hgs
parents: 0
diff changeset
  1336
 * Attempt to send @message to the connected @conn, blocking up to
hgs
parents: 0
diff changeset
  1337
 * the specified @timeout. @timeout can be #NULL, in which case this function
hgs
parents: 0
diff changeset
  1338
 * might block forever.
hgs
parents: 0
diff changeset
  1339
 * 
hgs
parents: 0
diff changeset
  1340
 * This function can be cancelled with gst_rtsp_connection_flush().
hgs
parents: 0
diff changeset
  1341
 *
hgs
parents: 0
diff changeset
  1342
 * Returns: #GST_RTSP_OK on success.
hgs
parents: 0
diff changeset
  1343
 */
hgs
parents: 0
diff changeset
  1344
GstRTSPResult
hgs
parents: 0
diff changeset
  1345
gst_rtsp_connection_send (GstRTSPConnection * conn, GstRTSPMessage * message,
hgs
parents: 0
diff changeset
  1346
    GTimeVal * timeout)
hgs
parents: 0
diff changeset
  1347
{
hgs
parents: 0
diff changeset
  1348
  GString *string = NULL;
hgs
parents: 0
diff changeset
  1349
  GstRTSPResult res;
hgs
parents: 0
diff changeset
  1350
  gchar *str;
hgs
parents: 0
diff changeset
  1351
  gsize len;
hgs
parents: 0
diff changeset
  1352
hgs
parents: 0
diff changeset
  1353
  g_return_val_if_fail (conn != NULL, GST_RTSP_EINVAL);
hgs
parents: 0
diff changeset
  1354
  g_return_val_if_fail (message != NULL, GST_RTSP_EINVAL);
hgs
parents: 0
diff changeset
  1355
hgs
parents: 0
diff changeset
  1356
  if (G_UNLIKELY (!(string = message_to_string (conn, message))))
hgs
parents: 0
diff changeset
  1357
    goto no_message;
hgs
parents: 0
diff changeset
  1358
hgs
parents: 0
diff changeset
  1359
  if (conn->tunneled) {
hgs
parents: 0
diff changeset
  1360
    str = g_base64_encode ((const guchar *) string->str, string->len);
hgs
parents: 0
diff changeset
  1361
    g_string_free (string, TRUE);
hgs
parents: 0
diff changeset
  1362
    len = strlen (str);
hgs
parents: 0
diff changeset
  1363
  } else {
hgs
parents: 0
diff changeset
  1364
    str = string->str;
hgs
parents: 0
diff changeset
  1365
    len = string->len;
hgs
parents: 0
diff changeset
  1366
    g_string_free (string, FALSE);
hgs
parents: 0
diff changeset
  1367
  }
hgs
parents: 0
diff changeset
  1368
0
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1369
  /* write request */
16
hgs
parents: 0
diff changeset
  1370
  res = gst_rtsp_connection_write (conn, (guint8 *) str, len, timeout);
hgs
parents: 0
diff changeset
  1371
hgs
parents: 0
diff changeset
  1372
  g_free (str);
0
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1373
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1374
  return res;
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1375
16
hgs
parents: 0
diff changeset
  1376
no_message:
0
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1377
  {
16
hgs
parents: 0
diff changeset
  1378
    g_warning ("Wrong message");
hgs
parents: 0
diff changeset
  1379
    return GST_RTSP_EINVAL;
0
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1380
  }
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1381
}
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1382
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1383
static void
16
hgs
parents: 0
diff changeset
  1384
parse_string (gchar * dest, gint size, gchar ** src)
0
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1385
{
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1386
  gint idx;
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1387
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1388
  idx = 0;
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1389
  /* skip spaces */
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1390
  while (g_ascii_isspace (**src))
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1391
    (*src)++;
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1392
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1393
  while (!g_ascii_isspace (**src) && **src != '\0') {
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1394
    if (idx < size - 1)
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1395
      dest[idx++] = **src;
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1396
    (*src)++;
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1397
  }
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1398
  if (size > 0)
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1399
    dest[idx] = '\0';
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1400
}
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1401
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1402
static void
16
hgs
parents: 0
diff changeset
  1403
parse_key (gchar * dest, gint size, gchar ** src)
0
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1404
{
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1405
  gint idx;
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1406
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1407
  idx = 0;
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1408
  while (**src != ':' && **src != '\0') {
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1409
    if (idx < size - 1)
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1410
      dest[idx++] = **src;
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1411
    (*src)++;
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1412
  }
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1413
  if (size > 0)
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1414
    dest[idx] = '\0';
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1415
}
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1416
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1417
static GstRTSPResult
16
hgs
parents: 0
diff changeset
  1418
parse_response_status (guint8 * buffer, GstRTSPMessage * msg)
0
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1419
{
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1420
  GstRTSPResult res;
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1421
  gchar versionstr[20];
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1422
  gchar codestr[4];
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1423
  gint code;
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1424
  gchar *bptr;
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1425
16
hgs
parents: 0
diff changeset
  1426
  bptr = (gchar *) buffer;
hgs
parents: 0
diff changeset
  1427
hgs
parents: 0
diff changeset
  1428
  parse_string (versionstr, sizeof (versionstr), &bptr);
hgs
parents: 0
diff changeset
  1429
  parse_string (codestr, sizeof (codestr), &bptr);
0
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1430
  code = atoi (codestr);
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1431
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1432
  while (g_ascii_isspace (*bptr))
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1433
    bptr++;
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1434
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1435
  if (strcmp (versionstr, "RTSP/1.0") == 0)
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1436
    GST_RTSP_CHECK (gst_rtsp_message_init_response (msg, code, bptr, NULL),
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1437
        parse_error);
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1438
  else if (strncmp (versionstr, "RTSP/", 5) == 0) {
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1439
    GST_RTSP_CHECK (gst_rtsp_message_init_response (msg, code, bptr, NULL),
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1440
        parse_error);
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1441
    msg->type_data.response.version = GST_RTSP_VERSION_INVALID;
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1442
  } else
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1443
    goto parse_error;
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1444
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1445
  return GST_RTSP_OK;
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1446
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1447
parse_error:
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1448
  {
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1449
    return GST_RTSP_EPARSE;
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1450
  }
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1451
}
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1452
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1453
static GstRTSPResult
16
hgs
parents: 0
diff changeset
  1454
parse_request_line (GstRTSPConnection * conn, guint8 * buffer,
hgs
parents: 0
diff changeset
  1455
    GstRTSPMessage * msg)
0
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1456
{
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1457
  GstRTSPResult res = GST_RTSP_OK;
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1458
  gchar versionstr[20];
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1459
  gchar methodstr[20];
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1460
  gchar urlstr[4096];
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1461
  gchar *bptr;
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1462
  GstRTSPMethod method;
16
hgs
parents: 0
diff changeset
  1463
  GstRTSPTunnelState tstate = TUNNEL_STATE_NONE;
hgs
parents: 0
diff changeset
  1464
hgs
parents: 0
diff changeset
  1465
  bptr = (gchar *) buffer;
hgs
parents: 0
diff changeset
  1466
hgs
parents: 0
diff changeset
  1467
  parse_string (methodstr, sizeof (methodstr), &bptr);
0
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1468
  method = gst_rtsp_find_method (methodstr);
16
hgs
parents: 0
diff changeset
  1469
  if (method == GST_RTSP_INVALID) {
hgs
parents: 0
diff changeset
  1470
    /* a tunnel request is allowed when we don't have one yet */
hgs
parents: 0
diff changeset
  1471
    if (conn->tstate != TUNNEL_STATE_NONE)
hgs
parents: 0
diff changeset
  1472
      goto invalid_method;
hgs
parents: 0
diff changeset
  1473
    /* we need GET or POST for a valid tunnel request */
hgs
parents: 0
diff changeset
  1474
    if (!strcmp (methodstr, "GET"))
hgs
parents: 0
diff changeset
  1475
      tstate = TUNNEL_STATE_GET;
hgs
parents: 0
diff changeset
  1476
    else if (!strcmp (methodstr, "POST"))
hgs
parents: 0
diff changeset
  1477
      tstate = TUNNEL_STATE_POST;
hgs
parents: 0
diff changeset
  1478
    else
hgs
parents: 0
diff changeset
  1479
      goto invalid_method;
hgs
parents: 0
diff changeset
  1480
  }
hgs
parents: 0
diff changeset
  1481
hgs
parents: 0
diff changeset
  1482
  parse_string (urlstr, sizeof (urlstr), &bptr);
hgs
parents: 0
diff changeset
  1483
  if (G_UNLIKELY (*urlstr == '\0'))
hgs
parents: 0
diff changeset
  1484
    goto invalid_url;
hgs
parents: 0
diff changeset
  1485
hgs
parents: 0
diff changeset
  1486
  parse_string (versionstr, sizeof (versionstr), &bptr);
hgs
parents: 0
diff changeset
  1487
hgs
parents: 0
diff changeset
  1488
  if (G_UNLIKELY (*bptr != '\0'))
hgs
parents: 0
diff changeset
  1489
    goto invalid_version;
0
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1490
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1491
  if (strcmp (versionstr, "RTSP/1.0") == 0) {
16
hgs
parents: 0
diff changeset
  1492
    res = gst_rtsp_message_init_request (msg, method, urlstr);
0
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1493
  } else if (strncmp (versionstr, "RTSP/", 5) == 0) {
16
hgs
parents: 0
diff changeset
  1494
    res = gst_rtsp_message_init_request (msg, method, urlstr);
hgs
parents: 0
diff changeset
  1495
    msg->type_data.request.version = GST_RTSP_VERSION_INVALID;
hgs
parents: 0
diff changeset
  1496
  } else if (strcmp (versionstr, "HTTP/1.0") == 0) {
hgs
parents: 0
diff changeset
  1497
    /* tunnel request, we need a tunnel method */
hgs
parents: 0
diff changeset
  1498
    if (tstate == TUNNEL_STATE_NONE) {
0
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1499
      res = GST_RTSP_EPARSE;
16
hgs
parents: 0
diff changeset
  1500
    } else {
hgs
parents: 0
diff changeset
  1501
      conn->tstate = tstate;
hgs
parents: 0
diff changeset
  1502
    }
0
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1503
  } else {
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1504
    res = GST_RTSP_EPARSE;
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1505
  }
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1506
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1507
  return res;
16
hgs
parents: 0
diff changeset
  1508
hgs
parents: 0
diff changeset
  1509
  /* ERRORS */
hgs
parents: 0
diff changeset
  1510
invalid_method:
hgs
parents: 0
diff changeset
  1511
  {
hgs
parents: 0
diff changeset
  1512
    GST_ERROR ("invalid method %s", methodstr);
hgs
parents: 0
diff changeset
  1513
    return GST_RTSP_EPARSE;
hgs
parents: 0
diff changeset
  1514
  }
hgs
parents: 0
diff changeset
  1515
invalid_url:
hgs
parents: 0
diff changeset
  1516
  {
hgs
parents: 0
diff changeset
  1517
    GST_ERROR ("invalid url %s", urlstr);
hgs
parents: 0
diff changeset
  1518
    return GST_RTSP_EPARSE;
hgs
parents: 0
diff changeset
  1519
  }
hgs
parents: 0
diff changeset
  1520
invalid_version:
hgs
parents: 0
diff changeset
  1521
  {
hgs
parents: 0
diff changeset
  1522
    GST_ERROR ("invalid version");
hgs
parents: 0
diff changeset
  1523
    return GST_RTSP_EPARSE;
hgs
parents: 0
diff changeset
  1524
  }
0
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1525
}
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1526
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1527
static GstRTSPResult
16
hgs
parents: 0
diff changeset
  1528
parse_key_value (guint8 * buffer, gchar * key, guint keysize, gchar ** value)
0
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1529
{
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1530
  gchar *bptr;
16
hgs
parents: 0
diff changeset
  1531
hgs
parents: 0
diff changeset
  1532
  bptr = (gchar *) buffer;
0
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1533
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1534
  /* read key */
16
hgs
parents: 0
diff changeset
  1535
  parse_key (key, keysize, &bptr);
hgs
parents: 0
diff changeset
  1536
  if (G_UNLIKELY (*bptr != ':'))
0
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1537
    goto no_column;
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1538
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1539
  bptr++;
16
hgs
parents: 0
diff changeset
  1540
  while (g_ascii_isspace (*bptr))
hgs
parents: 0
diff changeset
  1541
    bptr++;
hgs
parents: 0
diff changeset
  1542
hgs
parents: 0
diff changeset
  1543
  *value = bptr;
0
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1544
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1545
  return GST_RTSP_OK;
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1546
16
hgs
parents: 0
diff changeset
  1547
  /* ERRORS */
0
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1548
no_column:
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1549
  {
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1550
    return GST_RTSP_EPARSE;
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1551
  }
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1552
}
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1553
16
hgs
parents: 0
diff changeset
  1554
/* parsing lines means reading a Key: Value pair */
hgs
parents: 0
diff changeset
  1555
static GstRTSPResult
hgs
parents: 0
diff changeset
  1556
parse_line (GstRTSPConnection * conn, guint8 * buffer, GstRTSPMessage * msg)
hgs
parents: 0
diff changeset
  1557
{
hgs
parents: 0
diff changeset
  1558
  GstRTSPResult res;
hgs
parents: 0
diff changeset
  1559
  gchar key[32];
hgs
parents: 0
diff changeset
  1560
  gchar *value;
hgs
parents: 0
diff changeset
  1561
  GstRTSPHeaderField field;
hgs
parents: 0
diff changeset
  1562
hgs
parents: 0
diff changeset
  1563
  res = parse_key_value (buffer, key, sizeof (key), &value);
hgs
parents: 0
diff changeset
  1564
  if (G_UNLIKELY (res != GST_RTSP_OK))
hgs
parents: 0
diff changeset
  1565
    goto parse_error;
hgs
parents: 0
diff changeset
  1566
hgs
parents: 0
diff changeset
  1567
  if (conn->tstate == TUNNEL_STATE_GET || conn->tstate == TUNNEL_STATE_POST) {
hgs
parents: 0
diff changeset
  1568
    /* save the tunnel session in the connection */
hgs
parents: 0
diff changeset
  1569
    if (!strcmp (key, "x-sessioncookie")) {
hgs
parents: 0
diff changeset
  1570
      strncpy (conn->tunnelid, value, TUNNELID_LEN);
hgs
parents: 0
diff changeset
  1571
      conn->tunnelid[TUNNELID_LEN - 1] = '\0';
hgs
parents: 0
diff changeset
  1572
      conn->tunneled = TRUE;
hgs
parents: 0
diff changeset
  1573
    }
hgs
parents: 0
diff changeset
  1574
  } else {
hgs
parents: 0
diff changeset
  1575
    field = gst_rtsp_find_header_field (key);
hgs
parents: 0
diff changeset
  1576
    if (field != GST_RTSP_HDR_INVALID)
hgs
parents: 0
diff changeset
  1577
      gst_rtsp_message_add_header (msg, field, value);
hgs
parents: 0
diff changeset
  1578
  }
hgs
parents: 0
diff changeset
  1579
hgs
parents: 0
diff changeset
  1580
  return GST_RTSP_OK;
hgs
parents: 0
diff changeset
  1581
hgs
parents: 0
diff changeset
  1582
  /* ERRORS */
hgs
parents: 0
diff changeset
  1583
parse_error:
hgs
parents: 0
diff changeset
  1584
  {
hgs
parents: 0
diff changeset
  1585
    return res;
hgs
parents: 0
diff changeset
  1586
  }
hgs
parents: 0
diff changeset
  1587
}
hgs
parents: 0
diff changeset
  1588
hgs
parents: 0
diff changeset
  1589
/* returns:
hgs
parents: 0
diff changeset
  1590
 *  GST_RTSP_OK when a complete message was read.
hgs
parents: 0
diff changeset
  1591
 *  GST_RTSP_EEOF: when the socket is closed
hgs
parents: 0
diff changeset
  1592
 *  GST_RTSP_EINTR: when more data is needed.
hgs
parents: 0
diff changeset
  1593
 *  GST_RTSP_..: some other error occured.
hgs
parents: 0
diff changeset
  1594
 */
hgs
parents: 0
diff changeset
  1595
static GstRTSPResult
hgs
parents: 0
diff changeset
  1596
build_next (GstRTSPBuilder * builder, GstRTSPMessage * message,
hgs
parents: 0
diff changeset
  1597
    GstRTSPConnection * conn)
hgs
parents: 0
diff changeset
  1598
{
hgs
parents: 0
diff changeset
  1599
  GstRTSPResult res;
hgs
parents: 0
diff changeset
  1600
hgs
parents: 0
diff changeset
  1601
  while (TRUE) {
hgs
parents: 0
diff changeset
  1602
    switch (builder->state) {
hgs
parents: 0
diff changeset
  1603
      case STATE_START:
hgs
parents: 0
diff changeset
  1604
        builder->offset = 0;
hgs
parents: 0
diff changeset
  1605
        res =
hgs
parents: 0
diff changeset
  1606
            read_bytes (conn->readfd->fd, (guint8 *) builder->buffer,
hgs
parents: 0
diff changeset
  1607
            &builder->offset, 1, conn->ctxp);
hgs
parents: 0
diff changeset
  1608
        if (res != GST_RTSP_OK)
hgs
parents: 0
diff changeset
  1609
          goto done;
hgs
parents: 0
diff changeset
  1610
hgs
parents: 0
diff changeset
  1611
        /* we have 1 bytes now and we can see if this is a data message or
hgs
parents: 0
diff changeset
  1612
         * not */
hgs
parents: 0
diff changeset
  1613
        if (builder->buffer[0] == '$') {
hgs
parents: 0
diff changeset
  1614
          /* data message, prepare for the header */
hgs
parents: 0
diff changeset
  1615
          builder->state = STATE_DATA_HEADER;
hgs
parents: 0
diff changeset
  1616
        } else {
hgs
parents: 0
diff changeset
  1617
          builder->line = 0;
hgs
parents: 0
diff changeset
  1618
          builder->state = STATE_READ_LINES;
hgs
parents: 0
diff changeset
  1619
        }
hgs
parents: 0
diff changeset
  1620
        break;
hgs
parents: 0
diff changeset
  1621
      case STATE_DATA_HEADER:
hgs
parents: 0
diff changeset
  1622
      {
hgs
parents: 0
diff changeset
  1623
        res =
hgs
parents: 0
diff changeset
  1624
            read_bytes (conn->readfd->fd, (guint8 *) builder->buffer,
hgs
parents: 0
diff changeset
  1625
            &builder->offset, 4, conn->ctxp);
hgs
parents: 0
diff changeset
  1626
        if (res != GST_RTSP_OK)
hgs
parents: 0
diff changeset
  1627
          goto done;
hgs
parents: 0
diff changeset
  1628
hgs
parents: 0
diff changeset
  1629
        gst_rtsp_message_init_data (message, builder->buffer[1]);
hgs
parents: 0
diff changeset
  1630
hgs
parents: 0
diff changeset
  1631
        builder->body_len = (builder->buffer[2] << 8) | builder->buffer[3];
hgs
parents: 0
diff changeset
  1632
        builder->body_data = g_malloc (builder->body_len + 1);
hgs
parents: 0
diff changeset
  1633
        builder->body_data[builder->body_len] = '\0';
hgs
parents: 0
diff changeset
  1634
        builder->offset = 0;
hgs
parents: 0
diff changeset
  1635
        builder->state = STATE_DATA_BODY;
hgs
parents: 0
diff changeset
  1636
        break;
hgs
parents: 0
diff changeset
  1637
      }
hgs
parents: 0
diff changeset
  1638
      case STATE_DATA_BODY:
hgs
parents: 0
diff changeset
  1639
      {
hgs
parents: 0
diff changeset
  1640
        res =
hgs
parents: 0
diff changeset
  1641
            read_bytes (conn->readfd->fd, builder->body_data, &builder->offset,
hgs
parents: 0
diff changeset
  1642
            builder->body_len, conn->ctxp);
hgs
parents: 0
diff changeset
  1643
        if (res != GST_RTSP_OK)
hgs
parents: 0
diff changeset
  1644
          goto done;
hgs
parents: 0
diff changeset
  1645
hgs
parents: 0
diff changeset
  1646
        /* we have the complete body now, store in the message adjusting the
hgs
parents: 0
diff changeset
  1647
         * length to include the traling '\0' */
hgs
parents: 0
diff changeset
  1648
        gst_rtsp_message_take_body (message,
hgs
parents: 0
diff changeset
  1649
            (guint8 *) builder->body_data, builder->body_len + 1);
hgs
parents: 0
diff changeset
  1650
        builder->body_data = NULL;
hgs
parents: 0
diff changeset
  1651
        builder->body_len = 0;
hgs
parents: 0
diff changeset
  1652
hgs
parents: 0
diff changeset
  1653
        builder->state = STATE_END;
hgs
parents: 0
diff changeset
  1654
        break;
hgs
parents: 0
diff changeset
  1655
      }
hgs
parents: 0
diff changeset
  1656
      case STATE_READ_LINES:
hgs
parents: 0
diff changeset
  1657
      {
hgs
parents: 0
diff changeset
  1658
        res = read_line (conn->readfd->fd, builder->buffer, &builder->offset,
hgs
parents: 0
diff changeset
  1659
            sizeof (builder->buffer), conn->ctxp);
hgs
parents: 0
diff changeset
  1660
        if (res != GST_RTSP_OK)
hgs
parents: 0
diff changeset
  1661
          goto done;
hgs
parents: 0
diff changeset
  1662
hgs
parents: 0
diff changeset
  1663
        /* we have a regular response */
hgs
parents: 0
diff changeset
  1664
        if (builder->buffer[0] == '\r') {
hgs
parents: 0
diff changeset
  1665
          builder->buffer[0] = '\0';
hgs
parents: 0
diff changeset
  1666
        }
hgs
parents: 0
diff changeset
  1667
hgs
parents: 0
diff changeset
  1668
        if (builder->buffer[0] == '\0') {
hgs
parents: 0
diff changeset
  1669
          gchar *hdrval;
hgs
parents: 0
diff changeset
  1670
hgs
parents: 0
diff changeset
  1671
          /* empty line, end of message header */
hgs
parents: 0
diff changeset
  1672
          /* see if there is a Content-Length header */
hgs
parents: 0
diff changeset
  1673
          if (gst_rtsp_message_get_header (message,
hgs
parents: 0
diff changeset
  1674
                  GST_RTSP_HDR_CONTENT_LENGTH, &hdrval, 0) == GST_RTSP_OK) {
hgs
parents: 0
diff changeset
  1675
            /* there is, prepare to read the body */
hgs
parents: 0
diff changeset
  1676
            builder->body_len = atol (hdrval);
hgs
parents: 0
diff changeset
  1677
            builder->body_data = g_malloc (builder->body_len + 1);
hgs
parents: 0
diff changeset
  1678
            builder->body_data[builder->body_len] = '\0';
hgs
parents: 0
diff changeset
  1679
            builder->offset = 0;
hgs
parents: 0
diff changeset
  1680
            builder->state = STATE_DATA_BODY;
hgs
parents: 0
diff changeset
  1681
          } else {
hgs
parents: 0
diff changeset
  1682
            builder->state = STATE_END;
hgs
parents: 0
diff changeset
  1683
          }
hgs
parents: 0
diff changeset
  1684
          break;
hgs
parents: 0
diff changeset
  1685
        }
hgs
parents: 0
diff changeset
  1686
hgs
parents: 0
diff changeset
  1687
        /* we have a line */
hgs
parents: 0
diff changeset
  1688
        if (builder->line == 0) {
hgs
parents: 0
diff changeset
  1689
          /* first line, check for response status */
hgs
parents: 0
diff changeset
  1690
          if (memcmp (builder->buffer, "RTSP", 4) == 0) {
hgs
parents: 0
diff changeset
  1691
            res = parse_response_status (builder->buffer, message);
hgs
parents: 0
diff changeset
  1692
          } else {
hgs
parents: 0
diff changeset
  1693
            res = parse_request_line (conn, builder->buffer, message);
hgs
parents: 0
diff changeset
  1694
          }
hgs
parents: 0
diff changeset
  1695
          /* the first line must parse without errors */
hgs
parents: 0
diff changeset
  1696
          if (res != GST_RTSP_OK)
hgs
parents: 0
diff changeset
  1697
            goto done;
hgs
parents: 0
diff changeset
  1698
        } else {
hgs
parents: 0
diff changeset
  1699
          /* else just parse the line, ignore errors */
hgs
parents: 0
diff changeset
  1700
          parse_line (conn, builder->buffer, message);
hgs
parents: 0
diff changeset
  1701
        }
hgs
parents: 0
diff changeset
  1702
        builder->line++;
hgs
parents: 0
diff changeset
  1703
        builder->offset = 0;
hgs
parents: 0
diff changeset
  1704
        break;
hgs
parents: 0
diff changeset
  1705
      }
hgs
parents: 0
diff changeset
  1706
      case STATE_END:
hgs
parents: 0
diff changeset
  1707
      {
hgs
parents: 0
diff changeset
  1708
        gchar *session_id;
hgs
parents: 0
diff changeset
  1709
hgs
parents: 0
diff changeset
  1710
        if (conn->tstate == TUNNEL_STATE_GET) {
hgs
parents: 0
diff changeset
  1711
          res = GST_RTSP_ETGET;
hgs
parents: 0
diff changeset
  1712
          goto done;
hgs
parents: 0
diff changeset
  1713
        } else if (conn->tstate == TUNNEL_STATE_POST) {
hgs
parents: 0
diff changeset
  1714
          res = GST_RTSP_ETPOST;
hgs
parents: 0
diff changeset
  1715
          goto done;
hgs
parents: 0
diff changeset
  1716
        }
hgs
parents: 0
diff changeset
  1717
hgs
parents: 0
diff changeset
  1718
        if (message->type == GST_RTSP_MESSAGE_DATA) {
hgs
parents: 0
diff changeset
  1719
          /* data messages don't have headers */
hgs
parents: 0
diff changeset
  1720
          res = GST_RTSP_OK;
hgs
parents: 0
diff changeset
  1721
          goto done;
hgs
parents: 0
diff changeset
  1722
        }
hgs
parents: 0
diff changeset
  1723
hgs
parents: 0
diff changeset
  1724
        /* save session id in the connection for further use */
hgs
parents: 0
diff changeset
  1725
        if (message->type == GST_RTSP_MESSAGE_RESPONSE &&
hgs
parents: 0
diff changeset
  1726
            gst_rtsp_message_get_header (message, GST_RTSP_HDR_SESSION,
hgs
parents: 0
diff changeset
  1727
                &session_id, 0) == GST_RTSP_OK) {
hgs
parents: 0
diff changeset
  1728
          gint maxlen, i;
hgs
parents: 0
diff changeset
  1729
hgs
parents: 0
diff changeset
  1730
          maxlen = sizeof (conn->session_id) - 1;
hgs
parents: 0
diff changeset
  1731
          /* the sessionid can have attributes marked with ;
hgs
parents: 0
diff changeset
  1732
           * Make sure we strip them */
hgs
parents: 0
diff changeset
  1733
          for (i = 0; session_id[i] != '\0'; i++) {
hgs
parents: 0
diff changeset
  1734
            if (session_id[i] == ';') {
hgs
parents: 0
diff changeset
  1735
              maxlen = i;
hgs
parents: 0
diff changeset
  1736
              /* parse timeout */
hgs
parents: 0
diff changeset
  1737
              do {
hgs
parents: 0
diff changeset
  1738
                i++;
hgs
parents: 0
diff changeset
  1739
              } while (g_ascii_isspace (session_id[i]));
hgs
parents: 0
diff changeset
  1740
              if (g_str_has_prefix (&session_id[i], "timeout=")) {
hgs
parents: 0
diff changeset
  1741
                gint to;
hgs
parents: 0
diff changeset
  1742
hgs
parents: 0
diff changeset
  1743
                /* if we parsed something valid, configure */
hgs
parents: 0
diff changeset
  1744
                if ((to = atoi (&session_id[i + 8])) > 0)
hgs
parents: 0
diff changeset
  1745
                  conn->timeout = to;
hgs
parents: 0
diff changeset
  1746
              }
hgs
parents: 0
diff changeset
  1747
              break;
hgs
parents: 0
diff changeset
  1748
            }
hgs
parents: 0
diff changeset
  1749
          }
hgs
parents: 0
diff changeset
  1750
hgs
parents: 0
diff changeset
  1751
          /* make sure to not overflow */
hgs
parents: 0
diff changeset
  1752
          strncpy (conn->session_id, session_id, maxlen);
hgs
parents: 0
diff changeset
  1753
          conn->session_id[maxlen] = '\0';
hgs
parents: 0
diff changeset
  1754
        }
hgs
parents: 0
diff changeset
  1755
        res = GST_RTSP_OK;
hgs
parents: 0
diff changeset
  1756
        goto done;
hgs
parents: 0
diff changeset
  1757
      }
hgs
parents: 0
diff changeset
  1758
      default:
hgs
parents: 0
diff changeset
  1759
        res = GST_RTSP_ERROR;
hgs
parents: 0
diff changeset
  1760
        break;
hgs
parents: 0
diff changeset
  1761
    }
hgs
parents: 0
diff changeset
  1762
  }
hgs
parents: 0
diff changeset
  1763
done:
hgs
parents: 0
diff changeset
  1764
  return res;
hgs
parents: 0
diff changeset
  1765
}
hgs
parents: 0
diff changeset
  1766
0
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1767
/**
16
hgs
parents: 0
diff changeset
  1768
 * gst_rtsp_connection_read:
0
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1769
 * @conn: a #GstRTSPConnection
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1770
 * @data: the data to read
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1771
 * @size: the size of @data
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1772
 * @timeout: a timeout value or #NULL
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1773
 *
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1774
 * Attempt to read @size bytes into @data from the connected @conn, blocking up to
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1775
 * the specified @timeout. @timeout can be #NULL, in which case this function
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1776
 * might block forever.
16
hgs
parents: 0
diff changeset
  1777
 *
hgs
parents: 0
diff changeset
  1778
 * This function can be cancelled with gst_rtsp_connection_flush().
0
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1779
 *
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1780
 * Returns: #GST_RTSP_OK on success.
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1781
 */
16
hgs
parents: 0
diff changeset
  1782
GstRTSPResult
hgs
parents: 0
diff changeset
  1783
gst_rtsp_connection_read (GstRTSPConnection * conn, guint8 * data, guint size,
hgs
parents: 0
diff changeset
  1784
    GTimeVal * timeout)
0
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1785
{
16
hgs
parents: 0
diff changeset
  1786
  guint offset;
0
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1787
  gint retval;
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1788
  GstClockTime to;
16
hgs
parents: 0
diff changeset
  1789
  GstRTSPResult res;
0
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1790
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1791
  g_return_val_if_fail (conn != NULL, GST_RTSP_EINVAL);
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1792
  g_return_val_if_fail (data != NULL, GST_RTSP_EINVAL);
16
hgs
parents: 0
diff changeset
  1793
  g_return_val_if_fail (conn->readfd != NULL, GST_RTSP_EINVAL);
hgs
parents: 0
diff changeset
  1794
hgs
parents: 0
diff changeset
  1795
  if (G_UNLIKELY (size == 0))
0
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1796
    return GST_RTSP_OK;
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1797
16
hgs
parents: 0
diff changeset
  1798
  offset = 0;
0
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1799
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1800
  /* configure timeout if any */
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1801
  to = timeout ? GST_TIMEVAL_TO_TIME (*timeout) : GST_CLOCK_TIME_NONE;
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1802
16
hgs
parents: 0
diff changeset
  1803
  gst_poll_set_controllable (conn->fdset, TRUE);
hgs
parents: 0
diff changeset
  1804
  gst_poll_fd_ctl_write (conn->fdset, conn->writefd, FALSE);
hgs
parents: 0
diff changeset
  1805
  gst_poll_fd_ctl_read (conn->fdset, conn->readfd, TRUE);
hgs
parents: 0
diff changeset
  1806
hgs
parents: 0
diff changeset
  1807
  while (TRUE) {
hgs
parents: 0
diff changeset
  1808
    res = read_bytes (conn->readfd->fd, data, &offset, size, conn->ctxp);
hgs
parents: 0
diff changeset
  1809
    if (G_UNLIKELY (res == GST_RTSP_EEOF))
hgs
parents: 0
diff changeset
  1810
      goto eof;
hgs
parents: 0
diff changeset
  1811
    if (G_LIKELY (res == GST_RTSP_OK))
hgs
parents: 0
diff changeset
  1812
      break;
hgs
parents: 0
diff changeset
  1813
    if (G_UNLIKELY (res != GST_RTSP_EINTR))
hgs
parents: 0
diff changeset
  1814
      goto read_error;
0
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1815
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1816
    do {
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1817
      retval = gst_poll_wait (conn->fdset, to);
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1818
    } while (retval == -1 && (errno == EINTR || errno == EAGAIN));
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1819
16
hgs
parents: 0
diff changeset
  1820
    /* check for timeout */
hgs
parents: 0
diff changeset
  1821
    if (G_UNLIKELY (retval == 0))
hgs
parents: 0
diff changeset
  1822
      goto select_timeout;
hgs
parents: 0
diff changeset
  1823
hgs
parents: 0
diff changeset
  1824
    if (G_UNLIKELY (retval == -1)) {
0
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1825
      if (errno == EBUSY)
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1826
        goto stopped;
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1827
      else
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1828
        goto select_error;
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1829
    }
16
hgs
parents: 0
diff changeset
  1830
    gst_poll_set_controllable (conn->fdset, FALSE);
0
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1831
  }
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1832
  return GST_RTSP_OK;
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1833
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1834
  /* ERRORS */
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1835
select_error:
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1836
  {
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1837
    return GST_RTSP_ESYS;
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1838
  }
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1839
select_timeout:
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1840
  {
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1841
    return GST_RTSP_ETIMEOUT;
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1842
  }
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1843
stopped:
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1844
  {
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1845
    return GST_RTSP_EINTR;
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1846
  }
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1847
eof:
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1848
  {
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1849
    return GST_RTSP_EEOF;
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1850
  }
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1851
read_error:
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1852
  {
16
hgs
parents: 0
diff changeset
  1853
    return res;
0
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1854
  }
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1855
}
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1856
16
hgs
parents: 0
diff changeset
  1857
static GString *
hgs
parents: 0
diff changeset
  1858
gen_tunnel_reply (GstRTSPConnection * conn, GstRTSPStatusCode code)
0
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1859
{
16
hgs
parents: 0
diff changeset
  1860
  GString *str;
hgs
parents: 0
diff changeset
  1861
  gchar date_string[100];
hgs
parents: 0
diff changeset
  1862
  const gchar *status;
hgs
parents: 0
diff changeset
  1863
hgs
parents: 0
diff changeset
  1864
  gen_date_string (date_string, sizeof (date_string));
hgs
parents: 0
diff changeset
  1865
hgs
parents: 0
diff changeset
  1866
  status = gst_rtsp_status_as_text (code);
hgs
parents: 0
diff changeset
  1867
  if (status == NULL) {
hgs
parents: 0
diff changeset
  1868
    code = GST_RTSP_STS_INTERNAL_SERVER_ERROR;
hgs
parents: 0
diff changeset
  1869
    status = "Internal Server Error";
0
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1870
  }
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1871
16
hgs
parents: 0
diff changeset
  1872
  str = g_string_new ("");
hgs
parents: 0
diff changeset
  1873
hgs
parents: 0
diff changeset
  1874
  /* */
hgs
parents: 0
diff changeset
  1875
  g_string_append_printf (str, "HTTP/1.0 %d %s\r\n", code, status);
hgs
parents: 0
diff changeset
  1876
  g_string_append_printf (str,
hgs
parents: 0
diff changeset
  1877
      "Server: GStreamer RTSP Server\r\n"
hgs
parents: 0
diff changeset
  1878
      "Date: %s\r\n"
hgs
parents: 0
diff changeset
  1879
      "Connection: close\r\n"
hgs
parents: 0
diff changeset
  1880
      "Cache-Control: no-store\r\n" "Pragma: no-cache\r\n", date_string);
hgs
parents: 0
diff changeset
  1881
  if (code == GST_RTSP_STS_OK) {
hgs
parents: 0
diff changeset
  1882
    if (conn->ip)
hgs
parents: 0
diff changeset
  1883
      g_string_append_printf (str, "x-server-ip-address: %s\r\n", conn->ip);
hgs
parents: 0
diff changeset
  1884
    g_string_append_printf (str,
hgs
parents: 0
diff changeset
  1885
        "Content-Type: application/x-rtsp-tunnelled\r\n");
0
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1886
  }
16
hgs
parents: 0
diff changeset
  1887
  g_string_append_printf (str, "\r\n");
hgs
parents: 0
diff changeset
  1888
  return str;
0
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1889
}
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1890
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1891
/**
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1892
 * gst_rtsp_connection_receive:
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1893
 * @conn: a #GstRTSPConnection
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1894
 * @message: the message to read
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1895
 * @timeout: a timeout value or #NULL
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1896
 *
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1897
 * Attempt to read into @message from the connected @conn, blocking up to
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1898
 * the specified @timeout. @timeout can be #NULL, in which case this function
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1899
 * might block forever.
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1900
 * 
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1901
 * This function can be cancelled with gst_rtsp_connection_flush().
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1902
 *
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1903
 * Returns: #GST_RTSP_OK on success.
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1904
 */
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1905
GstRTSPResult
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1906
gst_rtsp_connection_receive (GstRTSPConnection * conn, GstRTSPMessage * message,
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1907
    GTimeVal * timeout)
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1908
{
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1909
  GstRTSPResult res;
16
hgs
parents: 0
diff changeset
  1910
  GstRTSPBuilder builder;
hgs
parents: 0
diff changeset
  1911
  gint retval;
hgs
parents: 0
diff changeset
  1912
  GstClockTime to;
0
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1913
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1914
  g_return_val_if_fail (conn != NULL, GST_RTSP_EINVAL);
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1915
  g_return_val_if_fail (message != NULL, GST_RTSP_EINVAL);
16
hgs
parents: 0
diff changeset
  1916
  g_return_val_if_fail (conn->readfd != NULL, GST_RTSP_EINVAL);
hgs
parents: 0
diff changeset
  1917
hgs
parents: 0
diff changeset
  1918
  /* configure timeout if any */
hgs
parents: 0
diff changeset
  1919
  to = timeout ? GST_TIMEVAL_TO_TIME (*timeout) : GST_CLOCK_TIME_NONE;
hgs
parents: 0
diff changeset
  1920
hgs
parents: 0
diff changeset
  1921
  gst_poll_set_controllable (conn->fdset, TRUE);
hgs
parents: 0
diff changeset
  1922
  gst_poll_fd_ctl_write (conn->fdset, conn->writefd, FALSE);
hgs
parents: 0
diff changeset
  1923
  gst_poll_fd_ctl_read (conn->fdset, conn->readfd, TRUE);
hgs
parents: 0
diff changeset
  1924
hgs
parents: 0
diff changeset
  1925
  memset (&builder, 0, sizeof (GstRTSPBuilder));
hgs
parents: 0
diff changeset
  1926
  while (TRUE) {
hgs
parents: 0
diff changeset
  1927
    res = build_next (&builder, message, conn);
hgs
parents: 0
diff changeset
  1928
    if (G_UNLIKELY (res == GST_RTSP_EEOF))
hgs
parents: 0
diff changeset
  1929
      goto eof;
hgs
parents: 0
diff changeset
  1930
    if (G_LIKELY (res == GST_RTSP_OK))
hgs
parents: 0
diff changeset
  1931
      break;
hgs
parents: 0
diff changeset
  1932
    if (res == GST_RTSP_ETGET) {
hgs
parents: 0
diff changeset
  1933
      GString *str;
hgs
parents: 0
diff changeset
  1934
hgs
parents: 0
diff changeset
  1935
      /* tunnel GET request, we can reply now */
hgs
parents: 0
diff changeset
  1936
      str = gen_tunnel_reply (conn, GST_RTSP_STS_OK);
hgs
parents: 0
diff changeset
  1937
      res =
hgs
parents: 0
diff changeset
  1938
          gst_rtsp_connection_write (conn, (guint8 *) str->str, str->len,
hgs
parents: 0
diff changeset
  1939
          timeout);
hgs
parents: 0
diff changeset
  1940
      g_string_free (str, TRUE);
hgs
parents: 0
diff changeset
  1941
    } else if (res == GST_RTSP_ETPOST) {
hgs
parents: 0
diff changeset
  1942
      /* tunnel POST request, return the value, the caller now has to link the
hgs
parents: 0
diff changeset
  1943
       * two connections. */
0
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1944
      break;
16
hgs
parents: 0
diff changeset
  1945
    } else if (G_UNLIKELY (res != GST_RTSP_EINTR))
hgs
parents: 0
diff changeset
  1946
      goto read_error;
hgs
parents: 0
diff changeset
  1947
hgs
parents: 0
diff changeset
  1948
    do {
hgs
parents: 0
diff changeset
  1949
      retval = gst_poll_wait (conn->fdset, to);
hgs
parents: 0
diff changeset
  1950
    } while (retval == -1 && (errno == EINTR || errno == EAGAIN));
hgs
parents: 0
diff changeset
  1951
hgs
parents: 0
diff changeset
  1952
    /* check for timeout */
hgs
parents: 0
diff changeset
  1953
    if (G_UNLIKELY (retval == 0))
hgs
parents: 0
diff changeset
  1954
      goto select_timeout;
hgs
parents: 0
diff changeset
  1955
hgs
parents: 0
diff changeset
  1956
    if (G_UNLIKELY (retval == -1)) {
hgs
parents: 0
diff changeset
  1957
      if (errno == EBUSY)
hgs
parents: 0
diff changeset
  1958
        goto stopped;
hgs
parents: 0
diff changeset
  1959
      else
hgs
parents: 0
diff changeset
  1960
        goto select_error;
0
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1961
    }
16
hgs
parents: 0
diff changeset
  1962
    gst_poll_set_controllable (conn->fdset, FALSE);
0
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1963
  }
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1964
16
hgs
parents: 0
diff changeset
  1965
  /* we have a message here */
hgs
parents: 0
diff changeset
  1966
  build_reset (&builder);
hgs
parents: 0
diff changeset
  1967
hgs
parents: 0
diff changeset
  1968
  return GST_RTSP_OK;
hgs
parents: 0
diff changeset
  1969
hgs
parents: 0
diff changeset
  1970
  /* ERRORS */
hgs
parents: 0
diff changeset
  1971
select_error:
hgs
parents: 0
diff changeset
  1972
  {
hgs
parents: 0
diff changeset
  1973
    res = GST_RTSP_ESYS;
hgs
parents: 0
diff changeset
  1974
    goto cleanup;
hgs
parents: 0
diff changeset
  1975
  }
hgs
parents: 0
diff changeset
  1976
select_timeout:
hgs
parents: 0
diff changeset
  1977
  {
hgs
parents: 0
diff changeset
  1978
    res = GST_RTSP_ETIMEOUT;
hgs
parents: 0
diff changeset
  1979
    goto cleanup;
0
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1980
  }
16
hgs
parents: 0
diff changeset
  1981
stopped:
hgs
parents: 0
diff changeset
  1982
  {
hgs
parents: 0
diff changeset
  1983
    res = GST_RTSP_EINTR;
hgs
parents: 0
diff changeset
  1984
    goto cleanup;
hgs
parents: 0
diff changeset
  1985
  }
hgs
parents: 0
diff changeset
  1986
eof:
hgs
parents: 0
diff changeset
  1987
  {
hgs
parents: 0
diff changeset
  1988
    res = GST_RTSP_EEOF;
hgs
parents: 0
diff changeset
  1989
    goto cleanup;
hgs
parents: 0
diff changeset
  1990
  }
0
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1991
read_error:
16
hgs
parents: 0
diff changeset
  1992
cleanup:
0
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1993
  {
16
hgs
parents: 0
diff changeset
  1994
    build_reset (&builder);
hgs
parents: 0
diff changeset
  1995
    gst_rtsp_message_unset (message);
0
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1996
    return res;
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1997
  }
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1998
}
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  1999
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2000
/**
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2001
 * gst_rtsp_connection_close:
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2002
 * @conn: a #GstRTSPConnection
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2003
 *
16
hgs
parents: 0
diff changeset
  2004
 * Close the connected @conn. After this call, the connection is in the same
hgs
parents: 0
diff changeset
  2005
 * state as when it was first created.
0
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2006
 * 
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2007
 * Returns: #GST_RTSP_OK on success.
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2008
 */
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2009
GstRTSPResult
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2010
gst_rtsp_connection_close (GstRTSPConnection * conn)
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2011
{
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2012
  g_return_val_if_fail (conn != NULL, GST_RTSP_EINVAL);
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2013
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2014
  g_free (conn->ip);
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2015
  conn->ip = NULL;
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2016
16
hgs
parents: 0
diff changeset
  2017
  REMOVE_POLLFD (conn->fdset, &conn->fd0);
hgs
parents: 0
diff changeset
  2018
  REMOVE_POLLFD (conn->fdset, &conn->fd1);
hgs
parents: 0
diff changeset
  2019
  conn->writefd = NULL;
hgs
parents: 0
diff changeset
  2020
  conn->readfd = NULL;
hgs
parents: 0
diff changeset
  2021
  conn->tunneled = FALSE;
hgs
parents: 0
diff changeset
  2022
  conn->tstate = TUNNEL_STATE_NONE;
hgs
parents: 0
diff changeset
  2023
  conn->ctxp = NULL;
hgs
parents: 0
diff changeset
  2024
  g_free (conn->username);
hgs
parents: 0
diff changeset
  2025
  conn->username = NULL;
hgs
parents: 0
diff changeset
  2026
  g_free (conn->passwd);
hgs
parents: 0
diff changeset
  2027
  conn->passwd = NULL;
hgs
parents: 0
diff changeset
  2028
  gst_rtsp_connection_clear_auth_params (conn);
hgs
parents: 0
diff changeset
  2029
  conn->timeout = 60;
hgs
parents: 0
diff changeset
  2030
  conn->cseq = 0;
hgs
parents: 0
diff changeset
  2031
  conn->session_id[0] = '\0';
0
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2032
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2033
  return GST_RTSP_OK;
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2034
}
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2035
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2036
/**
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2037
 * gst_rtsp_connection_free:
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2038
 * @conn: a #GstRTSPConnection
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2039
 *
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2040
 * Close and free @conn.
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2041
 * 
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2042
 * Returns: #GST_RTSP_OK on success.
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2043
 */
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2044
GstRTSPResult
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2045
gst_rtsp_connection_free (GstRTSPConnection * conn)
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2046
{
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2047
  GstRTSPResult res;
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2048
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2049
  g_return_val_if_fail (conn != NULL, GST_RTSP_EINVAL);
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2050
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2051
  res = gst_rtsp_connection_close (conn);
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2052
  gst_poll_free (conn->fdset);
16
hgs
parents: 0
diff changeset
  2053
  g_timer_destroy (conn->timer);
hgs
parents: 0
diff changeset
  2054
  gst_rtsp_url_free (conn->url);
hgs
parents: 0
diff changeset
  2055
  g_free (conn->proxy_host);
hgs
parents: 0
diff changeset
  2056
  g_free (conn);
0
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2057
#ifdef G_OS_WIN32
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2058
  WSACleanup ();
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2059
#endif
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2060
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2061
  return res;
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2062
}
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2063
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2064
/**
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2065
 * gst_rtsp_connection_poll:
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2066
 * @conn: a #GstRTSPConnection
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2067
 * @events: a bitmask of #GstRTSPEvent flags to check
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2068
 * @revents: location for result flags 
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2069
 * @timeout: a timeout
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2070
 *
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2071
 * Wait up to the specified @timeout for the connection to become available for
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2072
 * at least one of the operations specified in @events. When the function returns
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2073
 * with #GST_RTSP_OK, @revents will contain a bitmask of available operations on
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2074
 * @conn.
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2075
 *
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2076
 * @timeout can be #NULL, in which case this function might block forever.
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2077
 *
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2078
 * This function can be cancelled with gst_rtsp_connection_flush().
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2079
 * 
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2080
 * Returns: #GST_RTSP_OK on success.
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2081
 *
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2082
 * Since: 0.10.15
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2083
 */
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2084
GstRTSPResult
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2085
gst_rtsp_connection_poll (GstRTSPConnection * conn, GstRTSPEvent events,
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2086
    GstRTSPEvent * revents, GTimeVal * timeout)
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2087
{
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2088
  GstClockTime to;
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2089
  gint retval;
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2090
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2091
  g_return_val_if_fail (conn != NULL, GST_RTSP_EINVAL);
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2092
  g_return_val_if_fail (events != 0, GST_RTSP_EINVAL);
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2093
  g_return_val_if_fail (revents != NULL, GST_RTSP_EINVAL);
16
hgs
parents: 0
diff changeset
  2094
  g_return_val_if_fail (conn->readfd != NULL, GST_RTSP_EINVAL);
hgs
parents: 0
diff changeset
  2095
  g_return_val_if_fail (conn->writefd != NULL, GST_RTSP_EINVAL);
0
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2096
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2097
  gst_poll_set_controllable (conn->fdset, TRUE);
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2098
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2099
  /* add fd to writer set when asked to */
16
hgs
parents: 0
diff changeset
  2100
  gst_poll_fd_ctl_write (conn->fdset, conn->writefd,
hgs
parents: 0
diff changeset
  2101
      events & GST_RTSP_EV_WRITE);
0
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2102
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2103
  /* add fd to reader set when asked to */
16
hgs
parents: 0
diff changeset
  2104
  gst_poll_fd_ctl_read (conn->fdset, conn->readfd, events & GST_RTSP_EV_READ);
0
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2105
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2106
  /* configure timeout if any */
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2107
  to = timeout ? GST_TIMEVAL_TO_TIME (*timeout) : GST_CLOCK_TIME_NONE;
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2108
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2109
  do {
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2110
    retval = gst_poll_wait (conn->fdset, to);
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2111
  } while (retval == -1 && (errno == EINTR || errno == EAGAIN));
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2112
16
hgs
parents: 0
diff changeset
  2113
  if (G_UNLIKELY (retval == 0))
0
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2114
    goto select_timeout;
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2115
16
hgs
parents: 0
diff changeset
  2116
  if (G_UNLIKELY (retval == -1)) {
0
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2117
    if (errno == EBUSY)
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2118
      goto stopped;
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2119
    else
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2120
      goto select_error;
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2121
  }
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2122
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2123
  *revents = 0;
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2124
  if (events & GST_RTSP_EV_READ) {
16
hgs
parents: 0
diff changeset
  2125
    if (gst_poll_fd_can_read (conn->fdset, conn->readfd))
0
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2126
      *revents |= GST_RTSP_EV_READ;
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2127
  }
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2128
  if (events & GST_RTSP_EV_WRITE) {
16
hgs
parents: 0
diff changeset
  2129
    if (gst_poll_fd_can_write (conn->fdset, conn->writefd))
0
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2130
      *revents |= GST_RTSP_EV_WRITE;
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2131
  }
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2132
  return GST_RTSP_OK;
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2133
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2134
  /* ERRORS */
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2135
select_timeout:
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2136
  {
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2137
    return GST_RTSP_ETIMEOUT;
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2138
  }
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2139
select_error:
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2140
  {
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2141
    return GST_RTSP_ESYS;
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2142
  }
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2143
stopped:
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2144
  {
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2145
    return GST_RTSP_EINTR;
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2146
  }
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2147
}
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2148
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2149
/**
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2150
 * gst_rtsp_connection_next_timeout:
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2151
 * @conn: a #GstRTSPConnection
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2152
 * @timeout: a timeout
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2153
 *
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2154
 * Calculate the next timeout for @conn, storing the result in @timeout.
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2155
 * 
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2156
 * Returns: #GST_RTSP_OK.
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2157
 */
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2158
GstRTSPResult
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2159
gst_rtsp_connection_next_timeout (GstRTSPConnection * conn, GTimeVal * timeout)
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2160
{
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2161
  gdouble elapsed;
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2162
  glong sec;
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2163
  gulong usec;
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2164
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2165
  g_return_val_if_fail (conn != NULL, GST_RTSP_EINVAL);
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2166
  g_return_val_if_fail (timeout != NULL, GST_RTSP_EINVAL);
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2167
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2168
  elapsed = g_timer_elapsed (conn->timer, &usec);
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2169
  if (elapsed >= conn->timeout) {
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2170
    sec = 0;
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2171
    usec = 0;
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2172
  } else {
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2173
    sec = conn->timeout - elapsed;
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2174
  }
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2175
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2176
  timeout->tv_sec = sec;
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2177
  timeout->tv_usec = usec;
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2178
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2179
  return GST_RTSP_OK;
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2180
}
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2181
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2182
/**
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2183
 * gst_rtsp_connection_reset_timeout:
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2184
 * @conn: a #GstRTSPConnection
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2185
 *
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2186
 * Reset the timeout of @conn.
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2187
 * 
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2188
 * Returns: #GST_RTSP_OK.
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2189
 */
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2190
GstRTSPResult
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2191
gst_rtsp_connection_reset_timeout (GstRTSPConnection * conn)
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2192
{
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2193
  g_return_val_if_fail (conn != NULL, GST_RTSP_EINVAL);
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2194
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2195
  g_timer_start (conn->timer);
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2196
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2197
  return GST_RTSP_OK;
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2198
}
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2199
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2200
/**
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2201
 * gst_rtsp_connection_flush:
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2202
 * @conn: a #GstRTSPConnection
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2203
 * @flush: start or stop the flush
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2204
 *
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2205
 * Start or stop the flushing action on @conn. When flushing, all current
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2206
 * and future actions on @conn will return #GST_RTSP_EINTR until the connection
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2207
 * is set to non-flushing mode again.
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2208
 * 
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2209
 * Returns: #GST_RTSP_OK.
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2210
 */
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2211
GstRTSPResult
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2212
gst_rtsp_connection_flush (GstRTSPConnection * conn, gboolean flush)
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2213
{
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2214
  g_return_val_if_fail (conn != NULL, GST_RTSP_EINVAL);
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2215
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2216
  gst_poll_set_flushing (conn->fdset, flush);
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2217
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2218
  return GST_RTSP_OK;
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2219
}
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2220
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2221
/**
16
hgs
parents: 0
diff changeset
  2222
 * gst_rtsp_connection_set_proxy:
hgs
parents: 0
diff changeset
  2223
 * @conn: a #GstRTSPConnection
hgs
parents: 0
diff changeset
  2224
 * @host: the proxy host
hgs
parents: 0
diff changeset
  2225
 * @port: the proxy port
hgs
parents: 0
diff changeset
  2226
 *
hgs
parents: 0
diff changeset
  2227
 * Set the proxy host and port.
hgs
parents: 0
diff changeset
  2228
 * 
hgs
parents: 0
diff changeset
  2229
 * Returns: #GST_RTSP_OK.
hgs
parents: 0
diff changeset
  2230
 *
hgs
parents: 0
diff changeset
  2231
 * Since: 0.10.23
hgs
parents: 0
diff changeset
  2232
 */
hgs
parents: 0
diff changeset
  2233
GstRTSPResult
hgs
parents: 0
diff changeset
  2234
gst_rtsp_connection_set_proxy (GstRTSPConnection * conn,
hgs
parents: 0
diff changeset
  2235
    const gchar * host, guint port)
hgs
parents: 0
diff changeset
  2236
{
hgs
parents: 0
diff changeset
  2237
  g_return_val_if_fail (conn != NULL, GST_RTSP_EINVAL);
hgs
parents: 0
diff changeset
  2238
hgs
parents: 0
diff changeset
  2239
  g_free (conn->proxy_host);
hgs
parents: 0
diff changeset
  2240
  conn->proxy_host = g_strdup (host);
hgs
parents: 0
diff changeset
  2241
  conn->proxy_port = port;
hgs
parents: 0
diff changeset
  2242
hgs
parents: 0
diff changeset
  2243
  return GST_RTSP_OK;
hgs
parents: 0
diff changeset
  2244
}
hgs
parents: 0
diff changeset
  2245
hgs
parents: 0
diff changeset
  2246
/**
0
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2247
 * gst_rtsp_connection_set_auth:
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2248
 * @conn: a #GstRTSPConnection
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2249
 * @method: authentication method
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2250
 * @user: the user
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2251
 * @pass: the password
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2252
 *
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2253
 * Configure @conn for authentication mode @method with @user and @pass as the
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2254
 * user and password respectively.
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2255
 * 
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2256
 * Returns: #GST_RTSP_OK.
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2257
 */
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2258
GstRTSPResult
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2259
gst_rtsp_connection_set_auth (GstRTSPConnection * conn,
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2260
    GstRTSPAuthMethod method, const gchar * user, const gchar * pass)
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2261
{
16
hgs
parents: 0
diff changeset
  2262
  g_return_val_if_fail (conn != NULL, GST_RTSP_EINVAL);
hgs
parents: 0
diff changeset
  2263
hgs
parents: 0
diff changeset
  2264
  if (method == GST_RTSP_AUTH_DIGEST && ((user == NULL || pass == NULL)
hgs
parents: 0
diff changeset
  2265
          || g_strrstr (user, ":") != NULL))
hgs
parents: 0
diff changeset
  2266
    return GST_RTSP_EINVAL;
0
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2267
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2268
  /* Make sure the username and passwd are being set for authentication */
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2269
  if (method == GST_RTSP_AUTH_NONE && (user == NULL || pass == NULL))
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2270
    return GST_RTSP_EINVAL;
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2271
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2272
  /* ":" chars are not allowed in usernames for basic auth */
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2273
  if (method == GST_RTSP_AUTH_BASIC && g_strrstr (user, ":") != NULL)
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2274
    return GST_RTSP_EINVAL;
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2275
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2276
  g_free (conn->username);
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2277
  g_free (conn->passwd);
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2278
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2279
  conn->auth_method = method;
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2280
  conn->username = g_strdup (user);
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2281
  conn->passwd = g_strdup (pass);
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2282
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2283
  return GST_RTSP_OK;
0e761a78d257 Revision: 200949
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
  2284
}
16
hgs
parents: 0
diff changeset
  2285
hgs
parents: 0
diff changeset
  2286
/**
hgs
parents: 0
diff changeset
  2287
 * str_case_hash:
hgs
parents: 0
diff changeset
  2288
 * @key: ASCII string to hash
hgs
parents: 0
diff changeset
  2289
 *
hgs
parents: 0
diff changeset
  2290
 * Hashes @key in a case-insensitive manner.
hgs
parents: 0
diff changeset
  2291
 *
hgs
parents: 0
diff changeset
  2292
 * Returns: the hash code.
hgs
parents: 0
diff changeset
  2293
 **/
hgs
parents: 0
diff changeset
  2294
static guint
hgs
parents: 0
diff changeset
  2295
str_case_hash (gconstpointer key)
hgs
parents: 0
diff changeset
  2296
{
hgs
parents: 0
diff changeset
  2297
  const char *p = key;
hgs
parents: 0
diff changeset
  2298
  guint h = g_ascii_toupper (*p);
hgs
parents: 0
diff changeset
  2299
hgs
parents: 0
diff changeset
  2300
  if (h)
hgs
parents: 0
diff changeset
  2301
    for (p += 1; *p != '\0'; p++)
hgs
parents: 0
diff changeset
  2302
      h = (h << 5) - h + g_ascii_toupper (*p);
hgs
parents: 0
diff changeset
  2303
hgs
parents: 0
diff changeset
  2304
  return h;
hgs
parents: 0
diff changeset
  2305
}
hgs
parents: 0
diff changeset
  2306
hgs
parents: 0
diff changeset
  2307
/**
hgs
parents: 0
diff changeset
  2308
 * str_case_equal:
hgs
parents: 0
diff changeset
  2309
 * @v1: an ASCII string
hgs
parents: 0
diff changeset
  2310
 * @v2: another ASCII string
hgs
parents: 0
diff changeset
  2311
 *
hgs
parents: 0
diff changeset
  2312
 * Compares @v1 and @v2 in a case-insensitive manner
hgs
parents: 0
diff changeset
  2313
 *
hgs
parents: 0
diff changeset
  2314
 * Returns: %TRUE if they are equal (modulo case)
hgs
parents: 0
diff changeset
  2315
 **/
hgs
parents: 0
diff changeset
  2316
static gboolean
hgs
parents: 0
diff changeset
  2317
str_case_equal (gconstpointer v1, gconstpointer v2)
hgs
parents: 0
diff changeset
  2318
{
hgs
parents: 0
diff changeset
  2319
  const char *string1 = v1;
hgs
parents: 0
diff changeset
  2320
  const char *string2 = v2;
hgs
parents: 0
diff changeset
  2321
hgs
parents: 0
diff changeset
  2322
  return g_ascii_strcasecmp (string1, string2) == 0;
hgs
parents: 0
diff changeset
  2323
}
hgs
parents: 0
diff changeset
  2324
hgs
parents: 0
diff changeset
  2325
/**
hgs
parents: 0
diff changeset
  2326
 * gst_rtsp_connection_set_auth_param:
hgs
parents: 0
diff changeset
  2327
 * @conn: a #GstRTSPConnection
hgs
parents: 0
diff changeset
  2328
 * @param: authentication directive
hgs
parents: 0
diff changeset
  2329
 * @value: value
hgs
parents: 0
diff changeset
  2330
 *
hgs
parents: 0
diff changeset
  2331
 * Setup @conn with authentication directives. This is not necesary for
hgs
parents: 0
diff changeset
  2332
 * methods #GST_RTSP_AUTH_NONE and #GST_RTSP_AUTH_BASIC. For
hgs
parents: 0
diff changeset
  2333
 * #GST_RTSP_AUTH_DIGEST, directives should be taken from the digest challenge
hgs
parents: 0
diff changeset
  2334
 * in the WWW-Authenticate response header and can include realm, domain,
hgs
parents: 0
diff changeset
  2335
 * nonce, opaque, stale, algorithm, qop as per RFC2617.
hgs
parents: 0
diff changeset
  2336
 * 
hgs
parents: 0
diff changeset
  2337
 * Since: 0.10.20
hgs
parents: 0
diff changeset
  2338
 */
hgs
parents: 0
diff changeset
  2339
void
hgs
parents: 0
diff changeset
  2340
gst_rtsp_connection_set_auth_param (GstRTSPConnection * conn,
hgs
parents: 0
diff changeset
  2341
    const gchar * param, const gchar * value)
hgs
parents: 0
diff changeset
  2342
{
hgs
parents: 0
diff changeset
  2343
  g_return_if_fail (conn != NULL);
hgs
parents: 0
diff changeset
  2344
  g_return_if_fail (param != NULL);
hgs
parents: 0
diff changeset
  2345
hgs
parents: 0
diff changeset
  2346
  if (conn->auth_params == NULL) {
hgs
parents: 0
diff changeset
  2347
    conn->auth_params =
hgs
parents: 0
diff changeset
  2348
        g_hash_table_new_full (str_case_hash, str_case_equal, g_free, g_free);
hgs
parents: 0
diff changeset
  2349
  }
hgs
parents: 0
diff changeset
  2350
  g_hash_table_insert (conn->auth_params, g_strdup (param), g_strdup (value));
hgs
parents: 0
diff changeset
  2351
}
hgs
parents: 0
diff changeset
  2352
hgs
parents: 0
diff changeset
  2353
/**
hgs
parents: 0
diff changeset
  2354
 * gst_rtsp_connection_clear_auth_params:
hgs
parents: 0
diff changeset
  2355
 * @conn: a #GstRTSPConnection
hgs
parents: 0
diff changeset
  2356
 *
hgs
parents: 0
diff changeset
  2357
 * Clear the list of authentication directives stored in @conn.
hgs
parents: 0
diff changeset
  2358
 *
hgs
parents: 0
diff changeset
  2359
 * Since: 0.10.20
hgs
parents: 0
diff changeset
  2360
 */
hgs
parents: 0
diff changeset
  2361
void
hgs
parents: 0
diff changeset
  2362
gst_rtsp_connection_clear_auth_params (GstRTSPConnection * conn)
hgs
parents: 0
diff changeset
  2363
{
hgs
parents: 0
diff changeset
  2364
  g_return_if_fail (conn != NULL);
hgs
parents: 0
diff changeset
  2365
hgs
parents: 0
diff changeset
  2366
  if (conn->auth_params != NULL) {
hgs
parents: 0
diff changeset
  2367
    g_hash_table_destroy (conn->auth_params);
hgs
parents: 0
diff changeset
  2368
    conn->auth_params = NULL;
hgs
parents: 0
diff changeset
  2369
  }
hgs
parents: 0
diff changeset
  2370
}
hgs
parents: 0
diff changeset
  2371
hgs
parents: 0
diff changeset
  2372
static GstRTSPResult
hgs
parents: 0
diff changeset
  2373
set_qos_dscp (gint fd, guint qos_dscp)
hgs
parents: 0
diff changeset
  2374
{
hgs
parents: 0
diff changeset
  2375
  union gst_sockaddr sa;
hgs
parents: 0
diff changeset
  2376
  socklen_t slen = sizeof (sa);
hgs
parents: 0
diff changeset
  2377
  gint af;
hgs
parents: 0
diff changeset
  2378
  gint tos;
hgs
parents: 0
diff changeset
  2379
hgs
parents: 0
diff changeset
  2380
  if (fd == -1)
hgs
parents: 0
diff changeset
  2381
    return GST_RTSP_OK;
hgs
parents: 0
diff changeset
  2382
hgs
parents: 0
diff changeset
  2383
  if (getsockname (fd, &sa.sa, &slen) < 0)
hgs
parents: 0
diff changeset
  2384
    goto no_getsockname;
hgs
parents: 0
diff changeset
  2385
hgs
parents: 0
diff changeset
  2386
  af = sa.sa.sa_family;
hgs
parents: 0
diff changeset
  2387
hgs
parents: 0
diff changeset
  2388
  /* if this is an IPv4-mapped address then do IPv4 QoS */
hgs
parents: 0
diff changeset
  2389
  if (af == AF_INET6) {
hgs
parents: 0
diff changeset
  2390
    if (IN6_IS_ADDR_V4MAPPED (&sa.sa_in6.sin6_addr))
hgs
parents: 0
diff changeset
  2391
      af = AF_INET;
hgs
parents: 0
diff changeset
  2392
  }
hgs
parents: 0
diff changeset
  2393
hgs
parents: 0
diff changeset
  2394
  /* extract and shift 6 bits of the DSCP */
hgs
parents: 0
diff changeset
  2395
  tos = (qos_dscp & 0x3f) << 2;
hgs
parents: 0
diff changeset
  2396
hgs
parents: 0
diff changeset
  2397
  switch (af) {
hgs
parents: 0
diff changeset
  2398
    case AF_INET:
hgs
parents: 0
diff changeset
  2399
      if (SETSOCKOPT (fd, IPPROTO_IP, IP_TOS, &tos, sizeof (tos)) < 0)
hgs
parents: 0
diff changeset
  2400
        goto no_setsockopt;
hgs
parents: 0
diff changeset
  2401
      break;
hgs
parents: 0
diff changeset
  2402
    case AF_INET6:
hgs
parents: 0
diff changeset
  2403
#ifdef IPV6_TCLASS
hgs
parents: 0
diff changeset
  2404
      if (SETSOCKOPT (fd, IPPROTO_IPV6, IPV6_TCLASS, &tos, sizeof (tos)) < 0)
hgs
parents: 0
diff changeset
  2405
        goto no_setsockopt;
hgs
parents: 0
diff changeset
  2406
      break;
hgs
parents: 0
diff changeset
  2407
#endif
hgs
parents: 0
diff changeset
  2408
    default:
hgs
parents: 0
diff changeset
  2409
      goto wrong_family;
hgs
parents: 0
diff changeset
  2410
  }
hgs
parents: 0
diff changeset
  2411
hgs
parents: 0
diff changeset
  2412
  return GST_RTSP_OK;
hgs
parents: 0
diff changeset
  2413
hgs
parents: 0
diff changeset
  2414
  /* ERRORS */
hgs
parents: 0
diff changeset
  2415
no_getsockname:
hgs
parents: 0
diff changeset
  2416
no_setsockopt:
hgs
parents: 0
diff changeset
  2417
  {
hgs
parents: 0
diff changeset
  2418
    return GST_RTSP_ESYS;
hgs
parents: 0
diff changeset
  2419
  }
hgs
parents: 0
diff changeset
  2420
hgs
parents: 0
diff changeset
  2421
wrong_family:
hgs
parents: 0
diff changeset
  2422
  {
hgs
parents: 0
diff changeset
  2423
    return GST_RTSP_ERROR;
hgs
parents: 0
diff changeset
  2424
  }
hgs
parents: 0
diff changeset
  2425
}
hgs
parents: 0
diff changeset
  2426
hgs
parents: 0
diff changeset
  2427
/**
hgs
parents: 0
diff changeset
  2428
 * gst_rtsp_connection_set_qos_dscp:
hgs
parents: 0
diff changeset
  2429
 * @conn: a #GstRTSPConnection
hgs
parents: 0
diff changeset
  2430
 * @qos_dscp: DSCP value
hgs
parents: 0
diff changeset
  2431
 *
hgs
parents: 0
diff changeset
  2432
 * Configure @conn to use the specified DSCP value.
hgs
parents: 0
diff changeset
  2433
 *
hgs
parents: 0
diff changeset
  2434
 * Returns: #GST_RTSP_OK on success.
hgs
parents: 0
diff changeset
  2435
 *
hgs
parents: 0
diff changeset
  2436
 * Since: 0.10.20
hgs
parents: 0
diff changeset
  2437
 */
hgs
parents: 0
diff changeset
  2438
GstRTSPResult
hgs
parents: 0
diff changeset
  2439
gst_rtsp_connection_set_qos_dscp (GstRTSPConnection * conn, guint qos_dscp)
hgs
parents: 0
diff changeset
  2440
{
hgs
parents: 0
diff changeset
  2441
  GstRTSPResult res;
hgs
parents: 0
diff changeset
  2442
hgs
parents: 0
diff changeset
  2443
  g_return_val_if_fail (conn != NULL, GST_RTSP_EINVAL);
hgs
parents: 0
diff changeset
  2444
  g_return_val_if_fail (conn->readfd != NULL, GST_RTSP_EINVAL);
hgs
parents: 0
diff changeset
  2445
  g_return_val_if_fail (conn->writefd != NULL, GST_RTSP_EINVAL);
hgs
parents: 0
diff changeset
  2446
hgs
parents: 0
diff changeset
  2447
  res = set_qos_dscp (conn->fd0.fd, qos_dscp);
hgs
parents: 0
diff changeset
  2448
  if (res == GST_RTSP_OK)
hgs
parents: 0
diff changeset
  2449
    res = set_qos_dscp (conn->fd1.fd, qos_dscp);
hgs
parents: 0
diff changeset
  2450
hgs
parents: 0
diff changeset
  2451
  return res;
hgs
parents: 0
diff changeset
  2452
}
hgs
parents: 0
diff changeset
  2453
hgs
parents: 0
diff changeset
  2454
hgs
parents: 0
diff changeset
  2455
/**
hgs
parents: 0
diff changeset
  2456
 * gst_rtsp_connection_get_url:
hgs
parents: 0
diff changeset
  2457
 * @conn: a #GstRTSPConnection
hgs
parents: 0
diff changeset
  2458
 *
hgs
parents: 0
diff changeset
  2459
 * Retrieve the URL of the other end of @conn.
hgs
parents: 0
diff changeset
  2460
 *
hgs
parents: 0
diff changeset
  2461
 * Returns: The URL. This value remains valid until the
hgs
parents: 0
diff changeset
  2462
 * connection is freed.
hgs
parents: 0
diff changeset
  2463
 *
hgs
parents: 0
diff changeset
  2464
 * Since: 0.10.23
hgs
parents: 0
diff changeset
  2465
 */
hgs
parents: 0
diff changeset
  2466
GstRTSPUrl *
hgs
parents: 0
diff changeset
  2467
gst_rtsp_connection_get_url (const GstRTSPConnection * conn)
hgs
parents: 0
diff changeset
  2468
{
hgs
parents: 0
diff changeset
  2469
  g_return_val_if_fail (conn != NULL, NULL);
hgs
parents: 0
diff changeset
  2470
hgs
parents: 0
diff changeset
  2471
  return conn->url;
hgs
parents: 0
diff changeset
  2472
}
hgs
parents: 0
diff changeset
  2473
hgs
parents: 0
diff changeset
  2474
/**
hgs
parents: 0
diff changeset
  2475
 * gst_rtsp_connection_get_ip:
hgs
parents: 0
diff changeset
  2476
 * @conn: a #GstRTSPConnection
hgs
parents: 0
diff changeset
  2477
 *
hgs
parents: 0
diff changeset
  2478
 * Retrieve the IP address of the other end of @conn.
hgs
parents: 0
diff changeset
  2479
 *
hgs
parents: 0
diff changeset
  2480
 * Returns: The IP address as a string. this value remains valid until the
hgs
parents: 0
diff changeset
  2481
 * connection is closed.
hgs
parents: 0
diff changeset
  2482
 *
hgs
parents: 0
diff changeset
  2483
 * Since: 0.10.20
hgs
parents: 0
diff changeset
  2484
 */
hgs
parents: 0
diff changeset
  2485
const gchar *
hgs
parents: 0
diff changeset
  2486
gst_rtsp_connection_get_ip (const GstRTSPConnection * conn)
hgs
parents: 0
diff changeset
  2487
{
hgs
parents: 0
diff changeset
  2488
  g_return_val_if_fail (conn != NULL, NULL);
hgs
parents: 0
diff changeset
  2489
hgs
parents: 0
diff changeset
  2490
  return conn->ip;
hgs
parents: 0
diff changeset
  2491
}
hgs
parents: 0
diff changeset
  2492
hgs
parents: 0
diff changeset
  2493
/**
hgs
parents: 0
diff changeset
  2494
 * gst_rtsp_connection_set_ip:
hgs
parents: 0
diff changeset
  2495
 * @conn: a #GstRTSPConnection
hgs
parents: 0
diff changeset
  2496
 * @ip: an ip address
hgs
parents: 0
diff changeset
  2497
 *
hgs
parents: 0
diff changeset
  2498
 * Set the IP address of the server.
hgs
parents: 0
diff changeset
  2499
 *
hgs
parents: 0
diff changeset
  2500
 * Since: 0.10.23
hgs
parents: 0
diff changeset
  2501
 */
hgs
parents: 0
diff changeset
  2502
void
hgs
parents: 0
diff changeset
  2503
gst_rtsp_connection_set_ip (GstRTSPConnection * conn, const gchar * ip)
hgs
parents: 0
diff changeset
  2504
{
hgs
parents: 0
diff changeset
  2505
  g_return_if_fail (conn != NULL);
hgs
parents: 0
diff changeset
  2506
hgs
parents: 0
diff changeset
  2507
  g_free (conn->ip);
hgs
parents: 0
diff changeset
  2508
  conn->ip = g_strdup (ip);
hgs
parents: 0
diff changeset
  2509
}
hgs
parents: 0
diff changeset
  2510
hgs
parents: 0
diff changeset
  2511
/**
hgs
parents: 0
diff changeset
  2512
 * gst_rtsp_connection_get_readfd:
hgs
parents: 0
diff changeset
  2513
 * @conn: a #GstRTSPConnection
hgs
parents: 0
diff changeset
  2514
 *
hgs
parents: 0
diff changeset
  2515
 * Get the file descriptor for reading.
hgs
parents: 0
diff changeset
  2516
 *
hgs
parents: 0
diff changeset
  2517
 * Returns: the file descriptor used for reading or -1 on error. The file
hgs
parents: 0
diff changeset
  2518
 * descriptor remains valid until the connection is closed.
hgs
parents: 0
diff changeset
  2519
 *
hgs
parents: 0
diff changeset
  2520
 * Since: 0.10.23
hgs
parents: 0
diff changeset
  2521
 */
hgs
parents: 0
diff changeset
  2522
gint
hgs
parents: 0
diff changeset
  2523
gst_rtsp_connection_get_readfd (const GstRTSPConnection * conn)
hgs
parents: 0
diff changeset
  2524
{
hgs
parents: 0
diff changeset
  2525
  g_return_val_if_fail (conn != NULL, -1);
hgs
parents: 0
diff changeset
  2526
  g_return_val_if_fail (conn->readfd != NULL, -1);
hgs
parents: 0
diff changeset
  2527
hgs
parents: 0
diff changeset
  2528
  return conn->readfd->fd;
hgs
parents: 0
diff changeset
  2529
}
hgs
parents: 0
diff changeset
  2530
hgs
parents: 0
diff changeset
  2531
/**
hgs
parents: 0
diff changeset
  2532
 * gst_rtsp_connection_get_writefd:
hgs
parents: 0
diff changeset
  2533
 * @conn: a #GstRTSPConnection
hgs
parents: 0
diff changeset
  2534
 *
hgs
parents: 0
diff changeset
  2535
 * Get the file descriptor for writing.
hgs
parents: 0
diff changeset
  2536
 *
hgs
parents: 0
diff changeset
  2537
 * Returns: the file descriptor used for writing or -1 on error. The file
hgs
parents: 0
diff changeset
  2538
 * descriptor remains valid until the connection is closed.
hgs
parents: 0
diff changeset
  2539
 *
hgs
parents: 0
diff changeset
  2540
 * Since: 0.10.23
hgs
parents: 0
diff changeset
  2541
 */
hgs
parents: 0
diff changeset
  2542
gint
hgs
parents: 0
diff changeset
  2543
gst_rtsp_connection_get_writefd (const GstRTSPConnection * conn)
hgs
parents: 0
diff changeset
  2544
{
hgs
parents: 0
diff changeset
  2545
  g_return_val_if_fail (conn != NULL, -1);
hgs
parents: 0
diff changeset
  2546
  g_return_val_if_fail (conn->writefd != NULL, -1);
hgs
parents: 0
diff changeset
  2547
hgs
parents: 0
diff changeset
  2548
  return conn->writefd->fd;
hgs
parents: 0
diff changeset
  2549
}
hgs
parents: 0
diff changeset
  2550
hgs
parents: 0
diff changeset
  2551
hgs
parents: 0
diff changeset
  2552
/**
hgs
parents: 0
diff changeset
  2553
 * gst_rtsp_connection_set_tunneled:
hgs
parents: 0
diff changeset
  2554
 * @conn: a #GstRTSPConnection
hgs
parents: 0
diff changeset
  2555
 * @tunneled: the new state
hgs
parents: 0
diff changeset
  2556
 *
hgs
parents: 0
diff changeset
  2557
 * Set the HTTP tunneling state of the connection. This must be configured before
hgs
parents: 0
diff changeset
  2558
 * the @conn is connected.
hgs
parents: 0
diff changeset
  2559
 *
hgs
parents: 0
diff changeset
  2560
 * Since: 0.10.23
hgs
parents: 0
diff changeset
  2561
 */
hgs
parents: 0
diff changeset
  2562
void
hgs
parents: 0
diff changeset
  2563
gst_rtsp_connection_set_tunneled (GstRTSPConnection * conn, gboolean tunneled)
hgs
parents: 0
diff changeset
  2564
{
hgs
parents: 0
diff changeset
  2565
  g_return_if_fail (conn != NULL);
hgs
parents: 0
diff changeset
  2566
  g_return_if_fail (conn->readfd == NULL);
hgs
parents: 0
diff changeset
  2567
  g_return_if_fail (conn->writefd == NULL);
hgs
parents: 0
diff changeset
  2568
hgs
parents: 0
diff changeset
  2569
  conn->tunneled = tunneled;
hgs
parents: 0
diff changeset
  2570
}
hgs
parents: 0
diff changeset
  2571
hgs
parents: 0
diff changeset
  2572
/**
hgs
parents: 0
diff changeset
  2573
 * gst_rtsp_connection_is_tunneled:
hgs
parents: 0
diff changeset
  2574
 * @conn: a #GstRTSPConnection
hgs
parents: 0
diff changeset
  2575
 *
hgs
parents: 0
diff changeset
  2576
 * Get the tunneling state of the connection. 
hgs
parents: 0
diff changeset
  2577
 *
hgs
parents: 0
diff changeset
  2578
 * Returns: if @conn is using HTTP tunneling.
hgs
parents: 0
diff changeset
  2579
 *
hgs
parents: 0
diff changeset
  2580
 * Since: 0.10.23
hgs
parents: 0
diff changeset
  2581
 */
hgs
parents: 0
diff changeset
  2582
gboolean
hgs
parents: 0
diff changeset
  2583
gst_rtsp_connection_is_tunneled (const GstRTSPConnection * conn)
hgs
parents: 0
diff changeset
  2584
{
hgs
parents: 0
diff changeset
  2585
  g_return_val_if_fail (conn != NULL, FALSE);
hgs
parents: 0
diff changeset
  2586
hgs
parents: 0
diff changeset
  2587
  return conn->tunneled;
hgs
parents: 0
diff changeset
  2588
}
hgs
parents: 0
diff changeset
  2589
hgs
parents: 0
diff changeset
  2590
/**
hgs
parents: 0
diff changeset
  2591
 * gst_rtsp_connection_get_tunnelid:
hgs
parents: 0
diff changeset
  2592
 * @conn: a #GstRTSPConnection
hgs
parents: 0
diff changeset
  2593
 *
hgs
parents: 0
diff changeset
  2594
 * Get the tunnel session id the connection. 
hgs
parents: 0
diff changeset
  2595
 *
hgs
parents: 0
diff changeset
  2596
 * Returns: returns a non-empty string if @conn is being tunneled over HTTP.
hgs
parents: 0
diff changeset
  2597
 *
hgs
parents: 0
diff changeset
  2598
 * Since: 0.10.23
hgs
parents: 0
diff changeset
  2599
 */
hgs
parents: 0
diff changeset
  2600
const gchar *
hgs
parents: 0
diff changeset
  2601
gst_rtsp_connection_get_tunnelid (const GstRTSPConnection * conn)
hgs
parents: 0
diff changeset
  2602
{
hgs
parents: 0
diff changeset
  2603
  g_return_val_if_fail (conn != NULL, NULL);
hgs
parents: 0
diff changeset
  2604
hgs
parents: 0
diff changeset
  2605
  if (!conn->tunneled)
hgs
parents: 0
diff changeset
  2606
    return NULL;
hgs
parents: 0
diff changeset
  2607
hgs
parents: 0
diff changeset
  2608
  return conn->tunnelid;
hgs
parents: 0
diff changeset
  2609
}
hgs
parents: 0
diff changeset
  2610
hgs
parents: 0
diff changeset
  2611
/**
hgs
parents: 0
diff changeset
  2612
 * gst_rtsp_connection_do_tunnel:
hgs
parents: 0
diff changeset
  2613
 * @conn: a #GstRTSPConnection
hgs
parents: 0
diff changeset
  2614
 * @conn2: a #GstRTSPConnection
hgs
parents: 0
diff changeset
  2615
 *
hgs
parents: 0
diff changeset
  2616
 * If @conn received the first tunnel connection and @conn2 received
hgs
parents: 0
diff changeset
  2617
 * the second tunnel connection, link the two connections together so that
hgs
parents: 0
diff changeset
  2618
 * @conn manages the tunneled connection.
hgs
parents: 0
diff changeset
  2619
 *
hgs
parents: 0
diff changeset
  2620
 * After this call, @conn2 cannot be used anymore and must be freed with
hgs
parents: 0
diff changeset
  2621
 * gst_rtsp_connection_free().
hgs
parents: 0
diff changeset
  2622
 *
hgs
parents: 0
diff changeset
  2623
 * Returns: return GST_RTSP_OK on success.
hgs
parents: 0
diff changeset
  2624
 *
hgs
parents: 0
diff changeset
  2625
 * Since: 0.10.23
hgs
parents: 0
diff changeset
  2626
 */
hgs
parents: 0
diff changeset
  2627
GstRTSPResult
hgs
parents: 0
diff changeset
  2628
gst_rtsp_connection_do_tunnel (GstRTSPConnection * conn,
hgs
parents: 0
diff changeset
  2629
    GstRTSPConnection * conn2)
hgs
parents: 0
diff changeset
  2630
{
hgs
parents: 0
diff changeset
  2631
  g_return_val_if_fail (conn != NULL, GST_RTSP_EINVAL);
hgs
parents: 0
diff changeset
  2632
  g_return_val_if_fail (conn2 != NULL, GST_RTSP_EINVAL);
hgs
parents: 0
diff changeset
  2633
  g_return_val_if_fail (conn->tstate == TUNNEL_STATE_GET, GST_RTSP_EINVAL);
hgs
parents: 0
diff changeset
  2634
  g_return_val_if_fail (conn2->tstate == TUNNEL_STATE_POST, GST_RTSP_EINVAL);
hgs
parents: 0
diff changeset
  2635
  g_return_val_if_fail (!memcmp (conn2->tunnelid, conn->tunnelid, TUNNELID_LEN),
hgs
parents: 0
diff changeset
  2636
      GST_RTSP_EINVAL);
hgs
parents: 0
diff changeset
  2637
hgs
parents: 0
diff changeset
  2638
  /* both connections have fd0 as the read/write socket. start by taking the
hgs
parents: 0
diff changeset
  2639
   * socket from conn2 and set it as the socket in conn */
hgs
parents: 0
diff changeset
  2640
  conn->fd1 = conn2->fd0;
hgs
parents: 0
diff changeset
  2641
hgs
parents: 0
diff changeset
  2642
  /* clean up some of the state of conn2 */
hgs
parents: 0
diff changeset
  2643
  gst_poll_remove_fd (conn2->fdset, &conn2->fd0);
hgs
parents: 0
diff changeset
  2644
  conn2->fd0.fd = -1;
hgs
parents: 0
diff changeset
  2645
  conn2->readfd = conn2->writefd = NULL;
hgs
parents: 0
diff changeset
  2646
hgs
parents: 0
diff changeset
  2647
  /* We make fd0 the write socket and fd1 the read socket. */
hgs
parents: 0
diff changeset
  2648
  conn->writefd = &conn->fd0;
hgs
parents: 0
diff changeset
  2649
  conn->readfd = &conn->fd1;
hgs
parents: 0
diff changeset
  2650
hgs
parents: 0
diff changeset
  2651
  conn->tstate = TUNNEL_STATE_COMPLETE;
hgs
parents: 0
diff changeset
  2652
hgs
parents: 0
diff changeset
  2653
  /* we need base64 decoding for the readfd */
hgs
parents: 0
diff changeset
  2654
  conn->ctx.state = 0;
hgs
parents: 0
diff changeset
  2655
  conn->ctx.save = 0;
hgs
parents: 0
diff changeset
  2656
  conn->ctx.cout = 0;
hgs
parents: 0
diff changeset
  2657
  conn->ctx.coutl = 0;
hgs
parents: 0
diff changeset
  2658
  conn->ctxp = &conn->ctx;
hgs
parents: 0
diff changeset
  2659
hgs
parents: 0
diff changeset
  2660
  return GST_RTSP_OK;
hgs
parents: 0
diff changeset
  2661
}
hgs
parents: 0
diff changeset
  2662
hgs
parents: 0
diff changeset
  2663
#define READ_COND   (G_IO_IN | G_IO_HUP | G_IO_ERR)
hgs
parents: 0
diff changeset
  2664
#define WRITE_COND  (G_IO_OUT | G_IO_ERR)
hgs
parents: 0
diff changeset
  2665
hgs
parents: 0
diff changeset
  2666
typedef struct
hgs
parents: 0
diff changeset
  2667
{
hgs
parents: 0
diff changeset
  2668
  guint8 *data;
hgs
parents: 0
diff changeset
  2669
  guint size;
hgs
parents: 0
diff changeset
  2670
  guint id;
hgs
parents: 0
diff changeset
  2671
} GstRTSPRec;
hgs
parents: 0
diff changeset
  2672
hgs
parents: 0
diff changeset
  2673
/* async functions */
hgs
parents: 0
diff changeset
  2674
struct _GstRTSPWatch
hgs
parents: 0
diff changeset
  2675
{
hgs
parents: 0
diff changeset
  2676
  GSource source;
hgs
parents: 0
diff changeset
  2677
hgs
parents: 0
diff changeset
  2678
  GstRTSPConnection *conn;
hgs
parents: 0
diff changeset
  2679
hgs
parents: 0
diff changeset
  2680
  GstRTSPBuilder builder;
hgs
parents: 0
diff changeset
  2681
  GstRTSPMessage message;
hgs
parents: 0
diff changeset
  2682
hgs
parents: 0
diff changeset
  2683
  GPollFD readfd;
hgs
parents: 0
diff changeset
  2684
  GPollFD writefd;
hgs
parents: 0
diff changeset
  2685
  gboolean write_added;
hgs
parents: 0
diff changeset
  2686
hgs
parents: 0
diff changeset
  2687
  /* queued message for transmission */
hgs
parents: 0
diff changeset
  2688
  guint id;
hgs
parents: 0
diff changeset
  2689
  GAsyncQueue *messages;
hgs
parents: 0
diff changeset
  2690
  guint8 *write_data;
hgs
parents: 0
diff changeset
  2691
  guint write_off;
hgs
parents: 0
diff changeset
  2692
  guint write_size;
hgs
parents: 0
diff changeset
  2693
  guint write_id;
hgs
parents: 0
diff changeset
  2694
hgs
parents: 0
diff changeset
  2695
  GstRTSPWatchFuncs funcs;
hgs
parents: 0
diff changeset
  2696
hgs
parents: 0
diff changeset
  2697
  gpointer user_data;
hgs
parents: 0
diff changeset
  2698
  GDestroyNotify notify;
hgs
parents: 0
diff changeset
  2699
};
hgs
parents: 0
diff changeset
  2700
hgs
parents: 0
diff changeset
  2701
static gboolean
hgs
parents: 0
diff changeset
  2702
gst_rtsp_source_prepare (GSource * source, gint * timeout)
hgs
parents: 0
diff changeset
  2703
{
hgs
parents: 0
diff changeset
  2704
  GstRTSPWatch *watch = (GstRTSPWatch *) source;
hgs
parents: 0
diff changeset
  2705
hgs
parents: 0
diff changeset
  2706
  *timeout = (watch->conn->timeout * 1000);
hgs
parents: 0
diff changeset
  2707
hgs
parents: 0
diff changeset
  2708
  return FALSE;
hgs
parents: 0
diff changeset
  2709
}
hgs
parents: 0
diff changeset
  2710
hgs
parents: 0
diff changeset
  2711
static gboolean
hgs
parents: 0
diff changeset
  2712
gst_rtsp_source_check (GSource * source)
hgs
parents: 0
diff changeset
  2713
{
hgs
parents: 0
diff changeset
  2714
  GstRTSPWatch *watch = (GstRTSPWatch *) source;
hgs
parents: 0
diff changeset
  2715
hgs
parents: 0
diff changeset
  2716
  if (watch->readfd.revents & READ_COND)
hgs
parents: 0
diff changeset
  2717
    return TRUE;
hgs
parents: 0
diff changeset
  2718
hgs
parents: 0
diff changeset
  2719
  if (watch->writefd.revents & WRITE_COND)
hgs
parents: 0
diff changeset
  2720
    return TRUE;
hgs
parents: 0
diff changeset
  2721
hgs
parents: 0
diff changeset
  2722
  return FALSE;
hgs
parents: 0
diff changeset
  2723
}
hgs
parents: 0
diff changeset
  2724
hgs
parents: 0
diff changeset
  2725
static gboolean
hgs
parents: 0
diff changeset
  2726
gst_rtsp_source_dispatch (GSource * source, GSourceFunc callback G_GNUC_UNUSED,
hgs
parents: 0
diff changeset
  2727
    gpointer user_data G_GNUC_UNUSED)
hgs
parents: 0
diff changeset
  2728
{
hgs
parents: 0
diff changeset
  2729
  GstRTSPWatch *watch = (GstRTSPWatch *) source;
hgs
parents: 0
diff changeset
  2730
  GstRTSPResult res;
hgs
parents: 0
diff changeset
  2731
hgs
parents: 0
diff changeset
  2732
  /* first read as much as we can */
hgs
parents: 0
diff changeset
  2733
  if (watch->readfd.revents & READ_COND) {
hgs
parents: 0
diff changeset
  2734
    do {
hgs
parents: 0
diff changeset
  2735
      res = build_next (&watch->builder, &watch->message, watch->conn);
hgs
parents: 0
diff changeset
  2736
      if (res == GST_RTSP_EINTR)
hgs
parents: 0
diff changeset
  2737
        break;
hgs
parents: 0
diff changeset
  2738
      if (G_UNLIKELY (res == GST_RTSP_EEOF))
hgs
parents: 0
diff changeset
  2739
        goto eof;
hgs
parents: 0
diff changeset
  2740
      if (res == GST_RTSP_ETGET) {
hgs
parents: 0
diff changeset
  2741
        GString *str;
hgs
parents: 0
diff changeset
  2742
        GstRTSPStatusCode code;
hgs
parents: 0
diff changeset
  2743
        guint size;
hgs
parents: 0
diff changeset
  2744
hgs
parents: 0
diff changeset
  2745
        if (watch->funcs.tunnel_start)
hgs
parents: 0
diff changeset
  2746
          code = watch->funcs.tunnel_start (watch, watch->user_data);
hgs
parents: 0
diff changeset
  2747
        else
hgs
parents: 0
diff changeset
  2748
          code = GST_RTSP_STS_OK;
hgs
parents: 0
diff changeset
  2749
hgs
parents: 0
diff changeset
  2750
        /* queue the response string */
hgs
parents: 0
diff changeset
  2751
        str = gen_tunnel_reply (watch->conn, code);
hgs
parents: 0
diff changeset
  2752
        size = str->len;
hgs
parents: 0
diff changeset
  2753
        gst_rtsp_watch_queue_data (watch, (guint8 *) g_string_free (str, FALSE),
hgs
parents: 0
diff changeset
  2754
            size);
hgs
parents: 0
diff changeset
  2755
      } else if (res == GST_RTSP_ETPOST) {
hgs
parents: 0
diff changeset
  2756
        /* in the callback the connection should be tunneled with the
hgs
parents: 0
diff changeset
  2757
         * GET connection */
hgs
parents: 0
diff changeset
  2758
        if (watch->funcs.tunnel_complete)
hgs
parents: 0
diff changeset
  2759
          watch->funcs.tunnel_complete (watch, watch->user_data);
hgs
parents: 0
diff changeset
  2760
      } else if (G_UNLIKELY (res != GST_RTSP_OK))
hgs
parents: 0
diff changeset
  2761
        goto error;
hgs
parents: 0
diff changeset
  2762
hgs
parents: 0
diff changeset
  2763
      if (G_LIKELY (res == GST_RTSP_OK)) {
hgs
parents: 0
diff changeset
  2764
        if (watch->funcs.message_received)
hgs
parents: 0
diff changeset
  2765
          watch->funcs.message_received (watch, &watch->message,
hgs
parents: 0
diff changeset
  2766
              watch->user_data);
hgs
parents: 0
diff changeset
  2767
hgs
parents: 0
diff changeset
  2768
        gst_rtsp_message_unset (&watch->message);
hgs
parents: 0
diff changeset
  2769
      }
hgs
parents: 0
diff changeset
  2770
      build_reset (&watch->builder);
hgs
parents: 0
diff changeset
  2771
    } while (FALSE);
hgs
parents: 0
diff changeset
  2772
  }
hgs
parents: 0
diff changeset
  2773
hgs
parents: 0
diff changeset
  2774
  if (watch->writefd.revents & WRITE_COND) {
hgs
parents: 0
diff changeset
  2775
    do {
hgs
parents: 0
diff changeset
  2776
      if (watch->write_data == NULL) {
hgs
parents: 0
diff changeset
  2777
        GstRTSPRec *rec;
hgs
parents: 0
diff changeset
  2778
hgs
parents: 0
diff changeset
  2779
        /* get a new message from the queue */
hgs
parents: 0
diff changeset
  2780
        rec = g_async_queue_try_pop (watch->messages);
hgs
parents: 0
diff changeset
  2781
        if (rec == NULL)
hgs
parents: 0
diff changeset
  2782
          goto done;
hgs
parents: 0
diff changeset
  2783
hgs
parents: 0
diff changeset
  2784
        watch->write_off = 0;
hgs
parents: 0
diff changeset
  2785
        watch->write_data = rec->data;
hgs
parents: 0
diff changeset
  2786
        watch->write_size = rec->size;
hgs
parents: 0
diff changeset
  2787
        watch->write_id = rec->id;
hgs
parents: 0
diff changeset
  2788
hgs
parents: 0
diff changeset
  2789
        g_slice_free (GstRTSPRec, rec);
hgs
parents: 0
diff changeset
  2790
      }
hgs
parents: 0
diff changeset
  2791
hgs
parents: 0
diff changeset
  2792
      res = write_bytes (watch->writefd.fd, watch->write_data,
hgs
parents: 0
diff changeset
  2793
          &watch->write_off, watch->write_size);
hgs
parents: 0
diff changeset
  2794
      if (res == GST_RTSP_EINTR)
hgs
parents: 0
diff changeset
  2795
        break;
hgs
parents: 0
diff changeset
  2796
      if (G_UNLIKELY (res != GST_RTSP_OK))
hgs
parents: 0
diff changeset
  2797
        goto error;
hgs
parents: 0
diff changeset
  2798
hgs
parents: 0
diff changeset
  2799
      if (watch->funcs.message_sent)
hgs
parents: 0
diff changeset
  2800
        watch->funcs.message_sent (watch, watch->write_id, watch->user_data);
hgs
parents: 0
diff changeset
  2801
hgs
parents: 0
diff changeset
  2802
    done:
hgs
parents: 0
diff changeset
  2803
      if (g_async_queue_length (watch->messages) == 0 && watch->write_added) {
hgs
parents: 0
diff changeset
  2804
        g_source_remove_poll ((GSource *) watch, &watch->writefd);
hgs
parents: 0
diff changeset
  2805
        watch->write_added = FALSE;
hgs
parents: 0
diff changeset
  2806
        watch->writefd.revents = 0;
hgs
parents: 0
diff changeset
  2807
      }
hgs
parents: 0
diff changeset
  2808
      g_free (watch->write_data);
hgs
parents: 0
diff changeset
  2809
      watch->write_data = NULL;
hgs
parents: 0
diff changeset
  2810
    } while (FALSE);
hgs
parents: 0
diff changeset
  2811
  }
hgs
parents: 0
diff changeset
  2812
hgs
parents: 0
diff changeset
  2813
  return TRUE;
hgs
parents: 0
diff changeset
  2814
hgs
parents: 0
diff changeset
  2815
  /* ERRORS */
hgs
parents: 0
diff changeset
  2816
eof:
hgs
parents: 0
diff changeset
  2817
  {
hgs
parents: 0
diff changeset
  2818
    if (watch->funcs.closed)
hgs
parents: 0
diff changeset
  2819
      watch->funcs.closed (watch, watch->user_data);
hgs
parents: 0
diff changeset
  2820
    return FALSE;
hgs
parents: 0
diff changeset
  2821
  }
hgs
parents: 0
diff changeset
  2822
error:
hgs
parents: 0
diff changeset
  2823
  {
hgs
parents: 0
diff changeset
  2824
    if (watch->funcs.error)
hgs
parents: 0
diff changeset
  2825
      watch->funcs.error (watch, res, watch->user_data);
hgs
parents: 0
diff changeset
  2826
    return FALSE;
hgs
parents: 0
diff changeset
  2827
  }
hgs
parents: 0
diff changeset
  2828
}
hgs
parents: 0
diff changeset
  2829
hgs
parents: 0
diff changeset
  2830
static void
hgs
parents: 0
diff changeset
  2831
gst_rtsp_rec_free (gpointer data)
hgs
parents: 0
diff changeset
  2832
{
hgs
parents: 0
diff changeset
  2833
  GstRTSPRec *rec = data;
hgs
parents: 0
diff changeset
  2834
hgs
parents: 0
diff changeset
  2835
  g_free (rec->data);
hgs
parents: 0
diff changeset
  2836
  g_slice_free (GstRTSPRec, rec);
hgs
parents: 0
diff changeset
  2837
}
hgs
parents: 0
diff changeset
  2838
hgs
parents: 0
diff changeset
  2839
static void
hgs
parents: 0
diff changeset
  2840
gst_rtsp_source_finalize (GSource * source)
hgs
parents: 0
diff changeset
  2841
{
hgs
parents: 0
diff changeset
  2842
  GstRTSPWatch *watch = (GstRTSPWatch *) source;
hgs
parents: 0
diff changeset
  2843
hgs
parents: 0
diff changeset
  2844
  build_reset (&watch->builder);
hgs
parents: 0
diff changeset
  2845
  gst_rtsp_message_unset (&watch->message);
hgs
parents: 0
diff changeset
  2846
hgs
parents: 0
diff changeset
  2847
  g_async_queue_unref (watch->messages);
hgs
parents: 0
diff changeset
  2848
  watch->messages = NULL;
hgs
parents: 0
diff changeset
  2849
hgs
parents: 0
diff changeset
  2850
  g_free (watch->write_data);
hgs
parents: 0
diff changeset
  2851
hgs
parents: 0
diff changeset
  2852
  if (watch->notify)
hgs
parents: 0
diff changeset
  2853
    watch->notify (watch->user_data);
hgs
parents: 0
diff changeset
  2854
}
hgs
parents: 0
diff changeset
  2855
hgs
parents: 0
diff changeset
  2856
static GSourceFuncs gst_rtsp_source_funcs = {
hgs
parents: 0
diff changeset
  2857
  gst_rtsp_source_prepare,
hgs
parents: 0
diff changeset
  2858
  gst_rtsp_source_check,
hgs
parents: 0
diff changeset
  2859
  gst_rtsp_source_dispatch,
hgs
parents: 0
diff changeset
  2860
  gst_rtsp_source_finalize,
hgs
parents: 0
diff changeset
  2861
  NULL,
hgs
parents: 0
diff changeset
  2862
  NULL
hgs
parents: 0
diff changeset
  2863
};
hgs
parents: 0
diff changeset
  2864
hgs
parents: 0
diff changeset
  2865
/**
hgs
parents: 0
diff changeset
  2866
 * gst_rtsp_watch_new:
hgs
parents: 0
diff changeset
  2867
 * @conn: a #GstRTSPConnection
hgs
parents: 0
diff changeset
  2868
 * @funcs: watch functions
hgs
parents: 0
diff changeset
  2869
 * @user_data: user data to pass to @funcs
hgs
parents: 0
diff changeset
  2870
 * @notify: notify when @user_data is not referenced anymore
hgs
parents: 0
diff changeset
  2871
 *
hgs
parents: 0
diff changeset
  2872
 * Create a watch object for @conn. The functions provided in @funcs will be
hgs
parents: 0
diff changeset
  2873
 * called with @user_data when activity happened on the watch.
hgs
parents: 0
diff changeset
  2874
 *
hgs
parents: 0
diff changeset
  2875
 * The new watch is usually created so that it can be attached to a
hgs
parents: 0
diff changeset
  2876
 * maincontext with gst_rtsp_watch_attach(). 
hgs
parents: 0
diff changeset
  2877
 *
hgs
parents: 0
diff changeset
  2878
 * @conn must exist for the entire lifetime of the watch.
hgs
parents: 0
diff changeset
  2879
 *
hgs
parents: 0
diff changeset
  2880
 * Returns: a #GstRTSPWatch that can be used for asynchronous RTSP
hgs
parents: 0
diff changeset
  2881
 * communication. Free with gst_rtsp_watch_unref () after usage.
hgs
parents: 0
diff changeset
  2882
 *
hgs
parents: 0
diff changeset
  2883
 * Since: 0.10.23
hgs
parents: 0
diff changeset
  2884
 */
hgs
parents: 0
diff changeset
  2885
GstRTSPWatch *
hgs
parents: 0
diff changeset
  2886
gst_rtsp_watch_new (GstRTSPConnection * conn,
hgs
parents: 0
diff changeset
  2887
    GstRTSPWatchFuncs * funcs, gpointer user_data, GDestroyNotify notify)
hgs
parents: 0
diff changeset
  2888
{
hgs
parents: 0
diff changeset
  2889
  GstRTSPWatch *result;
hgs
parents: 0
diff changeset
  2890
hgs
parents: 0
diff changeset
  2891
  g_return_val_if_fail (conn != NULL, NULL);
hgs
parents: 0
diff changeset
  2892
  g_return_val_if_fail (funcs != NULL, NULL);
hgs
parents: 0
diff changeset
  2893
  g_return_val_if_fail (conn->readfd != NULL, NULL);
hgs
parents: 0
diff changeset
  2894
  g_return_val_if_fail (conn->writefd != NULL, NULL);
hgs
parents: 0
diff changeset
  2895
hgs
parents: 0
diff changeset
  2896
  result = (GstRTSPWatch *) g_source_new (&gst_rtsp_source_funcs,
hgs
parents: 0
diff changeset
  2897
      sizeof (GstRTSPWatch));
hgs
parents: 0
diff changeset
  2898
hgs
parents: 0
diff changeset
  2899
  result->conn = conn;
hgs
parents: 0
diff changeset
  2900
  result->builder.state = STATE_START;
hgs
parents: 0
diff changeset
  2901
hgs
parents: 0
diff changeset
  2902
  result->messages = g_async_queue_new_full (gst_rtsp_rec_free);
hgs
parents: 0
diff changeset
  2903
hgs
parents: 0
diff changeset
  2904
  result->readfd.fd = -1;
hgs
parents: 0
diff changeset
  2905
  result->writefd.fd = -1;
hgs
parents: 0
diff changeset
  2906
hgs
parents: 0
diff changeset
  2907
  gst_rtsp_watch_reset (result);
hgs
parents: 0
diff changeset
  2908
hgs
parents: 0
diff changeset
  2909
  result->funcs = *funcs;
hgs
parents: 0
diff changeset
  2910
  result->user_data = user_data;
hgs
parents: 0
diff changeset
  2911
  result->notify = notify;
hgs
parents: 0
diff changeset
  2912
hgs
parents: 0
diff changeset
  2913
  /* only add the read fd, the write fd is only added when we have data
hgs
parents: 0
diff changeset
  2914
   * to send. */
hgs
parents: 0
diff changeset
  2915
  g_source_add_poll ((GSource *) result, &result->readfd);
hgs
parents: 0
diff changeset
  2916
hgs
parents: 0
diff changeset
  2917
  return result;
hgs
parents: 0
diff changeset
  2918
}
hgs
parents: 0
diff changeset
  2919
hgs
parents: 0
diff changeset
  2920
/**
hgs
parents: 0
diff changeset
  2921
 * gst_rtsp_watch_reset:
hgs
parents: 0
diff changeset
  2922
 * @watch: a #GstRTSPWatch
hgs
parents: 0
diff changeset
  2923
 *
hgs
parents: 0
diff changeset
  2924
 * Reset @watch, this is usually called after gst_rtsp_connection_do_tunnel()
hgs
parents: 0
diff changeset
  2925
 * when the file descriptors of the connection might have changed.
hgs
parents: 0
diff changeset
  2926
 *
hgs
parents: 0
diff changeset
  2927
 * Since: 0.10.23
hgs
parents: 0
diff changeset
  2928
 */
hgs
parents: 0
diff changeset
  2929
void
hgs
parents: 0
diff changeset
  2930
gst_rtsp_watch_reset (GstRTSPWatch * watch)
hgs
parents: 0
diff changeset
  2931
{
hgs
parents: 0
diff changeset
  2932
  if (watch->readfd.fd != -1)
hgs
parents: 0
diff changeset
  2933
    g_source_remove_poll ((GSource *) watch, &watch->readfd);
hgs
parents: 0
diff changeset
  2934
  if (watch->writefd.fd != -1)
hgs
parents: 0
diff changeset
  2935
    g_source_remove_poll ((GSource *) watch, &watch->writefd);
hgs
parents: 0
diff changeset
  2936
hgs
parents: 0
diff changeset
  2937
  watch->readfd.fd = watch->conn->readfd->fd;
hgs
parents: 0
diff changeset
  2938
  watch->readfd.events = READ_COND;
hgs
parents: 0
diff changeset
  2939
  watch->readfd.revents = 0;
hgs
parents: 0
diff changeset
  2940
hgs
parents: 0
diff changeset
  2941
  watch->writefd.fd = watch->conn->writefd->fd;
hgs
parents: 0
diff changeset
  2942
  watch->writefd.events = WRITE_COND;
hgs
parents: 0
diff changeset
  2943
  watch->writefd.revents = 0;
hgs
parents: 0
diff changeset
  2944
  watch->write_added = FALSE;
hgs
parents: 0
diff changeset
  2945
hgs
parents: 0
diff changeset
  2946
  g_source_add_poll ((GSource *) watch, &watch->readfd);
hgs
parents: 0
diff changeset
  2947
}
hgs
parents: 0
diff changeset
  2948
hgs
parents: 0
diff changeset
  2949
/**
hgs
parents: 0
diff changeset
  2950
 * gst_rtsp_watch_attach:
hgs
parents: 0
diff changeset
  2951
 * @watch: a #GstRTSPWatch
hgs
parents: 0
diff changeset
  2952
 * @context: a GMainContext (if NULL, the default context will be used)
hgs
parents: 0
diff changeset
  2953
 *
hgs
parents: 0
diff changeset
  2954
 * Adds a #GstRTSPWatch to a context so that it will be executed within that context.
hgs
parents: 0
diff changeset
  2955
 *
hgs
parents: 0
diff changeset
  2956
 * Returns: the ID (greater than 0) for the watch within the GMainContext. 
hgs
parents: 0
diff changeset
  2957
 *
hgs
parents: 0
diff changeset
  2958
 * Since: 0.10.23
hgs
parents: 0
diff changeset
  2959
 */
hgs
parents: 0
diff changeset
  2960
guint
hgs
parents: 0
diff changeset
  2961
gst_rtsp_watch_attach (GstRTSPWatch * watch, GMainContext * context)
hgs
parents: 0
diff changeset
  2962
{
hgs
parents: 0
diff changeset
  2963
  g_return_val_if_fail (watch != NULL, 0);
hgs
parents: 0
diff changeset
  2964
hgs
parents: 0
diff changeset
  2965
  return g_source_attach ((GSource *) watch, context);
hgs
parents: 0
diff changeset
  2966
}
hgs
parents: 0
diff changeset
  2967
hgs
parents: 0
diff changeset
  2968
/**
hgs
parents: 0
diff changeset
  2969
 * gst_rtsp_watch_unref:
hgs
parents: 0
diff changeset
  2970
 * @watch: a #GstRTSPWatch
hgs
parents: 0
diff changeset
  2971
 *
hgs
parents: 0
diff changeset
  2972
 * Decreases the reference count of @watch by one. If the resulting reference
hgs
parents: 0
diff changeset
  2973
 * count is zero the watch and associated memory will be destroyed.
hgs
parents: 0
diff changeset
  2974
 *
hgs
parents: 0
diff changeset
  2975
 * Since: 0.10.23
hgs
parents: 0
diff changeset
  2976
 */
hgs
parents: 0
diff changeset
  2977
void
hgs
parents: 0
diff changeset
  2978
gst_rtsp_watch_unref (GstRTSPWatch * watch)
hgs
parents: 0
diff changeset
  2979
{
hgs
parents: 0
diff changeset
  2980
  g_return_if_fail (watch != NULL);
hgs
parents: 0
diff changeset
  2981
hgs
parents: 0
diff changeset
  2982
  g_source_unref ((GSource *) watch);
hgs
parents: 0
diff changeset
  2983
}
hgs
parents: 0
diff changeset
  2984
hgs
parents: 0
diff changeset
  2985
/**
hgs
parents: 0
diff changeset
  2986
 * gst_rtsp_watch_queue_data:
hgs
parents: 0
diff changeset
  2987
 * @watch: a #GstRTSPWatch
hgs
parents: 0
diff changeset
  2988
 * @data: the data to queue
hgs
parents: 0
diff changeset
  2989
 * @size: the size of @data
hgs
parents: 0
diff changeset
  2990
 *
hgs
parents: 0
diff changeset
  2991
 * Queue @data for transmission in @watch. It will be transmitted when the
hgs
parents: 0
diff changeset
  2992
 * connection of the @watch becomes writable.
hgs
parents: 0
diff changeset
  2993
 *
hgs
parents: 0
diff changeset
  2994
 * This function will take ownership of @data and g_free() it after use.
hgs
parents: 0
diff changeset
  2995
 *
hgs
parents: 0
diff changeset
  2996
 * The return value of this function will be used as the id argument in the
hgs
parents: 0
diff changeset
  2997
 * message_sent callback.
hgs
parents: 0
diff changeset
  2998
 *
hgs
parents: 0
diff changeset
  2999
 * Returns: an id.
hgs
parents: 0
diff changeset
  3000
 *
hgs
parents: 0
diff changeset
  3001
 * Since: 0.10.24
hgs
parents: 0
diff changeset
  3002
 */
hgs
parents: 0
diff changeset
  3003
guint
hgs
parents: 0
diff changeset
  3004
gst_rtsp_watch_queue_data (GstRTSPWatch * watch, const guint8 * data,
hgs
parents: 0
diff changeset
  3005
    guint size)
hgs
parents: 0
diff changeset
  3006
{
hgs
parents: 0
diff changeset
  3007
  GstRTSPRec *rec;
hgs
parents: 0
diff changeset
  3008
hgs
parents: 0
diff changeset
  3009
  g_return_val_if_fail (watch != NULL, GST_RTSP_EINVAL);
hgs
parents: 0
diff changeset
  3010
  g_return_val_if_fail (data != NULL, GST_RTSP_EINVAL);
hgs
parents: 0
diff changeset
  3011
  g_return_val_if_fail (size != 0, GST_RTSP_EINVAL);
hgs
parents: 0
diff changeset
  3012
hgs
parents: 0
diff changeset
  3013
  /* make a record with the data and id */
hgs
parents: 0
diff changeset
  3014
  rec = g_slice_new (GstRTSPRec);
hgs
parents: 0
diff changeset
  3015
  rec->data = (guint8 *) data;
hgs
parents: 0
diff changeset
  3016
  rec->size = size;
hgs
parents: 0
diff changeset
  3017
  do {
hgs
parents: 0
diff changeset
  3018
    /* make sure rec->id is never 0 */
hgs
parents: 0
diff changeset
  3019
    rec->id = ++watch->id;
hgs
parents: 0
diff changeset
  3020
  } while (G_UNLIKELY (rec->id == 0));
hgs
parents: 0
diff changeset
  3021
hgs
parents: 0
diff changeset
  3022
  /* add the record to a queue. FIXME we would like to have an upper limit here */
hgs
parents: 0
diff changeset
  3023
  g_async_queue_push (watch->messages, rec);
hgs
parents: 0
diff changeset
  3024
hgs
parents: 0
diff changeset
  3025
  /* FIXME: does the following need to be made thread-safe? (this might be
hgs
parents: 0
diff changeset
  3026
   * called from a streaming thread, like appsink's render function) */
hgs
parents: 0
diff changeset
  3027
  /* make sure the main context will now also check for writability on the
hgs
parents: 0
diff changeset
  3028
   * socket */
hgs
parents: 0
diff changeset
  3029
  if (!watch->write_added) {
hgs
parents: 0
diff changeset
  3030
    g_source_add_poll ((GSource *) watch, &watch->writefd);
hgs
parents: 0
diff changeset
  3031
    watch->write_added = TRUE;
hgs
parents: 0
diff changeset
  3032
  }
hgs
parents: 0
diff changeset
  3033
hgs
parents: 0
diff changeset
  3034
  return rec->id;
hgs
parents: 0
diff changeset
  3035
}
hgs
parents: 0
diff changeset
  3036
hgs
parents: 0
diff changeset
  3037
/**
hgs
parents: 0
diff changeset
  3038
 * gst_rtsp_watch_queue_message:
hgs
parents: 0
diff changeset
  3039
 * @watch: a #GstRTSPWatch
hgs
parents: 0
diff changeset
  3040
 * @message: a #GstRTSPMessage
hgs
parents: 0
diff changeset
  3041
 *
hgs
parents: 0
diff changeset
  3042
 * Queue a @message for transmission in @watch. The contents of this
hgs
parents: 0
diff changeset
  3043
 * message will be serialized and transmitted when the connection of the
hgs
parents: 0
diff changeset
  3044
 * @watch becomes writable.
hgs
parents: 0
diff changeset
  3045
 *
hgs
parents: 0
diff changeset
  3046
 * The return value of this function will be used as the id argument in the
hgs
parents: 0
diff changeset
  3047
 * message_sent callback.
hgs
parents: 0
diff changeset
  3048
 *
hgs
parents: 0
diff changeset
  3049
 * Returns: an id.
hgs
parents: 0
diff changeset
  3050
 *
hgs
parents: 0
diff changeset
  3051
 * Since: 0.10.23
hgs
parents: 0
diff changeset
  3052
 */
hgs
parents: 0
diff changeset
  3053
guint
hgs
parents: 0
diff changeset
  3054
gst_rtsp_watch_queue_message (GstRTSPWatch * watch, GstRTSPMessage * message)
hgs
parents: 0
diff changeset
  3055
{
hgs
parents: 0
diff changeset
  3056
  GString *str;
hgs
parents: 0
diff changeset
  3057
  guint size;
hgs
parents: 0
diff changeset
  3058
hgs
parents: 0
diff changeset
  3059
  g_return_val_if_fail (watch != NULL, GST_RTSP_EINVAL);
hgs
parents: 0
diff changeset
  3060
  g_return_val_if_fail (message != NULL, GST_RTSP_EINVAL);
hgs
parents: 0
diff changeset
  3061
hgs
parents: 0
diff changeset
  3062
  /* make a record with the message as a string and id */
hgs
parents: 0
diff changeset
  3063
  str = message_to_string (watch->conn, message);
hgs
parents: 0
diff changeset
  3064
  size = str->len;
hgs
parents: 0
diff changeset
  3065
  return gst_rtsp_watch_queue_data (watch,
hgs
parents: 0
diff changeset
  3066
      (guint8 *) g_string_free (str, FALSE), size);
hgs
parents: 0
diff changeset
  3067
}