diff options
Diffstat (limited to 'subversion/libsvn_ra_serf/get_deleted_rev.c')
-rw-r--r-- | subversion/libsvn_ra_serf/get_deleted_rev.c | 143 |
1 files changed, 41 insertions, 102 deletions
diff --git a/subversion/libsvn_ra_serf/get_deleted_rev.c b/subversion/libsvn_ra_serf/get_deleted_rev.c index 09db22c..40f6b1d 100644 --- a/subversion/libsvn_ra_serf/get_deleted_rev.c +++ b/subversion/libsvn_ra_serf/get_deleted_rev.c @@ -35,14 +35,13 @@ /* * This enum represents the current state of our XML parsing for a REPORT. */ -typedef enum drev_state_e { - NONE = 0, +enum drev_state_e { + INITIAL = 0, + REPORT, VERSION_NAME -} drev_state_e; +}; typedef struct drev_context_t { - apr_pool_t *pool; - const char *path; svn_revnum_t peg_revision; svn_revnum_t end_revision; @@ -51,90 +50,40 @@ typedef struct drev_context_t { the range PEG_REVISION-END-END_REVISION? */ svn_revnum_t *revision_deleted; - /* are we done? */ - svn_boolean_t done; - } drev_context_t; - -static void -push_state(svn_ra_serf__xml_parser_t *parser, - drev_context_t *drev_ctx, - drev_state_e state) -{ - svn_ra_serf__xml_push_state(parser, state); +#define D_ "DAV:" +#define S_ SVN_XML_NAMESPACE +static const svn_ra_serf__xml_transition_t getdrev_ttable[] = { + { INITIAL, S_, "get-deleted-rev-report", REPORT, + FALSE, { NULL }, FALSE }, - if (state == VERSION_NAME) - parser->state->private = NULL; -} + { REPORT, D_, SVN_DAV__VERSION_NAME, VERSION_NAME, + TRUE, { NULL }, TRUE }, -static svn_error_t * -start_getdrev(svn_ra_serf__xml_parser_t *parser, - void *userData, - svn_ra_serf__dav_props_t name, - const char **attrs) -{ - drev_context_t *drev_ctx = userData; - drev_state_e state; - - state = parser->state->current_state; - - if (state == NONE && - strcmp(name.name, SVN_DAV__VERSION_NAME) == 0) - { - push_state(parser, drev_ctx, VERSION_NAME); - } - - return SVN_NO_ERROR; -} + { 0 } +}; + +/* Conforms to svn_ra_serf__xml_closed_t */ static svn_error_t * -end_getdrev(svn_ra_serf__xml_parser_t *parser, - void *userData, - svn_ra_serf__dav_props_t name) +getdrev_closed(svn_ra_serf__xml_estate_t *xes, + void *baton, + int leaving_state, + const svn_string_t *cdata, + apr_hash_t *attrs, + apr_pool_t *scratch_pool) { - drev_context_t *drev_ctx = userData; - drev_state_e state; - svn_string_t *info; + drev_context_t *drev_ctx = baton; - state = parser->state->current_state; - info = parser->state->private; + SVN_ERR_ASSERT(leaving_state == VERSION_NAME); + SVN_ERR_ASSERT(cdata != NULL); - if (state == VERSION_NAME && - strcmp(name.name, SVN_DAV__VERSION_NAME) == 0 && - info) - { - *drev_ctx->revision_deleted = SVN_STR_TO_REV(info->data); - svn_ra_serf__xml_pop_state(parser); - } + *drev_ctx->revision_deleted = SVN_STR_TO_REV(cdata->data); return SVN_NO_ERROR; } -static svn_error_t * -cdata_getdrev(svn_ra_serf__xml_parser_t *parser, - void *userData, - const char *data, - apr_size_t len) -{ - drev_context_t *drev_ctx = userData; - drev_state_e state; - - UNUSED_CTX(drev_ctx); - - state = parser->state->current_state; - switch (state) - { - case VERSION_NAME: - parser->state->private = svn_string_ncreate(data, len, - parser->state->pool); - break; - default: - break; - } - - return SVN_NO_ERROR; -} /* Implements svn_ra_serf__request_body_delegate_t */ static svn_error_t * @@ -186,54 +135,44 @@ svn_ra_serf__get_deleted_rev(svn_ra_session_t *session, drev_context_t *drev_ctx; svn_ra_serf__session_t *ras = session->priv; svn_ra_serf__handler_t *handler; - svn_ra_serf__xml_parser_t *parser_ctx; - const char *relative_url, *basecoll_url, *req_url; - int status_code = 0; + svn_ra_serf__xml_context_t *xmlctx; + const char *req_url; svn_error_t *err; drev_ctx = apr_pcalloc(pool, sizeof(*drev_ctx)); drev_ctx->path = path; drev_ctx->peg_revision = peg_revision; drev_ctx->end_revision = end_revision; - drev_ctx->pool = pool; drev_ctx->revision_deleted = revision_deleted; - drev_ctx->done = FALSE; - - SVN_ERR(svn_ra_serf__get_baseline_info(&basecoll_url, &relative_url, - ras, NULL, NULL, peg_revision, NULL, - pool)); - req_url = svn_path_url_add_component2(basecoll_url, relative_url, pool); + SVN_ERR(svn_ra_serf__get_stable_url(&req_url, NULL /* latest_revnum */, + ras, NULL /* conn */, + NULL /* url */, peg_revision, + pool, pool)); - parser_ctx = apr_pcalloc(pool, sizeof(*parser_ctx)); - parser_ctx->pool = pool; - parser_ctx->user_data = drev_ctx; - parser_ctx->start = start_getdrev; - parser_ctx->end = end_getdrev; - parser_ctx->cdata = cdata_getdrev; - parser_ctx->done = &drev_ctx->done; - parser_ctx->status_code = &status_code; + xmlctx = svn_ra_serf__xml_context_create(getdrev_ttable, + NULL, getdrev_closed, NULL, + drev_ctx, + pool); + handler = svn_ra_serf__create_expat_handler(xmlctx, pool); - handler = apr_pcalloc(pool, sizeof(*handler)); handler->method = "REPORT"; handler->path = req_url; handler->body_type = "text/xml"; - handler->response_handler = svn_ra_serf__handle_xml_parser; handler->body_delegate = create_getdrev_body; handler->body_delegate_baton = drev_ctx; handler->conn = ras->conns[0]; handler->session = ras; - handler->response_baton = parser_ctx; - svn_ra_serf__request_create(handler); - - err = svn_ra_serf__context_run_wait(&drev_ctx->done, ras, pool); + err = svn_ra_serf__context_run_one(handler, pool); /* Map status 501: Method Not Implemented to our not implemented error. 1.5.x servers and older don't support this report. */ - if (status_code == 501) + if (handler->sline.code == 501) return svn_error_createf(SVN_ERR_RA_NOT_IMPLEMENTED, err, - _("'%s' REPORT not implemented"), "get-deleted-rev"); + _("'%s' REPORT not implemented"), + "get-deleted-rev"); SVN_ERR(err); + return SVN_NO_ERROR; } |