Alien-SVN
view release on metacpan or search on metacpan
src/subversion/subversion/libsvn_ra_serf/locks.c view on Meta::CPAN
{ MULTISTATUS, D_, "response", RESPONSE,
FALSE, { NULL }, FALSE },
{ RESPONSE, D_, "propstat", PROPSTAT,
FALSE, { NULL }, FALSE },
{ PROPSTAT, D_, "prop", PROP,
FALSE, { NULL }, FALSE },
{ PROP, D_, "lockdiscovery", LOCK_DISCOVERY,
FALSE, { NULL }, FALSE },
{ LOCK_DISCOVERY, D_, "activelock", ACTIVE_LOCK,
FALSE, { NULL }, FALSE },
#if 0
/* ### we don't really need to parse locktype/lockscope. we know what
### the values are going to be. we *could* validate that the only
### possible children are D:write and D:exclusive. we'd need to
### modify the state transition to tell us about all children
### (ie. maybe support "*" for the name) and then validate. but it
### just isn't important to validate, so disable this for now... */
{ ACTIVE_LOCK, D_, "locktype", LOCK_TYPE,
FALSE, { NULL }, FALSE },
{ LOCK_TYPE, D_, "write", WRITE,
FALSE, { NULL }, TRUE },
{ ACTIVE_LOCK, D_, "lockscope", LOCK_SCOPE,
FALSE, { NULL }, FALSE },
{ LOCK_SCOPE, D_, "exclusive", EXCLUSIVE,
FALSE, { NULL }, TRUE },
#endif /* 0 */
{ ACTIVE_LOCK, D_, "timeout", TIMEOUT,
TRUE, { NULL }, TRUE },
{ ACTIVE_LOCK, D_, "locktoken", LOCK_TOKEN,
FALSE, { NULL }, FALSE },
{ LOCK_TOKEN, D_, "href", HREF,
TRUE, { NULL }, TRUE },
{ ACTIVE_LOCK, D_, "owner", OWNER,
TRUE, { NULL }, TRUE },
/* ACTIVE_LOCK has a D:depth child, but we can ignore that. */
{ 0 }
};
/* Conforms to svn_ra_serf__xml_closed_t */
static svn_error_t *
locks_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)
{
lock_info_t *lock_ctx = baton;
if (leaving_state == TIMEOUT)
{
if (strcasecmp(cdata->data, "Infinite") == 0)
lock_ctx->lock->expiration_date = 0;
else if (strncasecmp(cdata->data, "Second-", 7) == 0)
{
unsigned n;
SVN_ERR(svn_cstring_atoui(&n, cdata->data+7));
lock_ctx->lock->expiration_date = apr_time_now() +
apr_time_from_sec(n);
}
else
return svn_error_createf(SVN_ERR_RA_DAV_MALFORMED_DATA, NULL,
_("Invalid LOCK timeout value '%s'"),
cdata->data);
}
else if (leaving_state == HREF)
{
if (cdata->len)
{
char *buf = apr_pstrmemdup(lock_ctx->pool, cdata->data, cdata->len);
apr_collapse_spaces(buf, buf);
lock_ctx->lock->token = buf;
}
}
else if (leaving_state == OWNER)
{
if (cdata->len)
{
lock_ctx->lock->comment = apr_pstrmemdup(lock_ctx->pool,
cdata->data, cdata->len);
}
}
return SVN_NO_ERROR;
}
static svn_error_t *
set_lock_headers(serf_bucket_t *headers,
void *baton,
apr_pool_t *pool)
{
lock_info_t *lock_ctx = baton;
if (lock_ctx->force)
{
serf_bucket_headers_set(headers, SVN_DAV_OPTIONS_HEADER,
SVN_DAV_OPTION_LOCK_STEAL);
}
if (SVN_IS_VALID_REVNUM(lock_ctx->revision))
{
serf_bucket_headers_set(headers, SVN_DAV_VERSION_NAME_HEADER,
apr_ltoa(pool, lock_ctx->revision));
}
return APR_SUCCESS;
}
/* Register an error within the session. If something is already there,
then it will take precedence. */
static svn_error_t *
determine_error(svn_ra_serf__handler_t *handler,
svn_error_t *err)
{
{
apr_status_t errcode;
if (handler->sline.code == 423)
errcode = SVN_ERR_FS_PATH_ALREADY_LOCKED;
else if (handler->sline.code == 403)
errcode = SVN_ERR_RA_DAV_FORBIDDEN;
else
return err;
/* Client-side or server-side error already. Return it. */
if (err != NULL)
return err;
/* The server did not send us a detailed human-readable error.
Provide a generic error. */
err = svn_error_createf(errcode, NULL,
_("Lock request failed: %d %s"),
handler->sline.code,
handler->sline.reason);
}
return err;
}
( run in 1.779 second using v1.01-cache-2.11-cpan-22024b96cdf )