summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMilan Crha <mcrha@redhat.com>2019-10-14 13:45:02 +0200
committerCorentin Noël <corentin@elementary.io>2019-10-14 14:32:10 +0200
commit5a0d84bf2c22de31381a35e73484d4a7f09e6d36 (patch)
tree6fd7041cf5c9534f137897a5f92af42b82c8084d
parent805be190c64665702583bd3e9b86f06bd2005110 (diff)
downloadlibical-git-5a0d84bf2c22de31381a35e73484d4a7f09e6d36.tar.gz
libical-glib: Fix ICalAttach handling of the icalattach native structure
The icalattach structure is specific, it has its own ref-counting, thus let the ICalAttach wrapper depend on it, rather than depend on the owner ICalProperty or ICalValue. This way the "owner" can be freed and the ICalAttach will still hold valid structure.
-rw-r--r--ReleaseNotes.txt2
-rw-r--r--src/libical-glib/api/i-cal-attach.xml2
-rw-r--r--src/libical-glib/tools/generator.c10
-rw-r--r--src/libical-glib/tools/source-structure-boilerplate-template1
-rw-r--r--src/libical-glib/tools/xml-parser.c20
-rw-r--r--src/libical-glib/tools/xml-parser.h1
6 files changed, 34 insertions, 2 deletions
diff --git a/ReleaseNotes.txt b/ReleaseNotes.txt
index 0332b947..f580fa4b 100644
--- a/ReleaseNotes.txt
+++ b/ReleaseNotes.txt
@@ -3,7 +3,7 @@ Release Highlights
Version 3.0.7 (UNRELEASED):
---------------------------
- *
+ * libical-glib: Fix ICalAttach handling of the icalattach native structure
Version 3.0.6 (14 Sep 2019):
----------------------------
diff --git a/src/libical-glib/api/i-cal-attach.xml b/src/libical-glib/api/i-cal-attach.xml
index c0c1e108..e4fcf0d2 100644
--- a/src/libical-glib/api/i-cal-attach.xml
+++ b/src/libical-glib/api/i-cal-attach.xml
@@ -13,7 +13,7 @@
You should have received a copy of the GNU Lesser General Public License
along with this library. If not, see <http://www.gnu.org/licenses/>.
-->
-<structure namespace="ICal" name="Attach" native="icalattach" destroy_func="icalattach_unref">
+<structure namespace="ICal" name="Attach" native="icalattach" destroy_func="icalattach_unref" new_full_extra_code="if (owner) { icalattach_ref (native); owner = NULL; }">
<method name="i_cal_attach_new_from_url" corresponds="icalattach_new_from_url" kind="constructor" since="1.0">
<parameter type="const gchar *" name="url" comment="The url from which the object is created"/>
<returns type="ICalAttach *" annotation="transfer full" comment="The newly created #ICalAttach from the @url" />
diff --git a/src/libical-glib/tools/generator.c b/src/libical-glib/tools/generator.c
index 712d9bc1..64a9f5ea 100644
--- a/src/libical-glib/tools/generator.c
+++ b/src/libical-glib/tools/generator.c
@@ -911,6 +911,12 @@ void generate_code_from_template(FILE *in, FILE *out, Structure *structure, GHas
val = g_hash_table_lookup(table, buffer);
write_str(out, val);
val = NULL;
+
+ if (g_strcmp0(buffer, "new_full_extraCode") == 0)
+ write_str(out, "\n ");
+ } else if (g_strcmp0(buffer, "new_full_extraCode") == 0) {
+ /* For simplicity, after lookup in the 'table', to
+ not force declaration of it in every .xml file */
} else if (g_strcmp0(buffer, "structure_boilerplate") == 0) {
if (structure->native != NULL)
generate_header_structure_boilerplate(out, structure, table);
@@ -1266,6 +1272,10 @@ GHashTable *get_hash_table_from_structure(Structure *structure)
(void)g_hash_table_insert(table, (gchar *)"defaultNative",
g_strdup(structure->defaultNative));
}
+ if (structure->new_full_extraCode && *structure->new_full_extraCode) {
+ (void)g_hash_table_insert(table, (gchar *)"new_full_extraCode",
+ g_strdup(structure->new_full_extraCode));
+ }
}
(void)g_hash_table_insert(table, (char *)"native", g_strdup(structure->native));
diff --git a/src/libical-glib/tools/source-structure-boilerplate-template b/src/libical-glib/tools/source-structure-boilerplate-template
index ceddd505..77d20aae 100644
--- a/src/libical-glib/tools/source-structure-boilerplate-template
+++ b/src/libical-glib/tools/source-structure-boilerplate-template
@@ -26,6 +26,7 @@ ${new_full}
${native} *clone;^$$^!${isBare}
if (native == NULL)
return NULL;^$
+ ${new_full_extraCode}
$^${isBare}
clone = g_new (${native}, 1);
*clone = native;^$
diff --git a/src/libical-glib/tools/xml-parser.c b/src/libical-glib/tools/xml-parser.c
index e7b1b42f..c5520119 100644
--- a/src/libical-glib/tools/xml-parser.c
+++ b/src/libical-glib/tools/xml-parser.c
@@ -27,6 +27,7 @@ Structure *structure_new()
structure->methods = NULL;
structure->isBare = FALSE;
structure->isPossibleGlobal = FALSE;
+ structure->new_full_extraCode = NULL;
structure->enumerations = NULL;
structure->destroyFunc = NULL;
structure->cloneFunc = NULL;
@@ -68,6 +69,7 @@ void structure_free(Structure * structure)
g_free(structure->destroyFunc);
g_free(structure->cloneFunc);
g_free(structure->defaultNative);
+ g_free(structure->new_full_extraCode);
g_hash_table_destroy(structure->dependencies);
g_free(structure);
}
@@ -251,6 +253,22 @@ void enumeration_free(Enumeration * enumeration)
g_free(enumeration);
}
+static gchar *dup_attribute_value(xmlDocPtr doc, const xmlNode * list, int inLine)
+{
+ xmlChar *xml_value;
+ gchar *glib_value;
+
+ xml_value = xmlNodeListGetString(doc, list, inLine);
+ if (!xml_value)
+ return NULL;
+
+ glib_value = g_strdup((const gchar *) xml_value);
+
+ xmlFree(xml_value);
+
+ return glib_value;
+}
+
GList *get_list_from_string(const gchar * str)
{
gchar **ret;
@@ -530,6 +548,8 @@ gboolean parse_structure(xmlNode * node, Structure * structure)
structure->destroyFunc = (gchar *) xmlNodeListGetString(attr->doc, attr->children, 1);
} else if (xmlStrcmp(attr->name, (xmlChar *) "clone_func") == 0) {
structure->cloneFunc = (gchar *) xmlNodeListGetString(attr->doc, attr->children, 1);
+ } else if (xmlStrcmp(attr->name, (xmlChar *) "new_full_extra_code") == 0) {
+ structure->new_full_extraCode = dup_attribute_value(attr->doc, attr->children, 1);
} else if (xmlStrcmp(attr->name, (xmlChar *) "default_native") == 0) {
structure->defaultNative = (gchar *) xmlNodeListGetString(attr->doc, attr->children, 1);
} else if (xmlStrcmp(attr->name, (xmlChar *) "is_bare") == 0) {
diff --git a/src/libical-glib/tools/xml-parser.h b/src/libical-glib/tools/xml-parser.h
index 33527c0c..3313753f 100644
--- a/src/libical-glib/tools/xml-parser.h
+++ b/src/libical-glib/tools/xml-parser.h
@@ -61,6 +61,7 @@ typedef struct Structure {
GList *methods;
gboolean isBare;
gboolean isPossibleGlobal;
+ gchar *new_full_extraCode;
GList *enumerations;
GHashTable *dependencies;
gchar *destroyFunc;