e6774e3a7bb1976fa60950df04ada81a84e7f737
[vlc.git] / src / input / access.c
1 /*****************************************************************************
2  * access.c
3  *****************************************************************************
4  * Copyright (C) 1999-2008 VLC authors and VideoLAN
5  * $Id$
6  *
7  * Author: Laurent Aimar <fenrir _AT_ videolan _DOT_ org>
8  *
9  * This program is free software; you can redistribute it and/or modify it
10  * under the terms of the GNU Lesser General Public License as published by
11  * the Free Software Foundation; either version 2.1 of the License, or
12  * (at your option) any later version.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17  * GNU Lesser General Public License for more details.
18  *
19  * You should have received a copy of the GNU Lesser General Public License
20  * along with this program; if not, write to the Free Software Foundation,
21  * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
22  *****************************************************************************/
23
24 #ifdef HAVE_CONFIG_H
25 # include "config.h"
26 #endif
27
28 #include <assert.h>
29
30 #include "access.h"
31 #include <libvlc.h>
32 #include <vlc_url.h>
33 #include <vlc_modules.h>
34
35 /* Decode URL (which has had its scheme stripped earlier) to a file path. */
36 char *get_path(const char *location)
37 {
38     char *url, *path;
39
40     /* Prepending "file://" is a bit hackish. But then again, we do not want
41      * to hard-code the list of schemes that use file paths in make_path().
42      */
43     if (asprintf(&url, "file://%s", location) == -1)
44         return NULL;
45
46     path = make_path (url);
47     free (url);
48     return path;
49 }
50
51 /*****************************************************************************
52  * access_New:
53  *****************************************************************************/
54 access_t *access_New(vlc_object_t *parent, input_thread_t *input,
55                      const char *mrl)
56 {
57     const char *p = strstr(mrl, "://");
58     if (p == NULL)
59         return NULL;
60
61     access_t *access = vlc_custom_create(parent, sizeof (*access), "access");
62     char *scheme = strndup(mrl, p - mrl);
63     char *location = strdup(p + 3);
64
65     if (unlikely(access == NULL || scheme == NULL || location == NULL))
66     {
67         free(location);
68         free(scheme);
69         vlc_object_release(access);
70         return NULL;
71     }
72
73     access->p_input = input;
74     access->psz_access = scheme;
75     access->psz_location = location;
76     access->psz_filepath = get_path(location);
77     access->pf_read    = NULL;
78     access->pf_block   = NULL;
79     access->pf_readdir = NULL;
80     access->pf_seek    = NULL;
81     access->pf_control = NULL;
82     access->p_sys      = NULL;
83     access_InitFields(access);
84
85     msg_Dbg(access, "creating access '%s' location='%s', path='%s'", scheme,
86             location, access->psz_filepath ? access->psz_filepath : "(null)");
87
88     access->p_module = module_need(access, "access", scheme, true);
89     if (access->p_module == NULL)
90     {
91         free(access->psz_filepath);
92         free(access->psz_location);
93         free(access->psz_access);
94         vlc_object_release(access);
95         access = NULL;
96     }
97     assert(access == NULL || access->pf_control != NULL);
98     return access;
99 }
100
101 access_t *vlc_access_NewMRL(vlc_object_t *parent, const char *mrl)
102 {
103     return access_New(parent, NULL, mrl);
104 }
105
106 void vlc_access_Delete(access_t *access)
107 {
108     module_unneed(access, access->p_module);
109
110     free(access->psz_access);
111     free(access->psz_location);
112     free(access->psz_filepath);
113     vlc_object_release(access);
114 }
115
116 /*****************************************************************************
117  * access_vaDirectoryControlHelper:
118  *****************************************************************************/
119 int access_vaDirectoryControlHelper( access_t *p_access, int i_query, va_list args )
120 {
121     VLC_UNUSED( p_access );
122
123     switch( i_query )
124     {
125         case ACCESS_CAN_SEEK:
126         case ACCESS_CAN_FASTSEEK:
127         case ACCESS_CAN_PAUSE:
128         case ACCESS_CAN_CONTROL_PACE:
129             *va_arg( args, bool* ) = false;
130             break;
131         case ACCESS_GET_PTS_DELAY:
132             *va_arg( args, int64_t * ) = 0;
133             break;
134         default:
135             return VLC_EGENERIC;
136      }
137      return VLC_SUCCESS;
138 }