[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