diff options
author | Berthold Stoeger <bstoeger@mail.tuwien.ac.at> | 2019-03-05 22:58:47 +0100 |
---|---|---|
committer | Dirk Hohndel <dirk@hohndel.org> | 2019-04-12 18:19:07 +0300 |
commit | e2df38d868324f2a767d2109cdd8727acb866ca2 (patch) | |
tree | 614b560431d2c61f3f2b1e2f986c7806bd175ae9 /core/dive.c | |
parent | c22fd9f4fd6699333629b8acb1e9c135a9783082 (diff) | |
download | subsurface-e2df38d868324f2a767d2109cdd8727acb866ca2.tar.gz |
Dive site: add dive site ref-counting
Instead of setting dive->dive_site directly, call the
add_dive_to_dive_site() and unregister_dive_from_dive_site()
functions. In the parser this turned out to be a bit tricky.
Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
Diffstat (limited to 'core/dive.c')
-rw-r--r-- | core/dive.c | 37 |
1 files changed, 24 insertions, 13 deletions
diff --git a/core/dive.c b/core/dive.c index b05030c60..f43697c65 100644 --- a/core/dive.c +++ b/core/dive.c @@ -662,8 +662,10 @@ void selective_copy_dive(const struct dive *s, struct dive *d, struct dive_compo d->rating = s->rating; if (what.visibility) d->visibility = s->visibility; - if (what.divesite) - d->dive_site = s->dive_site; + if (what.divesite) { + unregister_dive_from_dive_site(d); + add_dive_to_dive_site(d, s->dive_site); + } if (what.tags) STRUCTURED_LIST_COPY(struct tag_entry, s->tag_list, d->tag_list, copy_tl); if (what.cylinders) @@ -2988,12 +2990,21 @@ static int likely_same_dive(const struct dive *a, const struct dive *b) * be the old dive and dive b is supposed to be the newly imported * dive. If the flag "prefer_downloaded" is set, data of the latter * will take priority over the former. + * + * Attn: The dive_site parameter of the dive will be set, but the caller + * still has to register the dive in the dive site! */ struct dive *try_to_merge(struct dive *a, struct dive *b, bool prefer_downloaded) { - if (likely_same_dive(a, b)) - return merge_dives(a, b, 0, prefer_downloaded, NULL); - return NULL; + struct dive *res; + struct dive_site *site; + + if (!likely_same_dive(a, b)) + return NULL; + + res = merge_dives(a, b, 0, prefer_downloaded, NULL, &site); + res->dive_site = site; /* Caller has to call add_dive_to_dive_site()! */ + return res; } void free_events(struct event *ev) @@ -3440,10 +3451,12 @@ bool has_planned(const struct dive *dive, bool planned) { * will take priority over the former. * * The trip the new dive should be associated with (if any) is returned - * in the "trip" output paramater. If "trip" is NULL, then the dive will - * instead be added to this trip. + * in the "trip" output parameter. + * + * The dive site the new dive should be added to (if any) is returned + * in the "dive_site" output parameter. */ -struct dive *merge_dives(const struct dive *a, const struct dive *b, int offset, bool prefer_downloaded, struct dive_trip **trip) +struct dive *merge_dives(const struct dive *a, const struct dive *b, int offset, bool prefer_downloaded, struct dive_trip **trip, struct dive_site **site) { struct dive *res = alloc_dive(); int cylinders_map_a[MAX_CYLINDERS], cylinders_map_b[MAX_CYLINDERS]; @@ -3490,10 +3503,7 @@ struct dive *merge_dives(const struct dive *a, const struct dive *b, int offset, join_dive_computers(res, &res->dc, &a->dc, &b->dc, cylinders_map_a, cylinders_map_b, 0); /* we take the first dive site, unless it's empty */ - if (a->dive_site && !dive_site_is_empty(a->dive_site)) - res->dive_site = a->dive_site; - else - res->dive_site = b->dive_site; + *site = a->dive_site && !dive_site_is_empty(a->dive_site) ? a->dive_site : b->dive_site; fixup_dive(res); return res; } @@ -4034,7 +4044,8 @@ static void dive_set_geodata_from_picture(struct dive *dive, struct picture *pic if (ds) { ds->location = picture->location; } else { - dive->dive_site = create_dive_site_with_gps("", &picture->location, table); + ds = create_dive_site_with_gps("", &picture->location, table); + add_dive_to_dive_site(dive, ds); invalidate_dive_cache(dive); } } |