Installing property in interface



Hi!

I'm trying to install property into main interface, but when I run program
it always display me this warning:

(lt-goofysender:10709): GLib-GObject-WARNING **: When installing property:
type `GoofyFileTransfer' already has a property named `transfer-status'

Here you have some code:

/*>>> Interface definition <<<*/

GType   goofy_file_transfer_get_type (void) {
   static GType type = G_TYPE_INVALID;

   if (type == G_TYPE_INVALID) {
       static const GTypeInfo info = {
           sizeof (GoofyFileTransferIface),    /* class_size */
           goofy_file_transfer_base_init,    /* base_init */
           NULL,            /* base_finalize */
           NULL,
           NULL,            /* class_finalize */
           NULL,            /* class_data */
           0,
           0,            /* n_preallocs */
           NULL
       };
       type = g_type_register_static (G_TYPE_INTERFACE,
"GoofyFileTransfer", &info, 0);
   }

   return type;
}

/* cut */

static void goofy_file_transfer_base_init (gpointer g_iface) {
   g_object_interface_install_property (g_iface,
                      g_param_spec_string ("transfer-status",
                                "Transfer status",
                                "Specify current transfer status",
                                "lol",
                                G_PARAM_READWRITE));
}

/*>>> Class, which implement this interface <<<*/
/*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

       Private variables and functions prototypes

*/
static void     goofy_file_transfer_iface_init (gpointer       g_iface,
                                               gpointer       iface_data);

G_DEFINE_TYPE_WITH_CODE (GoofySendFile, goofy_send_file, GOOFY_TYPE_FILE,
                         G_IMPLEMENT_INTERFACE (GOOFY_TYPE_FILE_TRANSFER,

goofy_file_transfer_iface_init))

enum    {
   PROP_0,
   PROP_SENT_SIZE,
   PROP_TRANSFER_STATUS
};


static void     goofy_send_file_set_property   (GObject        *object,
                                               guint           property_id,
                                               const GValue   *value,
                                               GParamSpec     *pspec);

static void     goofy_send_file_get_property   (GObject        *object,
                                               guint           property_id,
                                               GValue         *value,
                                               GParamSpec     *pspec);

static void     goofy_send_file_dispose        (GObject        *object);

static void     goofy_send_file_finalize       (GObject        *object);

static gboolean goofy_send_file_start          (GoofyFileTransfer
*file_transfer,
                                               GError
**error);

static gboolean goofy_send_file_cancel         (GoofyFileTransfer
*file_transfer,
                                               GError
**error);
/*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

       Public functions definitions

*/
GoofySendFile   *goofy_send_file_new        (gchar          *file_path,
                                            gchar
*dest_ip_address,
                                            guint
dest_port_number,
                                            GError         **error)
{
   GoofySendFile   *send_file = NULL;
   FILE            *file_handler;
   gboolean        status;
   gint            return_val;
   gchar           *file_name;
   struct stat     file_info;

   /* Validate path to file */
   status = g_file_test (file_path, G_FILE_TEST_EXISTS);
   if (!status)    {
       goofy_set_error (error, GOOFY_FILE_ERROR_QUARK,
GOOFY_FILE_ERROR_FILE_OPEN, _("There is no file under given path."));
       return NULL;
   }

   /* We can't send symbolic links too */
   status = g_file_test (file_path, G_FILE_TEST_IS_SYMLINK);
   if (status)    {
       goofy_set_error (error, GOOFY_FILE_ERROR_QUARK,
GOOFY_FILE_ERROR_FILE_OPEN, _("File, which you choosen is a symbolic link to
other file. Please select file on which it's pointing on and try again."));
       return NULL;
   }
   printf ("Yea!");
   /* Try to open file */
   file_handler = fopen (file_path, "r");
   if (file_handler == NULL)   {
       goofy_set_error (error, GOOFY_FILE_ERROR_QUARK,
GOOFY_FILE_ERROR_FILE_OPEN, _("Failed to open file."));
       fclose (file_handler); /* Doesn't check for errors here */
       return NULL;
   }

   /* Validate IP address */
   status = goofy_network_ip_address_validate (dest_ip_address);
   if (!status)    {
       g_set_error (error, GOOFY_SEND_FILE_ERROR_QUARK,
GOOFY_SEND_FILE_ERROR_INVALID_IP_ADDRESS, _("Given IP address is
invalid."));
       return NULL;
   }

   /* Validate port number */
   status = goofy_network_port_number_validate (dest_port_number);
   if (!status)    {
       g_set_error (error, GOOFY_SEND_FILE_ERROR_QUARK,
GOOFY_SEND_FILE_ERROR_INVALID_PORT_NUMBER, _("Given port number is invalid,
it must be number between 1024 and 65535."));
       return NULL;
   }

   /* Obtain some base information */
   file_name = g_path_get_basename (file_path);
   return_val = g_stat (file_path, &file_info);
   if (return_val == -1)   {
       goofy_set_error (error, GOOFY_FILE_ERROR_QUARK,
GOOFY_FILE_ERROR_FILE_OPEN, _("Unable to acces file information. Maybe you
don't have premmision to read this file?."));
       return NULL;
   }

   /* File can't be empty */
   if (file_info.st_size == 0)  {
       goofy_set_error (error, GOOFY_FILE_ERROR_QUARK,
GOOFY_FILE_ERROR_EMPTY_FILE, _("File, which you are trying to send is empty.
GoofySender can't send empty files."));
       return NULL;
   }

   send_file = g_object_new (GOOFY_TYPE_SEND_FILE,
       "ip-address", dest_ip_address,
       "port-number", dest_port_number,
       "file-name", file_name,
       "file-path", file_path,
       "file-size", file_info.st_size,
       NULL);

   /* Set opened file handler*/
   GOOFY_FILE (send_file)->file_handler = file_handler;

   g_free (file_name);

   return send_file;
}

/*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

       Private functions definitions

*/
static void goofy_send_file_init  (GoofySendFile  *self)  {
   /* Dummy function */
}

static void goofy_send_file_set_property   (GObject        *object,
                                        guint           property_id,
                                        const GValue   *value,
                                        GParamSpec     *pspec)
{
   GoofySendFile *send_file = GOOFY_SEND_FILE (object);

   switch (property_id)    {
       case PROP_SENT_SIZE:
           send_file->sent_size = g_value_get_uint (value);
           break;
       case PROP_TRANSFER_STATUS:
           send_file->transfer_status = g_value_get_int (value);
           break;
       default:
           G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
   }
}

static void goofy_send_file_get_property   (GObject        *object,
                                        guint           property_id,
                                        GValue         *value,
                                        GParamSpec     *pspec)
{
   GoofySendFile *send_file = GOOFY_SEND_FILE (object);

   switch (property_id)    {
       case PROP_SENT_SIZE:
           g_value_set_uint (value, send_file->sent_size);
           break;
       case PROP_TRANSFER_STATUS:
           g_value_set_int (value, send_file->transfer_status);
           break;
       default:
           G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
   }
}

static void goofy_send_file_dispose (GObject  *object)    {
   GoofySendFile   *send_file = GOOFY_SEND_FILE (object);
   GoofyFileClass  *client_class = g_type_class_peek (GOOFY_TYPE_FILE);

   G_OBJECT_CLASS (client_class)->dispose (object);
}

static void goofy_send_file_finalize   (GObject  *object)    {
   GoofySendFile   *send_file = GOOFY_SEND_FILE (object);
   GoofyFileClass  *client_class = g_type_class_peek (GOOFY_TYPE_FILE);

   G_OBJECT_CLASS (client_class)->finalize (object);
}

static void goofy_send_file_class_init (GoofySendFileClass  *klass)    {
   GObjectClass        *g_klass = G_OBJECT_CLASS (klass);
   GoofySendFileClass  *send_file_class = GOOFY_SEND_FILE_CLASS (klass);

   g_klass->set_property = goofy_send_file_set_property;
   g_klass->get_property = goofy_send_file_get_property;
   g_klass->dispose = goofy_send_file_dispose;
   g_klass->finalize = goofy_send_file_finalize;

   /* Sent data size */
   g_object_class_install_property (g_klass, PROP_SENT_SIZE,
       g_param_spec_uint ("sent-size",
           "Sent sizer",
           "Total amount of file's bytes, which were send.",
           1,
           G_MAXUINT,
           1,
           G_PARAM_READABLE));

    /* Install interface's properties */
    g_object_class_override_property (g_klass, PROP_TRANSFER_STATUS,
"transfer-status");

    /* Install signals */
    send_file_class->file_send_step = g_signal_new ("file-send-setp",
                G_TYPE_FROM_CLASS (g_klass),
                G_SIGNAL_RUN_LAST,
                0,
                NULL,
                NULL,
                g_cclosure_marshal_VOID__VOID,
                G_TYPE_NONE,
                0);

    send_file_class->file_send_finish = g_signal_new ("file-send-finish",
                G_TYPE_FROM_CLASS (g_klass),
                G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE |
G_SIGNAL_NO_HOOKS,
                0,
                NULL,
                NULL,
                g_cclosure_marshal_VOID__VOID,
                G_TYPE_NONE,
                0);

   send_file_class->file_send_cancel = g_signal_new ("file-send-cancel",
                G_TYPE_FROM_CLASS (g_klass),
                G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE |
G_SIGNAL_NO_HOOKS,
                0,
                NULL,
                NULL,
                g_cclosure_marshal_VOID__VOID,
                G_TYPE_NONE,
                0);

    send_file_class->file_send_error = g_signal_new ("file-send-error",
                G_TYPE_FROM_CLASS (g_klass),
                G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE |
G_SIGNAL_NO_HOOKS,
                0,
                NULL,
                NULL,
                g_cclosure_user_marshal_VOID__OBJECT_POINTER,
                G_TYPE_NONE,
                0);
}

static void     goofy_file_transfer_iface_init (gpointer       g_iface,
                                               gpointer       iface_data)
{
   GoofyFileTransferIface   *iface = g_iface;

   iface->transfer_start = goofy_send_file_start;
   iface->transfer_cancel = goofy_send_file_cancel;
}

static gboolean goofy_send_file_start       (GoofyFileTransfer
*file_transfer,
                                            GError             **error)
{
   GoofySendFile   *send_file = (GoofySendFile *) file_transfer;
   gboolean        status;

   /* Emit signal "send-step" */
   g_signal_emit (send_file, GOOFY_SEND_FILE_GET_CLASS
(send_file)->file_send_step, 0, G_TYPE_NONE);

   return TRUE;
}

static gboolean goofy_send_file_cancel      (GoofyFileTransfer
*file_transfer,
                                            GError             **error)
{
   /* Emit signal "canceled" */
   g_signal_emit_by_name (file_transfer, "transfer-canceled", G_TYPE_NONE);

   return TRUE;
}

--
Cya!
Tom



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