8.6 Transfers


8.6 Transfers

Transfers are powerful utilities for transferring files from one place to another. You can copy anything from a single file to an entire directory tree with just a single statement, regardless of the file system type.

The API and mechanism is somewhat complicated. After you start a transfer, GnomeVFS periodically runs one of your callback functions. Your callback may need to answer a query, and that's the tricky part; you need to take a very close look at the callback parameters so that you know what kind of answer is appropriate.

The basic URI transfer function is

 GnomeVFSResult gnome_vfs_xfer_uri(const GnomeVFSURI *  src_uri  ,                                       const GnomeVFSURI *  target_uri  ,                                       GnomeVFSXferOptions  options  ,                                       GnomeVFSXferErrorMode  error_mode  ,                                       GnomeVFSXferOverwriteMode  overwrite_mode  ,                                       GnomeVFSXferProgressCallback  callback  ,                                       gpointer  data  ) 

This function transfers src_uri to its corresponding location in target_uri .

Specify options as a bitwise OR of these constants:

  • GNOME_VFS_XFER_DEFAULT

  • GNOME_VFS_XFER_REMOVESOURCE : Moves the files; doesn't just copy.

  • GNOME_VFS_XFER_LINK_ITEMS : Does not copy; creates symbolic links.

  • GNOME_VFS_XFER_FOLLOW_LINKS : Follows symbolic links in the source.

  • GNOME_VFS_XFER_RECURSIVE : If the source is a directory, copies the entire contents.

  • GNOME_VFS_XFER_SAMEFS : Limits transfer to the same (local) file system.

  • GNOME_VFS_XFER_USE_UNIQUE_NAMES : Makes sure that the transfer does not overwrite files at the target by giving new names to the source files that already exist in the target.

  • GNOME_VFS_XFER_DELETE_ITEMS : Does not copy; removes the source (set target_uri to NULL ).

  • GNOME_VFS_XFER_EMPTY_DIRECTORIES : Does not copy; removes the contents of the source (set target_uri to NULL ).

  • GNOME_VFS_XFER_NEW_UNIQUE_DIRECTORY : Does not copy; creates a new directory at the target. If the target already exists, the callback function will have the name of another new, unique directory.

Specify error_mode as one of the following:

  • GNOME_VFS_XFER_ERROR_MODE_ABORT : Terminates the transfer if errors occur.

  • GNOME_VFS_XFER_ERROR_MODE_QUERY : Stops transfer and asks the callback for advice.

The overwrite_mode parameter determines what GnomeVFS does when a transfer can overwrite a file:

  • GNOME_VFS_XFER_OVERWRITE_MODE_ABORT : Terminates the transfer.

  • GNOME_VFS_XFER_OVERWRITE_MODE_QUERY : Asks the callback function for advice.

  • GNOME_VFS_XFER_OVERWRITE_MODE_REPLACE : Replaces the file (silently).

  • GNOME_VFS_XFER_OVERWRITE_MODE_SKIP : Skips the file.

Every few hundred milliseconds , or whenever interaction is necessary as noted in the preceding discussion, GnomeVFS invokes

  callback  (  info  ,  data  ) 

The full type definition for callback is

 typedef gint (* GnomeVFSXferProgressCallback) (GnomeVFSXferProgressInfo *info,                                                gpointer data); 

Note that callback must be able to answer queries from GnomeVFS. To determine the answer, use the following general procedure:

  1. Look at info ->status to see what GnomeVFS wants.

  2. Figure out what return codes work for the status.

  3. Look at any other fields in info to make a final decision.

Detailed descriptions of each step follow.

Step 1:

The value of info ->status can be any of the following:

  • GNOME_VFS_XFER_PROGRESS_STATUS_OK : No errors; a normal status report.

  • GNOME_VFS_XFER_PROGRESS_STATUS_VFSERROR : The callback must react to an error.

  • GNOME_VFS_XFER_PROGRESS_STATUS_OVERWRITE : The callback must determine whether GnomeVFS should overwrite a file.

  • GNOME_VFS_XFER_PROGRESS_STATUS_DUPLICATE : The callback must determine what to do about a duplicate filename.

Step 2:

If info ->status says that everything is going well, return 1 to continue or 0 to terminate the transfer. For an error, your callback can return one of the following:

  • GNOME_VFS_XFER_ERROR_ACTION_ABORT : Terminate the transfer.

  • GNOME_VFS_XFER_ERROR_ACTION_RETRY : Try again.

  • GNOME_VFS_XFER_ERROR_ACTION_SKIP : Skip this operation and continue.

For overwrite questions, the return codes are

  • GNOME_VFS_XFER_OVERWRITE_ACTION_ABORT : Terminate the transfer.

  • GNOME_VFS_XFER_OVERWRITE_ACTION_REPLACE : Replace the file.

  • GNOME_VFS_XFER_OVERWRITE_ACTION_REPLACE_ALL : Replace this and any other files with duplicate names in the future.

  • GNOME_VFS_XFER_OVERWRITE_ACTION_SKIP : Skip this file.

  • GNOME_VFS_XFER_OVERWRITE_ACTION_SKIP_ALL : Skip this and any other files with duplicate names in the future.

For duplicate filenames, set info ->duplicate_name (see the discussion that follows) and return 1 to continue or 0 to stop.

Step 3:

GnomeVFSXferProgressInfo is a large structure with these fields:

  • status ( GnomeVFSXferProgressStatus ): See the preceding discussion.

  • vfs_status ( GnomeVFSResult ): Error code from VFS operation (see Section 8.10).

  • phase ( GnomeVFSXferPhase ): Current transfer phase; one of

    • GNOME_VFS_XFER_PHASE_INITIAL

    • GNOME_VFS_XFER_CHECKING_DESTINATION

    • GNOME_VFS_XFER_PHASE_COLLECTING (collecting source files)

    • GNOME_VFS_XFER_PHASE_READYTOGO

    • GNOME_VFS_XFER_PHASE_OPENSOURCE (opening the source file)

    • GNOME_VFS_XFER_PHASE_OPENTARGET (opening the target file)

    • GNOME_VFS_XFER_PHASE_COPYING

    • GNOME_VFS_XFER_PHASE_MOVING

    • GNOME_VFS_XFER_PHASE_READSOURCE

    • GNOME_VFS_XFER_PHASE_WRITETARGET

    • GNOME_VFS_XFER_PHASE_CLOSESOURCE

    • GNOME_VFS_XFER_PHASE_CLOSETARGET

    • GNOME_VFS_XFER_PHASE_DELETESOURCE

    • GNOME_VFS_XFER_PHASE_SETATTRIBUTES (setting the target file information)

    • GNOME_VFS_XFER_PHASE_FILECOMPLETED (ready for the next file)

    • GNOME_VFS_XFER_PHASE_CLEANUP

    • GNOME_VFS_XFER_PHASE_COMPLETED

  • source_name ( gchar * ): Source URI.

  • target_name ( gchar * ): Target URI.

  • file_index ( gulong ): Current file number.

  • files_total ( gulong ): Total number of files in the transfer.

  • bytes_total ( GnomeVFSFileSize ): Total number of bytes in the transfer.

  • file_size ( GnomeVFSFileSize ): Current file size .

  • bytes_copied ( GnomeVFSFileSize ): Number of bytes transferred from the current file so far.

  • total_bytes_copied ( GnomeVFSFileSize ): Total number of bytes copied in the transfer so far.

  • duplicate_name ( gchar * ): Set this to avoid a duplicate file.

  • duplicate_count ( int ): The number of copies of the file so far; helps build a unique name like copy 2 of file .

  • top_level_item ( gboolean ): If TRUE , the transfer function call explicitly named the current item; it is not part of a recursively traversed subdirectory.

8.6.1 Additional Transfer Functions

Now that you've seen the particulars of transferring a single item, you are ready to see the other transfer utilities at your disposal:

  •  GnomeVFSResult gnome_vfs_xfer_uri_list(const GList *  src_uri_list  ,                                      const GList *  target_uri_list  ,                                      GnomeVFSXferOptions  options  ,                                      GnomeVFSXferErrorMode  error_mode  ,                                      GnomeVFSXferOverwriteMode  overwrite_mode  ,                                      GnomeVFSXferProgressCallback  callback  ,                                      gpointer  data  ) 

    Like gnome_vfs_xfer_uri() , but transfers each URI in src_uri_list to its corresponding URI in target_uri_list .

  •  GnomeVFSResult gnome_vfs_xfer_delete_list(const GList *  src_uri_list  ,                                         GnomeVFSXferErrorMode  error_mode  ,                                         GnomeVFSXferOptions  options  ,                                         GnomeVFSXferProgressCallback  callback  ,                                         gpointer  data  ) 

    Deletes the items in src_uri_list .

  •  GnomeVFSResult gnome_vfs_async_xfer(GnomeVFSAsyncHandle **  handle_addr  ,                                     const GList *  src_uri_list  ,                                     const GList *  target_uri_list  ,                                     GnomeVFSXferOptions  options  ,                                     GnomeVFSXferErrorMode  error_mode  ,                                     GnomeVFSXferOverwriteMode  overwrite_mode  ,                                     GnomeVFSAsyncXferProgressCallback  afunc  ,                                     gpointer  adata  ,                                     GnomeVFSXferProgressCallback  callback  ,                                     gpointer  data  ) 

    Like gnome_vfs_xfer_uri_list() , but in asynchronous mode, so that your program can perform other tasks during a transfer. For regular status reports , GnomeVFS invokes

  afunc  (*  handle_addr  ,  info  ,  adata  ) 

The type definition for afunc is

 typedef gint (* GnomeVFSAsyncXferProgressCallback) (GnomeVFSAsyncHandle *  handle  ,                                             GnomeVFSXferProgressInfo *  info  ,                                             gpointer  data  ); 

For synchronous requests that require an answer, GnomeVFS makes the usual call to

  callback  (  info  ,  data  ) 



The Official GNOME 2 Developers Guide
The Official GNOME 2 Developers Guide
ISBN: 1593270305
EAN: 2147483647
Year: 2004
Pages: 108

flylib.com © 2008-2017.
If you may any questions please contact us: flylib@qtcs.net