libgnomevfs2-mythtv/modules/mythtv-method.c
author melunko
Tue Jun 12 16:04:52 2007 +0100 (2007-06-12)
branchtrunk
changeset 747 7eeaef26704c
parent 642 8105bca5313f
child 753 8ee634511c1e
permissions -rwxr-xr-x
[svn r753] Uncommented seek function. Now it is working
melunko@38
     1
/*
melunko@38
     2
 * @author Hallyson Melo <hallyson.melo@indt.org.br>
melunko@38
     3
 *
melunko@38
     4
 * This program is free software; you can redistribute it and/or modify
melunko@38
     5
 * it under the terms of the GNU Lesser General Public License as published by
melunko@38
     6
 * the Free Software Foundation; either version 2 of the License, or
melunko@38
     7
 * (at your option) any later version.
melunko@38
     8
 *
melunko@38
     9
 * This program is distributed in the hope that it will be useful,
melunko@38
    10
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
melunko@38
    11
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
melunko@38
    12
 * GNU General Public License for more details.
melunko@38
    13
 *
melunko@38
    14
 * You should have received a copy of the GNU Lesser General Public License
melunko@38
    15
 * along with this program; if not, write to the Free Software
melunko@38
    16
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
melunko@38
    17
 */
melunko@38
    18
melunko@38
    19
#ifdef HAVE_CONFIG_H
melunko@38
    20
#include <config.h>
melunko@38
    21
#endif
melunko@38
    22
melunko@38
    23
#include <string.h>
melunko@38
    24
#include <glib.h>
leo_sobral@441
    25
#include <glib/gprintf.h>
leo_sobral@441
    26
#include <glib/gstdio.h>
melunko@38
    27
#include <math.h>
melunko@38
    28
melunko@38
    29
#include <libgnomevfs/gnome-vfs-module.h>
melunko@38
    30
#include <libgnomevfs/gnome-vfs-utils.h>
melunko@38
    31
rosfran@547
    32
#include <gmyth/gmyth_file.h>
rosfran@277
    33
#include <gmyth/gmyth_file_transfer.h>
rosfran@547
    34
#include <gmyth/gmyth_file_local.h>
rosfran@277
    35
#include <gmyth/gmyth_livetv.h>
rosfran@277
    36
#include <gmyth/gmyth_uri.h>
rosfran@277
    37
#include <gmyth/gmyth_recorder.h>
rosfran@277
    38
#include <gmyth/gmyth_backendinfo.h>
rosfran@277
    39
#include <gmyth/gmyth_util.h>
rosfran@332
    40
#include <gmyth/gmyth_remote_util.h>
rosfran@332
    41
#include <gmyth/gmyth_tvchain.h>
rosfran@357
    42
#include <gmyth/gmyth_programinfo.h>
melunko@38
    43
melunko@38
    44
#define GST_MYTHTV_ID_NUM               1
melunko@38
    45
#define MYTHTV_VERSION_DEFAULT          30
rosfran@277
    46
#define MYTHTV_TRANSFER_MAX_WAITS       100
melunko@38
    47
rosfran@361
    48
/* internal GnomeVFS plug-in buffer size ( 120 Kbytes ) */
leo_sobral@441
    49
#define MYTHTV_BUFFER_SIZE                          80*1024
rosfran@361
    50
/* internally sized GnomeVFS plug-in buffer ( 4 Kbytes ) */
leo_sobral@441
    51
#define MYTHTV_MAX_VFS_BUFFER_SIZE                  4096
rosfran@361
    52
/* maximum number of bytes to be requested to the MythTV backend ( 64 Kbytes ) */
leo_sobral@441
    53
#define MYTHTV_MAX_REQUEST_SIZE                     64*1024
melunko@111
    54
renatofilho@456
    55
typedef struct {
rosfran@547
    56
	GMythFile *file;
renatofilho@456
    57
	GMythLiveTV *livetv;
renatofilho@456
    58
    GMythBackendInfo *backend_info;
renatofilho@456
    59
    GMythURI *gmyth_uri;
renatofilho@456
    60
    GMythRecorder *live_recorder;
renatofilho@502
    61
    gboolean started;
renatofilho@456
    62
    gint64 offset;
rosfran@606
    63
    
rosfran@606
    64
    gboolean is_livetv; /* it is, or not a Live TV content transfer */
rosfran@606
    65
    gboolean is_local_file; /* tell if the file is local to the current content transfer */
renatofilho@456
    66
renatofilho@456
    67
	gchar *channel_name;
renatofilho@456
    68
renatofilho@456
    69
	gint mythtv_version;
renatofilho@456
    70
	gboolean configured;
renatofilho@456
    71
} MythtvHandle;
renatofilho@456
    72
renatofilho@456
    73
renatofilho@367
    74
static GnomeVFSResult do_read (GnomeVFSMethod * method,
renatofilho@367
    75
			       GnomeVFSMethodHandle * method_handle,
renatofilho@367
    76
			       gpointer buffer,
renatofilho@367
    77
			       GnomeVFSFileSize num_bytes,
renatofilho@367
    78
			       GnomeVFSFileSize * bytes_read,
renatofilho@367
    79
			       GnomeVFSContext * context);
melunko@38
    80
renatofilho@456
    81
static GnomeVFSResult   myth_connection_start   (MythtvHandle * method_handle);
renatofilho@456
    82
static void             myth_destroy_handle     (MythtvHandle * method_handle);
renatofilho@456
    83
static GnomeVFSResult   myth_handle_new         (GnomeVFSURI * uri,
renatofilho@456
    84
                                                 MythtvHandle ** method_handle);
renatofilho@456
    85
static GnomeVFSResult   myth_get_file_info      (MythtvHandle * myth_handle,
renatofilho@456
    86
                                                 GnomeVFSURI * uri,
renatofilho@456
    87
                                                 GnomeVFSFileInfo * info);
melunko@111
    88
renatofilho@456
    89
static GnomeVFSResult 
renatofilho@456
    90
myth_handle_new (GnomeVFSURI * uri,
renatofilho@456
    91
                 MythtvHandle ** method_handle)
renatofilho@456
    92
{   
renatofilho@456
    93
    gchar *tmp_str1;
renatofilho@456
    94
    gchar *tmp_str2;
renatofilho@456
    95
renatofilho@456
    96
    _GNOME_VFS_METHOD_PARAM_CHECK (*method_handle == NULL);
renatofilho@456
    97
    
renatofilho@456
    98
	if (gnome_vfs_uri_get_host_name (uri) == NULL) {
renatofilho@456
    99
		return GNOME_VFS_ERROR_INVALID_HOST_NAME;
renatofilho@456
   100
	}
renatofilho@456
   101
renatofilho@456
   102
    *method_handle = g_new0 (MythtvHandle, 1);
renatofilho@456
   103
    (*method_handle)->mythtv_version = MYTHTV_VERSION_DEFAULT;
rosfran@606
   104
    
rosfran@606
   105
    (*method_handle)->is_livetv = FALSE;
rosfran@606
   106
    (*method_handle)->is_local_file = FALSE;
renatofilho@456
   107
        
renatofilho@456
   108
    tmp_str1 = gnome_vfs_uri_to_string (uri, GNOME_VFS_URI_HIDE_NONE);
renatofilho@456
   109
    tmp_str2 = gnome_vfs_unescape_string (tmp_str1, "");
renatofilho@456
   110
renatofilho@619
   111
    gchar *tmp_str3 = strstr (tmp_str2, ".nuv.avi");
renatofilho@619
   112
    if (tmp_str3 != NULL) {
renatofilho@619
   113
        tmp_str3[4] = '\0';
renatofilho@619
   114
    }
renatofilho@619
   115
renatofilho@456
   116
    (*method_handle)->backend_info = gmyth_backend_info_new_with_uri (tmp_str2);
renatofilho@456
   117
    (*method_handle)->gmyth_uri = gmyth_uri_new_with_value (tmp_str2);
renatofilho@456
   118
    g_free (tmp_str1);
renatofilho@456
   119
    g_free (tmp_str2);
renatofilho@456
   120
renatofilho@456
   121
    return GNOME_VFS_OK;
renatofilho@456
   122
}   
renatofilho@456
   123
renatofilho@456
   124
static void
renatofilho@456
   125
myth_destroy_handle (MythtvHandle * method_handle)
renatofilho@456
   126
{
renatofilho@456
   127
    //TODO: abort if in tranfer state
renatofilho@456
   128
    
renatofilho@456
   129
    if (method_handle->backend_info != NULL) {
renatofilho@456
   130
        g_object_unref (method_handle->backend_info);
renatofilho@456
   131
        method_handle->backend_info = NULL;
renatofilho@456
   132
    }
renatofilho@456
   133
    
renatofilho@456
   134
    if (method_handle->channel_name != NULL) {
renatofilho@456
   135
        g_free (method_handle->channel_name);
renatofilho@456
   136
        method_handle->channel_name = NULL;
renatofilho@456
   137
    }
renatofilho@456
   138
renatofilho@456
   139
    if (method_handle->livetv != NULL) {
renatofilho@456
   140
        g_object_unref (method_handle->livetv);
renatofilho@456
   141
        method_handle->livetv = NULL;
renatofilho@456
   142
    }
renatofilho@456
   143
rosfran@547
   144
    if (method_handle->file != NULL) {
rosfran@547
   145
        g_object_unref (method_handle->file);
rosfran@547
   146
        method_handle->file = NULL;
renatofilho@456
   147
    }
renatofilho@456
   148
renatofilho@456
   149
    if (method_handle->gmyth_uri != NULL) {
renatofilho@456
   150
        g_object_unref (method_handle->gmyth_uri);
renatofilho@456
   151
        method_handle->gmyth_uri = NULL;
renatofilho@456
   152
    }
renatofilho@456
   153
renatofilho@456
   154
    g_free (method_handle);
renatofilho@456
   155
}
renatofilho@456
   156
renatofilho@456
   157
static GnomeVFSResult
renatofilho@456
   158
myth_get_file_info (MythtvHandle * myth_handle,
renatofilho@456
   159
                    GnomeVFSURI * uri,
renatofilho@456
   160
                    GnomeVFSFileInfo * info)
renatofilho@456
   161
{
renatofilho@456
   162
    GMythURI *gmyth_uri;
renatofilho@456
   163
    GMythBackendInfo *backend_info;
renatofilho@642
   164
    gboolean is_livetv;
renatofilho@642
   165
    gboolean is_local;
renatofilho@456
   166
    
renatofilho@456
   167
    _GNOME_VFS_METHOD_PARAM_CHECK (info != NULL);
renatofilho@461
   168
    
renatofilho@642
   169
g_debug ("%s - %d", __FUNCTION__, __LINE__);
renatofilho@456
   170
renatofilho@456
   171
    if (myth_handle == NULL) {
renatofilho@456
   172
        gchar *tmp_str1;
renatofilho@456
   173
        gchar *tmp_str2;
renatofilho@456
   174
        
renatofilho@456
   175
        tmp_str1 = gnome_vfs_uri_to_string (uri, GNOME_VFS_URI_HIDE_NONE);
renatofilho@456
   176
        tmp_str2 = gnome_vfs_unescape_string (tmp_str1, "");
renatofilho@456
   177
renatofilho@456
   178
        backend_info = gmyth_backend_info_new_with_uri (tmp_str2);
renatofilho@456
   179
        gmyth_uri = gmyth_uri_new_with_value (tmp_str2);
renatofilho@456
   180
        
renatofilho@456
   181
        g_free (tmp_str1);
renatofilho@456
   182
        g_free (tmp_str2);
renatofilho@456
   183
    } else {
renatofilho@456
   184
        backend_info = g_object_ref (myth_handle->backend_info);
renatofilho@456
   185
        gmyth_uri = g_object_ref (myth_handle->gmyth_uri);
renatofilho@456
   186
    }
renatofilho@456
   187
renatofilho@456
   188
    info->valid_fields = 0;
renatofilho@456
   189
	info->valid_fields = GNOME_VFS_FILE_INFO_FIELDS_TYPE | 
renatofilho@456
   190
        GNOME_VFS_FILE_INFO_FIELDS_MIME_TYPE | 
renatofilho@456
   191
        GNOME_VFS_FILE_INFO_FIELDS_PERMISSIONS;
renatofilho@456
   192
    
renatofilho@456
   193
	info->type = GNOME_VFS_FILE_TYPE_REGULAR;
renatofilho@456
   194
    
renatofilho@456
   195
	/* fixme: get from file extension? */
renatofilho@456
   196
	info->mime_type = g_strdup ("video/x-nuv");
renatofilho@456
   197
	info->permissions = GNOME_VFS_PERM_USER_READ | 
renatofilho@456
   198
        GNOME_VFS_PERM_OTHER_READ | 
renatofilho@456
   199
        GNOME_VFS_PERM_GROUP_READ;
renatofilho@456
   200
   
renatofilho@456
   201
	info->name = g_strdup (gmyth_uri_get_path (gmyth_uri));
renatofilho@642
   202
    
renatofilho@456
   203
    /* file size for remote files */
renatofilho@642
   204
    is_livetv = gmyth_uri_is_livetv (gmyth_uri);
renatofilho@642
   205
    
renatofilho@642
   206
    if (is_livetv == FALSE) {
rosfran@547
   207
        GMythFile *file = NULL;
rosfran@547
   208
        gboolean ret = FALSE;
rosfran@547
   209
renatofilho@456
   210
        /* Verifies if the file exists */
renatofilho@456
   211
        if (!gmyth_util_file_exists (backend_info, 
renatofilho@456
   212
                    gmyth_uri_get_path (gmyth_uri))) {
rosfran@547
   213
            g_object_unref (file);
renatofilho@456
   214
            g_object_unref (backend_info);
renatofilho@456
   215
            g_debug ("NOT FOUND %s/%d", __FUNCTION__, __LINE__);
renatofilho@456
   216
            return GNOME_VFS_ERROR_NOT_FOUND;
renatofilho@456
   217
		}
renatofilho@461
   218
renatofilho@642
   219
        is_local = gmyth_uri_is_local_file (gmyth_uri);
renatofilho@642
   220
        if (is_local == TRUE ) {
renatofilho@642
   221
          file = GMYTH_FILE (gmyth_file_local_new(backend_info));
renatofilho@642
   222
          ret = gmyth_file_local_open (GMYTH_FILE_LOCAL (file));
rosfran@547
   223
        } else {
renatofilho@642
   224
          file = GMYTH_FILE (gmyth_file_transfer_new(backend_info));
renatofilho@642
   225
          ret = gmyth_file_transfer_open (GMYTH_FILE_TRANSFER(file), 
renatofilho@642
   226
                          gmyth_uri_get_path (gmyth_uri));
rosfran@547
   227
        }
renatofilho@642
   228
        
rosfran@547
   229
        if (!ret) {
rosfran@547
   230
            g_object_unref (file);
renatofilho@461
   231
            g_object_unref (backend_info);
renatofilho@461
   232
            g_debug ("NOT FOUND %s/%d", __FUNCTION__, __LINE__);
renatofilho@461
   233
            return GNOME_VFS_ERROR_NOT_FOUND;
renatofilho@461
   234
        }
renatofilho@642
   235
        
rosfran@547
   236
		info->size = gmyth_file_get_filesize (file);
renatofilho@456
   237
        info->valid_fields |= GNOME_VFS_FILE_INFO_FIELDS_SIZE;
rosfran@547
   238
		g_object_unref (file);
renatofilho@456
   239
	}
renatofilho@456
   240
renatofilho@456
   241
    g_object_unref (backend_info);
renatofilho@456
   242
    g_object_unref (gmyth_uri);
renatofilho@456
   243
    
renatofilho@456
   244
    return GNOME_VFS_OK;
renatofilho@456
   245
}
renatofilho@456
   246
renatofilho@456
   247
static GnomeVFSResult
renatofilho@456
   248
myth_connection_start (MythtvHandle * method_handle)
renatofilho@456
   249
{
renatofilho@456
   250
    GnomeVFSResult result = GNOME_VFS_OK;
renatofilho@456
   251
renatofilho@456
   252
    _GNOME_VFS_METHOD_PARAM_CHECK (method_handle != NULL);
renatofilho@456
   253
    _GNOME_VFS_METHOD_PARAM_CHECK (method_handle->backend_info != NULL);
renatofilho@456
   254
renatofilho@456
   255
	/* Connect to the backend */
rosfran@606
   256
	if ( ( method_handle->is_livetv = gmyth_uri_is_livetv (method_handle->gmyth_uri) ) == TRUE) {
renatofilho@456
   257
		method_handle->livetv = gmyth_livetv_new (method_handle->backend_info);
renatofilho@456
   258
		method_handle->channel_name = gmyth_uri_get_channel_name (method_handle->gmyth_uri);
renatofilho@456
   259
        
renatofilho@456
   260
		if (method_handle->channel_name != NULL) {
renatofilho@456
   261
		    if (gmyth_livetv_channel_name_setup (method_handle->livetv, 
renatofilho@456
   262
                    method_handle->channel_name) == FALSE) {
renatofilho@456
   263
                result = GNOME_VFS_ERROR_INVALID_URI;
renatofilho@456
   264
    			goto error;
renatofilho@456
   265
			}
renatofilho@456
   266
		} else if (gmyth_livetv_setup (method_handle->livetv) == FALSE) {
renatofilho@456
   267
                result = GNOME_VFS_ERROR_INVALID_URI;
renatofilho@456
   268
                goto error;
renatofilho@456
   269
		}
renatofilho@456
   270
        
renatofilho@456
   271
rosfran@547
   272
    	method_handle->file = 
rosfran@547
   273
            GMYTH_FILE( gmyth_livetv_create_file_transfer (method_handle->livetv) );
renatofilho@456
   274
rosfran@547
   275
        if (method_handle->file == NULL) {
renatofilho@456
   276
            result = GNOME_VFS_ERROR_INVALID_URI;
renatofilho@456
   277
    		g_debug ("MythTV FileTransfer is NULL!\n");
renatofilho@456
   278
            goto error;
renatofilho@456
   279
        }
renatofilho@456
   280
rosfran@547
   281
	    if (!gmyth_file_transfer_open ( GMYTH_FILE_TRANSFER(method_handle->file),
renatofilho@456
   282
                                        method_handle->livetv->uri != NULL ? 
renatofilho@456
   283
                                        gmyth_uri_get_path (method_handle->livetv->uri) :
renatofilho@456
   284
                                        method_handle->livetv->proginfo->pathname->str)) {
renatofilho@456
   285
        
renatofilho@456
   286
            g_debug ("Couldn't open MythTV FileTransfer is NULL!\n");
renatofilho@456
   287
            result = GNOME_VFS_ERROR_NOT_OPEN;
renatofilho@456
   288
            goto error;
renatofilho@456
   289
        }
renatofilho@456
   290
    }
renatofilho@456
   291
    else {
rosfran@547
   292
        gboolean ret = TRUE;
renatofilho@456
   293
		/* Verifies if the file exists */
renatofilho@456
   294
		if (!gmyth_util_file_exists (method_handle->backend_info, 
renatofilho@456
   295
                    gmyth_uri_get_path (method_handle->gmyth_uri))) {
renatofilho@456
   296
renatofilho@456
   297
            g_debug ("NOT FOUND %s/%d", __FUNCTION__, __LINE__);
renatofilho@456
   298
            goto error;
renatofilho@456
   299
		}
rosfran@547
   300
        
rosfran@606
   301
        if ( ( method_handle->is_local_file = gmyth_uri_is_local_file(method_handle->gmyth_uri) ) == TRUE )
rosfran@547
   302
        {
rosfran@547
   303
          method_handle->file = GMYTH_FILE( gmyth_file_local_new(method_handle->backend_info) );
rosfran@547
   304
          ret = gmyth_file_local_open ( GMYTH_FILE_LOCAL( method_handle->file ) );
rosfran@547
   305
        } else {
rosfran@547
   306
          method_handle->file = GMYTH_FILE( gmyth_file_transfer_new(method_handle->backend_info) );
rosfran@547
   307
          ret = gmyth_file_transfer_open ( GMYTH_FILE_TRANSFER(method_handle->file), 
rosfran@547
   308
                  gmyth_uri_get_path (method_handle->gmyth_uri));
rosfran@547
   309
        }
renatofilho@456
   310
renatofilho@456
   311
		/* sets the Playback monitor connection */
rosfran@547
   312
		if (!ret) {
renatofilho@461
   313
renatofilho@461
   314
            g_debug ("NOT FOUND %s/%d", __FUNCTION__, __LINE__);
renatofilho@461
   315
		    result = GNOME_VFS_ERROR_NOT_FOUND;
renatofilho@461
   316
            goto error;
renatofilho@461
   317
        }
renatofilho@456
   318
	} /* if - LiveTV or not? */
renatofilho@456
   319
renatofilho@456
   320
	method_handle->configured = TRUE;    
renatofilho@456
   321
rosfran@547
   322
    if (method_handle->file == NULL) {
renatofilho@456
   323
        result = GNOME_VFS_ERROR_NOT_OPEN;
renatofilho@456
   324
    }
renatofilho@456
   325
renatofilho@456
   326
error:
renatofilho@456
   327
    
renatofilho@456
   328
    return result; 
renatofilho@456
   329
}
renatofilho@456
   330
melunko@38
   331
static GnomeVFSResult
renatofilho@367
   332
do_open (GnomeVFSMethod * method,
renatofilho@367
   333
	 GnomeVFSMethodHandle ** method_handle,
renatofilho@367
   334
	 GnomeVFSURI * uri,
renatofilho@367
   335
	 GnomeVFSOpenMode mode, GnomeVFSContext * context)
renatofilho@367
   336
{
renatofilho@367
   337
	MythtvHandle *myth_handle = NULL;
renatofilho@456
   338
    GnomeVFSResult result = GNOME_VFS_OK;
renatofilho@456
   339
renatofilho@367
   340
	_GNOME_VFS_METHOD_PARAM_CHECK (method_handle != NULL);
renatofilho@367
   341
	_GNOME_VFS_METHOD_PARAM_CHECK (uri != NULL);
melunko@38
   342
renatofilho@367
   343
	if (mode & GNOME_VFS_OPEN_WRITE) {
renatofilho@456
   344
		return GNOME_VFS_ERROR_INVALID_OPEN_MODE;
renatofilho@367
   345
	}
melunko@38
   346
renatofilho@456
   347
    result = myth_handle_new (uri, &myth_handle);
renatofilho@456
   348
    if (result != GNOME_VFS_OK) 
renatofilho@456
   349
        return result;
renatofilho@367
   350
renatofilho@456
   351
    result = myth_connection_start (myth_handle);
renatofilho@456
   352
    if (result != GNOME_VFS_OK) {
renatofilho@456
   353
        myth_destroy_handle (myth_handle);
renatofilho@456
   354
        myth_handle = NULL;
renatofilho@456
   355
        return result;
renatofilho@456
   356
    }
renatofilho@461
   357
renatofilho@456
   358
    *method_handle = (GnomeVFSMethodHandle *) myth_handle;
renatofilho@456
   359
    
renatofilho@456
   360
    return result;
renatofilho@456
   361
}
renatofilho@367
   362
renatofilho@456
   363
static GnomeVFSResult
renatofilho@456
   364
do_create (GnomeVFSMethod	 *method,
renatofilho@456
   365
	   GnomeVFSMethodHandle **method_handle,
renatofilho@456
   366
	   GnomeVFSURI 		 *uri,
renatofilho@456
   367
	   GnomeVFSOpenMode 	  mode,
renatofilho@456
   368
	   gboolean 		  exclusive,
renatofilho@456
   369
	   guint 		  perm,
renatofilho@456
   370
	   GnomeVFSContext 	 *context)
renatofilho@456
   371
{
renatofilho@456
   372
    return GNOME_VFS_ERROR_NOT_SUPPORTED;
renatofilho@456
   373
}
renatofilho@367
   374
renatofilho@456
   375
static GnomeVFSResult
renatofilho@456
   376
do_close (GnomeVFSMethod * method,
renatofilho@456
   377
        GnomeVFSMethodHandle * method_handle, 
renatofilho@456
   378
        GnomeVFSContext * context)
renatofilho@456
   379
{
renatofilho@456
   380
	MythtvHandle *myth_handle = (MythtvHandle *) method_handle;
leo_sobral@447
   381
renatofilho@456
   382
    myth_destroy_handle (myth_handle);
renatofilho@456
   383
    
renatofilho@367
   384
	return GNOME_VFS_OK;
melunko@38
   385
}
melunko@38
   386
renatofilho@456
   387
melunko@38
   388
static GnomeVFSResult
renatofilho@367
   389
do_read (GnomeVFSMethod * method,
renatofilho@367
   390
	 GnomeVFSMethodHandle * method_handle,
renatofilho@367
   391
	 gpointer buffer,
renatofilho@367
   392
	 GnomeVFSFileSize num_bytes,
leo_sobral@441
   393
	 GnomeVFSFileSize * bytes_read, 
renatofilho@456
   394
         GnomeVFSContext * context)
melunko@38
   395
{
renatofilho@502
   396
    GnomeVFSResult retval = GNOME_VFS_OK;
renatofilho@456
   397
    MythtvHandle *myth_handle;
rosfran@547
   398
    GMythFileReadResult result;
renatofilho@456
   399
    GByteArray *myth_buffer = g_byte_array_new ();
melunko@38
   400
renatofilho@456
   401
    _GNOME_VFS_METHOD_PARAM_CHECK (method_handle != NULL);
melunko@38
   402
renatofilho@456
   403
    myth_handle = (MythtvHandle *) method_handle;
rosfran@606
   404
    if ( myth_handle->is_local_file )
rosfran@547
   405
        result = gmyth_file_local_read ( GMYTH_FILE_LOCAL(myth_handle->file),
rosfran@547
   406
                                       myth_buffer,
rosfran@606
   407
                                       num_bytes, myth_handle->is_livetv );
rosfran@547
   408
    else
rosfran@547
   409
        result = gmyth_file_transfer_read ( GMYTH_FILE_TRANSFER(myth_handle->file),
renatofilho@502
   410
                              		   myth_buffer,
rosfran@606
   411
                             		   num_bytes, myth_handle->is_livetv );
renatofilho@367
   412
rosfran@547
   413
    if (result == GMYTH_FILE_READ_ERROR) {
renatofilho@502
   414
        retval = GNOME_VFS_ERROR_IO;
renatofilho@456
   415
    }
renatofilho@367
   416
rosfran@547
   417
    if (result == GMYTH_FILE_READ_EOF) {
renatofilho@502
   418
        retval = GNOME_VFS_ERROR_EOF;
renatofilho@456
   419
    }
renatofilho@367
   420
renatofilho@502
   421
    if (myth_buffer->len > 0) {
renatofilho@502
   422
	    g_memmove (buffer, myth_buffer->data, myth_buffer->len);
renatofilho@502
   423
        *bytes_read = (GnomeVFSFileSize) myth_buffer->len;
renatofilho@502
   424
        myth_handle->offset += myth_buffer->len;
renatofilho@456
   425
        g_byte_array_free (myth_buffer, TRUE);
renatofilho@459
   426
    } 
renatofilho@367
   427
renatofilho@502
   428
	return retval;
melunko@38
   429
}
melunko@38
   430
melunko@38
   431
static GnomeVFSResult
renatofilho@456
   432
do_write (GnomeVFSMethod 	*method,
renatofilho@456
   433
	  GnomeVFSMethodHandle  *method_handle,
renatofilho@456
   434
	  gconstpointer 	 buffer,
renatofilho@456
   435
	  GnomeVFSFileSize 	 num_bytes,
renatofilho@456
   436
	  GnomeVFSFileSize 	*bytes_written,
renatofilho@456
   437
	  GnomeVFSContext 	*context)
melunko@38
   438
{
renatofilho@456
   439
    return GNOME_VFS_ERROR_NOT_SUPPORTED;
renatofilho@456
   440
}
melunko@111
   441
renatofilho@456
   442
static GnomeVFSResult
renatofilho@456
   443
do_seek (GnomeVFSMethod	      *method,
renatofilho@456
   444
	 GnomeVFSMethodHandle *method_handle,
renatofilho@456
   445
	 GnomeVFSSeekPosition  whence,
renatofilho@456
   446
	 GnomeVFSFileOffset    offset,
renatofilho@456
   447
	 GnomeVFSContext      *context)
renatofilho@456
   448
{
melunko@747
   449
    MythtvHandle *myth_handle;
melunko@747
   450
    guint64 whence_p  = 0;
melunko@747
   451
    gint64 new_offset = 0;
renatofilho@367
   452
renatofilho@456
   453
     _GNOME_VFS_METHOD_PARAM_CHECK (method_handle != NULL);
renatofilho@367
   454
renatofilho@456
   455
     myth_handle = (MythtvHandle *) method_handle;    
renatofilho@456
   456
    
melunko@747
   457
    g_debug ("seek offset %"G_GINT64_FORMAT" whence %d", offset, whence);
renatofilho@367
   458
renatofilho@456
   459
    if (gmyth_uri_is_livetv (myth_handle->gmyth_uri))
melunko@747
   460
        return GNOME_VFS_ERROR_NOT_SUPPORTED;
renatofilho@456
   461
    
renatofilho@456
   462
    switch (whence)
renatofilho@456
   463
    {
renatofilho@456
   464
        case GNOME_VFS_SEEK_START:
renatofilho@456
   465
            whence_p = 0;
renatofilho@456
   466
            break;
renatofilho@456
   467
        case GNOME_VFS_SEEK_CURRENT:
renatofilho@456
   468
            whence_p = myth_handle->offset;
renatofilho@456
   469
            break;
renatofilho@456
   470
        case GNOME_VFS_SEEK_END:
renatofilho@456
   471
            return GNOME_VFS_ERROR_NOT_SUPPORTED;
renatofilho@456
   472
    }
renatofilho@456
   473
    
rosfran@547
   474
    new_offset = gmyth_file_transfer_seek (myth_handle->file, offset, whence_p);
renatofilho@456
   475
    if (new_offset != 0) {
renatofilho@456
   476
        myth_handle->offset = new_offset;
renatofilho@456
   477
        return GNOME_VFS_OK;
renatofilho@456
   478
    }
renatofilho@367
   479
renatofilho@456
   480
    return GNOME_VFS_ERROR_NOT_SUPPORTED;
renatofilho@456
   481
}
renatofilho@367
   482
renatofilho@456
   483
static GnomeVFSResult
renatofilho@456
   484
do_tell (GnomeVFSMethod       *method,
renatofilho@456
   485
	 GnomeVFSMethodHandle *method_handle,
renatofilho@456
   486
	 GnomeVFSFileSize   *offset_return)
renatofilho@456
   487
{
renatofilho@456
   488
	MythtvHandle *myth_handle = NULL;
leo_sobral@441
   489
    
renatofilho@456
   490
     _GNOME_VFS_METHOD_PARAM_CHECK (method_handle != NULL);
renatofilho@456
   491
     
renatofilho@456
   492
    myth_handle = (MythtvHandle *) method_handle;
renatofilho@456
   493
    *offset_return = myth_handle->offset;
renatofilho@367
   494
renatofilho@456
   495
    return GNOME_VFS_OK;
renatofilho@456
   496
}
renatofilho@367
   497
renatofilho@456
   498
static GnomeVFSResult
renatofilho@456
   499
do_truncate_handle (GnomeVFSMethod *method,
renatofilho@456
   500
		    GnomeVFSMethodHandle *method_handle,
renatofilho@456
   501
		    GnomeVFSFileSize where,
renatofilho@456
   502
		    GnomeVFSContext *context)
renatofilho@456
   503
{
renatofilho@456
   504
    return GNOME_VFS_ERROR_READ_ONLY;
renatofilho@456
   505
}
renatofilho@367
   506
renatofilho@456
   507
static GnomeVFSResult
renatofilho@456
   508
do_open_directory (GnomeVFSMethod 	    *method,
renatofilho@456
   509
		   GnomeVFSMethodHandle    **method_handle,
renatofilho@456
   510
		   GnomeVFSURI 		    *uri,
renatofilho@456
   511
		   GnomeVFSFileInfoOptions   options,
renatofilho@456
   512
		   GnomeVFSContext 	    *context) 
renatofilho@456
   513
{
renatofilho@456
   514
    return GNOME_VFS_ERROR_NOT_SUPPORTED;
melunko@38
   515
}
melunko@38
   516
melunko@38
   517
static GnomeVFSResult
renatofilho@456
   518
do_close_directory (GnomeVFSMethod 	 *method,
renatofilho@456
   519
		    GnomeVFSMethodHandle *method_handle,
renatofilho@456
   520
		    GnomeVFSContext 	 *context) 
renatofilho@456
   521
{
renatofilho@456
   522
    return GNOME_VFS_ERROR_NOT_SUPPORTED;
renatofilho@456
   523
}
renatofilho@456
   524
renatofilho@456
   525
static GnomeVFSResult
renatofilho@456
   526
do_read_directory (GnomeVFSMethod 	*method,
renatofilho@456
   527
       		   GnomeVFSMethodHandle *method_handle,
renatofilho@456
   528
       		   GnomeVFSFileInfo 	*file_info,
renatofilho@456
   529
		   GnomeVFSContext 	*context)
renatofilho@456
   530
{
renatofilho@456
   531
    return GNOME_VFS_ERROR_NOT_SUPPORTED;
renatofilho@456
   532
}
renatofilho@456
   533
renatofilho@456
   534
renatofilho@456
   535
static GnomeVFSResult
renatofilho@367
   536
do_get_file_info (GnomeVFSMethod * method,
renatofilho@367
   537
		  GnomeVFSURI * uri,
renatofilho@367
   538
		  GnomeVFSFileInfo * file_info,
renatofilho@367
   539
		  GnomeVFSFileInfoOptions options,
renatofilho@367
   540
		  GnomeVFSContext * context)
melunko@38
   541
{
renatofilho@456
   542
    return myth_get_file_info (NULL, uri, file_info);
renatofilho@456
   543
}
leo_sobral@447
   544
renatofilho@456
   545
static GnomeVFSResult
renatofilho@456
   546
do_get_file_info_from_handle (GnomeVFSMethod 		*method,
renatofilho@456
   547
            			      GnomeVFSMethodHandle 	*method_handle,
renatofilho@456
   548
			                  GnomeVFSFileInfo 		*file_info,
renatofilho@456
   549
            			      GnomeVFSFileInfoOptions    options,
renatofilho@456
   550
			                  GnomeVFSContext 		*context)
renatofilho@456
   551
{
renatofilho@456
   552
	MythtvHandle *myth_handle = (MythtvHandle *) method_handle;
renatofilho@188
   553
renatofilho@456
   554
    return myth_get_file_info (myth_handle, NULL, file_info);
melunko@38
   555
}
melunko@38
   556
melunko@38
   557
static gboolean
renatofilho@367
   558
do_is_local (GnomeVFSMethod * method, const GnomeVFSURI * uri)
melunko@38
   559
{
melunko@38
   560
	return FALSE;
melunko@38
   561
}
melunko@38
   562
renatofilho@456
   563
static GnomeVFSResult
renatofilho@456
   564
do_make_directory (GnomeVFSMethod  *method, 
renatofilho@456
   565
		            GnomeVFSURI     *uri,
renatofilho@456
   566
                    guint 	    perm, 
renatofilho@456
   567
		            GnomeVFSContext *context) 
renatofilho@456
   568
{
renatofilho@456
   569
    return GNOME_VFS_ERROR_READ_ONLY;
renatofilho@456
   570
}
renatofilho@456
   571
renatofilho@456
   572
static GnomeVFSResult 
renatofilho@456
   573
do_remove_directory (GnomeVFSMethod  *method, 
renatofilho@456
   574
		             GnomeVFSURI     *uri, 
renatofilho@456
   575
		             GnomeVFSContext *context) 
renatofilho@456
   576
{
renatofilho@456
   577
    return GNOME_VFS_ERROR_READ_ONLY;
renatofilho@456
   578
}
renatofilho@456
   579
renatofilho@456
   580
static GnomeVFSResult
renatofilho@456
   581
do_move (GnomeVFSMethod  *method,
renatofilho@456
   582
	 GnomeVFSURI 	 *old_uri,
renatofilho@456
   583
	 GnomeVFSURI 	 *new_uri,
renatofilho@456
   584
	 gboolean         force_replace,
renatofilho@456
   585
	 GnomeVFSContext *context)
renatofilho@456
   586
{
renatofilho@456
   587
    return GNOME_VFS_ERROR_READ_ONLY;
renatofilho@456
   588
}
renatofilho@456
   589
renatofilho@456
   590
static GnomeVFSResult 
renatofilho@456
   591
do_unlink (GnomeVFSMethod  *method,
renatofilho@456
   592
	   GnomeVFSURI 	   *uri,
renatofilho@456
   593
	   GnomeVFSContext *context)
renatofilho@456
   594
{
renatofilho@456
   595
    return GNOME_VFS_ERROR_READ_ONLY;
renatofilho@456
   596
}
renatofilho@456
   597
renatofilho@456
   598
static GnomeVFSResult 
renatofilho@456
   599
do_check_same_fs (GnomeVFSMethod  *method,
renatofilho@456
   600
		  GnomeVFSURI 	  *a,
renatofilho@456
   601
		  GnomeVFSURI 	  *b,
renatofilho@456
   602
		  gboolean 	  *same_fs_return,
renatofilho@456
   603
		  GnomeVFSContext *context)
renatofilho@456
   604
{
renatofilho@456
   605
    return GNOME_VFS_ERROR_NOT_SUPPORTED;
renatofilho@456
   606
}
renatofilho@456
   607
renatofilho@456
   608
static GnomeVFSResult
renatofilho@456
   609
do_set_file_info (GnomeVFSMethod 		*method,
renatofilho@456
   610
		  GnomeVFSURI 			*uri,
renatofilho@456
   611
		  const GnomeVFSFileInfo 	*info,
renatofilho@456
   612
		  GnomeVFSSetFileInfoMask 	 mask,
renatofilho@456
   613
		  GnomeVFSContext 		*context)
renatofilho@456
   614
{
renatofilho@456
   615
    return GNOME_VFS_ERROR_READ_ONLY;
renatofilho@456
   616
}
renatofilho@456
   617
renatofilho@456
   618
static GnomeVFSResult
renatofilho@456
   619
do_truncate (GnomeVFSMethod *method,
renatofilho@456
   620
	     GnomeVFSURI *uri,
renatofilho@456
   621
	     GnomeVFSFileSize where,
renatofilho@456
   622
	     GnomeVFSContext *context)
renatofilho@456
   623
{
renatofilho@456
   624
    return GNOME_VFS_ERROR_READ_ONLY;
renatofilho@456
   625
}
renatofilho@456
   626
renatofilho@456
   627
static GnomeVFSResult
renatofilho@456
   628
do_find_directory (GnomeVFSMethod *method,
renatofilho@456
   629
		   GnomeVFSURI *near_uri,
renatofilho@456
   630
		   GnomeVFSFindDirectoryKind kind,
renatofilho@456
   631
		   GnomeVFSURI **result_uri,
renatofilho@456
   632
		   gboolean create_if_needed,
renatofilho@456
   633
		   gboolean find_if_needed,
renatofilho@456
   634
		   guint permissions,
renatofilho@456
   635
		   GnomeVFSContext *context)
renatofilho@456
   636
{
renatofilho@456
   637
	return GNOME_VFS_ERROR_NOT_SUPPORTED;
renatofilho@456
   638
}
renatofilho@456
   639
renatofilho@456
   640
static GnomeVFSResult
renatofilho@456
   641
do_create_symbolic_link (GnomeVFSMethod *method,
renatofilho@456
   642
			 GnomeVFSURI *uri,
renatofilho@456
   643
			 const char *target_reference,
renatofilho@456
   644
			 GnomeVFSContext *context)
renatofilho@456
   645
{
renatofilho@456
   646
    return GNOME_VFS_ERROR_READ_ONLY;
renatofilho@456
   647
}
renatofilho@456
   648
renatofilho@456
   649
static GnomeVFSResult
renatofilho@456
   650
do_monitor_add (GnomeVFSMethod *method,
renatofilho@456
   651
		GnomeVFSMethodHandle **method_handle_return,
renatofilho@456
   652
		GnomeVFSURI *uri,
renatofilho@456
   653
		GnomeVFSMonitorType monitor_type)
renatofilho@456
   654
{
renatofilho@456
   655
	return GNOME_VFS_ERROR_NOT_SUPPORTED;
renatofilho@456
   656
}
renatofilho@456
   657
renatofilho@456
   658
static GnomeVFSResult
renatofilho@456
   659
do_monitor_cancel (GnomeVFSMethod *method,
renatofilho@456
   660
		   GnomeVFSMethodHandle *method_handle)
renatofilho@456
   661
{
renatofilho@456
   662
	return GNOME_VFS_ERROR_NOT_SUPPORTED;
renatofilho@456
   663
}
renatofilho@456
   664
renatofilho@456
   665
static GnomeVFSResult
renatofilho@456
   666
do_file_control (GnomeVFSMethod *method,
renatofilho@456
   667
		 GnomeVFSMethodHandle *method_handle,
renatofilho@456
   668
		 const char *operation,
renatofilho@456
   669
		 gpointer operation_data,
renatofilho@456
   670
		 GnomeVFSContext *context)
renatofilho@456
   671
{
renatofilho@456
   672
	return GNOME_VFS_ERROR_NOT_SUPPORTED;
renatofilho@456
   673
}
renatofilho@456
   674
melunko@38
   675
static GnomeVFSMethod method = {
melunko@38
   676
	sizeof (GnomeVFSMethod),
renatofilho@456
   677
	do_open, 
renatofilho@456
   678
	do_create,
melunko@38
   679
	do_close,
renatofilho@456
   680
	do_read, 
renatofilho@456
   681
	do_write,
renatofilho@456
   682
	do_seek,
renatofilho@456
   683
	do_tell,
renatofilho@456
   684
	do_truncate_handle, 
renatofilho@456
   685
	do_open_directory,
renatofilho@456
   686
	do_close_directory,
renatofilho@456
   687
	do_read_directory,
melunko@38
   688
	do_get_file_info,
renatofilho@456
   689
	do_get_file_info_from_handle,
renatofilho@456
   690
	do_is_local, 
renatofilho@456
   691
	do_make_directory, 
renatofilho@456
   692
	do_remove_directory,
renatofilho@456
   693
	do_move,
renatofilho@456
   694
	do_unlink,
renatofilho@456
   695
	do_check_same_fs,
renatofilho@456
   696
	do_set_file_info,
renatofilho@456
   697
	do_truncate, 
renatofilho@456
   698
	do_find_directory, 
renatofilho@456
   699
	do_create_symbolic_link,  
renatofilho@456
   700
	do_monitor_add,  
renatofilho@456
   701
	do_monitor_cancel,  
renatofilho@456
   702
	do_file_control 	
melunko@38
   703
};
melunko@38
   704
melunko@38
   705
melunko@38
   706
GnomeVFSMethod *
melunko@38
   707
vfs_module_init (const char *method_name, const char *args)
melunko@38
   708
{
melunko@38
   709
	return &method;
melunko@38
   710
}
melunko@38
   711
melunko@38
   712
void
renatofilho@367
   713
vfs_module_shutdown (GnomeVFSMethod * method)
melunko@38
   714
{
melunko@38
   715
}