[svn r700] Reduced the quantity of max retries number on file_read.
2 * @author Artur Duque de Souza <souza.artur@indt.org.br>
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU Lesser General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 m * You should have received a copy of the GNU Lesser General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
23 #include <sys/socket.h> /* for socket(), connect(), send(), and recv() */
24 #include <arpa/inet.h> /* for sockaddr_in and inet_addr() */
25 #include <stdlib.h> /* for atoi() and exit() */
26 #include <string.h> /* for memset() */
27 #include <unistd.h> /* for close() */
31 #include <glib/gprintf.h>
32 #include <glib/gstdio.h>
33 #include <gmyth-stream-client.h>
35 #include <libgnomevfs/gnome-vfs-module.h>
36 #include <libgnomevfs/gnome-vfs-utils.h>
38 #define BUFFER_SIZE 4096
44 GMythStreamClient *stream;
63 static gmsHandle* gmsHandle_new(GnomeVFSURI *uri);
66 do_open (GnomeVFSMethod *method,
67 GnomeVFSMethodHandle **method_handle,
69 GnomeVFSOpenMode mode,
70 GnomeVFSContext *context);
73 do_read (GnomeVFSMethod *method,
74 GnomeVFSMethodHandle *method_handle,
76 GnomeVFSFileSize bytes,
77 GnomeVFSFileSize *bytes_read,
78 GnomeVFSContext *context);
81 do_close (GnomeVFSMethod * method,
82 GnomeVFSMethodHandle * method_handle,
83 GnomeVFSContext * context);
86 do_get_file_info (GnomeVFSMethod * method,
88 GnomeVFSFileInfo * file_info,
89 GnomeVFSFileInfoOptions options,
90 GnomeVFSContext * context);
94 do_get_file_info_from_handle (GnomeVFSMethod *method,
95 GnomeVFSMethodHandle *method_handle,
96 GnomeVFSFileInfo *file_info,
97 GnomeVFSFileInfoOptions options,
98 GnomeVFSContext *context);
102 do_is_local (GnomeVFSMethod * method, const GnomeVFSURI * uri);
105 static gmsHandle* gmsHandle_new(GnomeVFSURI *uri)
107 gmsHandle* handler = (gmsHandle*)g_malloc0(sizeof(gmsHandle));
109 handler->hostname = (gchar*)gnome_vfs_uri_get_host_name(uri);
110 handler->port = gnome_vfs_uri_get_host_port(uri);
111 handler->stream = gmyth_stream_client_new ();
116 static GnomeVFSMethod method = {
117 sizeof (GnomeVFSMethod),
120 do_close, /* close */
125 NULL, /* truncate_handle */
126 NULL, /* open_directory */
127 NULL, /* close_directory */
128 NULL, /* read_directory */
129 do_get_file_info, /* get_file_info */
130 do_get_file_info_from_handle, /* get_file_info_from_handle */
131 do_is_local, /* is_local */
132 NULL, /* make_directory */
133 NULL, /* remove_directory */
136 NULL, /* check_same_fs */
137 NULL, /* set_file_info */
139 NULL, /* find_directory */
140 NULL, /* create_symbolic_link */
141 NULL, /* monitor_add */
142 NULL, /* monitor_cancel */
143 NULL /* file_control */
147 vfs_module_init (const char *method_name, const char *args)
153 vfs_module_shutdown (GnomeVFSMethod* method)
158 char* _parse_opt(char* opt)
160 char** list = g_strsplit(opt, "opt=", 2);
161 char** opts = g_strsplit(list[1], "+", 32);
166 for (aux = opts[0]; aux != NULL; aux = opts[++i])
167 value = g_strdup_printf("%s %s", value, aux);
176 _uri_parse_args (const GnomeVFSURI *uri)
178 gchar *file = gnome_vfs_unescape_string (uri->text, NULL);
180 gchar **list = g_strsplit(file, "\'", 3);
181 gchar **prefix = g_strsplit_set(list[0], "/=", 3);
182 gchar **lst = g_strsplit (list[2], "?", 0);
184 UriArgs *info = g_new0 (UriArgs, 1);
188 prop = g_strsplit_set(lst[0], "/=", 3);
190 info->file_name = g_strdup_printf ("%s://%s",\
193 //g_debug("FILENAME: [%s]", info->file_name);
198 for (walk = lst[1]; walk != NULL; walk = lst[++i])
200 prop = g_strsplit(walk, "=", 2);
202 if (g_strv_length (prop) == 2) {
203 if (strcmp (prop[0], "mux") == 0) {
204 info->mux = g_strdup (prop[1]);
205 } else if (strcmp (prop[0], "vcodec") == 0) {
206 info->vcodec = g_strdup (prop[1]);
207 } else if (strcmp (prop[0], "vbitrate") == 0) {
208 info->vbitrate = atoi (prop[1]);
209 } else if (strcmp (prop[0], "fps") == 0) {
210 info->fps = g_strtod (prop[1], NULL);
211 } else if (strcmp (prop[0], "acodec") == 0) {
212 info->acodec = g_strdup (prop[1]);
213 } else if (strcmp (prop[0], "abitrate") == 0) {
214 info->abitrate = atoi (prop[1]);
215 } else if (strcmp (prop[0], "width") == 0) {
216 info->width = atoi (prop[1]);
217 } else if (strcmp (prop[0], "height") == 0) {
218 info->height = atoi (prop[1]);
219 } else if (strcmp (prop[0], "opt") == 0) {
220 info->opt = g_strdup (_parse_opt(walk));
233 static GnomeVFSResult
234 do_open (GnomeVFSMethod *method,
235 GnomeVFSMethodHandle **method_handle,
237 GnomeVFSOpenMode mode,
238 GnomeVFSContext *context)
240 gmsHandle *handle = gmsHandle_new(uri);
243 if (!gmyth_stream_client_connect (handle->stream,
244 gnome_vfs_uri_get_host_name (uri),
245 gnome_vfs_uri_get_host_port (uri))) {
247 return GNOME_VFS_ERROR_HOST_NOT_FOUND;
250 args = _uri_parse_args (uri);
252 gint ret = gmyth_stream_client_open_stream (handle->stream,
267 gmyth_stream_client_disconnect (handle->stream);
268 return GNOME_VFS_ERROR_HOST_NOT_FOUND;
271 handle->fd = gmyth_stream_client_play_stream (handle->stream);
273 if (handle->fd == -1) {
274 gmyth_stream_client_disconnect (handle->stream);
275 return GNOME_VFS_ERROR_HOST_NOT_FOUND;
278 *method_handle = (GnomeVFSMethodHandle *) handle;
282 static GnomeVFSResult
283 do_read (GnomeVFSMethod *method,
284 GnomeVFSMethodHandle *method_handle,
286 GnomeVFSFileSize bytes,
287 GnomeVFSFileSize *bytes_read,
288 GnomeVFSContext *context)
291 gint64 total_read = 0;
292 gmsHandle *handle = (gmsHandle *) method_handle;
294 //g_debug("waiting something");
296 total_read = recv(handle->fd, buffer, BUFFER_SIZE, 0);
297 //g_debug("COULD READ: %d bytes", total_read);
298 *bytes_read = (GnomeVFSFileSize) total_read;
300 //if (total_read < 0) g_debug("ERROR!!!!!!!!!!!!!!!!");
302 if (total_read < 0) return GNOME_VFS_ERROR_INTERNAL;
303 else return GNOME_VFS_OK;
307 static GnomeVFSResult
308 do_close (GnomeVFSMethod * method,
309 GnomeVFSMethodHandle * method_handle,
310 GnomeVFSContext * context)
312 gmsHandle *handle = (gmsHandle *) method_handle;
314 g_debug("close close close");
316 gmyth_stream_client_close_stream (handle->stream);
317 gmyth_stream_client_disconnect (handle->stream);
324 static GnomeVFSResult
325 do_get_file_info (GnomeVFSMethod * method,
327 GnomeVFSFileInfo * file_info,
328 GnomeVFSFileInfoOptions options,
329 GnomeVFSContext * context)
331 file_info->valid_fields = GNOME_VFS_FILE_INFO_FIELDS_TYPE |
332 GNOME_VFS_FILE_INFO_FIELDS_PERMISSIONS;
334 file_info->type = GNOME_VFS_FILE_TYPE_SOCKET;
336 file_info->permissions = GNOME_VFS_PERM_USER_READ |
337 GNOME_VFS_PERM_OTHER_READ |
338 GNOME_VFS_PERM_GROUP_READ;
344 static GnomeVFSResult
345 do_get_file_info_from_handle (GnomeVFSMethod *method,
346 GnomeVFSMethodHandle *method_handle,
347 GnomeVFSFileInfo *file_info,
348 GnomeVFSFileInfoOptions options,
349 GnomeVFSContext *context)
351 file_info->valid_fields = GNOME_VFS_FILE_INFO_FIELDS_TYPE |
352 GNOME_VFS_FILE_INFO_FIELDS_PERMISSIONS;
354 file_info->type = GNOME_VFS_FILE_TYPE_SOCKET;
356 file_info->permissions = GNOME_VFS_PERM_USER_READ |
357 GNOME_VFS_PERM_OTHER_READ |
358 GNOME_VFS_PERM_GROUP_READ;
365 do_is_local (GnomeVFSMethod * method, const GnomeVFSURI * uri)