static GError* _resolve_reference_service(struct hc_resolver_s *r, struct hashstr_s *hk, struct hc_url_s *u, const gchar *s, gchar ***result) { GError *err; gchar **m1urlv = NULL; GRID_TRACE2("%s(%s,%s,%s)", __FUNCTION__, hashstr_str(hk), hc_url_get(u, HCURL_WHOLE), s); /* Try to hit the cache for the service itself */ *result = hc_resolver_get_cached(r, r->services.cache, hk); if (NULL != *result) { return NULL; } /* now attempt a real resolution */ err = _resolve_meta1(r, u, &m1urlv); g_assert((err!=NULL) ^ (m1urlv!=NULL)); if (NULL != err) return err; err = _resolve_service_through_many_meta1(m1urlv, u, s, result); g_assert((err!=NULL) ^ (*result!=NULL)); if (!err) { /* fill the cache */ if (!(r->flags & HC_RESOLVER_NOCACHE)) hc_resolver_store(r, r->services.cache, hk, *result); } g_strfreev(m1urlv); return err; }
GError* hc_resolve_reference_directory(struct hc_resolver_s *r, struct hc_url_s *url, gchar ***result) { GRID_TRACE2("%s(%s)", __FUNCTION__, hc_url_get(url, HCURL_WHOLE)); EXTRA_ASSERT(r != NULL); EXTRA_ASSERT(url != NULL); EXTRA_ASSERT(result != NULL); if (!hc_url_get_id(url) || !hc_url_has(url, HCURL_NS)) return NEWERROR(CODE_BAD_REQUEST, "Incomplete URL [%s]", hc_url_get(url, HCURL_WHOLE)); GError *err = NULL; gchar **m1v = NULL, **m0v = NULL; if (!(err = _resolve_meta0(r, hc_url_get(url, HCURL_NS), &m0v))) err = _resolve_meta1(r, url, &m1v); if (err) { if (m0v) g_strfreev (m0v); if (m1v) g_strfreev (m1v); return err; } *result = g_malloc0(sizeof(gchar*) * (g_strv_length(m0v) + g_strv_length(m1v) + 1)); gchar **d = *result; for (gchar **p=m0v; *p ;++p) { *(d++) = *p; } g_free (m0v); // pointers reused for (gchar **p=m1v; *p ;++p) { *(d++) = *p; } g_free (m1v); // pointers reused return NULL; }
GError* hc_resolve_reference_directory(struct hc_resolver_s *r, struct hc_url_s *url, gchar ***result) { GRID_TRACE2("%s(%s)", __FUNCTION__, hc_url_get(url, HCURL_WHOLE)); g_assert(r != NULL); g_assert(url != NULL); g_assert(result != NULL); if (!hc_url_get_id(url) || !hc_url_has(url, HCURL_NS)) return NEWERROR(400, "Incomplete URL [%s]", hc_url_get(url, HCURL_WHOLE)); return _resolve_meta1(r, url, result); }