[CalendarServer-changes] [154] PyOpenDirectory/branches/generalized-api-56

source_changes at macosforge.org source_changes at macosforge.org
Tue Sep 19 12:12:27 PDT 2006


Revision: 154
Author:   dreid at apple.com
Date:     2006-09-19 12:12:25 -0700 (Tue, 19 Sep 2006)

Log Message:
-----------
New pyrexed interface, so far we can open the query the directory service for a list of nodes, and get specific noes, and open and close those nodes

Added Paths:
-----------
    PyOpenDirectory/branches/generalized-api-56/src/
    PyOpenDirectory/branches/generalized-api-56/src/DirectoryNode.pyx
    PyOpenDirectory/branches/generalized-api-56/src/DirectoryService.pyx
    PyOpenDirectory/branches/generalized-api-56/support/
    PyOpenDirectory/branches/generalized-api-56/support/PyOpenDirectory.pbx

Removed Paths:
-------------
    PyOpenDirectory/branches/generalized-api-56/src/
    PyOpenDirectory/branches/generalized-api-56/support/

Added: PyOpenDirectory/branches/generalized-api-56/src/DirectoryNode.pyx
===================================================================
--- PyOpenDirectory/branches/generalized-api-56/src/DirectoryNode.pyx	                        (rev 0)
+++ PyOpenDirectory/branches/generalized-api-56/src/DirectoryNode.pyx	2006-09-19 19:12:25 UTC (rev 154)
@@ -0,0 +1,58 @@
+cdef extern from "DirectoryService/DirectoryService.h":
+
+    ctypedef unsigned long tDirNodeReference
+
+    tDirStatus dsOpenDirNode(tDirReference inDirReference,
+                             tDataListPtr inDataList,
+                             tDirNodeReference *outDirNodeReference)
+
+    tDirStatus dsCloseDirNode(tDirNodeReference inDirNodeReference)
+
+
+cdef nodeFromName(tDirReference directory,
+                  tDataListPtr nodeName):
+    """Make a new Node from the given nodeName (we have to use this
+    because PyRex doesn't support passing pointers to methods)
+    """
+
+    return DirectoryNode(directory,
+                         <unsigned long>nodeName)
+
+
+cdef class DirectoryNode:
+    cdef tDirReference directory
+    cdef tDirNodeReference node
+    cdef tDataListPtr nodeName
+    cdef char * pPath
+
+    def __new__(object self,
+                tDirReference directory,
+                unsigned long nodeName):
+
+        self.directory = directory
+        self.nodeName = <tDataListPtr>nodeName
+
+    def open(self):
+        raiseOnError(dsOpenDirNode(self.directory,
+                                   self.nodeName, 
+                                   &self.node))
+
+    def close(self):
+        if self.node != 0:
+            raiseOnError(dsCloseDirNode(self.node))
+            self.node = 0
+
+    def getPath(self):
+        if self.pPath == NULL:
+            self.pPath = dsGetPathFromList(self.directory,
+                                           <tDataListPtr *>self.nodeName,
+                                           "/")
+
+        return str(self.pPath)
+
+    def __repr__(self):
+        return "<DirectoryNode: %s>" % (self.getPath())
+
+    def __dealloc__(self):
+        self.close()
+        raiseOnError(dsDataListDeallocate(self.directory, self.nodeName))

Added: PyOpenDirectory/branches/generalized-api-56/src/DirectoryService.pyx
===================================================================
--- PyOpenDirectory/branches/generalized-api-56/src/DirectoryService.pyx	                        (rev 0)
+++ PyOpenDirectory/branches/generalized-api-56/src/DirectoryService.pyx	2006-09-19 19:12:25 UTC (rev 154)
@@ -0,0 +1,149 @@
+cdef extern from "DirectoryService/DirectoryService.h":    
+    ctypedef enum tDirStatus:
+        eDSNoErr = 0
+        eDSNodeNotFound = -14008
+
+    ctypedef unsigned long tDirReference
+
+    ctypedef void * tClientData
+    ctypedef void * tBuffer
+    ctypedef void * tContextData
+    ctypedef void * tDataBufferPtr
+    ctypedef void * tDataListPtr    
+
+    tDirStatus dsOpenDirService(tDirReference *outDirReference)
+
+    tDirStatus dsCloseDirService(tDirReference inDirReference)
+
+    tDirStatus dsGetDirNodeCount(tDirReference inDirReference,
+                                 unsigned long *outNodeCount)
+
+    tDirStatus dsGetDirNodeName(tDirReference inDirReference,
+                                tDataBufferPtr inOutDataBufferPtr,
+                                unsigned long inDirNodeIndex,
+                                tDataListPtr *inOutDataList)
+
+    tDirStatus dsGetDirNodeList(tDirReference inDirReference,
+                                tDataBufferPtr inOutDataBufferPtr,
+                                unsigned long *outDirNodeCount,
+                                tContextData *inOutCountinueData)
+
+    tDataBufferPtr dsDataBufferAllocate(tDirReference inDirReference,
+                                        unsigned long inBufferSize)
+
+    char *dsGetPathFromList(tDirReference inDirReference,
+                                 tDataListPtr *inDataList,
+                                 char *inDelimiter)
+
+    tDirStatus dsDataBufferDeAllocate(tDirReference inDirReference,
+                                      tDataBufferPtr inDataBufferPtr)
+
+    tDirStatus dsReleaseContinueData(tDirReference inDirReference,
+                                     tContextData inContinueData)
+
+    tDataListPtr dsDataListAllocate(tDirReference inDirReference)
+
+    tDirStatus dsDataListDeallocate(tDirReference inDirReference,
+                                    tDataListPtr inDataList)
+
+    tDirStatus dsBuildListFromPathAlloc(tDirReference inDirReference,
+                                        tDataListPtr inDataList,
+                                        char *inPathCString,
+                                        char *inPathSeparatorCString)
+
+
+# DirectoryNode definitions
+include "DirectoryNode.pyx"
+
+class DirectoryServicesError(Exception):
+    def __init__(self, errno):
+        self.errno = errno
+
+    def __repr__(self):
+        return "<DirectoryServicesError: %d>" % (self.errno,)
+
+
+def raiseOnError(dirStatus):
+    if dirStatus != eDSNoErr:
+        print "Oh no:", dirStatus
+        raise DirectoryServicesError(dirStatus)
+
+        
+cdef class DirectoryService:
+    cdef tDirReference gDirRef
+
+    def __new__(self):
+        raiseOnError(dsOpenDirService(&self.gDirRef))
+
+    def __dealloc__(self):
+        raiseOnError(dsCloseDirService(self.gDirRef))
+
+    def getNodeCount(self):
+        cdef unsigned long nodeCount
+        nodeCount = 0
+
+        raiseOnError(dsGetDirNodeCount(self.gDirRef, &nodeCount))
+
+        return nodeCount
+
+    def getNodeList(self):
+        cdef tDataBufferPtr dataBuffer
+        dataBuffer = NULL
+
+        done = False
+
+        cdef tDirStatus dirStatus
+        dirStatus = eDSNoErr
+
+        cdef unsigned long bufferCount
+        bufferCount = 0
+
+        cdef tContextData context
+        context = NULL
+        
+        cdef tDataListPtr nodeName
+        nodeName = NULL
+
+        cdef unsigned long index
+
+        dataBuffer = dsDataBufferAllocate(self.gDirRef, 32 * 1024)
+
+        nodes = []
+        try:
+            if dataBuffer != NULL:
+                while done == False:
+                    raiseOnError(
+                        dsGetDirNodeList(self.gDirRef, dataBuffer, 
+                                         &bufferCount, &context))
+
+                    for index from 1 <= index < bufferCount:
+                        raiseOnError(
+                            dsGetDirNodeName(self.gDirRef,
+                                             dataBuffer,
+                                             index,
+                                             &nodeName))
+
+                        nodes.append(nodeFromName(self.gDirRef, nodeName))
+                        
+                    done = (context == NULL)
+        finally:
+            if context != NULL:
+                raiseOnError(
+                    dsReleaseContinueData(self.gDirRef, context))
+
+            raiseOnError(dsDataBufferDeAllocate(self.gDirRef, dataBuffer))
+
+            dataBuffer = NULL
+
+        return nodes
+
+    def getNode(object self, char * nodePath):
+        cdef tDataListPtr nodeName
+
+        nodeName = dsDataListAllocate(self.gDirRef)
+        raiseOnError(dsBuildListFromPathAlloc(self.gDirRef,
+                                              nodeName,
+                                              <char *>nodePath,
+                                              <char *>"/"))
+
+        return nodeFromName(self.gDirRef, nodeName)

Added: PyOpenDirectory/branches/generalized-api-56/support/PyOpenDirectory.pbx
===================================================================
--- PyOpenDirectory/branches/generalized-api-56/support/PyOpenDirectory.pbx	                        (rev 0)
+++ PyOpenDirectory/branches/generalized-api-56/support/PyOpenDirectory.pbx	2006-09-19 19:12:25 UTC (rev 154)
@@ -0,0 +1 @@
+self.localPrefs = {'files': [[u'/private/Network/Servers/harris/Volumes/veedu/dreid/DirectoryService.pyx', u'-I/Library/Frameworks/Python.framework/Versions/2.4/include/python2.4/']], 'path': u'/private/Network/Servers/harris/Volumes/veedu/dreid/PyOpenDirectory.pbx', 'flags': u'', 'name': u'PyOpenDirectory', 'frameworks': [u'DirectoryService', u'Python']}
\ No newline at end of file

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20060919/3239fabb/attachment.html


More information about the calendarserver-changes mailing list