⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 options.c

📁 subversion-1.4.3-1.tar.gz 配置svn的源码
💻 C
字号:
/* * options.c :  entry point for OPTIONS RA functions for ra_serf * * ==================================================================== * Copyright (c) 2006 CollabNet.  All rights reserved. * * This software is licensed as described in the file COPYING, which * you should have received as part of this distribution.  The terms * are also available at http://subversion.tigris.org/license-1.html. * If newer versions of this license are posted there, you may use a * newer version instead, at your option. * * This software consists of voluntary contributions made by many * individuals.  For exact contribution history, see the revision * history and logs, available at http://subversion.tigris.org/. * ==================================================================== */#include <apr_uri.h>#include <expat.h>#include <serf.h>#include "svn_pools.h"#include "svn_ra.h"#include "svn_dav.h"#include "svn_xml.h"#include "../libsvn_ra/ra_loader.h"#include "svn_config.h"#include "svn_delta.h"#include "svn_version.h"#include "svn_path.h"#include "svn_private_config.h"#include "ra_serf.h"/* * This enum represents the current state of our XML parsing for an OPTIONS. */typedef enum {  OPTIONS,  ACTIVITY_COLLECTION,  HREF,} options_state_e;typedef struct options_state_list_t {  /* The current state that we are in now. */  options_state_e state;  /* The previous state we were in. */  struct options_state_list_t *prev;} options_state_list_t;struct svn_ra_serf__options_context_t {  /* pool to allocate memory from */  apr_pool_t *pool;  const char *attr_val;  apr_size_t attr_val_len;  svn_boolean_t collect_cdata;  /* Current state we're in */  options_state_list_t *state;  options_state_list_t *free_state;  /* Return error code */  svn_error_t *error;  /* are we done? */  svn_boolean_t done;  svn_ra_serf__session_t *session;  svn_ra_serf__connection_t *conn;  const char *path;  const char *activity_collection;  serf_response_acceptor_t acceptor;  serf_response_handler_t handler;};static voidpush_state(svn_ra_serf__options_context_t *options_ctx, options_state_e state){  options_state_list_t *new_state;  if (!options_ctx->free_state)    {      new_state = apr_palloc(options_ctx->pool, sizeof(*options_ctx->state));    }  else    {      new_state = options_ctx->free_state;      options_ctx->free_state = options_ctx->free_state->prev;    }  new_state->state = state;  /* Add it to the state chain. */  new_state->prev = options_ctx->state;  options_ctx->state = new_state;}static void pop_state(svn_ra_serf__options_context_t *options_ctx){  options_state_list_t *free_state;  free_state = options_ctx->state;  /* advance the current state */  options_ctx->state = options_ctx->state->prev;  free_state->prev = options_ctx->free_state;  options_ctx->free_state = free_state;}static svn_error_t *start_options(svn_ra_serf__xml_parser_t *parser,              void *userData,              svn_ra_serf__dav_props_t name,              const char **attrs){  svn_ra_serf__options_context_t *options_ctx = userData;  if (!options_ctx->state && strcmp(name.name, "options-response") == 0)    {      push_state(options_ctx, OPTIONS);    }  else if (!options_ctx->state)    {      /* Nothing to do. */      return SVN_NO_ERROR;    }  else if (options_ctx->state->state == OPTIONS &&           strcmp(name.name, "activity-collection-set") == 0)    {      push_state(options_ctx, ACTIVITY_COLLECTION);    }  else if (options_ctx->state->state == ACTIVITY_COLLECTION &&           strcmp(name.name, "href") == 0)    {      options_ctx->collect_cdata = TRUE;      push_state(options_ctx, HREF);    }  return SVN_NO_ERROR;}static svn_error_t *end_options(svn_ra_serf__xml_parser_t *parser,            void *userData,            svn_ra_serf__dav_props_t name){  svn_ra_serf__options_context_t *options_ctx = userData;  options_state_list_t *cur_state;  if (!options_ctx->state)    {      return SVN_NO_ERROR;    }  cur_state = options_ctx->state;  if (cur_state->state == OPTIONS &&      strcmp(name.name, "options-response") == 0)    {      pop_state(options_ctx);    }  else if (cur_state->state == ACTIVITY_COLLECTION &&           strcmp(name.name, "activity-collection-set") == 0)    {      pop_state(options_ctx);    }  else if (cur_state->state == HREF &&           strcmp(name.name, "href") == 0)    {      options_ctx->collect_cdata = FALSE;      options_ctx->activity_collection = options_ctx->attr_val;      pop_state(options_ctx);    }  return SVN_NO_ERROR;}static svn_error_t *cdata_options(svn_ra_serf__xml_parser_t *parser,              void *userData,              const char *data,              apr_size_t len){  svn_ra_serf__options_context_t *ctx = userData;  if (ctx->collect_cdata == TRUE)    {      svn_ra_serf__expand_string(&ctx->attr_val, &ctx->attr_val_len,                    data, len, ctx->pool);    }  return SVN_NO_ERROR;}#define OPTIONS_BODY "<?xml version=\"1.0\" encoding=\"utf-8\"?><D:options xmlns:D=\"DAV:\"><D:activity-collection-set/></D:options>"static serf_bucket_t*create_options_body(void *baton,                    serf_bucket_alloc_t *alloc,                    apr_pool_t *pool){  return SERF_BUCKET_SIMPLE_STRING_LEN(OPTIONS_BODY,                                       sizeof(OPTIONS_BODY) - 1, alloc);}svn_boolean_t*svn_ra_serf__get_options_done_ptr(svn_ra_serf__options_context_t *ctx){  return &ctx->done;}const char *svn_ra_serf__options_get_activity_collection(svn_ra_serf__options_context_t *ctx){  return ctx->activity_collection;}svn_error_t *svn_ra_serf__create_options_req(svn_ra_serf__options_context_t **opt_ctx,                                svn_ra_serf__session_t *session,                                svn_ra_serf__connection_t *conn,                                const char *path,                                apr_pool_t *pool){  svn_ra_serf__options_context_t *new_ctx;  svn_ra_serf__handler_t *handler;  svn_ra_serf__xml_parser_t *parser_ctx;  new_ctx = apr_pcalloc(pool, sizeof(*new_ctx));  new_ctx->pool = pool;  new_ctx->path = path;  new_ctx->session = session;  new_ctx->conn = conn;  handler = apr_pcalloc(pool, sizeof(*handler));  handler->method = "OPTIONS";  handler->path = path;  handler->body_delegate = create_options_body;  handler->body_type = "text/xml";  handler->conn = conn;  handler->session = session;  parser_ctx = apr_pcalloc(pool, sizeof(*parser_ctx));  parser_ctx->pool = pool;  parser_ctx->user_data = new_ctx;  parser_ctx->start = start_options;  parser_ctx->end = end_options;  parser_ctx->cdata = cdata_options;  parser_ctx->done = &new_ctx->done;  handler->response_handler = svn_ra_serf__handle_xml_parser;  handler->response_baton = parser_ctx;  svn_ra_serf__request_create(handler);  *opt_ctx = new_ctx;  return SVN_NO_ERROR;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -