return conf->d_params;
}
-const dav_hooks_locks *dav_get_lock_hooks(request_rec *r)
+static const dav_provider * dav_get_provider(request_rec *r)
{
- void *data;
- const dav_hooks_locks *hooks;
+ dav_dir_conf *conf;
- (void) apr_get_userdata(&data, DAV_KEY_LOCK_HOOKS, r->pool);
- if (data == NULL) {
- hooks = ap_run_get_lock_hooks(r);
- (void) apr_set_userdata(hooks, DAV_KEY_LOCK_HOOKS, apr_null_cleanup,
- r->pool);
- }
- else
- hooks = data;
- return hooks;
+ conf = ap_get_module_config(r->per_dir_config, &dav_module);
+ /* assert: conf->provider != NULL
+ (otherwise, DAV is disabled, and we wouldn't be here */
+
+ /* ### assert that we find it? (return value != NULL) */
+ return dav_lookup_provider(conf->provider);
}
-const dav_hooks_propdb *dav_get_propdb_hooks(request_rec *r)
+const dav_hooks_locks *dav_get_lock_hooks(request_rec *r)
{
- void *data;
- const dav_hooks_db *hooks;
+ return dav_get_provider(r)->locks;
+}
- (void) apr_get_userdata(&data, DAV_KEY_PROPDB_HOOKS, r->pool);
- if (data == NULL) {
- hooks = ap_run_get_propdb_hooks(r);
- (void) apr_set_userdata(hooks, DAV_KEY_PROPDB_HOOKS, apr_null_cleanup,
- r->pool);
- }
- else
- hooks = data;
- return hooks;
+const dav_hooks_propdb *dav_get_propdb_hooks(request_rec *r)
+{
+ return dav_get_provider(r)->propdb;
}
const dav_hooks_vsn *dav_get_vsn_hooks(request_rec *r)
{
- void *data;
- const dav_hooks_vsn *hooks;
-
- (void) apr_get_userdata(&data, DAV_KEY_VSN_HOOKS, r->pool);
- if (data == NULL) {
- hooks = ap_run_get_vsn_hooks(r);
- (void) apr_set_userdata(hooks, DAV_KEY_VSN_HOOKS, apr_null_cleanup,
- r->pool);
- }
- else
- hooks = data;
- return hooks;
+ return dav_get_provider(r)->vsn;
}
/*
else {
conf->provider = apr_pstrdup(cmd->pool, arg1);
}
+ if (conf->provider != NULL
+ && dav_lookup_provider(conf->provider) == NULL) {
+
+ /* by the time they use it, the provider should be loaded and
+ registered with us. */
+ return apr_psprintf(cmd->pool,
+ "Unknown DAV provider: %s", conf->provider);
+ }
return NULL;
}
{
void *data;
dav_dir_conf *conf;
- const dav_hooks_repository *repos_hooks;
+ const dav_provider *provider;
const char *workspace = NULL;
const char *target_selector = NULL;
int is_label = 0;
conf = ap_get_module_config(r->per_dir_config, &dav_module);
- /* assert: provider != NULL */
- repos_hooks = dav_lookup_repository(conf->provider);
+ /* assert: conf->provider != NULL */
+ provider = dav_lookup_provider(conf->provider);
/* get any workspace header */
if ((result = dav_get_workspace(r, &workspace)) != OK)
}
/* resolve the resource */
- *res_p = (*repos_hooks->get_resource)(r, conf->dir, workspace,
- target_selector, is_label);
+ *res_p = (*provider->repos->get_resource)(r, conf->dir, workspace,
+ target_selector, is_label);
if (*res_p == NULL) {
/* Apache will supply a default error for this. */
return HTTP_NOT_FOUND;
};
AP_HOOK_STRUCT(
- AP_HOOK_LINK(get_lock_hooks)
- AP_HOOK_LINK(get_propdb_hooks)
- AP_HOOK_LINK(get_vsn_hooks)
AP_HOOK_LINK(gather_propsets)
AP_HOOK_LINK(find_liveprop)
AP_HOOK_LINK(insert_all_liveprops)
)
-AP_IMPLEMENT_HOOK_RUN_FIRST(const dav_hooks_locks *, get_lock_hooks,
- (request_rec *r), (r), NULL);
-AP_IMPLEMENT_HOOK_RUN_FIRST(const dav_hooks_db *, get_propdb_hooks,
- (request_rec *r), (r), NULL);
-AP_IMPLEMENT_HOOK_RUN_FIRST(const dav_hooks_vsn *, get_vsn_hooks,
- (request_rec *r), (r), NULL);
AP_IMPLEMENT_HOOK_VOID(gather_propsets, (apr_array_header_t *uris), (uris))
AP_IMPLEMENT_HOOK_RUN_FIRST(int, find_liveprop,
(request_rec *r,
/* ### docco ... */
-AP_DECLARE_HOOK(const dav_hooks_locks *, get_lock_hooks, (request_rec *r))
-AP_DECLARE_HOOK(const dav_hooks_propdb *, get_propdb_hooks, (request_rec *r))
-AP_DECLARE_HOOK(const dav_hooks_vsn *, get_vsn_hooks, (request_rec *r))
+/*
+** 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. There are too many
+** dependencies between a dav_resource (defined by <repos>) and the other
+** functionality.
+*/
+typedef struct {
+ const dav_hooks_repository *repos;
+ const dav_hooks_propdb *propdb;
+ const dav_hooks_locks *locks;
+ const dav_hooks_liveprop *liveprop;
+ const dav_hooks_vsn *vsn;
+
+} dav_provider;
AP_DECLARE_HOOK(void, gather_propsets, (apr_array_header_t *uris))
AP_DECLARE_HOOK(int, find_liveprop, (request_rec *r,
int insvalue,
ap_text_header *phdr))
+/* ### make this internal to mod_dav.c ? */
#define DAV_KEY_RESOURCE "dav-resource"
-#define DAV_KEY_LOCK_HOOKS "dav-lock-hooks"
-#define DAV_KEY_PROPDB_HOOKS "dav-propdb-hooks"
-#define DAV_KEY_VSN_HOOKS "dav-vsn-hooks"
const dav_hooks_locks *dav_get_lock_hooks(request_rec *r);
const dav_hooks_propdb *dav_get_propdb_hooks(request_rec *r);
const dav_hooks_vsn *dav_get_vsn_hooks(request_rec *r);
-void dav_register_repository(apr_pool_t *p, const char *name,
- const dav_hooks_repository *hooks);
-const dav_hooks_repository * dav_lookup_repository(const char *name);
+void dav_register_provider(apr_pool_t *p, const char *name,
+ const dav_provider *hooks);
+const dav_provider * dav_lookup_provider(const char *name);
void dav_register_liveprop_namespace(apr_pool_t *pool, const char *uri);
int dav_get_liveprop_ns_index(const char *uri);
return APR_SUCCESS;
}
-void dav_register_repository(apr_pool_t *p, const char *name,
- const dav_hooks_repository *hooks)
+void dav_register_provider(apr_pool_t *p, const char *name,
+ const dav_provider *provider)
{
/* ### ignore the pool; it is NULL right now */
p = ap_global_hook_pool;
}
/* just set it. no biggy if it was there before. */
- apr_hash_set(dav_repos_providers, name, 0, hooks);
+ apr_hash_set(dav_repos_providers, name, 0, provider);
}
-const dav_hooks_repository * dav_lookup_repository(const char *name)
+const dav_provider * dav_lookup_provider(const char *name)
{
return apr_hash_get(dav_repos_providers, name, 0);
}