aboutsummaryrefslogblamecommitdiffstats
path: root/addressbook/backend/ebook/e-book-view-listener.c
blob: 3ab2ff27086c4f8114b6d58ce16bf5d52fea3fbe (plain) (tree)
1
2
3
4
5
6
7
8
9





                                                                           
                                  
  
                               

   
                   
                               

                                 
                      
                           
 
                                                                                                           
 
      
                 




                                                        
                                                

                                  
                               

  

                                                                         
                                                                         
 




                                              

                                                                    

                                                                                  



                                           
 
                                                                                       



                         


                                                                              


                                        


                                    


                                                     
                                 





                                                             

                                                                              
                                                                                              

                                        
              
 


                                    


                                                     
                                                
 



                                                                                   






                                                                                
                                                                                                



                                        


                                    


                                                     
                                                
        

                                                                                                              




                                                             







                                                                               


                                    


                                                     
                                                




                                                             
           


                                                                                                 
 
                                                                                     
 

                                                                 
                                                   
                                                      


           


                                                                                                    
 
                                                                                     
 


                                                                                      


           


                                                                                                   
 
                                                                                     
 

                                                                   
                                                   
                                                         

 
           
                                                                               
                                                                                                    

                                                                      
                                                                                     
 

                                                                    

                                                                                               

 
           



                                                                       
 
                                                                                     
 
                                                           
 
                                                                                         

 
                      
                                                                                         

                         


                                                                 
                                                              
                                                                 
                                                              




                                                       
                
                                                     


         

                                                                 
 
                                 













                                                              
 


                                                                                                      
 
                                                  
 
                        





                                                                              
                                               

 

                                                       
 


                                                              
 
           
                                              

                                                                    
 
                             


                                        
 

                                                                

 
           

                                                               
                                                            
                                                                   
 
                                                             
 

                                                 

                                                                 
                                                                                 
                                         


                                                           
 
                                                             
 
                          


                                                                                    
                                                                                     
                                                                            

 




                                                                    
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
/*
 * Exports the BookViewListener interface.  Maintains a queue of messages
 * which come in on the interface.
 *
 * Author:
 *   Nat Friedman (nat@ximian.com)
 *
 * Copyright 2000, Ximian, Inc.
 */

#include <config.h>
#include <bonobo/bonobo-main.h>
#include "e-book-view-listener.h"
#include "e-book-view.h"
#include "e-contact.h"
#include "e-book-marshal.h"

static EBookViewStatus e_book_view_listener_convert_status (GNOME_Evolution_Addressbook_CallStatus status);

enum {
    RESPONSE,
    LAST_SIGNAL
};

static guint e_book_view_listener_signals [LAST_SIGNAL];

static BonoboObjectClass          *parent_class;

struct _EBookViewListenerPrivate {
    guint stopped      : 1;
};

static void
e_book_view_listener_queue_response (EBookViewListener         *listener,
                     EBookViewListenerResponse *response)
{
    if (response == NULL)
        return;

    if (listener->priv->stopped) {
        /* Free response and return */
        g_list_foreach (response->ids, (GFunc)g_free, NULL);
        g_list_free (response->ids);
        g_list_foreach (response->contacts, (GFunc) g_object_unref, NULL);
        g_list_free (response->contacts);
        g_free (response->message);
        g_free (response);
        return;
    }

    g_signal_emit (listener, e_book_view_listener_signals [RESPONSE], 0, response);
}

/* Add, Remove, Modify */
static void
e_book_view_listener_queue_status_event (EBookViewListener          *listener,
                     EBookViewListenerOperation  op,
                     EBookViewStatus             status)
{
    EBookViewListenerResponse *resp;

    if (listener->priv->stopped)
        return;

    resp = g_new0 (EBookViewListenerResponse, 1);

    resp->op        = op;
    resp->status    = status;

    e_book_view_listener_queue_response (listener, resp);
}

/* Add, Remove, Modify */
static void
e_book_view_listener_queue_idlist_event (EBookViewListener          *listener,
                     EBookViewListenerOperation  op,
                     const GNOME_Evolution_Addressbook_ContactIdList *ids)
{
    EBookViewListenerResponse *resp;
    int i;

    if (listener->priv->stopped)
        return;

    resp = g_new0 (EBookViewListenerResponse, 1);

    resp->op        = op;
    resp->status    = E_BOOK_VIEW_STATUS_OK;

    for (i = 0; i < ids->_length; i ++) {
        resp->ids = g_list_prepend (resp->ids, g_strdup (ids->_buffer[i]));
    }

    e_book_view_listener_queue_response (listener, resp);
}

/* Add, Remove, Modify */
static void
e_book_view_listener_queue_sequence_event (EBookViewListener          *listener,
                       EBookViewListenerOperation  op,
                       const GNOME_Evolution_Addressbook_VCardList  *vcards)
{
    EBookViewListenerResponse *resp;
    int i;

    if (listener->priv->stopped)
        return;

    resp = g_new0 (EBookViewListenerResponse, 1);

    resp->op        = op;
    resp->status    = E_BOOK_VIEW_STATUS_OK;
    
    for ( i = 0; i < vcards->_length; i++ ) {
        resp->contacts = g_list_append(resp->contacts, e_contact_new_from_vcard (vcards->_buffer[i]));
    }

    e_book_view_listener_queue_response (listener, resp);
}

/* Status Message */
static void
e_book_view_listener_queue_message_event (EBookViewListener          *listener,
                      EBookViewListenerOperation  op,
                      const char                 *message)
{
    EBookViewListenerResponse *resp;

    if (listener->priv->stopped)
        return;

    resp = g_new0 (EBookViewListenerResponse, 1);

    resp->op        = op;
    resp->status    = E_BOOK_VIEW_STATUS_OK;
    resp->message   = g_strdup(message);

    e_book_view_listener_queue_response (listener, resp);
}

static void
impl_BookViewListener_notify_contacts_added (PortableServer_Servant servant,
                         const GNOME_Evolution_Addressbook_VCardList *vcards,
                         CORBA_Environment *ev)
{
    EBookViewListener *listener = E_BOOK_VIEW_LISTENER (bonobo_object (servant));

    printf ("impl_BookViewListener_notify_contacts_added\n");

    e_book_view_listener_queue_sequence_event (
        listener, ContactsAddedEvent, vcards);
}

static void
impl_BookViewListener_notify_contacts_removed (PortableServer_Servant servant,
                           const GNOME_Evolution_Addressbook_ContactIdList *ids,
                           CORBA_Environment *ev)
{
    EBookViewListener *listener = E_BOOK_VIEW_LISTENER (bonobo_object (servant));

    printf ("impl_BookViewListener_notify_contacts_removed\n");

    e_book_view_listener_queue_idlist_event (listener, ContactsRemovedEvent, ids);
}

static void
impl_BookViewListener_notify_contacts_changed (PortableServer_Servant servant,
                           const GNOME_Evolution_Addressbook_VCardList *vcards,
                           CORBA_Environment *ev)
{
    EBookViewListener *listener = E_BOOK_VIEW_LISTENER (bonobo_object (servant));

    printf ("impl_BookViewListener_notify_contacts_changed\n");

    e_book_view_listener_queue_sequence_event (
        listener, ContactsModifiedEvent, vcards);
}

static void
impl_BookViewListener_notify_sequence_complete (PortableServer_Servant servant,
                        const GNOME_Evolution_Addressbook_CallStatus status,
                        CORBA_Environment *ev)
{
    EBookViewListener *listener = E_BOOK_VIEW_LISTENER (bonobo_object (servant));

    printf ("impl_BookViewListener_notify_sequence_complete\n");

    e_book_view_listener_queue_status_event (listener, SequenceCompleteEvent,
                         e_book_view_listener_convert_status (status));
}

static void
impl_BookViewListener_notify_progress (PortableServer_Servant  servant,
                       const char             *message,
                       const CORBA_short       percent,
                       CORBA_Environment      *ev)
{
    EBookViewListener *listener = E_BOOK_VIEW_LISTENER (bonobo_object (servant));

    printf ("impl_BookViewListener_notify_progress\n");

    e_book_view_listener_queue_message_event (listener, StatusMessageEvent, message);
}

static EBookViewStatus
e_book_view_listener_convert_status (const GNOME_Evolution_Addressbook_CallStatus status)
{
    switch (status) {
    case GNOME_Evolution_Addressbook_Success:
        return E_BOOK_VIEW_STATUS_OK;
    case GNOME_Evolution_Addressbook_SearchTimeLimitExceeded:
        return E_BOOK_VIEW_STATUS_TIME_LIMIT_EXCEEDED;
    case GNOME_Evolution_Addressbook_SearchSizeLimitExceeded:
        return E_BOOK_VIEW_STATUS_SIZE_LIMIT_EXCEEDED;
    case GNOME_Evolution_Addressbook_InvalidQuery:
        return E_BOOK_VIEW_ERROR_INVALID_QUERY;
    case GNOME_Evolution_Addressbook_QueryRefused:
        return E_BOOK_VIEW_ERROR_QUERY_REFUSED;
    case GNOME_Evolution_Addressbook_OtherError:
    default:
        return E_BOOK_VIEW_ERROR_OTHER_ERROR;
    }
}

static void
e_book_view_listener_construct      (EBookViewListener *listener)
{
    /* nothing needed here */
}

/**
 * e_book_view_listener_new:
 * @book: the #EBookView for which the listener is to be bound
 *
 * Creates and returns a new #EBookViewListener for the book.
 *
 * Returns: a new #EBookViewListener
 */
EBookViewListener *
e_book_view_listener_new ()
{
    EBookViewListener *listener;

    listener = g_object_new (E_TYPE_BOOK_VIEW_LISTENER,
                 "poa", bonobo_poa_get_threaded (ORBIT_THREAD_HINT_ALL_AT_IDLE, NULL),
                 NULL);

    e_book_view_listener_construct (listener);

    return listener;
}

static void
e_book_view_listener_init (EBookViewListener *listener)
{
    listener->priv                 = g_new0 (EBookViewListenerPrivate, 1);
    listener->priv->stopped        = FALSE;
}

void
e_book_view_listener_stop (EBookViewListener *listener)
{
    g_return_if_fail (E_IS_BOOK_VIEW_LISTENER (listener));
    listener->priv->stopped = TRUE;
}

static void
e_book_view_listener_dispose (GObject *object)
{
    EBookViewListener *listener = E_BOOK_VIEW_LISTENER (object);

    if (listener->priv) {
        g_free (listener->priv);
        listener->priv = NULL;
    }

    if (G_OBJECT_CLASS (parent_class)->dispose)
        G_OBJECT_CLASS (parent_class)->dispose (object);
}

static void
e_book_view_listener_class_init (EBookViewListenerClass *klass)
{
    GObjectClass *object_class = G_OBJECT_CLASS (klass);
    POA_GNOME_Evolution_Addressbook_BookViewListener__epv *epv;

    parent_class = g_type_class_ref (BONOBO_TYPE_OBJECT);

    e_book_view_listener_signals [RESPONSE] =
        g_signal_new ("response",
                  G_OBJECT_CLASS_TYPE (object_class),
                  G_SIGNAL_RUN_LAST,
                  G_STRUCT_OFFSET (EBookViewListenerClass, response),
                  NULL, NULL,
                  e_book_marshal_NONE__POINTER,
                  G_TYPE_NONE,
                  1, G_TYPE_POINTER);

    object_class->dispose = e_book_view_listener_dispose;

    epv = &klass->epv;
    epv->notifyContactsChanged  = impl_BookViewListener_notify_contacts_changed;
    epv->notifyContactsRemoved  = impl_BookViewListener_notify_contacts_removed;
    epv->notifyContactsAdded    = impl_BookViewListener_notify_contacts_added;
    epv->notifySequenceComplete = impl_BookViewListener_notify_sequence_complete;
    epv->notifyProgress         = impl_BookViewListener_notify_progress;
}

BONOBO_TYPE_FUNC_FULL (
               EBookViewListener,
               GNOME_Evolution_Addressbook_BookViewListener,
               BONOBO_TYPE_OBJECT,
               e_book_view_listener);