/* Implements svn_ra_serf__request_body_delegate_t */ static svn_error_t * create_get_locations_body(serf_bucket_t **body_bkt, void *baton, serf_bucket_alloc_t *alloc, apr_pool_t *pool) { serf_bucket_t *buckets; loc_context_t *loc_ctx = baton; int i; buckets = serf_bucket_aggregate_create(alloc); svn_ra_serf__add_open_tag_buckets(buckets, alloc, "S:get-locations", "xmlns:S", SVN_XML_NAMESPACE, "xmlns:D", "DAV:", NULL); svn_ra_serf__add_tag_buckets(buckets, "S:path", loc_ctx->path, alloc); svn_ra_serf__add_tag_buckets(buckets, "S:peg-revision", apr_ltoa(pool, loc_ctx->peg_revision), alloc); for (i = 0; i < loc_ctx->location_revisions->nelts; i++) { svn_revnum_t rev = APR_ARRAY_IDX(loc_ctx->location_revisions, i, svn_revnum_t); svn_ra_serf__add_tag_buckets(buckets, "S:location-revision", apr_ltoa(pool, rev), alloc); } svn_ra_serf__add_close_tag_buckets(buckets, alloc, "S:get-locations"); *body_bkt = buckets; return SVN_NO_ERROR; }
/* Implements svn_ra_serf__request_body_delegate_t */ static svn_error_t * create_getdrev_body(serf_bucket_t **body_bkt, void *baton, serf_bucket_alloc_t *alloc, apr_pool_t *pool) { serf_bucket_t *buckets; drev_context_t *drev_ctx = baton; buckets = serf_bucket_aggregate_create(alloc); svn_ra_serf__add_open_tag_buckets(buckets, alloc, "S:get-deleted-rev-report", "xmlns:S", SVN_XML_NAMESPACE, "xmlns:D", "DAV:", NULL, NULL); svn_ra_serf__add_tag_buckets(buckets, "S:path", drev_ctx->path, alloc); svn_ra_serf__add_tag_buckets(buckets, "S:peg-revision", apr_ltoa(pool, drev_ctx->peg_revision), alloc); svn_ra_serf__add_tag_buckets(buckets, "S:end-revision", apr_ltoa(pool, drev_ctx->end_revision), alloc); svn_ra_serf__add_close_tag_buckets(buckets, alloc, "S:get-deleted-rev-report"); *body_bkt = buckets; 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; 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; }
/* Implements svn_ra_serf__request_body_delegate_t */ static svn_error_t * create_list_body(serf_bucket_t **body_bkt, void *baton, serf_bucket_alloc_t *alloc, apr_pool_t *pool /* request pool */, apr_pool_t *scratch_pool) { serf_bucket_t *buckets; list_context_t *list_ctx = baton; int i; buckets = serf_bucket_aggregate_create(alloc); svn_ra_serf__add_open_tag_buckets(buckets, alloc, "S:list-report", "xmlns:S", SVN_XML_NAMESPACE, SVN_VA_NULL); svn_ra_serf__add_tag_buckets(buckets, "S:path", list_ctx->path, alloc); svn_ra_serf__add_tag_buckets(buckets, "S:revision", apr_ltoa(pool, list_ctx->revision), alloc); svn_ra_serf__add_tag_buckets(buckets, "S:depth", svn_depth_to_word(list_ctx->depth), alloc); if (list_ctx->patterns) { for (i = 0; i < list_ctx->patterns->nelts; i++) { char *name = APR_ARRAY_IDX(list_ctx->patterns, i, char *); svn_ra_serf__add_tag_buckets(buckets, "S:pattern", name, alloc); } if (list_ctx->patterns->nelts == 0) { svn_ra_serf__add_empty_tag_buckets(buckets, alloc, "S:no-patterns", SVN_VA_NULL); } } for (i = 0; i < list_ctx->props->nelts; i++) { const svn_ra_serf__dav_props_t *prop = &APR_ARRAY_IDX(list_ctx->props, i, const svn_ra_serf__dav_props_t); const char *name = apr_pstrcat(pool, prop->xmlns, prop->name, SVN_VA_NULL); svn_ra_serf__add_tag_buckets(buckets, "S:prop", name, alloc); } svn_ra_serf__add_close_tag_buckets(buckets, alloc, "S:list-report"); *body_bkt = buckets; return SVN_NO_ERROR; }