NGObjWeb WebDAV Implementation for SoObjects ============================================ This subproject contains a WebDAV implementation for SOPE which is based on top of the SoObjectRequestHandler. The central point where processing starts once the request is received by the handler, is the SoObjectWebDAVDispatcher class. This class knows about the various WebDAV HTTP methods and takes appropriate actions by calling specified methods on either the SoObject which is targetted by the URL or on one of the maintenance objects. Eg WebDAV locking and notification is handled by the SoDAVLockManager SoSubscriptionManager classes, so the targetted object itself doesn't need to concern itself about that. Once a WebDAV action has been performed, the SoWebDAVRenderer class is used to turn the result value of the HTTP method in a suitable WebDAV XML representation. To support non basic XML properties there is also a helper class SoWebDAVValue PROPFIND/SEARCH Queries ======================= The payload of both, WebDAV PROPFIND and SEARCH methods are represented as a regular EOControl EOFetchSpecification. The fetchspec is annotated with various hints to add additional WebDAV information. This includes the required depth of the query as well as the properties being requested. In case a SEARCH query is decoded, a regular EOQualifier/EOSortOrdering is used for representing that query. To perform a query, the layer will call: - (id)performWebDAVQuery:(EOFetchSpecification *)_fetchSpecification inContext:(WOContext *)_context; on the target object. Note that there are default implementations for queries based on KVC (see below) A special feature is that an object can make the WebDAV layer "remap" the public WebDAV property names to internal names, for example KVC keys. To do so the object needs to implement - (NSDictionary *)davAttributeMapInContext:(WOContext *)_context; For example this can be used to map the "davDisplayName" to the "title" of a given object. Default Query Implementation ============================ The default implementation is done in the NSObject(SoDAVQuery) category which requires an NSObject conforming to the "So" model of doing things. A query is initiated by - (id)performWebDAVQuery:(EOFetchSpecification *)_fetchSpecification inContext:(WOContext *)_context; The method then splits the operation based on the depth into one of those methods for 'self'(0) or 'deep'(infinity) queries: - (id)davQueryOnSelf:(EOFetchSpecification *)_fs inContext:(WOContext *)_ctx; - (id)performWebDAVDeepQuery:((EOFetchSpecification *)_fs inContext:(WOContext *)_ctx; For 'flat'(1) queries it uses a datasource to fetch the content and the -davQueryOnSelf:inContext: method to retrieve info on the object itself (required by WebDAV, but buggy in some implementations, eg WebFolders). The datasource is determined by - (EODataSource *)contentDataSourceInContext:(WOContext *)_context; Per default this returns the SoObjectDataSource which performs KVC / EOControl based filtering and sorting. Besides those standard queries, the default implementations also deals with bulk queries as generated by either BPROPFIND or by the _range_ URI hack for ZideLook. Those will call - (id)performWebDAVBulkQuery:(EOFetchSpecification *)_fetchSpec inContext:(WOContext *)_context; Its discouraged to use bulk queries, since they are non-standard. In case no specific property names are requested ( or a propfind without a body), the toolkit is going to query the available property set using: - (NSArray *)defaultWebDAVPropertyNamesInContext:(WOContext *)_context; TODO: check for soClass slots Note that this is just the set used for allprop queries, you can still support more properties than that (not sure whether that would be valid WebDAV though). Special Features ================ The dispatcher supports various Exchange WebDAV enhancements, eg bulk queries like BPROPFIND. Further it supports so called "ZideStore range" queries which are treated similiar to BPROPFIND and catches URLs starting with _range. TODO ==== REPORT - find a good way to represent arbitary reports extended ops: ACL, CHECKOUT etc - check for default property names (allprop) in SoClass slots - add support for DAV:supportedlock property - add support for property level 404 status - currently we just deliver empty tags or none (if the brief header is set) - add Apache2 like typing namespaces on DAV:creationdate and DAV:getlastmodified Notes ===== DASL: ---snip--- /evo/dav/helge/Private.plist/ infinity Mueller ---snap--- SQL-search queries use instead of