[california] Better responsiveness when performing I/O: Bug #725769



commit c5d3b5c49e2d61066e83007adca057902ffd273d
Author: Jim Nelson <jim yorba org>
Date:   Wed Jun 25 17:43:20 2014 -0700

    Better responsiveness when performing I/O: Bug #725769
    
    Now using EDS async variants wherever possible and a busy cursor over
    the window while the async operation is at work.

 .../activator-google-calendar-list-pane.vala       |   15 ++++++--
 src/activator/webcal/activator-webcal-pane.vala    |   14 ++++++-
 .../backing-eds-calendar-source-subscription.vala  |    7 ++--
 src/backing/eds/backing-eds-calendar-source.vala   |   32 +++++++++-------
 src/backing/eds/backing-eds-store.vala             |    4 +-
 src/host/host-create-update-event.vala             |   26 +++++++++++--
 src/host/host-main-window.vala                     |   11 ------
 src/host/host-quick-create-event.vala              |   13 ++++++-
 src/host/host-show-event.vala                      |   23 ++++++++++--
 src/toolkit/toolkit.vala                           |   38 ++++++++++++++++++++
 src/util/util-scheduled.vala                       |   18 +++++++++
 vapi/libecal-1.2.vapi                              |   23 +++++++-----
 vapi/libecal-1.2/libecal-1.2.metadata              |   33 +++++++++++++----
 13 files changed, 193 insertions(+), 64 deletions(-)
---
diff --git a/src/activator/google/activator-google-calendar-list-pane.vala 
b/src/activator/google/activator-google-calendar-list-pane.vala
index 4e47b00..8d37d7a 100644
--- a/src/activator/google/activator-google-calendar-list-pane.vala
+++ b/src/activator/google/activator-google-calendar-list-pane.vala
@@ -169,16 +169,23 @@ public class GoogleCalendarListPane : Gtk.Grid, Toolkit.Card {
         }
         
         debug("Subscribing to %s", uri.to_string(false));
+        
+        Gdk.Cursor? cursor = Toolkit.set_busy(this);
+        
+        Error? subscribe_err = null;
         try {
             yield store.subscribe_caldav_async(calendar.title, uri, username,
                 calendar.color.to_hexadecimal(), null);
         } catch (Error err) {
-            notify_failure(_("Unable to subscribe to %s: %s").printf(calendar.title, err.message));
-            
-            return;
+            subscribe_err = err;
         }
         
-        notify_success();
+        Toolkit.set_unbusy(this, cursor);
+        
+        if (subscribe_err == null)
+            notify_success();
+        else
+            notify_failure(_("Unable to subscribe to %s: %s").printf(calendar.title, subscribe_err.message));
     }
 }
 
diff --git a/src/activator/webcal/activator-webcal-pane.vala b/src/activator/webcal/activator-webcal-pane.vala
index 047304f..c66dc91 100644
--- a/src/activator/webcal/activator-webcal-pane.vala
+++ b/src/activator/webcal/activator-webcal-pane.vala
@@ -71,13 +71,23 @@ internal class WebCalActivatorPane : Gtk.Grid, Toolkit.Card {
     }
     
     private async void subscribe_async() {
+        Gdk.Cursor? cursor = Toolkit.set_busy(this);
+        
+        Error? subscribe_err = null;
         try {
             yield store.subscribe_webcal_async(name_entry.text, URI.parse(url_entry.text),
                 null, Gfx.rgba_to_uint8_rgb_string(color_button.rgba), null);
-            notify_success();
         } catch (Error err) {
+            subscribe_err = err;
+        }
+        
+        Toolkit.set_unbusy(this, cursor);
+        
+        if (subscribe_err == null) {
+            notify_success();
+        } else {
             notify_failure(_("Unable to subscribe to Web calendar at %s: %s").printf(url_entry.text,
-                err.message));
+                subscribe_err.message));
         }
     }
 }
diff --git a/src/backing/eds/backing-eds-calendar-source-subscription.vala 
b/src/backing/eds/backing-eds-calendar-source-subscription.vala
index ff02d70..f38932d 100644
--- a/src/backing/eds/backing-eds-calendar-source-subscription.vala
+++ b/src/backing/eds/backing-eds-calendar-source-subscription.vala
@@ -112,12 +112,13 @@ internal class EdsCalendarSourceSubscription : CalendarSourceSubscription {
     
     private void on_objects_added(SList<weak iCal.icalcomponent> objects) {
         foreach (weak iCal.icalcomponent ical_component in objects) {
-            // TODO: Either use the async variant or run this in a background thread
-            view.client.generate_instances_for_object_sync(
+            view.client.generate_instances_for_object(
                 ical_component,
                 window.start_exact_time.to_time_t(),
                 window.end_exact_time.to_time_t(),
-                on_instance_added);
+                null,
+                on_instance_added,
+                null);
         }
     }
     
diff --git a/src/backing/eds/backing-eds-calendar-source.vala 
b/src/backing/eds/backing-eds-calendar-source.vala
index 246023f..984f778 100644
--- a/src/backing/eds/backing-eds-calendar-source.vala
+++ b/src/backing/eds/backing-eds-calendar-source.vala
@@ -40,6 +40,11 @@ internal class EdsCalendarSource : CalendarSource {
         notify[PROP_COLOR].connect(on_color_changed);
     }
     
+    ~EdsCalendarSource() {
+        if (scheduled_source_write != null)
+            scheduled_source_write.wait();
+    }
+    
     private void on_title_changed() {
         // on schedule write if something changed
         if (eds_source.display_name == title)
@@ -69,14 +74,17 @@ internal class EdsCalendarSource : CalendarSource {
     
     private void schedule_source_write(string reason) {
         debug("Scheduling update of %s due to %s...", to_string(), reason);
+        
+        // cancel an outstanding write
+        if (source_write_cancellable != null)
+            source_write_cancellable.cancel();
         source_write_cancellable = new Cancellable();
+        
         scheduled_source_write = new Scheduled.once_after_msec(UPDATE_DELAY_MSEC,
-            on_background_write_source, Priority.LOW);
+            () => on_background_write_source_async.begin(), Priority.LOW);
     }
     
-    private void on_background_write_source() {
-        // in essence, say this is no longer scheduled ... for now, allow another write to be
-        // scheduled while this one is occurring
+    private async void on_background_write_source_async() {
         Cancellable? cancellable = source_write_cancellable;
         source_write_cancellable = null;
         
@@ -85,8 +93,8 @@ internal class EdsCalendarSource : CalendarSource {
         
         try {
             debug("Updating EDS source %s...", to_string());
-            // TODO: Fix bindings to use async variant
-            eds_source.write_sync(cancellable);
+            yield eds_source.write(cancellable);
+            debug("Updated EDS source %s", to_string());
         } catch (Error err) {
             debug("Error updating EDS source %s: %s", to_string(), err.message);
         }
@@ -134,9 +142,8 @@ internal class EdsCalendarSource : CalendarSource {
         Cancellable? cancellable = null) throws Error {
         check_open();
         
-        // TODO: Fix create_object() bindings so async is possible
         string? uid;
-        client.create_object_sync(instance.ical_component, out uid, cancellable);
+        yield client.create_object(instance.ical_component, cancellable, out uid);
         
         return !String.is_empty(uid) ? new Component.UID(uid) : null;
     }
@@ -145,24 +152,21 @@ internal class EdsCalendarSource : CalendarSource {
         Cancellable? cancellable = null) throws Error {
         check_open();
         
-        // TODO: Fix modify_object() bindings so async is possible
-        client.modify_object_sync(instance.ical_component, E.CalObjModType.THIS, cancellable);
+        yield client.modify_object(instance.ical_component, E.CalObjModType.THIS, cancellable);
     }
     
     public override async void remove_component_async(Component.UID uid,
         Cancellable? cancellable = null) throws Error {
         check_open();
         
-        // TODO: Fix remove_object() bindings so async is possible
-        client.remove_object_sync(uid.value, null, E.CalObjModType.THIS, cancellable);
+        yield client.remove_object(uid.value, null, E.CalObjModType.THIS, cancellable);
     }
     
     public override async void import_icalendar_async(Component.iCalendar ical, Cancellable? cancellable = 
null)
         throws Error {
         check_open();
         
-        // TODO: Fix receive_objects() bindings so async is possible
-        client.receive_objects_sync(ical.ical_component, cancellable);
+        yield client.receive_objects(ical.ical_component, cancellable);
     }
 }
 
diff --git a/src/backing/eds/backing-eds-store.vala b/src/backing/eds/backing-eds-store.vala
index 2b6efaf..70f8b71 100644
--- a/src/backing/eds/backing-eds-store.vala
+++ b/src/backing/eds/backing-eds-store.vala
@@ -110,8 +110,8 @@ internal class EdsStore : Store, WebCalSubscribable, CalDAVSubscribable {
         
         List<E.Source> sources = new List<E.Source>();
         sources.append(scratch);
-        // TODO: Properly bind async version of this call
-        registry.create_sources_sync(sources, cancellable);
+        
+        yield registry.create_sources(sources, cancellable);
     }
     
     public override Gee.List<Source> get_sources() {
diff --git a/src/host/host-create-update-event.vala b/src/host/host-create-update-event.vala
index 468ce89..77694f7 100644
--- a/src/host/host-create-update-event.vala
+++ b/src/host/host-create-update-event.vala
@@ -275,12 +275,21 @@ public class CreateUpdateEvent : Gtk.Grid, Toolkit.Card {
             return;
         }
         
+        Gdk.Cursor? cursor = Toolkit.set_busy(this);
+        
+        Error? create_err = null;
         try {
             yield event.calendar_source.create_component_async(event, cancellable);
-            notify_success();
         } catch (Error err) {
-            notify_failure(_("Unable to create event: %s").printf(err.message));
+            create_err = err;
         }
+        
+        Toolkit.set_unbusy(this, cursor);
+        
+        if (create_err == null)
+            notify_success();
+        else
+            notify_failure(_("Unable to create event: %s").printf(create_err.message));
     }
     
     // TODO: Delete from original source if not the same as the new source
@@ -291,12 +300,21 @@ public class CreateUpdateEvent : Gtk.Grid, Toolkit.Card {
             return;
         }
         
+        Gdk.Cursor? cursor = Toolkit.set_busy(this);
+        
+        Error? update_err = null;
         try {
             yield event.calendar_source.update_component_async(event, cancellable);
-            notify_success();
         } catch (Error err) {
-            notify_failure(_("Unable to update event: %s").printf(err.message));
+            update_err = err;
         }
+        
+        Toolkit.set_unbusy(this, cursor);
+        
+        if (update_err == null)
+            notify_success();
+        else
+            notify_failure(_("Unable to update event: %s").printf(update_err.message));
     }
     
 }
diff --git a/src/host/host-main-window.vala b/src/host/host-main-window.vala
index d1c0874..71a2cac 100644
--- a/src/host/host-main-window.vala
+++ b/src/host/host-main-window.vala
@@ -437,9 +437,6 @@ public class MainWindow : Gtk.ApplicationWindow {
     private void on_request_display_event(Component.Event event, Gtk.Widget relative_to,
         Gdk.Point? for_location) {
         ShowEvent show_event = new ShowEvent();
-        show_event.remove_event.connect(() => {
-            remove_event_async.begin(event, null);
-        });
         
         CreateUpdateEvent create_update_event = new CreateUpdateEvent();
         create_update_event.is_update = true;
@@ -451,14 +448,6 @@ public class MainWindow : Gtk.ApplicationWindow {
         
         show_deck(relative_to, for_location, deck);
     }
-    
-    private async void remove_event_async(Component.Event event, Cancellable? cancellable) {
-        try {
-            yield event.calendar_source.remove_component_async(event.uid, cancellable);
-        } catch (Error err) {
-            debug("Unable to destroy event: %s", err.message);
-        }
-    }
 }
 
 }
diff --git a/src/host/host-quick-create-event.vala b/src/host/host-quick-create-event.vala
index e0b33b1..9cdea9c 100644
--- a/src/host/host-quick-create-event.vala
+++ b/src/host/host-quick-create-event.vala
@@ -127,12 +127,21 @@ public class QuickCreateEvent : Gtk.Grid, Toolkit.Card {
             return;
         }
         
+        Gdk.Cursor? cursor = Toolkit.set_busy(this);
+        
+        Error? create_err = null;
         try {
             yield event.calendar_source.create_component_async(event, cancellable);
-            notify_success();
         } catch (Error err) {
-            notify_failure(_("Unable to create event: %s").printf(err.message));
+            create_err = err;
         }
+        
+        Toolkit.set_unbusy(this, cursor);
+        
+        if (create_err == null)
+            notify_success();
+        else
+            notify_failure(_("Unable to create event: %s").printf(create_err.message));
     }
 }
 
diff --git a/src/host/host-show-event.vala b/src/host/host-show-event.vala
index 18d5200..9f0cf08 100644
--- a/src/host/host-show-event.vala
+++ b/src/host/host-show-event.vala
@@ -47,8 +47,6 @@ public class ShowEvent : Gtk.Grid, Toolkit.Card {
     
     private new Component.Event event;
     
-    public signal void remove_event(Component.Event event);
-    
     public ShowEvent() {
         Calendar.System.instance.is_24hr_changed.connect(build_display);
         Calendar.System.instance.today_changed.connect(build_display);
@@ -132,8 +130,7 @@ public class ShowEvent : Gtk.Grid, Toolkit.Card {
     
     [GtkCallback]
     private void on_remove_button_clicked() {
-        remove_event(event);
-        notify_success();
+        remove_event_async.begin();
     }
     
     [GtkCallback]
@@ -145,6 +142,24 @@ public class ShowEvent : Gtk.Grid, Toolkit.Card {
     private void on_close_button_clicked() {
         notify_user_closed();
     }
+    
+    private async void remove_event_async() {
+        Gdk.Cursor? cursor = Toolkit.set_busy(this);
+        
+        Error? remove_err = null;
+        try {
+            yield event.calendar_source.remove_component_async(event.uid, null);
+        } catch (Error err) {
+            remove_err = err;
+        }
+        
+        Toolkit.set_unbusy(this, cursor);
+        
+        if (remove_err == null)
+            notify_success();
+        else
+            notify_failure(_("Unable to remove event: %s").printf(remove_err.message));
+    }
 }
 
 }
diff --git a/src/toolkit/toolkit.vala b/src/toolkit/toolkit.vala
index 41c3030..2630ed5 100644
--- a/src/toolkit/toolkit.vala
+++ b/src/toolkit/toolkit.vala
@@ -56,4 +56,42 @@ public void spin_event_loop() {
         Gtk.main_iteration();
 }
 
+/**
+ * Sets the window as "busy" by changing the cursor.
+ *
+ * @returns the window's current Gdk.Cursor.  This will need to be passed to
+ * { link set_window_unbusy}.
+ */
+public Gdk.Cursor? set_busy(Gtk.Widget widget) {
+    Gtk.Widget toplevel = widget.get_toplevel();
+    if (!toplevel.is_toplevel()) {
+        debug("Unable to set busy: widget has no toplevel window");
+        
+        return null;
+    }
+    
+    Gdk.Window gdk_window = toplevel.get_window();
+    Gdk.Cursor? unbusy_cursor = gdk_window.get_cursor();
+    gdk_window.set_cursor(new Gdk.Cursor.for_display(toplevel.get_display(), Gdk.CursorType.WATCH));
+    
+    return unbusy_cursor;
+}
+
+/**
+ * Sets the window as "unbusy".
+ *
+ * Pass the Gdk.Cursor returned by { link set_window_busy}.
+ */
+public void set_unbusy(Gtk.Widget widget, Gdk.Cursor? unbusy_cursor) {
+    Gtk.Widget toplevel = widget.get_toplevel();
+    if (!toplevel.is_toplevel()) {
+        if (unbusy_cursor != null)
+            debug("Unable to set unbusy: widget has no toplevel window");
+        
+        return;
+    }
+    
+    toplevel.get_window().set_cursor(unbusy_cursor);
+}
+
 }
diff --git a/src/util/util-scheduled.vala b/src/util/util-scheduled.vala
index 1fd0dc2..507cc58 100644
--- a/src/util/util-scheduled.vala
+++ b/src/util/util-scheduled.vala
@@ -139,6 +139,24 @@ public class Scheduled : BaseObject {
         source_id = 0;
     }
     
+    /**
+     * Wait for the scheduled code to execute.
+     *
+     * This waits for execution by spinning the event loop, which can cause reentrancy.  There is
+     * also the danger of waiting for continuously executing code that never returns
+     * { link Reschedule.HALT}.  In that case, wait() will never return.
+     *
+     * If the scheduled code has been cancelled, is executing, or has already executed, wait()
+     * immediately returns.
+     */
+    public void wait(MainContext main_context = MainContext.default()) {
+        if (!is_scheduled || is_executing)
+            return;
+        
+        while (main_context.pending())
+            main_context.iteration(false);
+    }
+    
     private bool on_once() {
         is_executing = true;
         schedule_once();
diff --git a/vapi/libecal-1.2.vapi b/vapi/libecal-1.2.vapi
index 1a97eff..e414c46 100644
--- a/vapi/libecal-1.2.vapi
+++ b/vapi/libecal-1.2.vapi
@@ -18,7 +18,7 @@ namespace E {
                public static async unowned E.Client connect (E.Source source, E.CalClientSourceType 
source_type, GLib.Cancellable cancellable) throws GLib.Error;
                public static unowned E.Client connect_sync (E.Source source, E.CalClientSourceType 
source_type, GLib.Cancellable cancellable) throws GLib.Error;
                [CCode (finish_name = "e_cal_client_create_object_finish")]
-               public async bool create_object (iCal.icalcomponent icalcomp, GLib.Cancellable? cancellable) 
throws GLib.Error;
+               public async void create_object (iCal.icalcomponent icalcomp, GLib.Cancellable? cancellable, 
out string out_uid) throws GLib.Error;
                public bool create_object_sync (iCal.icalcomponent icalcomp, out string out_uid, 
GLib.Cancellable? cancellable) throws GLib.Error;
                public void create_objects (GLib.SList icalcomps, GLib.Cancellable cancellable, 
GLib.AsyncReadyCallback callback);
                public bool create_objects_finish (GLib.AsyncResult _result, GLib.SList out_uids) throws 
GLib.Error;
@@ -31,7 +31,7 @@ namespace E {
                public static void free_ecalcomp_slist (GLib.SList<E.CalComponent> ecalcomps);
                public static void free_icalcomp_slist (GLib.SList icalcomps);
                public void generate_instances (time_t start, time_t end, GLib.Cancellable? cancellable, 
[CCode (delegate_target_pos = 4.9)] E.CalRecurInstanceFn cb, [CCode (delegate_target_pos = 4.9)] owned 
GLib.DestroyNotify? destroy_cb_data);
-               public void generate_instances_for_object (iCal.icalcomponent icalcomp, time_t start, time_t 
end, GLib.Cancellable? cancellable, [CCode (delegate_target_pos = 6.9)] E.CalRecurInstanceFn cb, owned 
GLib.DestroyNotify? destroy_cb_data);
+               public void generate_instances_for_object (iCal.icalcomponent icalcomp, time_t start, time_t 
end, GLib.Cancellable? cancellable, [CCode (delegate_target_pos = 5.9)] E.CalRecurInstanceFn cb, [CCode 
(delegate_target_pos = 5.9)] owned GLib.DestroyNotify? destroy_cb_data);
                public void generate_instances_for_object_sync (iCal.icalcomponent icalcomp, time_t start, 
time_t end, [CCode (delegate_target_pos = 6.9)] E.CalRecurInstanceFn cb);
                public void generate_instances_sync (time_t start, time_t end, [CCode (delegate_target_pos = 
3.9)] E.CalRecurInstanceFn cb);
                public async bool get_attachment_uris (string uid, string rid, GLib.Cancellable? cancellable) 
throws GLib.Error;
@@ -55,17 +55,20 @@ namespace E {
                public async bool get_timezone (string tzid, GLib.Cancellable? cancellable, out unowned 
iCal.icaltimezone out_zone) throws GLib.Error;
                public bool get_timezone_sync (string tzid, out unowned iCal.icaltimezone out_zone, 
GLib.Cancellable? cancellable) throws GLib.Error;
                [CCode (finish_name = "e_cal_client_get_view_finish")]
-               public async bool get_view (string sexp, GLib.Cancellable? cancellable, out unowned 
E.CalClientView out_view) throws GLib.Error;
-               public bool get_view_sync (string sexp, out unowned E.CalClientView out_view, 
GLib.Cancellable? cancellable) throws GLib.Error;
-               public async bool modify_object (iCal.icalcomponent icalcomp, E.CalObjModType mod, 
GLib.Cancellable? cancellable) throws GLib.Error;
-               public bool modify_object_sync (iCal.icalcomponent icalcomp, E.CalObjModType mod, 
GLib.Cancellable? cancellable) throws GLib.Error;
+               public async void get_view (string sexp, GLib.Cancellable? cancellable, out E.CalClientView 
out_view) throws GLib.Error;
+               public void get_view_sync (string sexp, out E.CalClientView out_view, GLib.Cancellable? 
cancellable) throws GLib.Error;
+               [CCode (finish_name = "e_cal_client_modify_object_finish")]
+               public async void modify_object (iCal.icalcomponent icalcomp, E.CalObjModType mod, 
GLib.Cancellable? cancellable) throws GLib.Error;
+               public void modify_object_sync (iCal.icalcomponent icalcomp, E.CalObjModType mod, 
GLib.Cancellable? cancellable) throws GLib.Error;
                public void modify_objects (GLib.SList comps, E.CalObjModType mod, GLib.Cancellable 
cancellable, GLib.AsyncReadyCallback callback);
                public bool modify_objects_finish (GLib.AsyncResult _result) throws GLib.Error;
                public bool modify_objects_sync (GLib.SList comps, E.CalObjModType mod, GLib.Cancellable 
cancellable) throws GLib.Error;
-               public async bool receive_objects (iCal.icalcomponent icalcomp, GLib.Cancellable? 
cancellable) throws GLib.Error;
-               public bool receive_objects_sync (iCal.icalcomponent icalcomp, GLib.Cancellable? cancellable) 
throws GLib.Error;
-               public async bool remove_object (string uid, string rid, E.CalObjModType mod, 
GLib.Cancellable? cancellable) throws GLib.Error;
-               public bool remove_object_sync (string uid, string? rid, E.CalObjModType mod, 
GLib.Cancellable? cancellable) throws GLib.Error;
+               [CCode (finish_name = "e_cal_client_receive_objects_finish")]
+               public async void receive_objects (iCal.icalcomponent icalcomp, GLib.Cancellable? 
cancellable) throws GLib.Error;
+               public void receive_objects_sync (iCal.icalcomponent icalcomp, GLib.Cancellable? cancellable) 
throws GLib.Error;
+               [CCode (finish_name = "e_cal_client_remove_object_finish")]
+               public async void remove_object (string uid, string? rid, E.CalObjModType mod, 
GLib.Cancellable? cancellable) throws GLib.Error;
+               public void remove_object_sync (string uid, string? rid, E.CalObjModType mod, 
GLib.Cancellable? cancellable) throws GLib.Error;
                public void remove_objects (GLib.SList ids, E.CalObjModType mod, GLib.Cancellable 
cancellable, GLib.AsyncReadyCallback callback);
                public bool remove_objects_finish (GLib.AsyncResult _result) throws GLib.Error;
                public bool remove_objects_sync (GLib.SList ids, E.CalObjModType mod, GLib.Cancellable 
cancellable) throws GLib.Error;
diff --git a/vapi/libecal-1.2/libecal-1.2.metadata b/vapi/libecal-1.2/libecal-1.2.metadata
index b67f77e..0d82150 100644
--- a/vapi/libecal-1.2/libecal-1.2.metadata
+++ b/vapi/libecal-1.2/libecal-1.2.metadata
@@ -26,7 +26,9 @@ e_cal_client_add_timezone async="1"
 
 e_cal_client_create_object async="1" finish_name="e_cal_client_create_object_finish"
 e_cal_client_create_object.cancellable nullable="1"
-e_cal_client_create_object_finish.uid is_out="1" value_owned="1"
+
+e_cal_client_create_object_finish type_name="void"
+e_cal_client_create_object_finish.out_uid is_out="1" value_owned="1"
 
 e_cal_client_create_object_sync.out_uid is_out="1" transfer_ownership="1" is_nullable="1"
 e_cal_client_create_object_sync.cancellable nullable="1"
@@ -57,9 +59,9 @@ e_cal_client_generate_instances_sync.cb_data hidden="1"
 e_cal_client_generate_instances_for_object.start type_name="time_t"
 e_cal_client_generate_instances_for_object.end type_name="time_t"
 e_cal_client_generate_instances_for_object.cancellable nullable="1"
-e_cal_client_generate_instances_for_object.cb delegate_target_pos="6.9"
+e_cal_client_generate_instances_for_object.cb delegate_target_pos="5.9"
 e_cal_client_generate_instances_for_object.cb_data hidden="1"
-e_cal_client_generate_instances_for_object.destroy_cb_data value_owned="1" nullable="1"
+e_cal_client_generate_instances_for_object.destroy_cb_data value_owned="1" nullable="1" 
delegate_target_pos="5.9"
 
 e_cal_client_generate_instances_for_object_sync.start type_name="time_t"
 e_cal_client_generate_instances_for_object_sync.end type_name="time_t"
@@ -118,22 +120,37 @@ e_cal_client_get_timezone_sync.zone is_out="1" value_owned="1"
 
 e_cal_client_get_view async="1" finish_name="e_cal_client_get_view_finish"
 e_cal_client_get_view.cancellable nullable="1"
-e_cal_client_get_view_finish.view is_out="1" value_owned="0"
 
+e_cal_client_get_view_finish type_name="void"
+e_cal_client_get_view_finish.out_view is_out="1" value_owned="1"
+
+e_cal_client_get_view_sync type_name="void"
 e_cal_client_get_view_sync.cancellable nullable="1"
-e_cal_client_get_view_sync.view is_out="1" value_owned="1"
+e_cal_client_get_view_sync.out_view is_out="1" value_owned="1"
 
-e_cal_client_modify_object async="1"
+e_cal_client_modify_object async="1" finish_name="e_cal_client_modify_object_finish"
 e_cal_client_modify_object.cancellable nullable="1"
+
+e_cal_client_modify_object_finish type_name="void"
+
+e_cal_client_modify_object_sync type_name="void"
 e_cal_client_modify_object_sync.cancellable nullable="1"
 
-e_cal_client_receive_objects async="1"
+e_cal_client_receive_objects async="1" finish_name="e_cal_client_receive_objects_finish"
 e_cal_client_receive_objects.cancellable nullable="1"
+
+e_cal_client_receive_objects_finish type_name="void"
+
+e_cal_client_receive_objects_sync type_name="void"
 e_cal_client_receive_objects_sync.cancellable nullable="1"
 
-e_cal_client_remove_object async="1"
+e_cal_client_remove_object async="1" finish_name="e_cal_client_remove_object_finish"
+e_cal_client_remove_object.rid nullable="1"
 e_cal_client_remove_object.cancellable nullable="1"
 
+e_cal_client_remove_object_finish type_name="void"
+
+e_cal_client_remove_object_sync type_name="void"
 e_cal_client_remove_object_sync.rid nullable="1"
 e_cal_client_remove_object_sync.cancellable nullable="1"
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]