]> granicus.if.org Git - apache/commitdiff
clean up the provider stuff some more: don't allow pick-and-choose of
authorGreg Stein <gstein@apache.org>
Sat, 7 Oct 2000 01:29:39 +0000 (01:29 +0000)
committerGreg Stein <gstein@apache.org>
Sat, 7 Oct 2000 01:29:39 +0000 (01:29 +0000)
pieces, but just a complete provider. they aren't really separable anyways.

git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@86425 13f79535-47bb-0310-9956-ffa450edef68

modules/dav/fs/mod_dav_fs.c
modules/dav/fs/repos.c
modules/dav/main/mod_dav.c
modules/dav/main/mod_dav.h
modules/dav/main/providers.c

index 05be3bd70796a841f8dcb57e73ba3c512ab0a7b9..c5c0423a3cb00cde357e5143a4fab8ca8d015167 100644 (file)
@@ -121,9 +121,6 @@ static const command_rec dav_fs_cmds[] =
 
 static void register_hooks(void)
 {
-    ap_hook_get_lock_hooks(dav_fs_get_lock_hooks, NULL, NULL, AP_HOOK_MIDDLE);
-    ap_hook_get_propdb_hooks(dav_fs_get_propdb_hooks, NULL, NULL,
-                             AP_HOOK_MIDDLE);
     ap_hook_gather_propsets(dav_fs_gather_propsets, NULL, NULL,
                             AP_HOOK_MIDDLE);
     ap_hook_find_liveprop(dav_fs_find_liveprop, NULL, NULL, AP_HOOK_MIDDLE);
index 36cc1927c09f9aa7e1714c860af91d99518580cf..8b8606a441a24ae63b573b4ba7e78087060be8e9 100644 (file)
@@ -1999,16 +1999,14 @@ static const dav_hooks_liveprop dav_hooks_liveprop_fs =
     dav_fs_patch_rollback,
 };
 
-
-const dav_hooks_locks *dav_fs_get_lock_hooks(request_rec *r)
-{
-    return &dav_hooks_locks_fs;
-}
-
-const dav_hooks_propdb *dav_fs_get_propdb_hooks(request_rec *r)
+static const dav_provider dav_fs_provider =
 {
-    return &dav_hooks_db_dbm;
-}
+    &dav_hooks_repository_fs,
+    &dav_hooks_db_dbm,
+    &dav_hooks_locks_fs,
+    &dav_hooks_liveprop_fs,
+    NULL
+};
 
 void dav_fs_gather_propsets(apr_array_header_t *uris)
 {
@@ -2046,5 +2044,5 @@ void dav_fs_register(apr_pool_t *p)
     }
 
     /* register the repository provider */
-    dav_register_repository(p, "filesystem", &dav_hooks_repository_fs);
+    dav_register_provider(p, "filesystem", &dav_fs_provider);
 }
index 1dca6b246977b3815e822715928fdd98712d2f4a..7423659445d907e6a78d17838ae489ee556cda77 100644 (file)
@@ -216,52 +216,31 @@ apr_table_t *dav_get_dir_params(const request_rec *r)
     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;
 }
 
 /*
@@ -280,6 +259,14 @@ static const char *dav_cmd_dav(cmd_parms *cmd, void *config, const char *arg1)
     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;
 }
@@ -610,7 +597,7 @@ static int dav_get_resource(request_rec *r, int target_allowed,
 {
     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;
@@ -625,8 +612,8 @@ static int dav_get_resource(request_rec *r, int target_allowed,
 
     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)
@@ -641,8 +628,8 @@ static int dav_get_resource(request_rec *r, int target_allowed,
     }
 
     /* 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;
@@ -3269,19 +3256,10 @@ module MODULE_VAR_EXPORT dav_module =
 };
 
 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,
index 3836fc288bfb3ecd5f41c950a0daa398a4a92e9a..497565df7494f5d70b96c38f09fd03482b374344 100644 (file)
@@ -410,9 +410,25 @@ ap_xml_elem *dav_find_child(const ap_xml_elem *elem, const char *tagname);
 
 /* ### 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,
@@ -423,18 +439,16 @@ AP_DECLARE_HOOK(void, insert_all_liveprops, (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);
index 74173096411db0eb945d45f83c6c3e6f159c0a19..337fb71793163c39b94c9e7519ba54d1b7b6db15 100644 (file)
@@ -69,8 +69,8 @@ static apr_status_t dav_cleanup_providers(void *ctx)
     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;
@@ -81,10 +81,10 @@ void dav_register_repository(apr_pool_t *p, const char *name,
     }
 
     /* 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);
 }