svn_error_t * svn_ra_serf__get_location_segments(svn_ra_session_t *ra_session, const char *path, svn_revnum_t peg_revision, svn_revnum_t start_rev, svn_revnum_t end_rev, svn_location_segment_receiver_t receiver, void *receiver_baton, apr_pool_t *pool) { gls_context_t *gls_ctx; svn_ra_serf__session_t *session = ra_session->priv; svn_ra_serf__handler_t *handler; svn_ra_serf__xml_parser_t *parser_ctx; serf_bucket_t *buckets; const char *relative_url, *basecoll_url, *req_url; svn_error_t *err; gls_ctx = apr_pcalloc(pool, sizeof(*gls_ctx)); gls_ctx->receiver = receiver; gls_ctx->receiver_baton = receiver_baton; gls_ctx->subpool = svn_pool_create(pool); gls_ctx->inside_report = FALSE; gls_ctx->error = SVN_NO_ERROR; gls_ctx->done = FALSE; buckets = serf_bucket_aggregate_create(session->bkt_alloc); svn_ra_serf__add_open_tag_buckets(buckets, session->bkt_alloc, "S:get-location-segments", "xmlns:S", SVN_XML_NAMESPACE, NULL); svn_ra_serf__add_tag_buckets(buckets, "S:path", path, session->bkt_alloc); svn_ra_serf__add_tag_buckets(buckets, "S:peg-revision", apr_ltoa(pool, peg_revision), session->bkt_alloc); svn_ra_serf__add_tag_buckets(buckets, "S:start-revision", apr_ltoa(pool, start_rev), session->bkt_alloc); svn_ra_serf__add_tag_buckets(buckets, "S:end-revision", apr_ltoa(pool, end_rev), session->bkt_alloc); svn_ra_serf__add_close_tag_buckets(buckets, session->bkt_alloc, "S:get-location-segments"); SVN_ERR(svn_ra_serf__get_baseline_info(&basecoll_url, &relative_url, session, NULL, NULL, peg_revision, NULL, pool)); req_url = svn_path_url_add_component(basecoll_url, relative_url, pool); handler = apr_pcalloc(pool, sizeof(*handler)); handler->method = "REPORT"; handler->path = req_url; handler->body_buckets = buckets; handler->body_type = "text/xml"; handler->conn = session->conns[0]; handler->session = session; parser_ctx = apr_pcalloc(pool, sizeof(*parser_ctx)); parser_ctx->pool = pool; parser_ctx->user_data = gls_ctx; parser_ctx->start = start_gls; parser_ctx->end = end_gls; parser_ctx->status_code = &gls_ctx->status_code; parser_ctx->done = &gls_ctx->done; handler->response_handler = svn_ra_serf__handle_xml_parser; handler->response_baton = parser_ctx; svn_ra_serf__request_create(handler); err = svn_ra_serf__context_run_wait(&gls_ctx->done, session, pool); if (gls_ctx->error || parser_ctx->error) { svn_error_clear(err); err = SVN_NO_ERROR; SVN_ERR(gls_ctx->error); SVN_ERR(parser_ctx->error); } if (gls_ctx->inside_report) err = svn_error_createf(SVN_ERR_RA_DAV_REQUEST_FAILED, NULL, _("Location segment report failed on '%s'@'%ld'"), path, peg_revision); SVN_ERR(svn_ra_serf__error_on_status(gls_ctx->status_code, handler->path)); svn_pool_destroy(gls_ctx->subpool); if (err && (err->apr_err == SVN_ERR_UNSUPPORTED_FEATURE)) return svn_error_create(SVN_ERR_RA_NOT_IMPLEMENTED, err, NULL); return err; }
svn_error_t * svn_ra_serf__get_locations(svn_ra_session_t *ra_session, apr_hash_t **locations, const char *path, svn_revnum_t peg_revision, const apr_array_header_t *location_revisions, apr_pool_t *pool) { loc_context_t *loc_ctx; svn_ra_serf__session_t *session = ra_session->priv; svn_ra_serf__handler_t *handler; svn_ra_serf__xml_parser_t *parser_ctx; const char *relative_url, *basecoll_url, *req_url; svn_error_t *err; loc_ctx = apr_pcalloc(pool, sizeof(*loc_ctx)); loc_ctx->pool = pool; loc_ctx->path = path; loc_ctx->peg_revision = peg_revision; loc_ctx->location_revisions = location_revisions; loc_ctx->done = FALSE; loc_ctx->paths = apr_hash_make(loc_ctx->pool); *locations = loc_ctx->paths; SVN_ERR(svn_ra_serf__get_baseline_info(&basecoll_url, &relative_url, session, NULL, NULL, peg_revision, NULL, pool)); req_url = svn_path_url_add_component2(basecoll_url, relative_url, pool); handler = apr_pcalloc(pool, sizeof(*handler)); handler->method = "REPORT"; handler->path = req_url; handler->body_delegate = create_get_locations_body; handler->body_delegate_baton = loc_ctx; handler->body_type = "text/xml"; handler->conn = session->conns[0]; handler->session = session; parser_ctx = apr_pcalloc(pool, sizeof(*parser_ctx)); parser_ctx->pool = pool; parser_ctx->user_data = loc_ctx; parser_ctx->start = start_getloc; parser_ctx->end = end_getloc; parser_ctx->status_code = &loc_ctx->status_code; parser_ctx->done = &loc_ctx->done; handler->response_handler = svn_ra_serf__handle_xml_parser; handler->response_baton = parser_ctx; svn_ra_serf__request_create(handler); err = svn_ra_serf__context_run_wait(&loc_ctx->done, session, pool); SVN_ERR(svn_error_compose_create( svn_ra_serf__error_on_status(loc_ctx->status_code, req_url, parser_ctx->location), err)); return SVN_NO_ERROR; }
svn_error_t * svn_ra_serf__get_location_segments(svn_ra_session_t *ra_session, const char *path, svn_revnum_t peg_revision, svn_revnum_t start_rev, svn_revnum_t end_rev, svn_location_segment_receiver_t receiver, void *receiver_baton, apr_pool_t *pool) { gls_context_t *gls_ctx; svn_ra_serf__session_t *session = ra_session->priv; svn_ra_serf__handler_t *handler; svn_ra_serf__xml_parser_t *parser_ctx; const char *relative_url, *basecoll_url, *req_url; svn_error_t *err, *err2; gls_ctx = apr_pcalloc(pool, sizeof(*gls_ctx)); gls_ctx->path = path; gls_ctx->peg_revision = peg_revision; gls_ctx->start_rev = start_rev; gls_ctx->end_rev = end_rev; gls_ctx->receiver = receiver; gls_ctx->receiver_baton = receiver_baton; gls_ctx->subpool = svn_pool_create(pool); gls_ctx->inside_report = FALSE; gls_ctx->done = FALSE; SVN_ERR(svn_ra_serf__get_baseline_info(&basecoll_url, &relative_url, session, NULL, NULL, peg_revision, NULL, pool)); req_url = svn_path_url_add_component2(basecoll_url, relative_url, pool); handler = apr_pcalloc(pool, sizeof(*handler)); handler->method = "REPORT"; handler->path = req_url; handler->body_delegate = create_gls_body; handler->body_delegate_baton = gls_ctx; handler->body_type = "text/xml"; handler->conn = session->conns[0]; handler->session = session; parser_ctx = apr_pcalloc(pool, sizeof(*parser_ctx)); parser_ctx->pool = pool; parser_ctx->user_data = gls_ctx; parser_ctx->start = start_gls; parser_ctx->end = end_gls; parser_ctx->status_code = &gls_ctx->status_code; parser_ctx->done = &gls_ctx->done; handler->response_handler = svn_ra_serf__handle_xml_parser; handler->response_baton = parser_ctx; svn_ra_serf__request_create(handler); err = svn_ra_serf__context_run_wait(&gls_ctx->done, session, pool); if (gls_ctx->inside_report) err = svn_error_createf(SVN_ERR_RA_DAV_REQUEST_FAILED, err, _("Location segment report failed on '%s'@'%ld'"), path, peg_revision); err2 = svn_ra_serf__error_on_status(gls_ctx->status_code, handler->path, parser_ctx->location); if (err2) { /* Prefer err2 to err. */ svn_error_clear(err); return err2; } svn_pool_destroy(gls_ctx->subpool); if (err && (err->apr_err == SVN_ERR_UNSUPPORTED_FEATURE)) return svn_error_create(SVN_ERR_RA_NOT_IMPLEMENTED, err, NULL); return err; }