2.34.0
[platform/upstream/at-spi2-core.git] / atspi / atspi-matchrule.c
index 1a17cf3..6fb4210 100644 (file)
@@ -7,19 +7,19 @@
  * Copyright 2010, 2011 Novell, Inc.
  *
  * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
+ * modify it under the terms of the GNU Lesser General Public
  * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
+ * version 2.1 of the License, or (at your option) any later version.
  *
  * This library is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
+ * Lesser General Public License for more details.
  *
- * You should have received a copy of the GNU Library General Public
+ * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
  */
 
 #include "atspi-private.h"
@@ -55,10 +55,14 @@ static void
 atspi_match_rule_finalize (GObject *object)
 {
   AtspiMatchRule *rule = ATSPI_MATCH_RULE (object);
+  gint i;
 
-  /* TODO: Check that interfaces don't leak */
   if (rule->interfaces)
+  {
+    for (i = 0; i < rule->interfaces->len; i++)
+      g_free (g_array_index (rule->interfaces, gchar *, i));
     g_array_free (rule->interfaces, TRUE);
+  }
 
   if (rule->attributes)
     g_hash_table_unref (rule->attributes);
@@ -122,9 +126,6 @@ atspi_match_rule_new (AtspiStateSet *states,
   AtspiMatchRule *rule = g_object_new (ATSPI_TYPE_MATCH_RULE, NULL);
   int i;
 
-  if (!rule)
-    return NULL;
-
   if (states)
     rule->states = g_object_ref (states);
   rule->statematchtype = statematchtype;
@@ -145,7 +146,14 @@ atspi_match_rule_new (AtspiStateSet *states,
   rule->attributematchtype = attributematchtype;
 
   if (interfaces)
-    rule->interfaces = g_array_ref (interfaces);
+  {
+    rule->interfaces = g_array_new (TRUE, TRUE, sizeof (gchar *));
+    for (i = 0; i < interfaces->len; i++)
+    {
+      gchar *val = g_strdup (g_array_index (interfaces, gchar *, i));
+      rule->interfaces = g_array_append_val (rule->interfaces, val);
+    }
+  }
   rule->interfacematchtype = interfacematchtype;
 
   if (roles)
@@ -156,7 +164,7 @@ atspi_match_rule_new (AtspiStateSet *states,
       if (role < 128)
         rule->roles [role / 32] |= (1 << (role % 32));
       else
-        g_warning ("Atspi: unexpected role %d\n", role);
+        g_warning ("AT-SPI: unexpected role %d\n", role);
     }
   }
   else
@@ -219,7 +227,8 @@ _atspi_match_rule_marshal (AtspiMatchRule *rule, DBusMessageIter *iter)
   if (!dbus_message_iter_open_container (&iter_struct, DBUS_TYPE_ARRAY, "{ss}",
                                          &iter_dict))
     return FALSE;
-  g_hash_table_foreach (rule->attributes, append_entry, &iter_dict);
+  if (rule->attributes)
+    g_hash_table_foreach (rule->attributes, append_entry, &iter_dict);
   dbus_message_iter_close_container (&iter_struct, &iter_dict);
   dbus_message_iter_append_basic (&iter_struct, DBUS_TYPE_INT32, &d_attributematchtype);