melunko@38: /*
melunko@38:  * @author Hallyson Melo <hallyson.melo@indt.org.br>
melunko@38:  *
melunko@38:  * This program is free software; you can redistribute it and/or modify
melunko@38:  * it under the terms of the GNU Lesser General Public License as published by
melunko@38:  * the Free Software Foundation; either version 2 of the License, or
melunko@38:  * (at your option) any later version.
melunko@38:  *
melunko@38:  * This program is distributed in the hope that it will be useful,
melunko@38:  * but WITHOUT ANY WARRANTY; without even the implied warranty of
melunko@38:  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
melunko@38:  * GNU General Public License for more details.
melunko@38:  *
melunko@38:  * You should have received a copy of the GNU Lesser General Public License
melunko@38:  * along with this program; if not, write to the Free Software
melunko@38:  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
melunko@38:  */
melunko@38: 
melunko@38: #ifdef HAVE_CONFIG_H
melunko@38: #include <config.h>
melunko@38: #endif
melunko@38: 
melunko@38: #include <string.h>
melunko@38: #include <glib.h>
leo_sobral@441: #include <glib/gprintf.h>
leo_sobral@441: #include <glib/gstdio.h>
melunko@38: #include <math.h>
melunko@38: 
melunko@38: #include <libgnomevfs/gnome-vfs-module.h>
melunko@38: #include <libgnomevfs/gnome-vfs-utils.h>
melunko@38: 
rosfran@547: #include <gmyth/gmyth_file.h>
rosfran@277: #include <gmyth/gmyth_file_transfer.h>
rosfran@547: #include <gmyth/gmyth_file_local.h>
rosfran@277: #include <gmyth/gmyth_livetv.h>
rosfran@277: #include <gmyth/gmyth_uri.h>
rosfran@277: #include <gmyth/gmyth_recorder.h>
rosfran@277: #include <gmyth/gmyth_backendinfo.h>
rosfran@277: #include <gmyth/gmyth_util.h>
rosfran@332: #include <gmyth/gmyth_remote_util.h>
rosfran@332: #include <gmyth/gmyth_tvchain.h>
rosfran@357: #include <gmyth/gmyth_programinfo.h>
melunko@38: 
melunko@38: #define GST_MYTHTV_ID_NUM               1
melunko@38: #define MYTHTV_VERSION_DEFAULT          30
rosfran@277: #define MYTHTV_TRANSFER_MAX_WAITS       100
melunko@38: 
rosfran@361: /* internal GnomeVFS plug-in buffer size ( 120 Kbytes ) */
leo_sobral@441: #define MYTHTV_BUFFER_SIZE                          80*1024
rosfran@361: /* internally sized GnomeVFS plug-in buffer ( 4 Kbytes ) */
leo_sobral@441: #define MYTHTV_MAX_VFS_BUFFER_SIZE                  4096
rosfran@361: /* maximum number of bytes to be requested to the MythTV backend ( 64 Kbytes ) */
leo_sobral@441: #define MYTHTV_MAX_REQUEST_SIZE                     64*1024
melunko@111: 
renatofilho@456: typedef struct {
rosfran@547: 	GMythFile *file;
renatofilho@456: 	GMythLiveTV *livetv;
renatofilho@456:     GMythBackendInfo *backend_info;
renatofilho@456:     GMythURI *gmyth_uri;
renatofilho@456:     GMythRecorder *live_recorder;
renatofilho@502:     gboolean started;
renatofilho@456:     gint64 offset;
renatofilho@456: 
renatofilho@456: 	gchar *channel_name;
renatofilho@456: 
renatofilho@456: 	gint mythtv_version;
renatofilho@456: 	gboolean configured;
renatofilho@456: } MythtvHandle;
renatofilho@456: 
renatofilho@456: 
renatofilho@367: static GnomeVFSResult do_read (GnomeVFSMethod * method,
renatofilho@367: 			       GnomeVFSMethodHandle * method_handle,
renatofilho@367: 			       gpointer buffer,
renatofilho@367: 			       GnomeVFSFileSize num_bytes,
renatofilho@367: 			       GnomeVFSFileSize * bytes_read,
renatofilho@367: 			       GnomeVFSContext * context);
melunko@38: 
renatofilho@456: static GnomeVFSResult   myth_connection_start   (MythtvHandle * method_handle);
renatofilho@456: static void             myth_destroy_handle     (MythtvHandle * method_handle);
renatofilho@456: static GnomeVFSResult   myth_handle_new         (GnomeVFSURI * uri,
renatofilho@456:                                                  MythtvHandle ** method_handle);
renatofilho@456: static GnomeVFSResult   myth_get_file_info      (MythtvHandle * myth_handle,
renatofilho@456:                                                  GnomeVFSURI * uri,
renatofilho@456:                                                  GnomeVFSFileInfo * info);
melunko@111: 
renatofilho@456: static GnomeVFSResult 
renatofilho@456: myth_handle_new (GnomeVFSURI * uri,
renatofilho@456:                  MythtvHandle ** method_handle)
renatofilho@456: {   
renatofilho@456:     gchar *tmp_str1;
renatofilho@456:     gchar *tmp_str2;
renatofilho@456: 
renatofilho@456:     _GNOME_VFS_METHOD_PARAM_CHECK (*method_handle == NULL);
renatofilho@456:     
renatofilho@456: 	if (gnome_vfs_uri_get_host_name (uri) == NULL) {
renatofilho@456: 		return GNOME_VFS_ERROR_INVALID_HOST_NAME;
renatofilho@456: 	}
renatofilho@456: 
renatofilho@456:     *method_handle = g_new0 (MythtvHandle, 1);
renatofilho@456:     (*method_handle)->mythtv_version = MYTHTV_VERSION_DEFAULT;
renatofilho@456:         
renatofilho@456:     tmp_str1 = gnome_vfs_uri_to_string (uri, GNOME_VFS_URI_HIDE_NONE);
renatofilho@456:     tmp_str2 = gnome_vfs_unescape_string (tmp_str1, "");
renatofilho@456: 
renatofilho@456:     (*method_handle)->backend_info = gmyth_backend_info_new_with_uri (tmp_str2);
renatofilho@456:     (*method_handle)->gmyth_uri = gmyth_uri_new_with_value (tmp_str2);
renatofilho@456:     g_free (tmp_str1);
renatofilho@456:     g_free (tmp_str2);
renatofilho@456: 
renatofilho@456:     return GNOME_VFS_OK;
renatofilho@456: }   
renatofilho@456: 
renatofilho@456: static void
renatofilho@456: myth_destroy_handle (MythtvHandle * method_handle)
renatofilho@456: {
renatofilho@456:     //TODO: abort if in tranfer state
renatofilho@456:     
renatofilho@456:     if (method_handle->backend_info != NULL) {
renatofilho@456:         g_object_unref (method_handle->backend_info);
renatofilho@456:         method_handle->backend_info = NULL;
renatofilho@456:     }
renatofilho@456:     
renatofilho@456:     if (method_handle->channel_name != NULL) {
renatofilho@456:         g_free (method_handle->channel_name);
renatofilho@456:         method_handle->channel_name = NULL;
renatofilho@456:     }
renatofilho@456: 
renatofilho@456:     if (method_handle->livetv != NULL) {
renatofilho@456:         g_object_unref (method_handle->livetv);
renatofilho@456:         method_handle->livetv = NULL;
renatofilho@456:     }
renatofilho@456: 
rosfran@547:     if (method_handle->file != NULL) {
rosfran@547:         g_object_unref (method_handle->file);
rosfran@547:         method_handle->file = NULL;
renatofilho@456:     }
renatofilho@456: 
renatofilho@456:     if (method_handle->gmyth_uri != NULL) {
renatofilho@456:         g_object_unref (method_handle->gmyth_uri);
renatofilho@456:         method_handle->gmyth_uri = NULL;
renatofilho@456:     }
renatofilho@456: 
renatofilho@456:     g_free (method_handle);
renatofilho@456: }
renatofilho@456: 
renatofilho@456: static GnomeVFSResult
renatofilho@456: myth_get_file_info (MythtvHandle * myth_handle,
renatofilho@456:                     GnomeVFSURI * uri,
renatofilho@456:                     GnomeVFSFileInfo * info)
renatofilho@456: {
renatofilho@456:     GMythURI *gmyth_uri;
renatofilho@456:     GMythBackendInfo *backend_info;
renatofilho@456:     
renatofilho@456:     _GNOME_VFS_METHOD_PARAM_CHECK (info != NULL);
renatofilho@461:     
renatofilho@456: 
renatofilho@456:     if (myth_handle == NULL) {
renatofilho@456:         gchar *tmp_str1;
renatofilho@456:         gchar *tmp_str2;
renatofilho@456:         
renatofilho@456:         tmp_str1 = gnome_vfs_uri_to_string (uri, GNOME_VFS_URI_HIDE_NONE);
renatofilho@456:         tmp_str2 = gnome_vfs_unescape_string (tmp_str1, "");
renatofilho@456: 
renatofilho@456:         backend_info = gmyth_backend_info_new_with_uri (tmp_str2);
renatofilho@456:         gmyth_uri = gmyth_uri_new_with_value (tmp_str2);
renatofilho@456:         
renatofilho@456:         g_free (tmp_str1);
renatofilho@456:         g_free (tmp_str2);
renatofilho@456:     } else {
renatofilho@456:         backend_info = g_object_ref (myth_handle->backend_info);
renatofilho@456:         gmyth_uri = g_object_ref (myth_handle->gmyth_uri);
renatofilho@456:     }
renatofilho@456: 
renatofilho@456:     info->valid_fields = 0;
renatofilho@456: 	info->valid_fields = GNOME_VFS_FILE_INFO_FIELDS_TYPE | 
renatofilho@456:         GNOME_VFS_FILE_INFO_FIELDS_MIME_TYPE | 
renatofilho@456:         GNOME_VFS_FILE_INFO_FIELDS_PERMISSIONS;
renatofilho@456:     
renatofilho@456: 	info->type = GNOME_VFS_FILE_TYPE_REGULAR;
renatofilho@456:     
renatofilho@456: 	/* fixme: get from file extension? */
renatofilho@456: 	info->mime_type = g_strdup ("video/x-nuv");
renatofilho@456: 	info->permissions = GNOME_VFS_PERM_USER_READ | 
renatofilho@456:         GNOME_VFS_PERM_OTHER_READ | 
renatofilho@456:         GNOME_VFS_PERM_GROUP_READ;
renatofilho@456: 
renatofilho@456:    
renatofilho@456: 	info->name = g_strdup (gmyth_uri_get_path (gmyth_uri));
renatofilho@456: 
renatofilho@456:     /* file size for remote files */
renatofilho@456:     if (gmyth_uri_is_livetv (gmyth_uri) == FALSE) {
rosfran@547:         GMythFile *file = NULL;
rosfran@547:         gboolean ret = FALSE;
rosfran@547: 
renatofilho@456:         /* Verifies if the file exists */
renatofilho@456:         if (!gmyth_util_file_exists (backend_info, 
renatofilho@456:                     gmyth_uri_get_path (gmyth_uri))) {
rosfran@547:             g_object_unref (file);
renatofilho@456:             g_object_unref (backend_info);
renatofilho@456:             g_debug ("NOT FOUND %s/%d", __FUNCTION__, __LINE__);
renatofilho@456:             return GNOME_VFS_ERROR_NOT_FOUND;
renatofilho@456: 		}
renatofilho@461: 
rosfran@547:         if ( gmyth_uri_is_local_file(gmyth_uri) )
rosfran@547:         {
rosfran@547:           file = GMYTH_FILE( gmyth_file_local_new(backend_info) );
rosfran@547:           ret = gmyth_file_local_open ( GMYTH_FILE_LOCAL( file ) );
rosfran@547:         } else {
rosfran@547:           file = GMYTH_FILE( gmyth_file_transfer_new(backend_info) );
rosfran@547:           ret = gmyth_file_transfer_open ( GMYTH_FILE_TRANSFER(file), gmyth_uri_get_path (gmyth_uri));
rosfran@547:         }
rosfran@547: 
rosfran@547:         if (!ret) {
rosfran@547:             g_object_unref (file);
renatofilho@461:             g_object_unref (backend_info);
renatofilho@461:             g_debug ("NOT FOUND %s/%d", __FUNCTION__, __LINE__);
renatofilho@461:             return GNOME_VFS_ERROR_NOT_FOUND;
renatofilho@461:         }
renatofilho@456: 	
rosfran@547: 		info->size = gmyth_file_get_filesize (file);
renatofilho@456:         info->valid_fields |= GNOME_VFS_FILE_INFO_FIELDS_SIZE;
rosfran@547: 		g_object_unref (file);
renatofilho@456: 	}
renatofilho@456: 
renatofilho@456:     g_object_unref (backend_info);
renatofilho@456:     g_object_unref (gmyth_uri);
renatofilho@456:     
renatofilho@456:     return GNOME_VFS_OK;
renatofilho@456: }
renatofilho@456: 
renatofilho@456: static GnomeVFSResult
renatofilho@456: myth_connection_start (MythtvHandle * method_handle)
renatofilho@456: {
renatofilho@456:     GnomeVFSResult result = GNOME_VFS_OK;
renatofilho@456: 
renatofilho@456:     _GNOME_VFS_METHOD_PARAM_CHECK (method_handle != NULL);
renatofilho@456:     _GNOME_VFS_METHOD_PARAM_CHECK (method_handle->backend_info != NULL);
renatofilho@456: 
renatofilho@456: 	/* Connect to the backend */
renatofilho@456: 	if (gmyth_uri_is_livetv (method_handle->gmyth_uri) == TRUE) {
renatofilho@456: 		method_handle->livetv = gmyth_livetv_new (method_handle->backend_info);
renatofilho@456: 		method_handle->channel_name = gmyth_uri_get_channel_name (method_handle->gmyth_uri);
renatofilho@456:         
renatofilho@456: 		if (method_handle->channel_name != NULL) {
renatofilho@456: 		    if (gmyth_livetv_channel_name_setup (method_handle->livetv, 
renatofilho@456:                     method_handle->channel_name) == FALSE) {
renatofilho@456:                 result = GNOME_VFS_ERROR_INVALID_URI;
renatofilho@456:     			goto error;
renatofilho@456: 			}
renatofilho@456: 		} else if (gmyth_livetv_setup (method_handle->livetv) == FALSE) {
renatofilho@456:                 result = GNOME_VFS_ERROR_INVALID_URI;
renatofilho@456:                 goto error;
renatofilho@456: 		}
renatofilho@456:         
renatofilho@456: 
rosfran@547:     	method_handle->file = 
rosfran@547:             GMYTH_FILE( gmyth_livetv_create_file_transfer (method_handle->livetv) );
renatofilho@456: 
rosfran@547:         if (method_handle->file == NULL) {
renatofilho@456:             result = GNOME_VFS_ERROR_INVALID_URI;
renatofilho@456:     		g_debug ("MythTV FileTransfer is NULL!\n");
renatofilho@456:             goto error;
renatofilho@456:         }
renatofilho@456: 
rosfran@547: 	    if (!gmyth_file_transfer_open ( GMYTH_FILE_TRANSFER(method_handle->file),
renatofilho@456:                                         method_handle->livetv->uri != NULL ? 
renatofilho@456:                                         gmyth_uri_get_path (method_handle->livetv->uri) :
renatofilho@456:                                         method_handle->livetv->proginfo->pathname->str)) {
renatofilho@456:         
renatofilho@456:             g_debug ("Couldn't open MythTV FileTransfer is NULL!\n");
renatofilho@456:             result = GNOME_VFS_ERROR_NOT_OPEN;
renatofilho@456:             goto error;
renatofilho@456:         }
renatofilho@456:     }
renatofilho@456:     else {
rosfran@547:         gboolean ret = TRUE;
renatofilho@456: 		/* Verifies if the file exists */
renatofilho@456: 		if (!gmyth_util_file_exists (method_handle->backend_info, 
renatofilho@456:                     gmyth_uri_get_path (method_handle->gmyth_uri))) {
renatofilho@456: 
renatofilho@456:             g_debug ("NOT FOUND %s/%d", __FUNCTION__, __LINE__);
renatofilho@456:             goto error;
renatofilho@456: 		}
rosfran@547:         
rosfran@547:         if ( gmyth_uri_is_local_file(method_handle->gmyth_uri) )
rosfran@547:         {
rosfran@547:           method_handle->file = GMYTH_FILE( gmyth_file_local_new(method_handle->backend_info) );
rosfran@547:           ret = gmyth_file_local_open ( GMYTH_FILE_LOCAL( method_handle->file ) );
rosfran@547:         } else {
rosfran@547:           method_handle->file = GMYTH_FILE( gmyth_file_transfer_new(method_handle->backend_info) );
rosfran@547:           ret = gmyth_file_transfer_open ( GMYTH_FILE_TRANSFER(method_handle->file), 
rosfran@547:                   gmyth_uri_get_path (method_handle->gmyth_uri));
rosfran@547:         }
renatofilho@456: 
renatofilho@456: 		/* sets the Playback monitor connection */
rosfran@547: 		if (!ret) {
renatofilho@461: 
renatofilho@461:             g_debug ("NOT FOUND %s/%d", __FUNCTION__, __LINE__);
renatofilho@461: 		    result = GNOME_VFS_ERROR_NOT_FOUND;
renatofilho@461:             goto error;
renatofilho@461:         }
renatofilho@456: 	} /* if - LiveTV or not? */
renatofilho@456: 
renatofilho@456: 	method_handle->configured = TRUE;    
renatofilho@456: 
rosfran@547:     if (method_handle->file == NULL) {
renatofilho@456:         result = GNOME_VFS_ERROR_NOT_OPEN;
renatofilho@456:     }
renatofilho@456: 
renatofilho@456: error:
renatofilho@456:     
renatofilho@456:     return result; 
renatofilho@456: }
renatofilho@456: 
melunko@38: static GnomeVFSResult
renatofilho@367: do_open (GnomeVFSMethod * method,
renatofilho@367: 	 GnomeVFSMethodHandle ** method_handle,
renatofilho@367: 	 GnomeVFSURI * uri,
renatofilho@367: 	 GnomeVFSOpenMode mode, GnomeVFSContext * context)
renatofilho@367: {
renatofilho@367: 	MythtvHandle *myth_handle = NULL;
renatofilho@456:     GnomeVFSResult result = GNOME_VFS_OK;
renatofilho@456: 
renatofilho@367: 	_GNOME_VFS_METHOD_PARAM_CHECK (method_handle != NULL);
renatofilho@367: 	_GNOME_VFS_METHOD_PARAM_CHECK (uri != NULL);
melunko@38: 
renatofilho@367: 	if (mode & GNOME_VFS_OPEN_WRITE) {
renatofilho@456: 		return GNOME_VFS_ERROR_INVALID_OPEN_MODE;
renatofilho@367: 	}
melunko@38: 
renatofilho@456:     result = myth_handle_new (uri, &myth_handle);
renatofilho@456:     if (result != GNOME_VFS_OK) 
renatofilho@456:         return result;
renatofilho@367: 
renatofilho@456:     result = myth_connection_start (myth_handle);
renatofilho@456:     if (result != GNOME_VFS_OK) {
renatofilho@456:         myth_destroy_handle (myth_handle);
renatofilho@456:         myth_handle = NULL;
renatofilho@456:         return result;
renatofilho@456:     }
renatofilho@461: 
renatofilho@456:     *method_handle = (GnomeVFSMethodHandle *) myth_handle;
renatofilho@456:     
renatofilho@456:     return result;
renatofilho@456: }
renatofilho@367: 
renatofilho@456: static GnomeVFSResult
renatofilho@456: do_create (GnomeVFSMethod	 *method,
renatofilho@456: 	   GnomeVFSMethodHandle **method_handle,
renatofilho@456: 	   GnomeVFSURI 		 *uri,
renatofilho@456: 	   GnomeVFSOpenMode 	  mode,
renatofilho@456: 	   gboolean 		  exclusive,
renatofilho@456: 	   guint 		  perm,
renatofilho@456: 	   GnomeVFSContext 	 *context)
renatofilho@456: {
renatofilho@456:     return GNOME_VFS_ERROR_NOT_SUPPORTED;
renatofilho@456: }
renatofilho@367: 
renatofilho@456: static GnomeVFSResult
renatofilho@456: do_close (GnomeVFSMethod * method,
renatofilho@456:         GnomeVFSMethodHandle * method_handle, 
renatofilho@456:         GnomeVFSContext * context)
renatofilho@456: {
renatofilho@456: 	MythtvHandle *myth_handle = (MythtvHandle *) method_handle;
leo_sobral@447: 
renatofilho@456:     myth_destroy_handle (myth_handle);
renatofilho@456:     
renatofilho@367: 	return GNOME_VFS_OK;
melunko@38: }
melunko@38: 
renatofilho@456: 
melunko@38: static GnomeVFSResult
renatofilho@367: do_read (GnomeVFSMethod * method,
renatofilho@367: 	 GnomeVFSMethodHandle * method_handle,
renatofilho@367: 	 gpointer buffer,
renatofilho@367: 	 GnomeVFSFileSize num_bytes,
leo_sobral@441: 	 GnomeVFSFileSize * bytes_read, 
renatofilho@456:          GnomeVFSContext * context)
melunko@38: {
renatofilho@502:     GnomeVFSResult retval = GNOME_VFS_OK;
renatofilho@456:     MythtvHandle *myth_handle;
rosfran@547:     GMythFileReadResult result;
renatofilho@456:     GByteArray *myth_buffer = g_byte_array_new ();
melunko@38: 
renatofilho@456:     _GNOME_VFS_METHOD_PARAM_CHECK (method_handle != NULL);
melunko@38: 
renatofilho@456:     myth_handle = (MythtvHandle *) method_handle;
rosfran@547:     if ( gmyth_uri_is_local_file(myth_handle->gmyth_uri) )
rosfran@547:         result = gmyth_file_local_read ( GMYTH_FILE_LOCAL(myth_handle->file),
rosfran@547:                                        myth_buffer,
rosfran@547:                                        num_bytes, gmyth_uri_is_livetv (myth_handle->gmyth_uri));
rosfran@547:     else
rosfran@547:         result = gmyth_file_transfer_read ( GMYTH_FILE_TRANSFER(myth_handle->file),
renatofilho@502:                               		   myth_buffer,
renatofilho@502:                              		   num_bytes, gmyth_uri_is_livetv (myth_handle->gmyth_uri));
melunko@38: 
renatofilho@367: 
rosfran@547:     if (result == GMYTH_FILE_READ_ERROR) {
renatofilho@502:         retval = GNOME_VFS_ERROR_IO;
renatofilho@456:     }
renatofilho@367: 
rosfran@547:     if (result == GMYTH_FILE_READ_EOF) {
renatofilho@502:         retval = GNOME_VFS_ERROR_EOF;
renatofilho@456:     }
renatofilho@367: 
renatofilho@502:     if (myth_buffer->len > 0) {
renatofilho@502: 	    g_memmove (buffer, myth_buffer->data, myth_buffer->len);
renatofilho@502:         *bytes_read = (GnomeVFSFileSize) myth_buffer->len;
renatofilho@502:         myth_handle->offset += myth_buffer->len;
renatofilho@456:         g_byte_array_free (myth_buffer, TRUE);
renatofilho@459:     } 
renatofilho@367: 
renatofilho@502: 	return retval;
melunko@38: }
melunko@38: 
melunko@38: static GnomeVFSResult
renatofilho@456: do_write (GnomeVFSMethod 	*method,
renatofilho@456: 	  GnomeVFSMethodHandle  *method_handle,
renatofilho@456: 	  gconstpointer 	 buffer,
renatofilho@456: 	  GnomeVFSFileSize 	 num_bytes,
renatofilho@456: 	  GnomeVFSFileSize 	*bytes_written,
renatofilho@456: 	  GnomeVFSContext 	*context)
melunko@38: {
renatofilho@456:     return GNOME_VFS_ERROR_NOT_SUPPORTED;
renatofilho@456: }
melunko@111: 
renatofilho@456: static GnomeVFSResult
renatofilho@456: do_seek (GnomeVFSMethod	      *method,
renatofilho@456: 	 GnomeVFSMethodHandle *method_handle,
renatofilho@456: 	 GnomeVFSSeekPosition  whence,
renatofilho@456: 	 GnomeVFSFileOffset    offset,
renatofilho@456: 	 GnomeVFSContext      *context)
renatofilho@456: {
renatofilho@456: 	MythtvHandle *myth_handle;
renatofilho@460:     //guint64 whence_p = 0;
renatofilho@460:     //gint64 new_offset =0;
renatofilho@367: 
renatofilho@456:      _GNOME_VFS_METHOD_PARAM_CHECK (method_handle != NULL);
renatofilho@367: 
renatofilho@456:      myth_handle = (MythtvHandle *) method_handle;    
renatofilho@456:     
renatofilho@456:     g_debug ("seek offset%"G_GINT64_FORMAT" whence %d", offset, whence);
renatofilho@367: 
renatofilho@460:     return GNOME_VFS_ERROR_NOT_SUPPORTED;
renatofilho@460:     /*
renatofilho@456:     if (gmyth_uri_is_livetv (myth_handle->gmyth_uri))
renatofilho@456:     
renatofilho@456:     switch (whence)
renatofilho@456:     {
renatofilho@456:         case GNOME_VFS_SEEK_START:
renatofilho@456:             whence_p = 0;
renatofilho@456:             break;
renatofilho@456:         case GNOME_VFS_SEEK_CURRENT:
renatofilho@456:             whence_p = myth_handle->offset;
renatofilho@456:             break;
renatofilho@456:         case GNOME_VFS_SEEK_END:
renatofilho@456:             return GNOME_VFS_ERROR_NOT_SUPPORTED;
renatofilho@456:     }
renatofilho@456:     
rosfran@547:     new_offset = gmyth_file_transfer_seek (myth_handle->file, offset, whence_p);
renatofilho@456:     if (new_offset != 0) {
renatofilho@456:         myth_handle->offset = new_offset;
renatofilho@456:         return GNOME_VFS_OK;
renatofilho@456:     }
renatofilho@367: 
renatofilho@456:     return GNOME_VFS_ERROR_NOT_SUPPORTED;
renatofilho@460:     */
renatofilho@456: }
renatofilho@367: 
renatofilho@456: static GnomeVFSResult
renatofilho@456: do_tell (GnomeVFSMethod       *method,
renatofilho@456: 	 GnomeVFSMethodHandle *method_handle,
renatofilho@456: 	 GnomeVFSFileSize   *offset_return)
renatofilho@456: {
renatofilho@456: 	MythtvHandle *myth_handle = NULL;
leo_sobral@441:     
renatofilho@456:      _GNOME_VFS_METHOD_PARAM_CHECK (method_handle != NULL);
renatofilho@456:      
renatofilho@456:     myth_handle = (MythtvHandle *) method_handle;
renatofilho@456:     *offset_return = myth_handle->offset;
renatofilho@367: 
renatofilho@456:     return GNOME_VFS_OK;
renatofilho@456: }
renatofilho@367: 
renatofilho@456: static GnomeVFSResult
renatofilho@456: do_truncate_handle (GnomeVFSMethod *method,
renatofilho@456: 		    GnomeVFSMethodHandle *method_handle,
renatofilho@456: 		    GnomeVFSFileSize where,
renatofilho@456: 		    GnomeVFSContext *context)
renatofilho@456: {
renatofilho@456:     return GNOME_VFS_ERROR_READ_ONLY;
renatofilho@456: }
renatofilho@367: 
renatofilho@456: static GnomeVFSResult
renatofilho@456: do_open_directory (GnomeVFSMethod 	    *method,
renatofilho@456: 		   GnomeVFSMethodHandle    **method_handle,
renatofilho@456: 		   GnomeVFSURI 		    *uri,
renatofilho@456: 		   GnomeVFSFileInfoOptions   options,
renatofilho@456: 		   GnomeVFSContext 	    *context) 
renatofilho@456: {
renatofilho@456:     return GNOME_VFS_ERROR_NOT_SUPPORTED;
melunko@38: }
melunko@38: 
melunko@38: static GnomeVFSResult
renatofilho@456: do_close_directory (GnomeVFSMethod 	 *method,
renatofilho@456: 		    GnomeVFSMethodHandle *method_handle,
renatofilho@456: 		    GnomeVFSContext 	 *context) 
renatofilho@456: {
renatofilho@456:     return GNOME_VFS_ERROR_NOT_SUPPORTED;
renatofilho@456: }
renatofilho@456: 
renatofilho@456: static GnomeVFSResult
renatofilho@456: do_read_directory (GnomeVFSMethod 	*method,
renatofilho@456:        		   GnomeVFSMethodHandle *method_handle,
renatofilho@456:        		   GnomeVFSFileInfo 	*file_info,
renatofilho@456: 		   GnomeVFSContext 	*context)
renatofilho@456: {
renatofilho@456:     return GNOME_VFS_ERROR_NOT_SUPPORTED;
renatofilho@456: }
renatofilho@456: 
renatofilho@456: 
renatofilho@456: static GnomeVFSResult
renatofilho@367: do_get_file_info (GnomeVFSMethod * method,
renatofilho@367: 		  GnomeVFSURI * uri,
renatofilho@367: 		  GnomeVFSFileInfo * file_info,
renatofilho@367: 		  GnomeVFSFileInfoOptions options,
renatofilho@367: 		  GnomeVFSContext * context)
melunko@38: {
renatofilho@456:     return myth_get_file_info (NULL, uri, file_info);
renatofilho@456: }
leo_sobral@447: 
renatofilho@456: static GnomeVFSResult
renatofilho@456: do_get_file_info_from_handle (GnomeVFSMethod 		*method,
renatofilho@456:             			      GnomeVFSMethodHandle 	*method_handle,
renatofilho@456: 			                  GnomeVFSFileInfo 		*file_info,
renatofilho@456:             			      GnomeVFSFileInfoOptions    options,
renatofilho@456: 			                  GnomeVFSContext 		*context)
renatofilho@456: {
renatofilho@456: 	MythtvHandle *myth_handle = (MythtvHandle *) method_handle;
renatofilho@188: 
renatofilho@456:     return myth_get_file_info (myth_handle, NULL, file_info);
melunko@38: }
melunko@38: 
melunko@38: static gboolean
renatofilho@367: do_is_local (GnomeVFSMethod * method, const GnomeVFSURI * uri)
melunko@38: {
melunko@38: 	return FALSE;
melunko@38: }
melunko@38: 
renatofilho@456: static GnomeVFSResult
renatofilho@456: do_make_directory (GnomeVFSMethod  *method, 
renatofilho@456: 		            GnomeVFSURI     *uri,
renatofilho@456:                     guint 	    perm, 
renatofilho@456: 		            GnomeVFSContext *context) 
renatofilho@456: {
renatofilho@456:     return GNOME_VFS_ERROR_READ_ONLY;
renatofilho@456: }
renatofilho@456: 
renatofilho@456: static GnomeVFSResult 
renatofilho@456: do_remove_directory (GnomeVFSMethod  *method, 
renatofilho@456: 		             GnomeVFSURI     *uri, 
renatofilho@456: 		             GnomeVFSContext *context) 
renatofilho@456: {
renatofilho@456:     return GNOME_VFS_ERROR_READ_ONLY;
renatofilho@456: }
renatofilho@456: 
renatofilho@456: static GnomeVFSResult
renatofilho@456: do_move (GnomeVFSMethod  *method,
renatofilho@456: 	 GnomeVFSURI 	 *old_uri,
renatofilho@456: 	 GnomeVFSURI 	 *new_uri,
renatofilho@456: 	 gboolean         force_replace,
renatofilho@456: 	 GnomeVFSContext *context)
renatofilho@456: {
renatofilho@456:     return GNOME_VFS_ERROR_READ_ONLY;
renatofilho@456: }
renatofilho@456: 
renatofilho@456: static GnomeVFSResult 
renatofilho@456: do_unlink (GnomeVFSMethod  *method,
renatofilho@456: 	   GnomeVFSURI 	   *uri,
renatofilho@456: 	   GnomeVFSContext *context)
renatofilho@456: {
renatofilho@456:     return GNOME_VFS_ERROR_READ_ONLY;
renatofilho@456: }
renatofilho@456: 
renatofilho@456: static GnomeVFSResult 
renatofilho@456: do_check_same_fs (GnomeVFSMethod  *method,
renatofilho@456: 		  GnomeVFSURI 	  *a,
renatofilho@456: 		  GnomeVFSURI 	  *b,
renatofilho@456: 		  gboolean 	  *same_fs_return,
renatofilho@456: 		  GnomeVFSContext *context)
renatofilho@456: {
renatofilho@456:     return GNOME_VFS_ERROR_NOT_SUPPORTED;
renatofilho@456: }
renatofilho@456: 
renatofilho@456: static GnomeVFSResult
renatofilho@456: do_set_file_info (GnomeVFSMethod 		*method,
renatofilho@456: 		  GnomeVFSURI 			*uri,
renatofilho@456: 		  const GnomeVFSFileInfo 	*info,
renatofilho@456: 		  GnomeVFSSetFileInfoMask 	 mask,
renatofilho@456: 		  GnomeVFSContext 		*context)
renatofilho@456: {
renatofilho@456:     return GNOME_VFS_ERROR_READ_ONLY;
renatofilho@456: }
renatofilho@456: 
renatofilho@456: static GnomeVFSResult
renatofilho@456: do_truncate (GnomeVFSMethod *method,
renatofilho@456: 	     GnomeVFSURI *uri,
renatofilho@456: 	     GnomeVFSFileSize where,
renatofilho@456: 	     GnomeVFSContext *context)
renatofilho@456: {
renatofilho@456:     return GNOME_VFS_ERROR_READ_ONLY;
renatofilho@456: }
renatofilho@456: 
renatofilho@456: static GnomeVFSResult
renatofilho@456: do_find_directory (GnomeVFSMethod *method,
renatofilho@456: 		   GnomeVFSURI *near_uri,
renatofilho@456: 		   GnomeVFSFindDirectoryKind kind,
renatofilho@456: 		   GnomeVFSURI **result_uri,
renatofilho@456: 		   gboolean create_if_needed,
renatofilho@456: 		   gboolean find_if_needed,
renatofilho@456: 		   guint permissions,
renatofilho@456: 		   GnomeVFSContext *context)
renatofilho@456: {
renatofilho@456: 	return GNOME_VFS_ERROR_NOT_SUPPORTED;
renatofilho@456: }
renatofilho@456: 
renatofilho@456: static GnomeVFSResult
renatofilho@456: do_create_symbolic_link (GnomeVFSMethod *method,
renatofilho@456: 			 GnomeVFSURI *uri,
renatofilho@456: 			 const char *target_reference,
renatofilho@456: 			 GnomeVFSContext *context)
renatofilho@456: {
renatofilho@456:     return GNOME_VFS_ERROR_READ_ONLY;
renatofilho@456: }
renatofilho@456: 
renatofilho@456: static GnomeVFSResult
renatofilho@456: do_monitor_add (GnomeVFSMethod *method,
renatofilho@456: 		GnomeVFSMethodHandle **method_handle_return,
renatofilho@456: 		GnomeVFSURI *uri,
renatofilho@456: 		GnomeVFSMonitorType monitor_type)
renatofilho@456: {
renatofilho@456: 	return GNOME_VFS_ERROR_NOT_SUPPORTED;
renatofilho@456: }
renatofilho@456: 
renatofilho@456: static GnomeVFSResult
renatofilho@456: do_monitor_cancel (GnomeVFSMethod *method,
renatofilho@456: 		   GnomeVFSMethodHandle *method_handle)
renatofilho@456: {
renatofilho@456: 	return GNOME_VFS_ERROR_NOT_SUPPORTED;
renatofilho@456: }
renatofilho@456: 
renatofilho@456: static GnomeVFSResult
renatofilho@456: do_file_control (GnomeVFSMethod *method,
renatofilho@456: 		 GnomeVFSMethodHandle *method_handle,
renatofilho@456: 		 const char *operation,
renatofilho@456: 		 gpointer operation_data,
renatofilho@456: 		 GnomeVFSContext *context)
renatofilho@456: {
renatofilho@456: 	return GNOME_VFS_ERROR_NOT_SUPPORTED;
renatofilho@456: }
renatofilho@456: 
melunko@38: static GnomeVFSMethod method = {
melunko@38: 	sizeof (GnomeVFSMethod),
renatofilho@456: 	do_open, 
renatofilho@456: 	do_create,
melunko@38: 	do_close,
renatofilho@456: 	do_read, 
renatofilho@456: 	do_write,
renatofilho@456: 	do_seek,
renatofilho@456: 	do_tell,
renatofilho@456: 	do_truncate_handle, 
renatofilho@456: 	do_open_directory,
renatofilho@456: 	do_close_directory,
renatofilho@456: 	do_read_directory,
melunko@38: 	do_get_file_info,
renatofilho@456: 	do_get_file_info_from_handle,
renatofilho@456: 	do_is_local, 
renatofilho@456: 	do_make_directory, 
renatofilho@456: 	do_remove_directory,
renatofilho@456: 	do_move,
renatofilho@456: 	do_unlink,
renatofilho@456: 	do_check_same_fs,
renatofilho@456: 	do_set_file_info,
renatofilho@456: 	do_truncate, 
renatofilho@456: 	do_find_directory, 
renatofilho@456: 	do_create_symbolic_link,  
renatofilho@456: 	do_monitor_add,  
renatofilho@456: 	do_monitor_cancel,  
renatofilho@456: 	do_file_control 	
melunko@38: };
melunko@38: 
melunko@38: 
melunko@38: GnomeVFSMethod *
melunko@38: vfs_module_init (const char *method_name, const char *args)
melunko@38: {
melunko@38: 	return &method;
melunko@38: }
melunko@38: 
melunko@38: void
renatofilho@367: vfs_module_shutdown (GnomeVFSMethod * method)
melunko@38: {
melunko@38: }