[ekiga] Made the form's memory management clearer (bug #562946)



commit 0941186a39d10be4d7a14b5d928657f02d0e6466
Author: Julien Puydt <jpuydt gnome org>
Date:   Sat Jun 13 16:39:30 2009 +0200

    Made the form's memory management clearer (bug #562946)
    
    Clearer, but less beautiful.

 lib/engine/account/account-core.h                  |    2 +-
 lib/engine/account/account.h                       |    2 +-
 lib/engine/account/bank.h                          |    2 +-
 lib/engine/addressbook/book.h                      |    2 +-
 lib/engine/addressbook/contact-core.h              |    2 +-
 lib/engine/addressbook/contact.h                   |    2 +-
 lib/engine/addressbook/source.h                    |    2 +-
 lib/engine/components/evolution/evolution-book.cpp |   28 ++----
 .../components/evolution/evolution-contact.cpp     |   43 +++-------
 lib/engine/components/ldap/ldap-book.cpp           |   77 +++++++-----------
 lib/engine/components/ldap/ldap-book.h             |    5 +-
 lib/engine/components/ldap/ldap-source.cpp         |   27 ++-----
 lib/engine/components/local-roster/local-heap.cpp  |   68 +++++----------
 .../components/local-roster/local-presentity.cpp   |   26 ++----
 .../components/loudmouth/loudmouth-account.cpp     |   29 ++----
 lib/engine/components/loudmouth/loudmouth-heap.cpp |   39 +++------
 .../components/loudmouth/loudmouth-presentity.cpp  |   24 ++----
 lib/engine/components/opal/opal-account.cpp        |   47 ++++-------
 lib/engine/components/opal/opal-bank.cpp           |   87 +++++++++-----------
 lib/engine/components/resource-list/rl-cluster.cpp |   33 +++-----
 lib/engine/components/resource-list/rl-heap.cpp    |   58 +++++--------
 .../components/resource-list/rl-presentity.cpp     |   22 ++----
 lib/engine/framework/form-request.h                |    8 ++-
 lib/engine/gui/gtk-core/form-dialog-gtk.cpp        |    8 +-
 lib/engine/gui/gtk-core/form-dialog-gtk.h          |    4 +-
 lib/engine/gui/gtk-frontend/addressbook-window.cpp |    6 +-
 lib/engine/gui/gtk-frontend/roster-view-gtk.cpp    |    6 +-
 lib/engine/presence/cluster.h                      |    2 +-
 lib/engine/presence/heap.h                         |    2 +-
 lib/engine/presence/presence-core.h                |    2 +-
 lib/engine/presence/presentity.h                   |    2 +-
 src/gui/accounts.cpp                               |    4 +-
 32 files changed, 253 insertions(+), 418 deletions(-)
---
diff --git a/lib/engine/account/account-core.h b/lib/engine/account/account-core.h
index 7671f88..49bd14f 100644
--- a/lib/engine/account/account-core.h
+++ b/lib/engine/account/account-core.h
@@ -152,7 +152,7 @@ namespace Ekiga
 
     /** This chain allows the AccountCore to present forms to the user
      */
-    ChainOfResponsibility<FormRequest*> questions;
+    ChainOfResponsibility<FormRequestPtr> questions;
 
   };
   /**
diff --git a/lib/engine/account/account.h b/lib/engine/account/account.h
index a6d178a..dc3f47e 100644
--- a/lib/engine/account/account.h
+++ b/lib/engine/account/account.h
@@ -103,7 +103,7 @@ namespace Ekiga
 
     /** This chain allows the Account to present forms to the user
      */
-    ChainOfResponsibility<FormRequest*> questions;
+    ChainOfResponsibility<FormRequestPtr> questions;
   };
 
   typedef gmref_ptr<Account> AccountPtr;
diff --git a/lib/engine/account/bank.h b/lib/engine/account/bank.h
index 9d46a7d..d0e1889 100644
--- a/lib/engine/account/bank.h
+++ b/lib/engine/account/bank.h
@@ -86,7 +86,7 @@ namespace Ekiga
 
     /** This chain allows the BankImpl to present forms to the user
      */
-    ChainOfResponsibility<FormRequest*> questions;
+    ChainOfResponsibility<FormRequestPtr> questions;
   };
 
   typedef gmref_ptr<Bank> BankPtr;
diff --git a/lib/engine/addressbook/book.h b/lib/engine/addressbook/book.h
index 7445d8c..0580837 100644
--- a/lib/engine/addressbook/book.h
+++ b/lib/engine/addressbook/book.h
@@ -133,7 +133,7 @@ namespace Ekiga {
 
     /** This chain allows the Book to present forms to the user
      */
-    ChainOfResponsibility<FormRequest*> questions;
+    ChainOfResponsibility<FormRequestPtr> questions;
   };
 
   typedef gmref_ptr<Book> BookPtr;
diff --git a/lib/engine/addressbook/contact-core.h b/lib/engine/addressbook/contact-core.h
index 2241755..97f4b6e 100644
--- a/lib/engine/addressbook/contact-core.h
+++ b/lib/engine/addressbook/contact-core.h
@@ -188,7 +188,7 @@ namespace Ekiga
 
     /** This chain allows the ContactCore to present forms to the user
      */
-    ChainOfResponsibility<FormRequest*> questions;
+    ChainOfResponsibility<FormRequestPtr> questions;
 
     std::list<sigc::connection> conns;
   };
diff --git a/lib/engine/addressbook/contact.h b/lib/engine/addressbook/contact.h
index 92a2c87..4d120ea 100644
--- a/lib/engine/addressbook/contact.h
+++ b/lib/engine/addressbook/contact.h
@@ -108,7 +108,7 @@ namespace Ekiga
 
     /** This chain allows the Contact to present forms to the user
      */
-    ChainOfResponsibility<FormRequest*> questions;
+    ChainOfResponsibility<FormRequestPtr> questions;
   };
 
 
diff --git a/lib/engine/addressbook/source.h b/lib/engine/addressbook/source.h
index 660617a..ff5662f 100644
--- a/lib/engine/addressbook/source.h
+++ b/lib/engine/addressbook/source.h
@@ -99,7 +99,7 @@ namespace Ekiga {
 
     /** This chain allows the Source to present forms to the user
      */
-    ChainOfResponsibility<FormRequest*> questions;
+    ChainOfResponsibility<FormRequestPtr> questions;
   };
 
   typedef gmref_ptr<Source> SourcePtr;
diff --git a/lib/engine/components/evolution/evolution-book.cpp b/lib/engine/components/evolution/evolution-book.cpp
index f957bf0..5ecc8a5 100644
--- a/lib/engine/components/evolution/evolution-book.cpp
+++ b/lib/engine/components/evolution/evolution-book.cpp
@@ -35,7 +35,6 @@
  *
  */
 
-#include <iostream>
 #include <string>
 #include <glib/gi18n.h>
 
@@ -314,27 +313,20 @@ Evolution::Book::refresh ()
 void
 Evolution::Book::new_contact_action ()
 {
-  Ekiga::FormRequestSimple request(sigc::mem_fun (this, &Evolution::Book::on_new_contact_form_submitted));
+  gmref_ptr<Ekiga::FormRequestSimple> request = gmref_ptr<Ekiga::FormRequestSimple> (new Ekiga::FormRequestSimple (sigc::mem_fun (this, &Evolution::Book::on_new_contact_form_submitted)));
 
-  request.title (_("New contact"));
+  request->title (_("New contact"));
 
-  request.instructions (_("Please update the following fields:"));
+  request->instructions (_("Please update the following fields:"));
 
-  request.text ("name", _("_Name:"), "");
-  request.text ("video", _("VoIP _URI:"), "");
-  request.text ("home", _("_Home phone:"), "");
-  request.text ("work", _("_Office phone:"), "");
-  request.text ("cell", _("_Cell phone:"), "");
-  request.text ("pager", _("_Pager:"), "");
+  request->text ("name", _("_Name:"), "");
+  request->text ("video", _("VoIP _URI:"), "");
+  request->text ("home", _("_Home phone:"), "");
+  request->text ("work", _("_Office phone:"), "");
+  request->text ("cell", _("_Cell phone:"), "");
+  request->text ("pager", _("_Pager:"), "");
 
-  if (!questions.handle_request (&request)) {
-
-    // FIXME: better error reporting
-#ifdef __GNUC__
-    std::cout << "Unhandled form request in "
-	      << __PRETTY_FUNCTION__ << std::endl;
-#endif
-  }
+  questions.handle_request (request);
 }
 
 void
diff --git a/lib/engine/components/evolution/evolution-contact.cpp b/lib/engine/components/evolution/evolution-contact.cpp
index f10281f..49df323 100644
--- a/lib/engine/components/evolution/evolution-contact.cpp
+++ b/lib/engine/components/evolution/evolution-contact.cpp
@@ -35,7 +35,6 @@
  *
  */
 
-#include <iostream>
 #include <glib/gi18n.h>
 
 #include "evolution-contact.h"
@@ -321,13 +320,13 @@ Evolution::Contact::set_attribute_value (unsigned int attr_type,
 void
 Evolution::Contact::edit_action ()
 {
-  Ekiga::FormRequestSimple request(sigc::mem_fun (this, &Evolution::Contact::on_edit_form_submitted));;
+  gmref_ptr<Ekiga::FormRequestSimple> request = gmref_ptr<Ekiga::FormRequestSimple> (new Ekiga::FormRequestSimple (sigc::mem_fun (this, &Evolution::Contact::on_edit_form_submitted)));;
 
-  request.title (_("Edit contact"));
+  request->title (_("Edit contact"));
 
-  request.instructions (_("Please update the following fields:"));
+  request->instructions (_("Please update the following fields:"));
 
-  request.text ("name", _("Name:"), get_name ());
+  request->text ("name", _("Name:"), get_name ());
 
   {
     std::string home_uri = get_attribute_value (ATTR_HOME);
@@ -336,21 +335,14 @@ Evolution::Contact::edit_action ()
     std::string pager_uri = get_attribute_value (ATTR_PAGER);
     std::string video_uri = get_attribute_value (ATTR_VIDEO);
 
-    request.text ("video", _("VoIP _URI:"), video_uri);
-    request.text ("home", _("_Home phone:"), home_uri);
-    request.text ("work", _("_Office phone:"), work_uri);
-    request.text ("cell", _("_Cell phone:"), cell_phone_uri);
-    request.text ("pager", _("_Pager:"), pager_uri);
+    request->text ("video", _("VoIP _URI:"), video_uri);
+    request->text ("home", _("_Home phone:"), home_uri);
+    request->text ("work", _("_Office phone:"), work_uri);
+    request->text ("cell", _("_Cell phone:"), cell_phone_uri);
+    request->text ("pager", _("_Pager:"), pager_uri);
   }
 
-  if (!questions.handle_request (&request)) {
-
-    // FIXME: better error reporting
-#ifdef __GNUC__
-    std::cout << "Unhandled form request in "
-	      << __PRETTY_FUNCTION__ << std::endl;
-#endif
-  }
+  questions.handle_request (request);
 }
 
 void
@@ -381,23 +373,16 @@ Evolution::Contact::on_edit_form_submitted (bool submitted,
 void
 Evolution::Contact::remove_action ()
 {
-  Ekiga::FormRequestSimple request(sigc::mem_fun (this, &Evolution::Contact::on_remove_form_submitted));;
+  gmref_ptr<Ekiga::FormRequestSimple> request = gmref_ptr<Ekiga::FormRequestSimple>(new Ekiga::FormRequestSimple (sigc::mem_fun (this, &Evolution::Contact::on_remove_form_submitted)));
   gchar* instructions = NULL;
 
-  request.title (_("Remove contact"));
+  request->title (_("Remove contact"));
 
   instructions = g_strdup_printf (_("Are you sure you want to remove %s from the addressbook?"), get_name ().c_str ());
-  request.instructions (instructions);
+  request->instructions (instructions);
   g_free (instructions);
 
-  if (!questions.handle_request (&request)) {
-
-    // FIXME: better error reporting
-#ifdef __GNUC__
-    std::cout << "Unhandled form request in "
-	      << __PRETTY_FUNCTION__ << std::endl;
-#endif
-  }
+  questions.handle_request (request);
 }
 
 void
diff --git a/lib/engine/components/ldap/ldap-book.cpp b/lib/engine/components/ldap/ldap-book.cpp
index 4d6b30c..db61db6 100644
--- a/lib/engine/components/ldap/ldap-book.cpp
+++ b/lib/engine/components/ldap/ldap-book.cpp
@@ -36,7 +36,6 @@
  *
  */
 
-#include <iostream>
 #include <cstdlib>
 #include <string>
 #include <sstream>
@@ -532,13 +531,13 @@ extern "C" {
 
     /* If there are missing items, try to get them all in one dialog */
     if (nprompts) {
-      Ekiga::FormRequestSimple request(sigc::mem_fun (ctx->book, &OPENLDAP::Book::on_sasl_form_submitted));
+      gmref_ptr<Ekiga::FormRequestSimple> request = gmref_ptr<Ekiga::FormRequestSimple> (new Ekiga::FormRequestSimple (sigc::mem_fun (ctx->book, &OPENLDAP::Book::on_sasl_form_submitted)));
       Ekiga::FormBuilder result;
       std::string prompt;
       std::string ctxt = "";
       char resbuf[32];
 
-      request.title (_("LDAP SASL Interaction"));
+      request->title (_("LDAP SASL Interaction"));
 
       for (i=0, in = (sasl_interact_t *)inter;
 	   in->id != SASL_CB_LIST_END;in++)
@@ -592,26 +591,24 @@ extern "C" {
 
 	  /* private text or not? */
 	  if (noecho) {
-	    request.private_text (std::string (resbuf), prompt, "");
+	    request->private_text (std::string (resbuf), prompt, "");
 	  } else {
 	    std::string dflt;
 	    if (in->defresult)
 	      dflt = std::string (in->defresult);
 	    else
 	      dflt = "";
-	    request.text (std::string(resbuf), prompt, dflt);
+	    request->text (std::string(resbuf), prompt, dflt);
 	  }
 	}
 
       /* If we had any challenge text, set it now */
       if (!ctxt.empty())
-	request.instructions (ctxt);
+	request->instructions (ctxt);
 
       /* Save a pointer for storing the form result */
       ctx->book->saslform = &result;
-      if (!ctx->book->questions.handle_request (&request)) {
-	return LDAP_LOCAL_ERROR;
-      }
+      ctx->book->questions.handle_request (request);
 
       /* Extract answers from the result form */
       for (i=0, in = (sasl_interact_t *)inter;
@@ -908,19 +905,19 @@ OPENLDAP::Book::refresh_result ()
 }
 
 void
-OPENLDAP::BookForm (Ekiga::FormRequestSimple &request,
+OPENLDAP::BookForm (gmref_ptr<Ekiga::FormRequestSimple> request,
 		    struct BookInfo &info,
 		    std::string title)
 {
   std::string callAttr = "";
 
-  request.title (title);
+  request->title (title);
 
-  request.instructions (_("Please edit the following fields"));
+  request->instructions (_("Please edit the following fields"));
 
-  request.text ("name", _("Book _Name"), info.name);
-  request.text ("uri", _("Server _URI"), info.uri_host);
-  request.text ("base", _("_Base DN"), info.urld->lud_dn);
+  request->text ("name", _("Book _Name"), info.name);
+  request->text ("uri", _("Server _URI"), info.uri_host);
+  request->text ("base", _("_Base DN"), info.urld->lud_dn);
 
   {
     std::map<std::string, std::string> choices;
@@ -928,8 +925,8 @@ OPENLDAP::BookForm (Ekiga::FormRequestSimple &request,
 
     choices["sub"] = _("Subtree");
     choices["onelevel"] = _("Single Level");
-    request.single_choice ("scope", _("_Search Scope"),
-			   scopes[info.urld->lud_scope], choices);
+    request->single_choice ("scope", _("_Search Scope"),
+			    scopes[info.urld->lud_scope], choices);
   }
 
   /* attrs[0] is the name attribute */
@@ -943,12 +940,12 @@ OPENLDAP::BookForm (Ekiga::FormRequestSimple &request,
    * "DisplayName" (i.e., "the name that will be displayed") but on
    * most LDAP servers it's "CommonName".
    */
-  request.text ("nameAttr", _("_DisplayName Attribute"), info.urld->lud_attrs[0]);
-  request.text ("callAttr", _("Call _Attributes"), callAttr);
+  request->text ("nameAttr", _("_DisplayName Attribute"), info.urld->lud_attrs[0]);
+  request->text ("callAttr", _("Call _Attributes"), callAttr);
   if (info.urld->lud_filter != NULL)
-    request.text ("filter", _("_Filter Template"), info.urld->lud_filter);
+    request->text ("filter", _("_Filter Template"), info.urld->lud_filter);
   else
-    request.text ("filter", _("_Filter Template"), "");
+    request->text ("filter", _("_Filter Template"), "");
 
   /* Translators: Bind ID - In LDAP, the operation that begins an LDAP
    * session and authenticates the user to the directory is called a
@@ -959,10 +956,10 @@ OPENLDAP::BookForm (Ekiga::FormRequestSimple &request,
    * course, the Bind ID can be left blank, in which case the session
    * is anonymous / unauthenticated.)
    */
-  request.text ("authcID", _("Bind _ID"), info.authcID);
-  request.private_text ("password", _("_Password"), info.password);
-  request.boolean ("startTLS", _("Use TLS"), info.starttls);
-  request.boolean ("sasl", _("Use SASL"), info.sasl);
+  request->text ("authcID", _("Bind _ID"), info.authcID);
+  request->private_text ("password", _("_Password"), info.password);
+  request->boolean ("startTLS", _("Use TLS"), info.starttls);
+  request->boolean ("sasl", _("Use SASL"), info.sasl);
   {
     std::map<std::string, std::string> mechs;
     const char **mechlist;
@@ -976,26 +973,19 @@ OPENLDAP::BookForm (Ekiga::FormRequestSimple &request,
         mechs[mech] = mech;
       }
     }
-    request.single_choice ("saslMech", _("SASL _Mechanism"),
-			   info.saslMech, mechs);
+    request->single_choice ("saslMech", _("SASL _Mechanism"),
+			    info.saslMech, mechs);
   }
 }
 
 void
 OPENLDAP::Book::edit ()
 {
-  Ekiga::FormRequestSimple request(sigc::mem_fun (this, &OPENLDAP::Book::on_edit_form_submitted));
+  gmref_ptr<Ekiga::FormRequestSimple> request = gmref_ptr<Ekiga::FormRequestSimple> (new Ekiga::FormRequestSimple (sigc::mem_fun (this, &OPENLDAP::Book::on_edit_form_submitted)));
 
   OPENLDAP::BookForm (request, bookinfo, std::string(_("Edit LDAP directory")));
 
-  if (!questions.handle_request (&request)) {
-
-    // FIXME: better error reporting
-#ifdef __GNUC__
-    std::cout << "Unhandled form request in "
-	      << __PRETTY_FUNCTION__ << std::endl;
-#endif
-  }
+  questions.handle_request (request);
 }
 
 int
@@ -1101,19 +1091,12 @@ OPENLDAP::Book::on_edit_form_submitted (bool submitted,
 
   std::string errmsg;
   if (OPENLDAP::BookFormInfo (result, bookinfo, errmsg)) {
-    Ekiga::FormRequestSimple request(sigc::mem_fun (this, &OPENLDAP::Book::on_edit_form_submitted));
+    gmref_ptr<Ekiga::FormRequestSimple> request = gmref_ptr<Ekiga::FormRequestSimple> (new Ekiga::FormRequestSimple (sigc::mem_fun (this, &OPENLDAP::Book::on_edit_form_submitted)));
 
-    result.visit (request);
-    request.error (errmsg);
+    result.visit (*request);
+    request->error (errmsg);
 
-    if (!questions.handle_request (&request)) {
-
-      // FIXME: better error reporting
-#ifdef __GNUC__
-      std::cout << "Unhandled form request in "
-		<< __PRETTY_FUNCTION__ << std::endl;
-#endif
-    }
+    questions.handle_request (request);
     return;
   }
 
diff --git a/lib/engine/components/ldap/ldap-book.h b/lib/engine/components/ldap/ldap-book.h
index a2602a6..eea73e1 100644
--- a/lib/engine/components/ldap/ldap-book.h
+++ b/lib/engine/components/ldap/ldap-book.h
@@ -68,8 +68,9 @@ namespace OPENLDAP
     bool starttls;
   };
 
-  void BookForm (Ekiga::FormRequestSimple &req, struct BookInfo &info,
-  	std::string title );
+  void BookForm (gmref_ptr<Ekiga::FormRequestSimple> req,
+		 struct BookInfo &info,
+		 std::string title );
 
   int BookFormInfo (Ekiga::Form &result, struct BookInfo &info,
   	std::string &errmsg);
diff --git a/lib/engine/components/ldap/ldap-source.cpp b/lib/engine/components/ldap/ldap-source.cpp
index 69d3aa4..147655c 100644
--- a/lib/engine/components/ldap/ldap-source.cpp
+++ b/lib/engine/components/ldap/ldap-source.cpp
@@ -37,7 +37,6 @@
  */
 
 #include <cstdlib>
-#include <iostream>
 #include <string.h>
 
 #include "config.h"
@@ -137,7 +136,7 @@ OPENLDAP::Source::populate_menu (Ekiga::MenuBuilder &builder)
 void
 OPENLDAP::Source::new_book ()
 {
-  Ekiga::FormRequestSimple request(sigc::mem_fun (this, &OPENLDAP::Source::on_new_book_form_submitted));
+  gmref_ptr<Ekiga::FormRequestSimple> request = gmref_ptr<Ekiga::FormRequestSimple> (new Ekiga::FormRequestSimple (sigc::mem_fun (this, &OPENLDAP::Source::on_new_book_form_submitted)));
 
   bookinfo.name = "";
   bookinfo.uri = "ldap://localhost/dc=net?cn,telephoneNumber?sub?(cn=$)",
@@ -151,14 +150,7 @@ OPENLDAP::Source::new_book ()
   OPENLDAP::BookInfoParse (bookinfo);
   OPENLDAP::BookForm (request, bookinfo, _("Create LDAP directory"));
 
-  if (!questions.handle_request (&request)) {
-
-    // FIXME: better error reporting
-#ifdef __GNUC__
-    std::cout << "Unhandled form request in "
-	      << __PRETTY_FUNCTION__ << std::endl;
-#endif
-  }
+  questions.handle_request (request);
 }
 
 void
@@ -188,19 +180,12 @@ OPENLDAP::Source::on_new_book_form_submitted (bool submitted,
   std::string errmsg;
 
   if (OPENLDAP::BookFormInfo (result, bookinfo, errmsg)) {
-    Ekiga::FormRequestSimple request(sigc::mem_fun (this, &OPENLDAP::Source::on_new_book_form_submitted));
+    gmref_ptr<Ekiga::FormRequestSimple> request = gmref_ptr<Ekiga::FormRequestSimple> (new Ekiga::FormRequestSimple (sigc::mem_fun (this, &OPENLDAP::Source::on_new_book_form_submitted)));
 
-    result.visit (request);
-    request.error (errmsg);
+    result.visit (*request);
+    request->error (errmsg);
 
-    if (!questions.handle_request (&request)) {
-
-      // FIXME: better error reporting
-#ifdef __GNUC__
-      std::cout << "Unhandled form request in "
-		<< __PRETTY_FUNCTION__ << std::endl;
-#endif
-    }
+    questions.handle_request (request);
     return;
   }
 
diff --git a/lib/engine/components/local-roster/local-heap.cpp b/lib/engine/components/local-roster/local-heap.cpp
index dc8d8a9..72f8d65 100644
--- a/lib/engine/components/local-roster/local-heap.cpp
+++ b/lib/engine/components/local-roster/local-heap.cpp
@@ -34,7 +34,6 @@
  */
 
 #include <algorithm>
-#include <iostream>
 #include <set>
 #include <glib/gi18n.h>
 
@@ -220,38 +219,31 @@ Local::Heap::new_presentity (const std::string name,
   if (!has_presentity_with_uri (uri)) {
 
     gmref_ptr<Ekiga::PresenceCore> presence_core = core.get ("presence-core");
-    Ekiga::FormRequestSimple request(sigc::mem_fun (this, &Local::Heap::new_presentity_form_submitted));
+    gmref_ptr<Ekiga::FormRequestSimple> request = gmref_ptr<Ekiga::FormRequestSimple> (new Ekiga::FormRequestSimple (sigc::mem_fun (this, &Local::Heap::new_presentity_form_submitted)));
     std::set<std::string> groups = existing_groups ();
 
-    request.title (_("Add to local roster"));
-    request.instructions (_("Please fill in this form to add a new contact "
+    request->title (_("Add to local roster"));
+    request->instructions (_("Please fill in this form to add a new contact "
 			    "to ekiga's internal roster"));
-    request.text ("name", _("Name:"), name);
+    request->text ("name", _("Name:"), name);
     if (presence_core->is_supported_uri (uri)) {
 
-      request.hidden ("good-uri", "yes");
-      request.hidden ("uri", uri);
+      request->hidden ("good-uri", "yes");
+      request->hidden ("uri", uri);
     } else {
 
-      request.hidden ("good-uri", "no");
+      request->hidden ("good-uri", "no");
       if ( !uri.empty ())
-	request.text ("uri", _("Address:"), uri);
+	request->text ("uri", _("Address:"), uri);
       else
-	request.text ("uri", _("Address:"), "sip:"); // let's put a default
+	request->text ("uri", _("Address:"), "sip:"); // let's put a default
     }
 
-    request.editable_set ("groups",
-			  _("Put contact in groups:"),
-			  std::set<std::string>(), groups);
+    request->editable_set ("groups",
+			   _("Put contact in groups:"),
+			   std::set<std::string>(), groups);
 
-    if (!questions.handle_request (&request)) {
-
-      // FIXME: better error reporting
-#ifdef __GNUC__
-      std::cout << "Unhandled form request in "
-		<< __PRETTY_FUNCTION__ << std::endl;
-#endif
-    }
+    questions.handle_request (request);
   }
 }
 
@@ -404,42 +396,28 @@ Local::Heap::new_presentity_form_submitted (bool submitted,
     save ();
   } else {
 
-    Ekiga::FormRequestSimple request(sigc::mem_fun (this, &Local::Heap::new_presentity_form_submitted));
+    gmref_ptr<Ekiga::FormRequestSimple> request = gmref_ptr<Ekiga::FormRequestSimple>(new Ekiga::FormRequestSimple (sigc::mem_fun (this, &Local::Heap::new_presentity_form_submitted)));
 
-    result.visit (request);
+    result.visit (*request);
     if (!presence_core->is_supported_uri (uri))
-      request.error (_("You supplied an unsupported address"));
+      request->error (_("You supplied an unsupported address"));
     else
-      request.error (_("You already have a contact with this address!"));
-
-    if (!questions.handle_request (&request)) {
+      request->error (_("You already have a contact with this address!"));
 
-      // FIXME: better error handling
-#ifdef __GNUC__
-      std::cout << "Unhandled form request in "
-		<< __PRETTY_FUNCTION__ << std::endl;
-#endif
-    }
+    questions.handle_request (request);
   }
 }
 
 void
 Local::Heap::on_rename_group (std::string name)
 {
-  Ekiga::FormRequestSimple request(sigc::bind<0>(sigc::mem_fun (this, &Local::Heap::rename_group_form_submitted), name));
-
-  request.title (_("Rename group"));
-  request.instructions (_("Please edit this group name"));
-  request.text ("name", _("Name:"), name);
+  gmref_ptr<Ekiga::FormRequestSimple> request = gmref_ptr<Ekiga::FormRequestSimple> (new Ekiga::FormRequestSimple (sigc::bind<0>(sigc::mem_fun (this, &Local::Heap::rename_group_form_submitted), name)));
 
-  if (!questions.handle_request (&request)) {
+  request->title (_("Rename group"));
+  request->instructions (_("Please edit this group name"));
+  request->text ("name", _("Name:"), name);
 
-    // FIXME: better error reporting
-#ifdef __GNUC__
-    std::cout << "Unhandled form request in "
-	      << __PRETTY_FUNCTION__ << std::endl;
-#endif
-  }
+  questions.handle_request (request);
 }
 
 struct rename_group_form_submitted_helper
diff --git a/lib/engine/components/local-roster/local-presentity.cpp b/lib/engine/components/local-roster/local-presentity.cpp
index 482d4b5..93b998a 100644
--- a/lib/engine/components/local-roster/local-presentity.cpp
+++ b/lib/engine/components/local-roster/local-presentity.cpp
@@ -34,7 +34,6 @@
  */
 
 #include <algorithm>
-#include <iostream>
 #include <set>
 #include <glib/gi18n.h>
 
@@ -216,27 +215,20 @@ void
 Local::Presentity::edit_presentity ()
 {
   ClusterPtr cluster = core.get ("local-cluster");
-  Ekiga::FormRequestSimple request(sigc::mem_fun (this, &Local::Presentity::edit_presentity_form_submitted));
+  gmref_ptr<Ekiga::FormRequestSimple> request = gmref_ptr<Ekiga::FormRequestSimple> (new Ekiga::FormRequestSimple (sigc::mem_fun (this, &Local::Presentity::edit_presentity_form_submitted)));
 
   std::set<std::string> all_groups = cluster->existing_groups ();
 
-  request.title (_("Edit roster element"));
-  request.instructions (_("Please fill in this form to change an existing "
-			  "element of ekiga's internal roster"));
-  request.text ("name", _("Name:"), name);
-  request.text ("uri", _("Address:"), uri);
+  request->title (_("Edit roster element"));
+  request->instructions (_("Please fill in this form to change an existing "
+			   "element of ekiga's internal roster"));
+  request->text ("name", _("Name:"), name);
+  request->text ("uri", _("Address:"), uri);
 
-  request.editable_set ("groups", _("Choose groups:"),
-			groups, all_groups);
+  request->editable_set ("groups", _("Choose groups:"),
+			 groups, all_groups);
 
-  if (!questions.handle_request (&request)) {
-
-    // FIXME: better error reporting
-#ifdef __GNUC__
-    std::cout << "Unhandled form request in "
-	      << __PRETTY_FUNCTION__ << std::endl;
-#endif
-  }
+  questions.handle_request (request);
 }
 
 
diff --git a/lib/engine/components/loudmouth/loudmouth-account.cpp b/lib/engine/components/loudmouth/loudmouth-account.cpp
index 10ed729..d863e02 100644
--- a/lib/engine/components/loudmouth/loudmouth-account.cpp
+++ b/lib/engine/components/loudmouth/loudmouth-account.cpp
@@ -33,7 +33,6 @@
  *
  */
 
-#include <iostream>
 #include <glib/gi18n.h>
 
 #include "form-request-simple.h"
@@ -257,32 +256,31 @@ LM::Account::get_node () const
 void
 LM::Account::edit ()
 {
-  Ekiga::FormRequestSimple request(sigc::mem_fun (this,
-						  &LM::Account::on_edit_form_submitted));
+  gmref_ptr<Ekiga::FormRequestSimple> request = gmref_ptr<Ekiga::FormRequestSimple> (new Ekiga::FormRequestSimple (sigc::mem_fun (this, &LM::Account::on_edit_form_submitted)));
   xmlChar* xml_str = NULL;
 
-  request.title (_("Edit account"));
+  request->title (_("Edit account"));
 
-  request.instructions (_("Please update the following fields:"));
+  request->instructions (_("Please update the following fields:"));
 
   xml_str = xmlGetProp (node, BAD_CAST "name");
-  request.text ("name", _("Name:"), (const char*)xml_str);
+  request->text ("name", _("Name:"), (const char*)xml_str);
   xmlFree (xml_str);
 
   xml_str = xmlGetProp (node, BAD_CAST "user");
-  request.text ("user", _("User:"), (const char*)xml_str);
+  request->text ("user", _("User:"), (const char*)xml_str);
   xmlFree (xml_str);
 
   xml_str = xmlGetProp (node, BAD_CAST "server");
-  request.text ("server", _("Server:"), (const char*)xml_str);
+  request->text ("server", _("Server:"), (const char*)xml_str);
   xmlFree (xml_str);
 
   xml_str = xmlGetProp (node, BAD_CAST "resource");
-  request.text ("resource", _("Resource:"), (const char*)xml_str);
+  request->text ("resource", _("Resource:"), (const char*)xml_str);
   xmlFree (xml_str);
 
   xml_str = xmlGetProp (node, BAD_CAST "password");
-  request.private_text ("password", _("Password:"), (const char*)xml_str);
+  request->private_text ("password", _("Password:"), (const char*)xml_str);
   xmlFree (xml_str);
 
   xml_str = xmlGetProp (node, BAD_CAST "startup");
@@ -296,16 +294,9 @@ LM::Account::edit ()
 
   }
   xmlFree (xml_str);
-  request.boolean ("enabled", _("Enable account"), enable_on_startup);
+  request->boolean ("enabled", _("Enable account"), enable_on_startup);
 
-  if (!questions.handle_request (&request)) {
-
-    // FIXME: better error reporting
-#ifdef __GNUC__
-    std::cout << "Unhandled form request in "
-	      << __PRETTY_FUNCTION__ << std::endl;
-#endif
-  }
+  questions.handle_request (request);
 }
 
 void
diff --git a/lib/engine/components/loudmouth/loudmouth-heap.cpp b/lib/engine/components/loudmouth/loudmouth-heap.cpp
index 82b8616..95da46a 100644
--- a/lib/engine/components/loudmouth/loudmouth-heap.cpp
+++ b/lib/engine/components/loudmouth/loudmouth-heap.cpp
@@ -33,7 +33,6 @@
  *
  */
 
-#include <iostream>
 #include <string.h>
 #include <glib/gi18n.h>
 
@@ -195,7 +194,7 @@ LM::Heap::presence_handler (LmMessage* message)
 
   if (type_attr != NULL && strcmp (type_attr, "subscribe") == 0) {
 
-    Ekiga::FormRequestSimple request (sigc::mem_fun (this, &LM::Heap::subscribe_from_form_submitted));
+    gmref_ptr<Ekiga::FormRequestSimple> request = gmref_ptr<Ekiga::FormRequestSimple> (new Ekiga::FormRequestSimple (sigc::mem_fun (this, &LM::Heap::subscribe_from_form_submitted)));
     LmMessageNode* status = lm_message_node_find_child (lm_message_get_node (message), "status");
     gchar* instructions = NULL;
     std::string item_name;
@@ -208,7 +207,7 @@ LM::Heap::presence_handler (LmMessage* message)
       item_name = base_jid;
     }
 
-    request.title (_("Authorization to see your presence"));
+    request->title (_("Authorization to see your presence"));
 
     if (status != NULL && lm_message_node_get_value (status) != NULL) {
 
@@ -219,25 +218,18 @@ LM::Heap::presence_handler (LmMessage* message)
       instructions = g_strdup_printf (_("%s asks the permission to see your presence."),
 				      item_name.c_str ());
     }
-    request.instructions (instructions);
+    request->instructions (instructions);
     g_free (instructions);
 
     std::map<std::string, std::string> choices;
     choices["grant"] = _("grant him/her the permission to see your presence");
     choices["refuse"] = _("refuse him/her the permission to see your presence");
     choices["later"] = _("decide later (also close or cancel this dialog)");
-    request.single_choice ("answer", _("Your answer is: "), "grant", choices);
+    request->single_choice ("answer", _("Your answer is: "), "grant", choices);
 
-    request.hidden ("jid", base_jid);
+    request->hidden ("jid", base_jid);
 
-    if (!questions.handle_request (&request)) {
-
-      // FIXME: better error reporting
-#ifdef __GNUC__
-      std::cout << "Unhandled form request in "
-		<< __PRETTY_FUNCTION__ << std::endl;
-#endif
-    }
+    questions.handle_request (request);
   } else {
 
     if (item) {
@@ -318,21 +310,14 @@ LM::Heap::parse_roster (LmMessageNode* query)
 void
 LM::Heap::add_item ()
 {
-  Ekiga::FormRequestSimple request(sigc::mem_fun (this, &LM::Heap::add_item_form_submitted));
+  gmref_ptr<Ekiga::FormRequestSimple> request = gmref_ptr<Ekiga::FormRequestSimple> (new Ekiga::FormRequestSimple (sigc::mem_fun (this, &LM::Heap::add_item_form_submitted)));
 
-  request.title (_("Add a roster element"));
-  request.instructions (_("Please fill in this form to add a new"
-			  "element to the remote roster"));
-  request.text ("jid", _("Identifier:"), _("identifier server"));
+  request->title (_("Add a roster element"));
+  request->instructions (_("Please fill in this form to add a new"
+			   "element to the remote roster"));
+  request->text ("jid", _("Identifier:"), _("identifier server"));
 
-  if (!questions.handle_request (&request)) {
-
-    // FIXME: better error reporting
-#ifdef __GNUC__
-    std::cout << "Unhandled form request in "
-	      << __PRETTY_FUNCTION__ << std::endl;
-#endif
-  }
+  questions.handle_request (request);
 }
 
 void
diff --git a/lib/engine/components/loudmouth/loudmouth-presentity.cpp b/lib/engine/components/loudmouth/loudmouth-presentity.cpp
index 341cf0d..af2101a 100644
--- a/lib/engine/components/loudmouth/loudmouth-presentity.cpp
+++ b/lib/engine/components/loudmouth/loudmouth-presentity.cpp
@@ -33,7 +33,6 @@
  *
  */
 
-#include <iostream>
 #include <string.h>
 #include <stdlib.h>
 #include <glib/gi18n.h>
@@ -258,24 +257,17 @@ LM::Presentity::push_presence (const std::string resource,
 void
 LM::Presentity::edit_presentity ()
 {
-  Ekiga::FormRequestSimple request(sigc::mem_fun (this, &LM::Presentity::edit_presentity_form_submitted));
+  gmref_ptr<Ekiga::FormRequestSimple> request = gmref_ptr<Ekiga::FormRequestSimple> (new Ekiga::FormRequestSimple (sigc::mem_fun (this, &LM::Presentity::edit_presentity_form_submitted)));
 
-  request.title (_("Edit roster element"));
-  request.instructions (_("Please fill in this form to change an existing "
-			  "element of the remote roster"));
-  request.text ("name", _("Name:"), get_name ());
+  request->title (_("Edit roster element"));
+  request->instructions (_("Please fill in this form to change an existing "
+			   "element of the remote roster"));
+  request->text ("name", _("Name:"), get_name ());
 
-  request.editable_set ("groups", _("Choose groups:"),
-			get_groups (), get_groups ());
+  request->editable_set ("groups", _("Choose groups:"),
+			 get_groups (), get_groups ());
 
-  if (!questions.handle_request (&request)) {
-
-    // FIXME: better error reporting
-#ifdef __GNUC__
-    std::cout << "Unhandled form request in "
-	      << __PRETTY_FUNCTION__ << std::endl;
-#endif
-  }
+  questions.handle_request (request);
 }
 
 void
diff --git a/lib/engine/components/opal/opal-account.cpp b/lib/engine/components/opal/opal-account.cpp
index c65c72e..1f78b98 100644
--- a/lib/engine/components/opal/opal-account.cpp
+++ b/lib/engine/components/opal/opal-account.cpp
@@ -37,7 +37,6 @@
 
 #include <string.h>
 #include <stdlib.h>
-#include <iostream>
 #include <algorithm>
 #include <sstream>
 
@@ -369,38 +368,31 @@ bool Opal::Account::populate_menu (Ekiga::MenuBuilder &builder)
 
 void Opal::Account::edit ()
 {
-  Ekiga::FormRequestSimple request(sigc::mem_fun (this, &Opal::Account::on_edit_form_submitted));
+  gmref_ptr<Ekiga::FormRequestSimple> request = gmref_ptr<Ekiga::FormRequestSimple> (new Ekiga::FormRequestSimple (sigc::mem_fun (this, &Opal::Account::on_edit_form_submitted)));
   std::stringstream str;
 
   str << get_timeout ();
 
-  request.title (_("Edit account"));
+  request->title (_("Edit account"));
 
-  request.instructions (_("Please update the following fields:"));
+  request->instructions (_("Please update the following fields:"));
 
-  request.text ("name", _("Name:"), get_name ());
+  request->text ("name", _("Name:"), get_name ());
   if (get_protocol_name () == "SIP")
-    request.text ("host", _("Registrar:"), get_host ());
+    request->text ("host", _("Registrar:"), get_host ());
   else
-    request.text ("host", _("Gatekeeper:"), get_host ());
-  request.text ("user", _("User:"), get_username ());
+    request->text ("host", _("Gatekeeper:"), get_host ());
+  request->text ("user", _("User:"), get_username ());
   if (get_protocol_name () == "SIP")
     /* Translators:
      * SIP knows two usernames: The name for the client ("User") and the name
      * for the authentication procedure ("Authentication User") */
-    request.text ("authentication_user", _("Authentication User:"), get_authentication_username ());
-  request.private_text ("password", _("Password:"), get_password ());
-  request.text ("timeout", _("Timeout:"), str.str ());
-  request.boolean ("enabled", _("Enable Account"), enabled);
-
-  if (!questions.handle_request (&request)) {
-
-    // FIXME: better error reporting
-#ifdef __GNUC__
-    std::cout << "Unhandled form request in "
-	      << __PRETTY_FUNCTION__ << std::endl;
-#endif
-  }
+    request->text ("authentication_user", _("Authentication User:"), get_authentication_username ());
+  request->private_text ("password", _("Password:"), get_password ());
+  request->text ("timeout", _("Timeout:"), str.str ());
+  request->boolean ("enabled", _("Enable Account"), enabled);
+
+  questions.handle_request (request);
 }
 
 
@@ -434,16 +426,11 @@ void Opal::Account::on_edit_form_submitted (bool submitted,
 
   if (!error.empty ()) {
 
-    Ekiga::FormRequestSimple request(sigc::mem_fun (this, &Opal::Account::on_edit_form_submitted));
-    result.visit (request);
-    request.error (error);
+    gmref_ptr<Ekiga::FormRequestSimple> request = gmref_ptr<Ekiga::FormRequestSimple> (new Ekiga::FormRequestSimple (sigc::mem_fun (this, &Opal::Account::on_edit_form_submitted)));
+    result.visit (*request);
+    request->error (error);
 
-    if (!questions.handle_request (&request)) {
-#ifdef __GNUC__
-      std::cout << "Unhandled form request in "
-		<< __PRETTY_FUNCTION__ << std::endl;
-#endif
-    }
+    questions.handle_request (request);
   }
   else {
 
diff --git a/lib/engine/components/opal/opal-bank.cpp b/lib/engine/components/opal/opal-bank.cpp
index 400f205..18fcba8 100644
--- a/lib/engine/components/opal/opal-bank.cpp
+++ b/lib/engine/components/opal/opal-bank.cpp
@@ -39,7 +39,6 @@
 
 #include <string.h>
 #include <stdlib.h>
-#include <iostream>
 #include <sstream>
 
 #include <glib/gi18n.h>
@@ -90,64 +89,59 @@ Opal::Bank::new_account (Account::Type acc_type,
 			 std::string username,
 			 std::string password)
 {
-  Ekiga::FormRequestSimple request(sigc::bind (sigc::mem_fun (this, &Opal::Bank::on_new_account_form_submitted), acc_type));
+  gmref_ptr<Ekiga::FormRequestSimple> request = gmref_ptr<Ekiga::FormRequestSimple> (new Ekiga::FormRequestSimple (sigc::bind (sigc::mem_fun (this, &Opal::Bank::on_new_account_form_submitted), acc_type)));
 
-  request.title (_("Edit account"));
-  request.instructions (_("Please update the following fields."));
+  request->title (_("Edit account"));
+  request->instructions (_("Please update the following fields."));
 
   switch (acc_type) {
 
   case Opal::Account::Ekiga:
-    request.link (_("Get an Ekiga.net SIP account"), "http://www.ekiga.net";);
-    request.hidden ("name", "Ekiga.net");
-    request.hidden ("host", "ekiga.net");
-    request.text ("user", _("_User:"), username);
-    request.hidden ("authentication_user", username);
-    request.private_text ("password", _("_Password:"), password);
-    request.hidden ("timeout", "3600");
+    request->link (_("Get an Ekiga.net SIP account"), "http://www.ekiga.net";);
+    request->hidden ("name", "Ekiga.net");
+    request->hidden ("host", "ekiga.net");
+    request->text ("user", _("_User:"), username);
+    request->hidden ("authentication_user", username);
+    request->private_text ("password", _("_Password:"), password);
+    request->hidden ("timeout", "3600");
     break;
 
   case Opal::Account::DiamondCard:
-    request.link (_("Get an Ekiga Call Out account"),
-                  "https://www.diamondcard.us/exec/voip-login?act=sgn&spo=ekiga";);
-    request.hidden ("name", "Ekiga Call Out");
-    request.hidden ("host", "sip.diamondcard.us");
-    request.text ("user", _("_Account ID:"), username);
-    request.hidden ("authentication_user", username);
-    request.private_text ("password", _("_PIN Code:"), password);
-    request.hidden ("timeout", "3600");
+    request->link (_("Get an Ekiga Call Out account"),
+		   "https://www.diamondcard.us/exec/voip-login?act=sgn&spo=ekiga";);
+    request->hidden ("name", "Ekiga Call Out");
+    request->hidden ("host", "sip.diamondcard.us");
+    request->text ("user", _("_Account ID:"), username);
+    request->hidden ("authentication_user", username);
+    request->private_text ("password", _("_PIN Code:"), password);
+    request->hidden ("timeout", "3600");
     break;
 
   case Opal::Account::H323:
-    request.text ("name", _("_Name:"), std::string ());
-    request.text ("host", _("_Gatekeeper:"), std::string ());
-    request.text ("user", _("_User:"), username);
-    request.hidden ("authentication_user", username);
-    request.private_text ("password", _("_Password:"), password);
-    request.text ("timeout", _("_Timeout:"), "3600");
+    request->text ("name", _("_Name:"), std::string ());
+    request->text ("host", _("_Gatekeeper:"), std::string ());
+    request->text ("user", _("_User:"), username);
+    request->hidden ("authentication_user", username);
+    request->private_text ("password", _("_Password:"), password);
+    request->text ("timeout", _("_Timeout:"), "3600");
     break;
 
   case Opal::Account::SIP:
   default:
-    request.text ("name", _("_Name:"), std::string ());
-    request.text ("host", _("_Registrar:"), std::string ());
-    request.text ("user", _("_User:"), username);
-    request.text ("authentication_user", _("_Authentication User:"), std::string ());
-    request.private_text ("password", _("_Password:"), password);
-    request.text ("timeout", _("_Timeout:"), "3600");
+    request->text ("name", _("_Name:"), std::string ());
+    request->text ("host", _("_Registrar:"), std::string ());
+    request->text ("user", _("_User:"), username);
+    request->text ("authentication_user", _("_Authentication User:"), std::string ());
+    request->private_text ("password", _("_Password:"), password);
+    request->text ("timeout", _("_Timeout:"), "3600");
     break;
   }
-  request.boolean ("enabled", _("Enable Account"), true);
+  request->boolean ("enabled", _("Enable Account"), true);
 
   if (!username.empty () && !password.empty ())
-    request.submit (request);
+    request->submit (*request);
   else
-    if (!questions.handle_request (&request)) {
-#ifdef __GNUC__
-      std::cout << "Unhandled form request in "
-		<< __PRETTY_FUNCTION__ << std::endl;
-#endif
-    }
+    questions.handle_request (request);
 }
 
 
@@ -158,7 +152,7 @@ void Opal::Bank::on_new_account_form_submitted (bool submitted,
   if (!submitted)
     return;
 
-  Ekiga::FormRequestSimple request(sigc::bind (sigc::mem_fun (this, &Opal::Bank::on_new_account_form_submitted) ,acc_type));
+  gmref_ptr<Ekiga::FormRequestSimple> request = gmref_ptr<Ekiga::FormRequestSimple> (new Ekiga::FormRequestSimple (sigc::bind (sigc::mem_fun (this, &Opal::Bank::on_new_account_form_submitted) ,acc_type)));
 
   std::string error;
   std::string new_name = (acc_type == Opal::Account::SIP
@@ -173,7 +167,7 @@ void Opal::Bank::on_new_account_form_submitted (bool submitted,
 				|| acc_type == Opal::Account::H323) ?
 			       result.text ("timeout").c_str () : result.hidden ("timeout").c_str ());
 
-  result.visit (request);
+  result.visit (*request);
 
   if (new_name.empty ())
     error = _("You did not supply a name for that account.");
@@ -185,14 +179,9 @@ void Opal::Bank::on_new_account_form_submitted (bool submitted,
     error = _("The timeout should have a bigger value.");
 
   if (!error.empty ()) {
-    request.error (error);
+    request->error (error);
 
-    if (!questions.handle_request (&request)) {
-#ifdef __GNUC__
-      std::cout << "Unhandled form request in "
-		<< __PRETTY_FUNCTION__ << std::endl;
-#endif
-    }
+    questions.handle_request (request);
   }
   else {
 
diff --git a/lib/engine/components/resource-list/rl-cluster.cpp b/lib/engine/components/resource-list/rl-cluster.cpp
index a9545c3..558642d 100644
--- a/lib/engine/components/resource-list/rl-cluster.cpp
+++ b/lib/engine/components/resource-list/rl-cluster.cpp
@@ -161,26 +161,19 @@ RL::Cluster::new_heap (const std::string name,
 		       const std::string user,
 		       bool writable)
 {
-  Ekiga::FormRequestSimple request(sigc::mem_fun (this, &RL::Cluster::on_new_heap_form_submitted));
-
-  request.title (_("Add new resource-list"));
-  request.instructions (_("Please fill in this form to add a new "
-			  "contact list to ekiga's remote roster"));
-  request.text ("name", _("Name:"), name);
-  request.text ("uri", _("Address:"), uri);
-  request.boolean ("writable", _("Writable:"), writable);
-  request.text ("username", _("Username:"), username);
-  request.private_text ("password", _("Password:"), password);
-  request.text ("user", _("User:"), user);
-
-  if (!questions.handle_request (&request)) {
-
-    // FIXME: better error reporting
-#ifdef __GNUC__
-    std::cout << "Unhandled form request in "
-	      << __PRETTY_FUNCTION__ << std::endl;
-#endif
-  }
+  gmref_ptr<Ekiga::FormRequestSimple> request = gmref_ptr<Ekiga::FormRequestSimple> (new Ekiga::FormRequestSimple (sigc::mem_fun (this, &RL::Cluster::on_new_heap_form_submitted)));
+
+  request->title (_("Add new resource-list"));
+  request->instructions (_("Please fill in this form to add a new "
+			   "contact list to ekiga's remote roster"));
+  request->text ("name", _("Name:"), name);
+  request->text ("uri", _("Address:"), uri);
+  request->boolean ("writable", _("Writable:"), writable);
+  request->text ("username", _("Username:"), username);
+  request->private_text ("password", _("Password:"), password);
+  request->text ("user", _("User:"), user);
+
+  questions.handle_request (request);
 }
 
 void
diff --git a/lib/engine/components/resource-list/rl-heap.cpp b/lib/engine/components/resource-list/rl-heap.cpp
index 210154b..1f1e80b 100644
--- a/lib/engine/components/resource-list/rl-heap.cpp
+++ b/lib/engine/components/resource-list/rl-heap.cpp
@@ -37,8 +37,6 @@
 
 #include <glib/gi18n.h>
 
-#include <iostream>
-
 #include "robust-xml.h"
 #include "form-request-simple.h"
 #include "xcap-core.h"
@@ -410,7 +408,7 @@ RL::Heap::push_status (const std::string uri_,
 void
 RL::Heap::edit ()
 {
-  Ekiga::FormRequestSimple request(sigc::mem_fun (this, &RL::Heap::on_edit_form_submitted));
+  gmref_ptr<Ekiga::FormRequestSimple> request = gmref_ptr<Ekiga::FormRequestSimple> (new Ekiga::FormRequestSimple (sigc::mem_fun (this, &RL::Heap::on_edit_form_submitted)));
 
   std::string name_str;
   std::string root_str;
@@ -461,27 +459,20 @@ RL::Heap::edit ()
     }
   }
 
-  request.title (_("Edit contact list properties"));
+  request->title (_("Edit contact list properties"));
 
-  request.instructions (_("Please edit the following fields (no identifier"
-			  " means global)"));
+  request->instructions (_("Please edit the following fields (no identifier"
+			   " means global)"));
 
-  request.text ("name", _("Contact list's name"), get_name ());
+  request->text ("name", _("Contact list's name"), get_name ());
   /* "Document" used as a name -- uri point to the root of a document tree */
-  request.text ("root", _("Document root"), root_str);
-  request.text ("user", _("Identifier"), user_str);
-  request.boolean ("writable", _("Writable"), writable);
-  request.text ("username", _("Server username"), username_str);
-  request.private_text ("password", _("Server password"), password_str);
-
-  if (!questions.handle_request (&request)) {
-
-    // FIXME: better error reporting
-#ifdef __GNUC__
-    std::cout << "Unhandled form request in "
-	      << __PRETTY_FUNCTION__ << std::endl;
-#endif
-  }
+  request->text ("root", _("Document root"), root_str);
+  request->text ("user", _("Identifier"), user_str);
+  request->boolean ("writable", _("Writable"), writable);
+  request->text ("username", _("Server username"), username_str);
+  request->private_text ("password", _("Server password"), password_str);
+
+  questions.handle_request (request);
 }
 
 void
@@ -516,11 +507,11 @@ RL::Heap::on_edit_form_submitted (bool submitted,
 void
 RL::Heap::new_entry ()
 {
-  Ekiga::FormRequestSimple request(sigc::mem_fun (this, &RL::Heap::on_new_entry_form_submitted));
+  gmref_ptr<Ekiga::FormRequestSimple> request = gmref_ptr<Ekiga::FormRequestSimple> (new Ekiga::FormRequestSimple (sigc::mem_fun (this, &RL::Heap::on_new_entry_form_submitted)));
 
-  request.title (_("Add a remote contact"));
-  request.instructions (_("Please fill in this form to create a new "
-			  "contact on a remote server"));
+  request->title (_("Add a remote contact"));
+  request->instructions (_("Please fill in this form to create a new "
+			   "contact on a remote server"));
 
   std::set<std::string> all_groups;
   for (std::map<PresentityPtr,std::list<sigc::connection> >::iterator
@@ -532,19 +523,12 @@ RL::Heap::new_entry ()
     all_groups.insert (groups.begin (), groups.end ());
   }
 
-  request.text ("name", _("Name:"), "");
-  request.text ("uri", _("Address:"), "");
-  request.editable_set ("groups", _("Choose groups:"),
-			std::set<std::string>(), all_groups);
+  request->text ("name", _("Name:"), "");
+  request->text ("uri", _("Address:"), "");
+  request->editable_set ("groups", _("Choose groups:"),
+			 std::set<std::string>(), all_groups);
 
-  if (!questions.handle_request (&request)) {
-
-    // FIXME: better error reporting
-#ifdef __GNUC__
-    std::cout << "Unhandled form request in "
-	      << __PRETTY_FUNCTION__ << std::endl;
-#endif
-  }
+  questions.handle_request (request);
 }
 
 void
diff --git a/lib/engine/components/resource-list/rl-presentity.cpp b/lib/engine/components/resource-list/rl-presentity.cpp
index 1dbcdb2..2cd1f7e 100644
--- a/lib/engine/components/resource-list/rl-presentity.cpp
+++ b/lib/engine/components/resource-list/rl-presentity.cpp
@@ -34,7 +34,6 @@
  */
 
 #include <algorithm>
-#include <iostream>
 #include <set>
 
 #include <glib/gi18n.h>
@@ -214,28 +213,21 @@ RL::Presentity::populate_menu (Ekiga::MenuBuilder &builder)
 void
 RL::Presentity::edit_presentity ()
 {
-  Ekiga::FormRequestSimple request(sigc::mem_fun (this, &RL::Presentity::edit_presentity_form_submitted));
+  gmref_ptr<Ekiga::FormRequestSimple> request = gmref_ptr<Ekiga::FormRequestSimple> (new Ekiga::FormRequestSimple (sigc::mem_fun (this, &RL::Presentity::edit_presentity_form_submitted)));
 
   // FIXME: we should be able to know all groups in the heap
   std::set<std::string> all_groups = groups;
 
-  request.title (_("Edit remote contact"));
-  request.instructions (_("Please fill in this form to change an existing "
+  request->title (_("Edit remote contact"));
+  request->instructions (_("Please fill in this form to change an existing "
 			  "contact on a remote server"));
-  request.text ("name", _("Name:"), get_name ());
-  request.text ("uri", _("Address:"), uri);
+  request->text ("name", _("Name:"), get_name ());
+  request->text ("uri", _("Address:"), uri);
 
-  request.editable_set ("groups", _("Choose groups:"),
+  request->editable_set ("groups", _("Choose groups:"),
 			groups, all_groups);
 
-  if (!questions.handle_request (&request)) {
-
-    // FIXME: better error reporting
-#ifdef __GNUC__
-    std::cout << "Unhandled form request in "
-	      << __PRETTY_FUNCTION__ << std::endl;
-#endif
-  }
+  questions.handle_request (request);
 }
 
 
diff --git a/lib/engine/framework/form-request.h b/lib/engine/framework/form-request.h
index a497375..630933d 100644
--- a/lib/engine/framework/form-request.h
+++ b/lib/engine/framework/form-request.h
@@ -38,6 +38,8 @@
 
 #include "form.h"
 
+#include "gmref.h"
+
 namespace Ekiga
 {
 
@@ -46,7 +48,9 @@ namespace Ekiga
  * @{
  */
 
-  class FormRequest: public virtual Form
+  class FormRequest:
+    public virtual GmRefCounted,
+    public virtual Form
   {
   public:
 
@@ -56,6 +60,8 @@ namespace Ekiga
 
   };
 
+  typedef gmref_ptr<FormRequest> FormRequestPtr;
+
 /**
  * @}
  */
diff --git a/lib/engine/gui/gtk-core/form-dialog-gtk.cpp b/lib/engine/gui/gtk-core/form-dialog-gtk.cpp
index 2be4499..379de45 100644
--- a/lib/engine/gui/gtk-core/form-dialog-gtk.cpp
+++ b/lib/engine/gui/gtk-core/form-dialog-gtk.cpp
@@ -621,7 +621,7 @@ link_clicked_cb (GtkWidget * /*widget*/,
 }
 
 
-FormDialog::FormDialog (Ekiga::FormRequest &_request,
+FormDialog::FormDialog (Ekiga::FormRequestPtr _request,
 			GtkWidget *parent): request(_request)
 {
   GtkWidget *vbox = NULL;
@@ -664,7 +664,7 @@ FormDialog::FormDialog (Ekiga::FormRequest &_request,
   labels_group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
   options_group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
 
-  request.visit (*this);
+  request->visit (*this);
 }
 
 
@@ -1340,14 +1340,14 @@ FormDialog::submit ()
        iter++)
     (*iter)->submit (builder);
 
-  request.submit (builder);
+  request->submit (builder);
 }
 
 void
 FormDialog::cancel ()
 {
   gtk_widget_hide_all (GTK_WIDGET (window));
-  request.cancel ();
+  request->cancel ();
 }
 
 void
diff --git a/lib/engine/gui/gtk-core/form-dialog-gtk.h b/lib/engine/gui/gtk-core/form-dialog-gtk.h
index c858205..19e0de9 100644
--- a/lib/engine/gui/gtk-core/form-dialog-gtk.h
+++ b/lib/engine/gui/gtk-core/form-dialog-gtk.h
@@ -55,7 +55,7 @@ class FormDialog: public Ekiga::FormVisitor
 {
 public:
 
-  FormDialog (Ekiga::FormRequest &request,
+  FormDialog (Ekiga::FormRequestPtr request,
 	      GtkWidget *parent);
 
   ~FormDialog ();
@@ -124,7 +124,7 @@ private:
 
   void grow_fields (bool advanced);
 
-  Ekiga::FormRequest &request;
+  Ekiga::FormRequestPtr request;
   GtkWidget *window;
   GtkWidget *preamble;
   GtkWidget *fields;
diff --git a/lib/engine/gui/gtk-frontend/addressbook-window.cpp b/lib/engine/gui/gtk-frontend/addressbook-window.cpp
index 41124bb..757974f 100644
--- a/lib/engine/gui/gtk-frontend/addressbook-window.cpp
+++ b/lib/engine/gui/gtk-frontend/addressbook-window.cpp
@@ -142,7 +142,7 @@ static void on_book_updated (Ekiga::SourcePtr source,
  * BEHAVIOR     : Runs the form request in gtk+
  * PRE          : The given pointer is the parent window for the form.
  */
-static bool on_handle_questions (Ekiga::FormRequest *request,
+static bool on_handle_questions (Ekiga::FormRequestPtr request,
 				 gpointer data);
 
 /* DESCRIPTION  : Called when a view of a Book has been updated,
@@ -296,10 +296,10 @@ on_book_updated (Ekiga::SourcePtr /*source*/,
 }
 
 static bool
-on_handle_questions (Ekiga::FormRequest *request,
+on_handle_questions (Ekiga::FormRequestPtr request,
 		     gpointer data)
 {
-  FormDialog dialog (*request, GTK_WIDGET (data));
+  FormDialog dialog (request, GTK_WIDGET (data));
 
   dialog.run ();
 
diff --git a/lib/engine/gui/gtk-frontend/roster-view-gtk.cpp b/lib/engine/gui/gtk-frontend/roster-view-gtk.cpp
index 3dbbec3..d4b23a4 100644
--- a/lib/engine/gui/gtk-frontend/roster-view-gtk.cpp
+++ b/lib/engine/gui/gtk-frontend/roster-view-gtk.cpp
@@ -328,7 +328,7 @@ static void on_presentity_removed (Ekiga::ClusterPtr cluster,
  * BEHAVIOR     : Runs the form request in gtk+
  * PRE          : The given pointer is the roster view widget
  */
-static bool on_handle_questions (Ekiga::FormRequest *request,
+static bool on_handle_questions (Ekiga::FormRequestPtr request,
 				 gpointer data);
 
 
@@ -1080,11 +1080,11 @@ on_presentity_removed (Ekiga::ClusterPtr /*cluster*/,
 }
 
 static bool
-on_handle_questions (Ekiga::FormRequest *request,
+on_handle_questions (Ekiga::FormRequestPtr request,
 		     gpointer data)
 {
   GtkWidget *parent = gtk_widget_get_toplevel (GTK_WIDGET (data));
-  FormDialog dialog (*request, parent);
+  FormDialog dialog (request, parent);
 
   dialog.run ();
 
diff --git a/lib/engine/presence/cluster.h b/lib/engine/presence/cluster.h
index 8911c8e..38a5456 100644
--- a/lib/engine/presence/cluster.h
+++ b/lib/engine/presence/cluster.h
@@ -83,7 +83,7 @@ namespace Ekiga
 
     /** This chain allows the Cluster to present forms to the user.
      */
-    ChainOfResponsibility<FormRequest*> questions;
+    ChainOfResponsibility<FormRequestPtr> questions;
   };
 
   typedef gmref_ptr<Cluster> ClusterPtr;
diff --git a/lib/engine/presence/heap.h b/lib/engine/presence/heap.h
index a94833e..9201f79 100644
--- a/lib/engine/presence/heap.h
+++ b/lib/engine/presence/heap.h
@@ -109,7 +109,7 @@ namespace Ekiga
 
     /** This chain allows the Heap to present forms to the user
      */
-    ChainOfResponsibility<FormRequest*> questions;
+    ChainOfResponsibility<FormRequestPtr> questions;
   };
 
   typedef gmref_ptr<Heap> HeapPtr;
diff --git a/lib/engine/presence/presence-core.h b/lib/engine/presence/presence-core.h
index 084416a..18d4ff3 100644
--- a/lib/engine/presence/presence-core.h
+++ b/lib/engine/presence/presence-core.h
@@ -317,7 +317,7 @@ namespace Ekiga
 
     /** This chain allows the PresenceCore to present forms to the user
      */
-    ChainOfResponsibility<FormRequest*> questions;
+    ChainOfResponsibility<FormRequestPtr> questions;
 
     std::list<sigc::connection> conns;
   };
diff --git a/lib/engine/presence/presentity.h b/lib/engine/presence/presentity.h
index 29dd813..99a9a2a 100644
--- a/lib/engine/presence/presentity.h
+++ b/lib/engine/presence/presentity.h
@@ -102,7 +102,7 @@ namespace Ekiga
 
     /** This chain allows the Presentity to present forms to the user
      */
-    ChainOfResponsibility<FormRequest*> questions;
+    ChainOfResponsibility<FormRequestPtr> questions;
   };
 
   typedef gmref_ptr<Presentity> PresentityPtr;
diff --git a/src/gui/accounts.cpp b/src/gui/accounts.cpp
index c236f9c..1cc5775 100644
--- a/src/gui/accounts.cpp
+++ b/src/gui/accounts.cpp
@@ -463,10 +463,10 @@ on_bank_added (Ekiga::BankPtr bank,
 
 
 static bool
-on_handle_questions (Ekiga::FormRequest *request,
+on_handle_questions (Ekiga::FormRequestPtr request,
                      gpointer data)
 {
-  FormDialog dialog (*request, GTK_WIDGET (data));
+  FormDialog dialog (request, GTK_WIDGET (data));
 
   dialog.run ();
 



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