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

📄 mod_dav.h

📁 最新apache的源代码
💻 H
📖 第 1 页 / 共 5 页
字号:
    **    ** ### WARNING: current providers will quote the text within ELEM.    ** ### this implies you can call this function only once with a given    ** ### element structure (a second time will quote it again).    */    dav_error * (*store)(dav_db *db, const dav_prop_name *name,                         const apr_xml_elem *elem,                         dav_namespace_map *mapping);    /* remove a given property */    dav_error * (*remove)(dav_db *db, const dav_prop_name *name);    /* returns 1 if the record specified by "key" exists; 0 otherwise */    int (*exists)(dav_db *db, const dav_prop_name *name);    /*    ** Iterate over the property names in the database.    **    ** iter->name.ns == iter->name.name == NULL when there are no more names.    **    ** Note: only one iteration may occur over the propdb at a time.    */    dav_error * (*first_name)(dav_db *db, dav_prop_name *pname);    dav_error * (*next_name)(dav_db *db, dav_prop_name *pname);    /*    ** Rollback support: get rollback context, and apply it.    **    ** struct dav_deadprop_rollback is a provider-private structure; it    ** should remember the name, and the name's old value (or the fact that    ** the value was not present, and should be deleted if a rollback occurs).    */    dav_error * (*get_rollback)(dav_db *db, const dav_prop_name *name,                                dav_deadprop_rollback **prollback);    dav_error * (*apply_rollback)(dav_db *db,                                  dav_deadprop_rollback *rollback);    /*    ** If a provider needs a context to associate with this hooks structure,    ** then this field may be used. In most cases, it will just be NULL.    */    void *ctx;};/* --------------------------------------------------------------------**** LOCK FUNCTIONS*//* Used to represent a Timeout header of "Infinity" */#define DAV_TIMEOUT_INFINITE 0DAV_DECLARE(time_t) dav_get_timeout(request_rec *r);/*** Opaque, provider-specific information for a lock database.*/typedef struct dav_lockdb_private dav_lockdb_private;/*** Opaque, provider-specific information for a lock record.*/typedef struct dav_lock_private dav_lock_private;/*** Lock database type. Lock providers are urged to implement a "lazy" open, so** doing an "open" is cheap until something is actually needed from the DB.*/typedef struct{    const dav_hooks_locks *hooks;   /* the hooks used for this lockdb */    int ro;                         /* was it opened readonly? */    dav_lockdb_private *info;} dav_lockdb;typedef enum {    DAV_LOCKSCOPE_UNKNOWN,    DAV_LOCKSCOPE_EXCLUSIVE,    DAV_LOCKSCOPE_SHARED} dav_lock_scope;typedef enum {    DAV_LOCKTYPE_UNKNOWN,    DAV_LOCKTYPE_WRITE} dav_lock_type;typedef enum {    DAV_LOCKREC_DIRECT,             /* lock asserted on this resource */    DAV_LOCKREC_INDIRECT,           /* lock inherited from a parent */    DAV_LOCKREC_INDIRECT_PARTIAL    /* most info is not filled in */} dav_lock_rectype;/*** dav_lock: hold information about a lock on a resource.**** This structure is used for both direct and indirect locks. A direct lock** is a lock applied to a specific resource by the client. An indirect lock** is one that is inherited from a parent resource by virtue of a non-zero** Depth: header when the lock was applied.**** mod_dav records both types of locks in the lock database, managing their** addition/removal as resources are moved about the namespace.**** Note that the lockdb is free to marshal this structure in any form that** it likes.**** For a "partial" lock, the <rectype> and <locktoken> fields must be filled** in. All other (user) fields should be zeroed. The lock provider will** usually fill in the <info> field, and the <next> field may be used to** construct a list of partial locks.**** The lock provider MUST use the info field to store a value such that a** dav_lock structure can locate itself in the underlying lock database.** This requirement is needed for refreshing: when an indirect dav_lock is** refreshed, its reference to the direct lock does not specify the direct's** resource, so the only way to locate the (refreshed, direct) lock in the** database is to use the info field.**** Note that <is_locknull> only refers to the resource where this lock was** found.** ### hrm. that says the abstraction is wrong. is_locknull may disappear.*/typedef struct dav_lock{    dav_lock_rectype rectype;   /* type of lock record */    int is_locknull;            /* lock establishes a locknull resource */    /* ### put the resource in here? */    dav_lock_scope scope;       /* scope of the lock */    dav_lock_type type;         /* type of lock */    int depth;                  /* depth of the lock */    time_t timeout;             /* when the lock will timeout */    const dav_locktoken *locktoken;  /* the token that was issued */    const char *owner;          /* (XML) owner of the lock */    const char *auth_user;      /* auth'd username owning lock */    dav_lock_private *info;     /* private to the lockdb */    struct dav_lock *next;      /* for managing a list of locks */} dav_lock;/* Property-related public lock functions */DAV_DECLARE(const char *)dav_lock_get_activelock(request_rec *r,                                                 dav_lock *locks,                                                 dav_buffer *pbuf);/* LockDB-related public lock functions */DAV_DECLARE(dav_error *) dav_lock_parse_lockinfo(request_rec *r,                                                 const dav_resource *resrouce,                                                 dav_lockdb *lockdb,                                                 const apr_xml_doc *doc,                                                 dav_lock **lock_request);DAV_DECLARE(int) dav_unlock(request_rec *r,                            const dav_resource *resource,                            const dav_locktoken *locktoken);DAV_DECLARE(dav_error *) dav_add_lock(request_rec *r,                                      const dav_resource *resource,                                      dav_lockdb *lockdb, dav_lock *request,                                      dav_response **response);DAV_DECLARE(dav_error *) dav_notify_created(request_rec *r,                                            dav_lockdb *lockdb,                                            const dav_resource *resource,                                            int resource_state,                                            int depth);DAV_DECLARE(dav_error*) dav_lock_query(dav_lockdb *lockdb,                                        const dav_resource *resource,                                       dav_lock **locks);DAV_DECLARE(dav_error *) dav_validate_request(request_rec *r,                                              dav_resource *resource,                                              int depth,                                              dav_locktoken *locktoken,                                              dav_response **response,                                              int flags,                                              dav_lockdb *lockdb);/*** flags:**    0x0F -- reserved for <dav_lock_scope> values****    other flags, detailed below*/#define DAV_VALIDATE_RESOURCE   0x0010  /* validate just the resource */#define DAV_VALIDATE_PARENT     0x0020  /* validate resource AND its parent */#define DAV_VALIDATE_ADD_LD     0x0040  /* add DAV:lockdiscovery into                                           the 424 DAV:response */#define DAV_VALIDATE_USE_424    0x0080  /* return 424 status, not 207 */#define DAV_VALIDATE_IS_PARENT  0x0100  /* for internal use *//* Lock-null related public lock functions */DAV_DECLARE(int) dav_get_resource_state(request_rec *r,                                        const dav_resource *resource);/* Lock provider hooks. Locking is optional, so there may be no * lock provider for a given repository. */struct dav_hooks_locks{    /* Return the supportedlock property for a resource */    const char * (*get_supportedlock)(        const dav_resource *resource    );    /* Parse a lock token URI, returning a lock token object allocated     * in the given pool.     */    dav_error * (*parse_locktoken)(        apr_pool_t *p,        const char *char_token,        dav_locktoken **locktoken_p    );    /* Format a lock token object into a URI string, allocated in     * the given pool.     *     * Always returns non-NULL.     */    const char * (*format_locktoken)(        apr_pool_t *p,        const dav_locktoken *locktoken    );    /* Compare two lock tokens.     *     * Result < 0  => lt1 < lt2     * Result == 0 => lt1 == lt2     * Result > 0  => lt1 > lt2     */    int (*compare_locktoken)(        const dav_locktoken *lt1,        const dav_locktoken *lt2    );    /* Open the provider's lock database.     *     * The provider may or may not use a "real" database for locks     * (a lock could be an attribute on a resource, for example).     *     * The provider may choose to use the value of the DAVLockDB directive     * (as returned by dav_get_lockdb_path()) to decide where to place     * any storage it may need.     *     * The request storage pool should be associated with the lockdb,     * so it can be used in subsequent operations.     *     * If ro != 0, only readonly operations will be performed.     * If force == 0, the open can be "lazy"; no subsequent locking operations     * may occur.     * If force != 0, locking operations will definitely occur.     */    dav_error * (*open_lockdb)(        request_rec *r,        int ro,        int force,        dav_lockdb **lockdb    );    /* Indicates completion of locking operations */    void (*close_lockdb)(        dav_lockdb *lockdb    );    /* Take a resource out of the lock-null state. */    dav_error * (*remove_locknull_state)(        dav_lockdb *lockdb,        const dav_resource *resource    );    /*    ** Create a (direct) lock structure for the given resource. A locktoken    ** will be created.    **    ** The lock provider may store private information into lock->info.    */    dav_error * (*create_lock)(dav_lockdb *lockdb,                               const dav_resource *resource,                               dav_lock **lock);    /*    ** Get the locks associated with the specified resource.    **    ** If resolve_locks is true (non-zero), then any indirect locks are    ** resolved to their actual, direct lock (i.e. the reference to followed    ** to the original lock).    **    ** The locks, if any, are returned as a linked list in no particular    ** order. If no locks are present, then *locks will be NULL.    */    dav_error * (*get_locks)(dav_lockdb *lockdb,                             const dav_resource *resource,                             int calltype,                             dav_lock **locks);#define DAV_GETLOCKS_RESOLVED   0    /* resolve indirects to directs */#define DAV_GETLOCKS_PARTIAL    1    /* leave indirects partially filled */#define DAV_GETLOCKS_COMPLETE   2    /* fill out indirect locks */    /*    ** Find a particular lock on a resource (specified by its locktoken).    **    ** *lock will be set to NULL if the lock is not found.    **    ** Note that the provider can optimize the unmarshalling -- only one    ** lock (or none) must be constructed and returned.    **    ** If partial_ok is true (non-zero), then an indirect lock can be    ** partially filled in. Otherwise, another lookup is done and the    ** lock structure will be filled out as a DAV_LOCKREC_INDIRECT.    */    dav_error * (*find_lock)(dav_lockdb *lockdb,                             const dav_resource *resource,                             const dav_locktoken *locktoken,                             int partial_ok,                             dav_lock **lock);    /*    ** Quick test to see if the resource has *any* locks on it.    **    ** This is typically used to determine if a non-existent resource    ** has a lock and is (therefore) a locknull resource.    **    ** WARNING: this function may return TRUE even when timed-out locks    **          exist (i.e. it may not perform timeout checks).    */    dav_error * (*has_locks)(dav_lockdb *lockdb,                             const dav_resource *resource,                             int *locks_present);    /*    ** Append the specified lock(s) to the set of locks on this resource.    **    ** If "make_indirect" is true (non-zero), then the specified lock(s)    ** should be converted to an indirect lock (if it is a direct lock)    ** before appending. Note that the conversion to an indirect lock does    ** not alter the passed-in lock -- the change is internal the    ** append_locks function.    **    ** Multiple locks are specified using the lock->next links.    */    dav_error * (*append_locks)(dav_lockdb *lockdb,                                const dav_resource *resource,                                int make_indirect,                                const dav_lock *lock);    /*    ** Remove any lock that has the specified locktoken.    **    ** If locktoken == NULL, then ALL locks are removed.    */    dav_error * (*remove_lock)(dav_lockdb *lockdb,                               const dav_resource *resource,                               const dav_locktoken *locktoken);    /*    ** Refresh all locks, found on the specified resource, which has a

⌨️ 快捷键说明

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