📄 mod_dav.h
字号:
* versioned == 1 when baselined == 1 */ int working; /* 0 => not checked out; can be 1 for * REGULAR and WORKSPACE resources, * and is always 1 for WORKING */ const char *uri; /* the URI for this resource */ dav_resource_private *info; /* the provider's private info */ const dav_hooks_repository *hooks; /* hooks used for this resource */ /* When allocating items related specifically to this resource, the following pool should be used. Its lifetime will be at least as long as the dav_resource structure. */ apr_pool_t *pool;} dav_resource;/*** Lock token type. Lock providers define the details of a lock token.** However, all providers are expected to at least be able to parse** the "opaquelocktoken" scheme, which is represented by a uuid_t.*/typedef struct dav_locktoken dav_locktoken;/* --------------------------------------------------------------------**** BUFFER HANDLING**** These buffers are used as a lightweight buffer reuse mechanism. Apache** provides sub-pool creation and destruction to much the same effect, but** the sub-pools are a bit more general and heavyweight than these buffers.*//* buffer for reuse; can grow to accomodate needed size */typedef struct{ apr_size_t alloc_len; /* how much has been allocated */ apr_size_t cur_len; /* how much is currently being used */ char *buf; /* buffer contents */} dav_buffer;#define DAV_BUFFER_MINSIZE 256 /* minimum size for buffer */#define DAV_BUFFER_PAD 64 /* amount of pad when growing *//* set the cur_len to the given size and ensure space is available */DAV_DECLARE(void) dav_set_bufsize(apr_pool_t *p, dav_buffer *pbuf, apr_size_t size);/* initialize a buffer and copy the specified (null-term'd) string into it */DAV_DECLARE(void) dav_buffer_init(apr_pool_t *p, dav_buffer *pbuf, const char *str);/* check that the buffer can accomodate <extra_needed> more bytes */DAV_DECLARE(void) dav_check_bufsize(apr_pool_t *p, dav_buffer *pbuf, apr_size_t extra_needed);/* append a string to the end of the buffer, adjust length */DAV_DECLARE(void) dav_buffer_append(apr_pool_t *p, dav_buffer *pbuf, const char *str);/* place a string on the end of the buffer, do NOT adjust length */DAV_DECLARE(void) dav_buffer_place(apr_pool_t *p, dav_buffer *pbuf, const char *str);/* place some memory on the end of a buffer; do NOT adjust length */DAV_DECLARE(void) dav_buffer_place_mem(apr_pool_t *p, dav_buffer *pbuf, const void *mem, apr_size_t amt, apr_size_t pad);/* --------------------------------------------------------------------**** HANDY UTILITIES*//* contains results from one of the getprop functions */typedef struct{ apr_text * propstats; /* <propstat> element text */ apr_text * xmlns; /* namespace decls for <response> elem */} dav_get_props_result;/* holds the contents of a <response> element */typedef struct dav_response{ const char *href; /* always */ const char *desc; /* optional description at <response> level */ /* use status if propresult.propstats is NULL. */ dav_get_props_result propresult; int status; struct dav_response *next;} dav_response;typedef struct{ request_rec *rnew; /* new subrequest */ dav_error err; /* potential error response */} dav_lookup_result;DAV_DECLARE(dav_lookup_result) dav_lookup_uri(const char *uri, request_rec *r, int must_be_absolute);/* defines type of property info a provider is to return */typedef enum { DAV_PROP_INSERT_NOTDEF, /* property is defined by this provider, but nothing was inserted because the (live) property is not defined for this resource (it may be present as a dead property). */ DAV_PROP_INSERT_NOTSUPP, /* property is recognized by this provider, but it is not supported, and cannot be treated as a dead property */ DAV_PROP_INSERT_NAME, /* a property name (empty elem) was inserted into the text block */ DAV_PROP_INSERT_VALUE, /* a property name/value pair was inserted into the text block */ DAV_PROP_INSERT_SUPPORTED /* a supported live property was added to the text block as a <DAV:supported-live-property> element */} dav_prop_insert;/* ### this stuff is private to dav/fs/repos.c; move it... *//* format a time string (buf must be at least DAV_TIMEBUF_SIZE chars) */#define DAV_STYLE_ISO8601 1#define DAV_STYLE_RFC822 2#define DAV_TIMEBUF_SIZE 30DAV_DECLARE(int) dav_get_depth(request_rec *r, int def_depth);DAV_DECLARE(int) dav_validate_root(const apr_xml_doc *doc, const char *tagname);DAV_DECLARE(apr_xml_elem *) dav_find_child(const apr_xml_elem *elem, const char *tagname);/* gather up all the CDATA into a single string */DAV_DECLARE(const char *) dav_xml_get_cdata(const apr_xml_elem *elem, apr_pool_t *pool, int strip_white);/*** XML namespace handling**** This structure tracks namespace declarations (xmlns:prefix="URI").** It maintains a one-to-many relationship of URIs-to-prefixes. In other** words, one URI may be defined by many prefixes, but any specific** prefix will specify only one URI.**** Prefixes using the "g###" pattern can be generated automatically if** the caller does not have specific prefix requirements.*/typedef struct { apr_pool_t *pool; apr_hash_t *uri_prefix; /* map URIs to an available prefix */ apr_hash_t *prefix_uri; /* map all prefixes to their URIs */ int count; /* counter for "g###" prefixes */} dav_xmlns_info;/* create an empty dav_xmlns_info structure */DAV_DECLARE(dav_xmlns_info *) dav_xmlns_create(apr_pool_t *pool);/* add a specific prefix/URI pair. the prefix/uri should have a lifetime at least that of xmlns->pool */DAV_DECLARE(void) dav_xmlns_add(dav_xmlns_info *xi, const char *prefix, const char *uri);/* add a URI (if not present); any prefix is acceptable and is returned. the uri should have a lifetime at least that xmlns->pool */DAV_DECLARE(const char *) dav_xmlns_add_uri(dav_xmlns_info *xi, const char *uri);/* return the URI for a specified prefix (or NULL if the prefix is unknown) */DAV_DECLARE(const char *) dav_xmlns_get_uri(dav_xmlns_info *xi, const char *prefix);/* return an available prefix for a specified URI (or NULL if the URI is unknown) */DAV_DECLARE(const char *) dav_xmlns_get_prefix(dav_xmlns_info *xi, const char *uri);/* generate xmlns declarations (appending into the given text) */DAV_DECLARE(void) dav_xmlns_generate(dav_xmlns_info *xi, apr_text_header *phdr);/* --------------------------------------------------------------------**** DAV PLUGINS*//* ### docco ... *//*** dav_provider**** This structure wraps up all of the hooks that a mod_dav provider can** supply. The provider MUST supply <repos> and <propdb>. The rest are** optional and should contain NULL if that feature is not supplied.**** Note that a provider cannot pick and choose portions from various** underlying implementations (which was theoretically possible in** mod_dav 1.0). There are too many dependencies between a dav_resource** (defined by <repos>) and the other functionality.**** Live properties are not part of the dav_provider structure because they** are handled through the APR_HOOK interface (to allow for multiple liveprop** providers). The core always provides some properties, and then a given** provider will add more properties.**** Some providers may need to associate a context with the dav_provider** structure -- the ctx field is available for storing this context. Just** leave it NULL if it isn't required.*/typedef struct { const dav_hooks_repository *repos; const dav_hooks_propdb *propdb; const dav_hooks_locks *locks; const dav_hooks_vsn *vsn; const dav_hooks_binding *binding; const dav_hooks_search *search; void *ctx;} dav_provider;/*** gather_propsets: gather all live property propset-URIs**** The hook implementor should push one or more URIs into the specified** array. These URIs are returned in the DAV: header to let clients know** what sets of live properties are supported by the installation. mod_dav** will place open/close angle brackets around each value (much like** a Coded-URL); quotes and brackets should not be in the value.**** Example: http://apache.org/dav/props/**** (of course, use your own domain to ensure a unique value)*/APR_DECLARE_EXTERNAL_HOOK(dav, DAV, void, gather_propsets, (apr_array_header_t *uris))/*** find_liveprop: find a live property, returning a non-zero, unique,** opaque identifier.**** If the hook implementor determines the specified URI/name refers to** one of its properties, then it should fill in HOOKS and return a** non-zero value. The returned value is the "property ID" and will** be passed to the various liveprop hook functions.**** Return 0 if the property is not defined by the hook implementor.*/APR_DECLARE_EXTERNAL_HOOK(dav, DAV, int, find_liveprop, (const dav_resource *resource, const char *ns_uri, const char *name, const dav_hooks_liveprop **hooks))/*** insert_all_liveprops: insert all (known) live property names/values.**** The hook implementor should append XML text to PHDR, containing liveprop** names. If INSVALUE is true, then the property values should also be** inserted into the output XML stream.**** The liveprop provider should insert *all* known and *defined* live** properties on the specified resource. If a particular liveprop is** not defined for this resource, then it should not be inserted.*/APR_DECLARE_EXTERNAL_HOOK(dav, DAV, void, insert_all_liveprops, (request_rec *r, const dav_resource *resource, dav_prop_insert what, apr_text_header *phdr))DAV_DECLARE(const dav_hooks_locks *) dav_get_lock_hooks(request_rec *r);DAV_DECLARE(const dav_hooks_propdb *) dav_get_propdb_hooks(request_rec *r);DAV_DECLARE(const dav_hooks_vsn *) dav_get_vsn_hooks(request_rec *r);DAV_DECLARE(const dav_hooks_binding *) dav_get_binding_hooks(request_rec *r);DAV_DECLARE(const dav_hooks_search *) dav_get_search_hooks(request_rec *r);DAV_DECLARE(void) dav_register_provider(apr_pool_t *p, const char *name, const dav_provider *hooks);DAV_DECLARE(const dav_provider *) dav_lookup_provider(const char *name);/* ### deprecated */#define DAV_GET_HOOKS_PROPDB(r) dav_get_propdb_hooks(r)#define DAV_GET_HOOKS_LOCKS(r) dav_get_lock_hooks(r)#define DAV_GET_HOOKS_VSN(r) dav_get_vsn_hooks(r)#define DAV_GET_HOOKS_BINDING(r) dav_get_binding_hooks(r)#define DAV_GET_HOOKS_SEARCH(r) dav_get_search_hooks(r)/* --------------------------------------------------------------------**** IF HEADER PROCESSING**** Here is the definition of the If: header from RFC 2518, S9.4:**** If = "If" ":" (1*No-tag-list | 1*Tagged-list)** No-tag-list = List** Tagged-list = Resource 1*List** Resource = Coded-URL** List = "(" 1*(["Not"](State-token | "[" entity-tag "]")) ")"** State-token = Coded-URL** Coded-URL = "<" absoluteURI ">" ; absoluteURI from RFC 2616**** List corresponds to dav_if_state_list. No-tag-list corresponds to** dav_if_header with uri==NULL. Tagged-list corresponds to a sequence of** dav_if_header structures with (duplicate) uri==Resource -- one** dav_if_header per state_list. A second Tagged-list will start a new** sequence of dav_if_header structures with the new URI.**** A summary of the semantics, mapped into our structures:** - Chained dav_if_headers: OR** - Chained dav_if_state_lists: AND** - NULL uri matches all resources*/typedef enum{ dav_if_etag, dav_if_opaquelock} dav_if_state_type;typedef struct dav_if_state_list{ dav_if_state_type type; int condition;#define DAV_IF_COND_NORMAL 0#define DAV_IF_COND_NOT 1 /* "Not" was applied */ const char *etag; dav_locktoken *locktoken; struct dav_if_state_list *next;} dav_if_state_list;typedef struct dav_if_header{ const char *uri; apr_size_t uri_len; struct dav_if_state_list *state; struct dav_if_header *next; int dummy_header; /* used internally by the lock/etag validation */} dav_if_header;typedef struct dav_locktoken_list { dav_locktoken *locktoken; struct dav_locktoken_list *next;} dav_locktoken_list;DAV_DECLARE(dav_error *) dav_get_locktoken_list(request_rec *r, dav_locktoken_list **ltl);/* --------------------------------------------------------------------**
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -