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