Differenze tra le versioni di "Monitorare con le funzioni esterne del API di libgio-2.0 le modifiche apportate ad un file"

Da Gambas-it.org - Wikipedia.
Riga 1: Riga 1:
 
La libreria ''libgio-2.0'' di GLIB consente, fra l'altro, di intercettare le eventuali modifiche apportate ad uno specifico file, ovvero ad un qualsiasi file all'interno di una cartella.
 
La libreria ''libgio-2.0'' di GLIB consente, fra l'altro, di intercettare le eventuali modifiche apportate ad uno specifico file, ovvero ad un qualsiasi file all'interno di una cartella.
  
E' necessario richiamare in Gambas la libreria dinamica condivisa: "''libgio-2.0.so.0.4002.0''"
+
E' necessario avere installata nel sistema e richiamare in Gambas la libreria dinamica condivisa: "''libgio-2.0.so''"
  
  
Riga 28: Riga 28:
 
  <FONT Color=gray>' ''void g_main_loop_run (GMainLoop *loop)
 
  <FONT Color=gray>' ''void g_main_loop_run (GMainLoop *loop)
 
  ' ''Runs a main loop until g_main_loop_quit() is called on the loop.''</font>
 
  ' ''Runs a main loop until g_main_loop_quit() is called on the loop.''</font>
  Private Extern g_main_loop_run(gMainloop As Pointer)
+
  Private Extern g_main_loop_run(gloop As Pointer)
 
   
 
   
 
  <FONT Color=gray>' ''char * g_file_get_basename (GFile *file)''
 
  <FONT Color=gray>' ''char * g_file_get_basename (GFile *file)''
 
  ' ''Gets the base name (the last component of the path) for a given GFile.''</font>
 
  ' ''Gets the base name (the last component of the path) for a given GFile.''</font>
 
  Private Extern g_file_get_basename(GFile As Pointer) As String
 
  Private Extern g_file_get_basename(GFile As Pointer) As String
 +
 +
<FONT Color=gray>' ''void g_main_loop_unref (GMainLoop *loop)''
 +
' ''Decreases the reference count on a GMainLoop object by one.''</font>
 +
Private Extern g_main_loop_unref(gloop As Pointer)
 
   
 
   
 
  <FONT Color=gray>' ''void g_object_unref (gpointer object)''
 
  <FONT Color=gray>' ''void g_object_unref (gpointer object)''
Riga 59: Riga 63:
 
   g_main_loop_run(gml)
 
   g_main_loop_run(gml)
 
      
 
      
   
+
  g_main_loop_unref(gml)
 
   g_object_unref(mon)
 
   g_object_unref(mon)
 +
  g_object_unref(gf)
 
    
 
    
 
  '''End'''
 
  '''End'''

Versione delle 10:07, 17 feb 2018

La libreria libgio-2.0 di GLIB consente, fra l'altro, di intercettare le eventuali modifiche apportate ad uno specifico file, ovvero ad un qualsiasi file all'interno di una cartella.

E' necessario avere installata nel sistema e richiamare in Gambas la libreria dinamica condivisa: "libgio-2.0.so"


Mostriamo un esempio pratico, nel quale monitoreremo il contenuto della cartella dei file temporanei /tmp :

Library "libgio-2.0:0.4002.0"

Private Enum G_FILE_MONITOR_NONE = 0, G_FILE_MONITOR_WATCH_MOUNTS, G_FILE_MONITOR_SEND_MOVED,
             G_FILE_MONITOR_WATCH_HARD_LINKS, G_FILE_MONITOR_WATCH_MOVES

' GFile * g_file_new_for_path (const char *path)
' Constructs a GFile for a given path.
Private Extern g_file_new_for_path(path As String) As Pointer

' GFileMonitor * g_file_monitor (GFile *file, GFileMonitorFlags flags, GCancellable *cancellable, GError **error)
' Obtains a file or directory monitor for the given file, depending on the type of the file.
Private Extern g_file_monitor(GFile As Pointer, flags As Integer, cancellable As Pointer, GError As Pointer) As Pointer

' gulong g_signal_connect_data (gpointer instance, const gchar *detailed_signal, GCallback c_handler, gpointer data, GClosureNotify destroy_data, GConnectFlags connect_flags)
' Connects a GCallback function to a signal for a particular object.
Private Extern g_signal_connect_data(instance As Pointer, detailed_signal As String, c_handler As Pointer, data As Pointer, destroy_data As Pointer, connect_flags As Integer) As Long

' GMainLoop * g_main_loop_new (GMainContext *context, gboolean is_running)
' Creates a new GMainLoop structure.
Private Extern g_main_loop_new(context As Pointer, is_running As Boolean) As Pointer

' void g_main_loop_run (GMainLoop *loop)
' Runs a main loop until g_main_loop_quit() is called on the loop.
Private Extern g_main_loop_run(gloop As Pointer)

' char * g_file_get_basename (GFile *file)
' Gets the base name (the last component of the path) for a given GFile.
Private Extern g_file_get_basename(GFile As Pointer) As String

' void g_main_loop_unref (GMainLoop *loop)
' Decreases the reference count on a GMainLoop object by one.
Private Extern g_main_loop_unref(gloop As Pointer)

' void g_object_unref (gpointer object)
' Decreases the reference count of object.
Private Extern g_object_unref(Gobject As Pointer)


Public Sub Main()
 
 Dim s As String
 Dim gf, mon, gml As Pointer
       
' Impostiamo la cartella da monitorare:
  s = "/tmp"
   
  gf = g_file_new_for_path(s)
  If gf = 0 Then Error.Raise("Impossibile impostare il percorso del file da monitorare !")
   
  mon = g_file_monitor(gf, G_FILE_MONITOR_SEND_MOVED, 0, 0)
  If mon = 0 Then Error.Raise("Impossibile monitorare " & s & " !")
   
' Funzione Callback che chiama la 'Funzione di Callback' per intercettare gli eventi sui file della cartella monitorata:
  g_signal_connect_data(mon, "changed", callback, 0, 0, 0)
   
  gml = g_main_loop_new(0, False)
  g_main_loop_run(gml)
   
  g_main_loop_unref(gml)
  g_object_unref(mon)
  g_object_unref(gf)
  
End


Private Function callback(monitor As Pointer, primo As Pointer, secondo As Pointer, evento As Integer, udata As Pointer)
 
 Dim ris As String
 Dim eventi As String[]
 
  eventi = ["CHANGED", "CHANGES_DONE_HINT", "DELETED", "CREATED", "ATTRIBUTE_CHANGED",
            "PRE_UNMOUNT", "UNMOUNTED", "MOVED", "RENAMED", "MOVED_IN", "MOVED_OUT"]
 
' Descrive il tipo di evento ed il file interessato:
  ris = "Evento n. " & evento & " = '" & eventi[evento] & "'  -  " & " Nome primo file: " &
        Quote(IIf(primo > 0, g_file_get_basename(primo), "---")) &
        ",  Nome secondo file: " & Quote(IIf(secondo > 0, g_file_get_basename(secondo), "---"))
   
  Print ris
  
End



Riferimenti