added 'session_id' argument, to add the <Header> SOAP part if not NULL.
authorRodrigo Moya <rodrigo@ximian.com>
Wed, 24 Dec 2003 13:17:29 +0000 (13:17 +0000)
committerRodrigo Moya <rodrigo@src.gnome.org>
Wed, 24 Dec 2003 13:17:29 +0000 (13:17 +0000)
2003-12-24  Rodrigo Moya <rodrigo@ximian.com>

* backends/groupwise/e-gw-message.[ch] (e_gw_message_new_with_header):
added 'session_id' argument, to add the <Header> SOAP part if not NULL.

* backends/groupwise/e-gw-connection.c (e_gw_connection_get_items): use
e_gw_message_new_with_header to create the SOAP message. Also, unref
the correct object if we don't get a response from
e_gw_connection_send_message, or we when we can't find a parameter in
the response.
(logout): pass session ID to e_gw_message_new_with_header().
(e_gw_connection_new): ditto.

* backends/groupwise/e-cal-backend-groupwise.c: removed 'icalcomp'
field from the ECalBackendGroupwisePrivate structure.
(e_cal_backend_groupwise_get_timezone): don't use priv->icalcomp
to retrieve timezones, since that object is empty, use the libical's
built-in timezones.
(populate_cache): fixed C99'isms and re-enabled g_mutex_lock/_unlock
calls.

2003-12-24  Harish Krishnaswamy <kharish@novell.com>

* backends/groupwise/e-gw-connection.[ch] (e_gw_connection_get_items):
new function.

* backends/groupwise/e-cal-backend-groupwise.c (populate_cache): new
function to populate the cache with all objects from the server.
(e_cal_backend_groupwise_open): call populate_cache when opening the
connection, to get all objects from the server.
(e_cal_backend_groupwise_get_default_object): implemented.
(e_cal_backend_groupwise_get_timezone): implemented.

calendar/ChangeLog
calendar/backends/groupwise/e-cal-backend-groupwise.c
calendar/backends/groupwise/e-gw-connection.c
calendar/backends/groupwise/e-gw-connection.h
calendar/backends/groupwise/e-gw-message.c
calendar/backends/groupwise/e-gw-message.h
servers/groupwise/e-gw-connection.c
servers/groupwise/e-gw-connection.h
servers/groupwise/e-gw-message.c
servers/groupwise/e-gw-message.h

index 1f585ed..cf4b160 100644 (file)
@@ -1,3 +1,36 @@
+2003-12-24  Rodrigo Moya <rodrigo@ximian.com>
+
+       * backends/groupwise/e-gw-message.[ch] (e_gw_message_new_with_header):
+       added 'session_id' argument, to add the <Header> SOAP part if not NULL.
+
+       * backends/groupwise/e-gw-connection.c (e_gw_connection_get_items): use
+       e_gw_message_new_with_header to create the SOAP message. Also, unref
+       the correct object if we don't get a response from
+       e_gw_connection_send_message, or we when we can't find a parameter in
+       the response.
+       (logout): pass session ID to e_gw_message_new_with_header().
+       (e_gw_connection_new): ditto.
+
+       * backends/groupwise/e-cal-backend-groupwise.c: removed 'icalcomp'
+       field from the ECalBackendGroupwisePrivate structure.
+       (e_cal_backend_groupwise_get_timezone): don't use priv->icalcomp
+       to retrieve timezones, since that object is empty, use the libical's
+       built-in timezones.
+       (populate_cache): fixed C99'isms and re-enabled g_mutex_lock/_unlock
+       calls.
+
+2003-12-24  Harish Krishnaswamy <kharish@novell.com>
+
+       * backends/groupwise/e-gw-connection.[ch] (e_gw_connection_get_items):
+       new function.
+
+       * backends/groupwise/e-cal-backend-groupwise.c (populate_cache): new
+       function to populate the cache with all objects from the server.
+       (e_cal_backend_groupwise_open): call populate_cache when opening the
+       connection, to get all objects from the server.
+       (e_cal_backend_groupwise_get_default_object): implemented.
+       (e_cal_backend_groupwise_get_timezone): implemented.
+
 2003-12-22  Rodrigo Moya <rodrigo@ximian.com>
 
        * libedata-cal/e-cal-backend-sexp.c (func_has_alarms): removed useless
index 5ca99a3..d930500 100644 (file)
@@ -174,6 +174,53 @@ convert_uri (const char *gw_uri)
        return vuri;
 }
 
+/* Initialy populate the cache from the server */
+//static EGwConnectionStatus
+EGwConnectionStatus
+populate_cache (ECalBackendGroupwisePrivate *priv)
+{
+       EGwConnectionStatus status;
+       SoupSoapParameter *param;
+       const char *uid;
+       const char *rid;
+       const char *calobj;
+        GSList *list = NULL, *l;
+
+        /* get all the objects from the server */
+        status = e_gw_connection_get_items (priv->cnc, &list);
+        if (status != E_GW_CONNECTION_STATUS_OK)
+                return status;
+
+        /* update the cache */
+        g_mutex_lock (priv->mutex);
+
+        for (l = list; l; l = l->next) {
+               param = (SoupSoapParameter *) l->data;
+               uid = soup_soap_parameter_get_first_child_by_name (param, "iCalId");
+               rid = soup_soap_parameter_get_first_child_by_name (param, "recurrance");
+               calobj = soup_soap_parameter_get_string_value (param);
+               e_cal_backend_cache_add_component (priv->cache, uid, rid, calobj);
+        }
+
+       g_mutex_unlock (priv->mutex);
+
+       return E_GW_CONNECTION_STATUS_OK;        
+                                                                                                                    
+}
+
+static void
+update_cache (gpointer *data)
+{
+       EGwConnection *cnc;
+       GList *list;
+       EGwConnectionStatus status;
+
+        cnc = E_GW_CONNECTION (data);
+        /* FIXME: Get all changes from the server since last poll  */
+        /* FIXME: parse the response and update the cache*/
+        /*status =  e_gw_connection_get_items_with_Filter (cnc, &list);*/
+}
+
 /* Open handler for the file backend */
 static ECalBackendSyncStatus
 e_cal_backend_groupwise_open (ECalBackendSync *backend, EDataCal *cal, gboolean only_if_exists,
@@ -226,15 +273,25 @@ e_cal_backend_groupwise_open (ECalBackendSync *backend, EDataCal *cal, gboolean
        cbgw->priv->read_only = FALSE;
        
        if (E_IS_GW_CONNECTION (priv->cnc)) {
+               /* Populate the cache for the first time.*/
+                /* start a timed polling thread set to 10 minutes*/
+                status = populate_cache (priv);
+                if (status != E_GW_CONNECTION_STATUS_OK) {
+                       g_object_unref (priv->cnc);
+                       priv->cnc = NULL;
+                       g_mutex_unlock (priv->mutex);
+                       g_warning (G_STRLOC ": Could not populate the cache");
+
+                        return GNOME_Evolution_Calendar_OtherError;
+                }
+
+                /* FIXME : add a symbolic constant for the time-out */
                g_mutex_unlock (priv->mutex);
+                g_timeout_add (600000, (GSourceFunc) update_cache, (gpointer) cbgw);
+
                return GNOME_Evolution_Calendar_Success;
        }
                
-       
-       /* free memory */
-       g_object_unref (priv->cnc);
-       priv->cnc = NULL;
-
        g_mutex_unlock (priv->mutex);
 
        return GNOME_Evolution_Calendar_AuthenticationFailed;
@@ -278,6 +335,30 @@ e_cal_backend_groupwise_set_mode (ECalBackend *backend, CalMode mode)
 static ECalBackendSyncStatus
 e_cal_backend_groupwise_get_default_object (ECalBackendSync *backend, EDataCal *cal, char **object)
 {
+       
+       ECalComponent *comp;
+       
+        comp = e_cal_component_new ();
+
+       switch (e_cal_backend_get_kind (E_CAL_BACKEND (backend))) {
+       case ICAL_VEVENT_COMPONENT:
+               e_cal_component_set_new_vtype (comp, E_CAL_COMPONENT_EVENT);
+               break;
+       case ICAL_VTODO_COMPONENT:
+               e_cal_component_set_new_vtype (comp, E_CAL_COMPONENT_TODO);
+               break;
+       case ICAL_VJOURNAL_COMPONENT:
+               e_cal_component_set_new_vtype (comp, E_CAL_COMPONENT_JOURNAL);
+               break;
+       default:
+               g_object_unref (comp);
+               return GNOME_Evolution_Calendar_ObjectNotFound;
+       }
+
+       *object = e_cal_component_get_as_string (comp);
+       g_object_unref (comp);
+       
+       return GNOME_Evolution_Calendar_Success;
 }
 
 /* Get_object_component handler for the file backend */
@@ -301,7 +382,7 @@ e_cal_backend_groupwise_get_object (ECalBackendSync *backend, EDataCal *cal, con
                return GNOME_Evolution_Calendar_Success;
        }
 
-       /* FIXME: get the object from the server */
+       /* callers will never have a uuid that is in server but not in cache */
        return GNOME_Evolution_Calendar_ObjectNotFound;
 }
 
@@ -309,6 +390,31 @@ e_cal_backend_groupwise_get_object (ECalBackendSync *backend, EDataCal *cal, con
 static ECalBackendSyncStatus
 e_cal_backend_groupwise_get_timezone (ECalBackendSync *backend, EDataCal *cal, const char *tzid, char **object)
 {
+       ECalBackendGroupwise *cbfile;
+        ECalBackendGroupwisePrivate *priv;
+        icaltimezone *zone;
+        icalcomponent *icalcomp;
+
+        cbfile = E_CAL_BACKEND_GROUPWISE (backend);
+        priv = cbfile->priv;
+
+        g_return_val_if_fail (tzid != NULL, GNOME_Evolution_Calendar_ObjectNotFound);
+
+        if (!strcmp (tzid, "UTC")) {
+                zone = icaltimezone_get_utc_timezone ();
+        } else {
+               zone = icaltimezone_get_builtin_timezone_from_tzid (tzid);
+               if (!zone)
+                       return GNOME_Evolution_Calendar_ObjectNotFound;
+        }
+
+        icalcomp = icaltimezone_get_component (zone);
+        if (!icalcomp)
+                return GNOME_Evolution_Calendar_InvalidObject;
+                                                      
+        *object = g_strdup (icalcomponent_as_ical_string (icalcomp));
+
+        return GNOME_Evolution_Calendar_Success;
 }
 
 /* Add_timezone handler for the file backend */
index 462c655..0fd4081 100644 (file)
@@ -75,7 +75,7 @@ logout (EGwConnection *cnc)
        g_return_val_if_fail (E_IS_GW_CONNECTION (cnc), E_GW_CONNECTION_STATUS_INVALID_OBJECT);
 
        /* build the SOAP message */
-       msg = e_gw_message_new_with_header (cnc->priv->uri, "logoutRequest");
+       msg = e_gw_message_new_with_header (cnc->priv->uri, cnc->priv->session_id, "logoutRequest");
        e_gw_message_write_string_parameter (msg, "session", cnc->priv->session_id);
        e_gw_message_write_footer (msg);
 
@@ -264,7 +264,7 @@ e_gw_connection_new (const char *uri, const char *username, const char *password
        cnc = g_object_new (E_TYPE_GW_CONNECTION, NULL);
 
        /* build the SOAP message */
-       msg = e_gw_message_new_with_header (uri, "loginRequest");
+       msg = e_gw_message_new_with_header (uri, NULL, "loginRequest");
        soup_soap_message_start_element (msg, "auth", "types", NULL);
        soup_soap_message_add_attribute (msg, "type", "types:PlainText", "xsi",
                                         "http://www.w3.org/2001/XMLSchema-instance");
@@ -365,6 +365,62 @@ e_gw_connection_logout (EGwConnection *cnc)
        return E_GW_CONNECTION_STATUS_OK;
 }
 
+EGwConnectionStatus
+e_gw_connection_get_items (EGwConnection *cnc, GSList **list)
+{
+       SoupSoapMessage *msg;
+        SoupSoapResponse *response;
+        EGwConnectionStatus status;
+        SoupSoapParameter *param;
+       GList *l;
+
+        g_return_val_if_fail (E_IS_GW_CONNECTION (cnc), E_GW_CONNECTION_STATUS_INVALID_OBJECT);
+        
+       /* build the SOAP message */
+        /* FIXME : e_gw_message_new_with_header does not allow additional elements to be 
+       added in the header. Using soap_message functions directly.*/                                                                                                                              
+        msg = e_gw_message_new_with_header (cnc->priv->uri, cnc->priv->session_id, "getItemsRequest");
+        if (!msg) {
+                g_warning (G_STRLOC ": Could not build SOAP message");
+                return E_GW_CONNECTION_STATUS_UNKNOWN;
+        }
+        
+       /* FIXME: Need to obtain the uid for calendar and use here */
+        e_gw_message_write_string_parameter (msg, "container", "A.dom1.po1.100.0.1.0.1@19");
+       e_gw_message_write_footer (msg);
+
+        /* send message to server */
+        response = e_gw_connection_send_message (cnc, msg);
+        if (!response) {
+                g_object_unref (msg);
+                return E_GW_CONNECTION_STATUS_INVALID_RESPONSE;
+        }
+
+        status = parse_response_status (response);
+        if (status != E_GW_CONNECTION_STATUS_OK) {
+               g_object_unref (response);
+               return status;
+       }
+
+       /* if status is OK - parse result. return the list */   
+       param = soup_soap_response_get_first_parameter_by_name (response, "items");
+        if (!param) {
+                g_object_unref (response);
+                g_object_unref (msg);
+                return E_GW_CONNECTION_STATUS_INVALID_RESPONSE;
+        }
+       
+       /* FIXME: iterate through the response and populate the list  */
+       *l = soup_soap_response_get_parameters (response);
+
+       /* free memory */
+        g_object_unref (response);
+       g_object_unref (msg);
+
+       /* FIXME: when will the cache be cleared ? */
+        return E_GW_CONNECTION_STATUS_OK;        
+}
+
 const char* 
 e_gw_connection_get_user_email (EGwConnection *cnc)
 {
@@ -373,3 +429,4 @@ e_gw_connection_get_user_email (EGwConnection *cnc)
     return (const char*) cnc->priv->user_email;
        
 }
+
index ace08fa..f402030 100644 (file)
@@ -62,8 +62,9 @@ typedef enum {
 SoupSoapResponse   *e_gw_connection_send_message (EGwConnection *cnc, SoupSoapMessage *msg);
 
 EGwConnectionStatus e_gw_connection_logout (EGwConnection *cnc);
+EGwConnectionStatus e_gw_connection_get_items (EGwConnection *cnc, GSList **list);
 
-const char                *e_gw_connection_get_user_email (EGwConnection *cnc);
+const char         *e_gw_connection_get_user_email (EGwConnection *cnc);
 
 G_END_DECLS
 
index 299ed31..2546711 100644 (file)
@@ -73,7 +73,7 @@ setup_debug (SoupSoapMessage *msg)
 #endif
 
 SoupSoapMessage *
-e_gw_message_new_with_header (const char *uri, const char *method_name)
+e_gw_message_new_with_header (const char *uri, const char *session_id, const char *method_name)
 {
        SoupSoapMessage *msg;
 
@@ -93,6 +93,15 @@ e_gw_message_new_with_header (const char *uri, const char *method_name)
 #endif
 
        soup_soap_message_start_envelope (msg);
+       if (session_id && *session_id) {
+               soup_soap_message_start_element (msg, "Header","SOAP-ENV", NULL);
+               soup_soap_message_add_attribute (msg, "encodingStyle", "", "SOAP-ENV", NULL);
+               /* FIXME: cannot use e_gw_message_write_string_parameter as it sets prefix -types*/
+               soup_soap_message_start_element (msg, "session", NULL, NULL);
+               soup_soap_message_write_string (msg, session_id);
+               soup_soap_message_end_element (msg);
+               soup_soap_message_end_element (msg);
+       }
        soup_soap_message_start_body (msg);
        soup_soap_message_add_attribute (msg, "encodingStyle", "", "SOAP-ENV", NULL);
        soup_soap_message_add_namespace (msg, "types", "http://schemas.novell.com/2003/10/NCSP/types.xsd");
index 0f5e389..aa73b74 100644 (file)
@@ -28,7 +28,7 @@
 
 G_BEGIN_DECLS
 
-SoupSoapMessage *e_gw_message_new_with_header (const char *uri, const char *method_name);
+SoupSoapMessage *e_gw_message_new_with_header (const char *uri, const char *session_id, const char *method_name);
 void             e_gw_message_write_string_parameter (SoupSoapMessage *msg, const char *name, const char *value);
 void             e_gw_message_write_footer (SoupSoapMessage *msg);
 
index 462c655..0fd4081 100644 (file)
@@ -75,7 +75,7 @@ logout (EGwConnection *cnc)
        g_return_val_if_fail (E_IS_GW_CONNECTION (cnc), E_GW_CONNECTION_STATUS_INVALID_OBJECT);
 
        /* build the SOAP message */
-       msg = e_gw_message_new_with_header (cnc->priv->uri, "logoutRequest");
+       msg = e_gw_message_new_with_header (cnc->priv->uri, cnc->priv->session_id, "logoutRequest");
        e_gw_message_write_string_parameter (msg, "session", cnc->priv->session_id);
        e_gw_message_write_footer (msg);
 
@@ -264,7 +264,7 @@ e_gw_connection_new (const char *uri, const char *username, const char *password
        cnc = g_object_new (E_TYPE_GW_CONNECTION, NULL);
 
        /* build the SOAP message */
-       msg = e_gw_message_new_with_header (uri, "loginRequest");
+       msg = e_gw_message_new_with_header (uri, NULL, "loginRequest");
        soup_soap_message_start_element (msg, "auth", "types", NULL);
        soup_soap_message_add_attribute (msg, "type", "types:PlainText", "xsi",
                                         "http://www.w3.org/2001/XMLSchema-instance");
@@ -365,6 +365,62 @@ e_gw_connection_logout (EGwConnection *cnc)
        return E_GW_CONNECTION_STATUS_OK;
 }
 
+EGwConnectionStatus
+e_gw_connection_get_items (EGwConnection *cnc, GSList **list)
+{
+       SoupSoapMessage *msg;
+        SoupSoapResponse *response;
+        EGwConnectionStatus status;
+        SoupSoapParameter *param;
+       GList *l;
+
+        g_return_val_if_fail (E_IS_GW_CONNECTION (cnc), E_GW_CONNECTION_STATUS_INVALID_OBJECT);
+        
+       /* build the SOAP message */
+        /* FIXME : e_gw_message_new_with_header does not allow additional elements to be 
+       added in the header. Using soap_message functions directly.*/                                                                                                                              
+        msg = e_gw_message_new_with_header (cnc->priv->uri, cnc->priv->session_id, "getItemsRequest");
+        if (!msg) {
+                g_warning (G_STRLOC ": Could not build SOAP message");
+                return E_GW_CONNECTION_STATUS_UNKNOWN;
+        }
+        
+       /* FIXME: Need to obtain the uid for calendar and use here */
+        e_gw_message_write_string_parameter (msg, "container", "A.dom1.po1.100.0.1.0.1@19");
+       e_gw_message_write_footer (msg);
+
+        /* send message to server */
+        response = e_gw_connection_send_message (cnc, msg);
+        if (!response) {
+                g_object_unref (msg);
+                return E_GW_CONNECTION_STATUS_INVALID_RESPONSE;
+        }
+
+        status = parse_response_status (response);
+        if (status != E_GW_CONNECTION_STATUS_OK) {
+               g_object_unref (response);
+               return status;
+       }
+
+       /* if status is OK - parse result. return the list */   
+       param = soup_soap_response_get_first_parameter_by_name (response, "items");
+        if (!param) {
+                g_object_unref (response);
+                g_object_unref (msg);
+                return E_GW_CONNECTION_STATUS_INVALID_RESPONSE;
+        }
+       
+       /* FIXME: iterate through the response and populate the list  */
+       *l = soup_soap_response_get_parameters (response);
+
+       /* free memory */
+        g_object_unref (response);
+       g_object_unref (msg);
+
+       /* FIXME: when will the cache be cleared ? */
+        return E_GW_CONNECTION_STATUS_OK;        
+}
+
 const char* 
 e_gw_connection_get_user_email (EGwConnection *cnc)
 {
@@ -373,3 +429,4 @@ e_gw_connection_get_user_email (EGwConnection *cnc)
     return (const char*) cnc->priv->user_email;
        
 }
+
index ace08fa..f402030 100644 (file)
@@ -62,8 +62,9 @@ typedef enum {
 SoupSoapResponse   *e_gw_connection_send_message (EGwConnection *cnc, SoupSoapMessage *msg);
 
 EGwConnectionStatus e_gw_connection_logout (EGwConnection *cnc);
+EGwConnectionStatus e_gw_connection_get_items (EGwConnection *cnc, GSList **list);
 
-const char                *e_gw_connection_get_user_email (EGwConnection *cnc);
+const char         *e_gw_connection_get_user_email (EGwConnection *cnc);
 
 G_END_DECLS
 
index 299ed31..2546711 100644 (file)
@@ -73,7 +73,7 @@ setup_debug (SoupSoapMessage *msg)
 #endif
 
 SoupSoapMessage *
-e_gw_message_new_with_header (const char *uri, const char *method_name)
+e_gw_message_new_with_header (const char *uri, const char *session_id, const char *method_name)
 {
        SoupSoapMessage *msg;
 
@@ -93,6 +93,15 @@ e_gw_message_new_with_header (const char *uri, const char *method_name)
 #endif
 
        soup_soap_message_start_envelope (msg);
+       if (session_id && *session_id) {
+               soup_soap_message_start_element (msg, "Header","SOAP-ENV", NULL);
+               soup_soap_message_add_attribute (msg, "encodingStyle", "", "SOAP-ENV", NULL);
+               /* FIXME: cannot use e_gw_message_write_string_parameter as it sets prefix -types*/
+               soup_soap_message_start_element (msg, "session", NULL, NULL);
+               soup_soap_message_write_string (msg, session_id);
+               soup_soap_message_end_element (msg);
+               soup_soap_message_end_element (msg);
+       }
        soup_soap_message_start_body (msg);
        soup_soap_message_add_attribute (msg, "encodingStyle", "", "SOAP-ENV", NULL);
        soup_soap_message_add_namespace (msg, "types", "http://schemas.novell.com/2003/10/NCSP/types.xsd");
index 0f5e389..aa73b74 100644 (file)
@@ -28,7 +28,7 @@
 
 G_BEGIN_DECLS
 
-SoupSoapMessage *e_gw_message_new_with_header (const char *uri, const char *method_name);
+SoupSoapMessage *e_gw_message_new_with_header (const char *uri, const char *session_id, const char *method_name);
 void             e_gw_message_write_string_parameter (SoupSoapMessage *msg, const char *name, const char *value);
 void             e_gw_message_write_footer (SoupSoapMessage *msg);