melunko@38: /* melunko@38: * @author Hallyson Melo 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 melunko@38: #endif melunko@38: melunko@38: #include melunko@38: #include leo_sobral@441: #include leo_sobral@441: #include melunko@38: #include melunko@38: melunko@38: #include melunko@38: #include melunko@38: rosfran@547: #include rosfran@277: #include rosfran@547: #include rosfran@277: #include rosfran@277: #include rosfran@277: #include rosfran@277: #include rosfran@277: #include rosfran@332: #include rosfran@332: #include rosfran@357: #include 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; rosfran@606: rosfran@606: gboolean is_livetv; /* it is, or not a Live TV content transfer */ rosfran@606: gboolean is_local_file; /* tell if the file is local to the current content transfer */ 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; rosfran@606: rosfran@606: (*method_handle)->is_livetv = FALSE; rosfran@606: (*method_handle)->is_local_file = FALSE; 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@619: gchar *tmp_str3 = strstr (tmp_str2, ".nuv.avi"); renatofilho@619: if (tmp_str3 != NULL) { renatofilho@619: tmp_str3[4] = '\0'; renatofilho@619: } renatofilho@619: 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 */ rosfran@606: if ( ( myth_handle->is_livetv = 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@606: if ( ( myth_handle->is_local_file = gmyth_uri_is_local_file(gmyth_uri) ) == TRUE ) 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 */ rosfran@606: if ( ( method_handle->is_livetv = 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@606: if ( ( method_handle->is_local_file = gmyth_uri_is_local_file(method_handle->gmyth_uri) ) == TRUE ) 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@606: if ( myth_handle->is_local_file ) rosfran@547: result = gmyth_file_local_read ( GMYTH_FILE_LOCAL(myth_handle->file), rosfran@547: myth_buffer, rosfran@606: num_bytes, myth_handle->is_livetv ); rosfran@547: else rosfran@547: result = gmyth_file_transfer_read ( GMYTH_FILE_TRANSFER(myth_handle->file), renatofilho@502: myth_buffer, rosfran@606: num_bytes, myth_handle->is_livetv ); 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: }