[CalendarServer-changes] [3917] PyOpenDirectory/trunk

source_changes at macosforge.org source_changes at macosforge.org
Tue Mar 24 17:02:34 PDT 2009


Revision: 3917
          http://trac.macosforge.org/projects/calendarserver/changeset/3917
Author:   cdaboo at apple.com
Date:     2009-03-24 17:02:34 -0700 (Tue, 24 Mar 2009)
Log Message:
-----------
New API to retrieve attributes on a node. i.e. we can check which nodes are on /Search.

Modified Paths:
--------------
    PyOpenDirectory/trunk/pysrc/opendirectory.py
    PyOpenDirectory/trunk/src/CDirectoryService.cpp
    PyOpenDirectory/trunk/src/CDirectoryService.h
    PyOpenDirectory/trunk/src/PythonWrapper.cpp
    PyOpenDirectory/trunk/support/PyOpenDirectory.xcodeproj/cyrusdaboo.mode1v3
    PyOpenDirectory/trunk/support/PyOpenDirectory.xcodeproj/cyrusdaboo.pbxuser
    PyOpenDirectory/trunk/test.py

Modified: PyOpenDirectory/trunk/pysrc/opendirectory.py
===================================================================
--- PyOpenDirectory/trunk/pysrc/opendirectory.py	2009-03-24 20:13:00 UTC (rev 3916)
+++ PyOpenDirectory/trunk/pysrc/opendirectory.py	2009-03-25 00:02:34 UTC (rev 3917)
@@ -35,6 +35,18 @@
     @return: C{list} containing a C{str} for each configured node.
     """
     
+def getNodeAttributes(obj, nodename, attributes):
+    """
+    Return key attributes for the specified directory node. The attributes
+    can be a C{str} for the attribute name, or a C{tuple} or C{list} where the first C{str}
+    is the attribute name, and the second C{str} is an encoding type, either "str" or "base64".
+
+    @param obj: C{object} the object obtained from an odInit call.
+    @param nodename: C{str} containing the OD nodename to query.
+    @param attributes: C{list} or C{tuple} containing the attributes to return for each record.
+    @return: C{dict} of attributes found.
+    """
+
 def listAllRecordsWithAttributes(obj, recordType, attributes, count=0):
     """
     List records in Open Directory, and return key attributes for each one.

Modified: PyOpenDirectory/trunk/src/CDirectoryService.cpp
===================================================================
--- PyOpenDirectory/trunk/src/CDirectoryService.cpp	2009-03-24 20:13:00 UTC (rev 3916)
+++ PyOpenDirectory/trunk/src/CDirectoryService.cpp	2009-03-25 00:02:34 UTC (rev 3917)
@@ -101,6 +101,38 @@
     }
 }
 
+// GetNodeAttributes
+//
+// Return key attributes for the specified directory node.
+//
+// @param nodename: the node name to query.
+// @param attributes: CFArray of CFString listing the attributes to return for each record.
+// @return: CFMutableDictionaryRef composed of CFStringRef for each attribute found.
+//
+CFMutableDictionaryRef CDirectoryService::GetNodeAttributes(const char* nodename, CFDictionaryRef attributes, bool using_python)
+{
+    try
+    {
+        StPythonThreadState threading(using_python);
+		
+        // Get list
+        return _GetNodeAttributes(nodename, attributes);
+    }
+    catch(CDirectoryServiceException& dserror)
+    {
+		if (using_python)
+			dserror.SetPythonException();
+        return NULL;
+    }
+    catch(...)
+    {
+        CDirectoryServiceException dserror;
+		if (using_python)
+	        dserror.SetPythonException();
+        return NULL;
+    }
+}
+
 // ListAllRecordsWithAttributes
 //
 // Get specific attributes for one or more user records in the directory.
@@ -297,6 +329,167 @@
     return result;
 }
 
+// _GetNodeAttributes
+//
+// Return key attributes for the specified directory node.
+//
+// @param nodename: the node name to query.
+// @param attributes: CFArray of CFString listing the attributes to return for each record.
+// @return: CFMutableDictionaryRef composed of CFStringRef for each attribute found.
+//
+CFMutableDictionaryRef CDirectoryService::_GetNodeAttributes(const char* nodename, CFDictionaryRef attributes)
+{
+    CFMutableDictionaryRef result = NULL;
+    CFMutableArrayRef values = NULL;
+	tDirNodeReference node = 0L;
+    tDataListPtr attrTypes = NULL;
+    tContextData context = NULL;
+    tAttributeListRef attrListRef = 0L;
+	
+    try
+    {
+        // Make sure we have a valid directory service
+        OpenService();
+
+		node = OpenNamedNode(nodename);
+		
+        // We need a buffer for what comes next
+        CreateBuffer();
+		
+        // Build data list of attributes
+        attrTypes = ::dsDataListAllocate(mDir);
+        ThrowIfNULL(attrTypes);
+        BuildStringDataListFromKeys(attributes, attrTypes);
+		
+        result = ::CFDictionaryCreateMutable(kCFAllocatorDefault, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);
+		
+        do
+        {
+            // List all the appropriate records
+			UInt32 attrCount = 0;
+            tDirStatus err;
+            do
+            {
+                err = ::dsGetDirNodeInfo(node, attrTypes, mData, false, &attrCount, &attrListRef, &context);
+                if (err == eDSBufferTooSmall)
+                    ReallocBuffer();
+            } while(err == eDSBufferTooSmall);
+            ThrowIfDSErr(err);
+            for(UInt32 i = 1; i <= attrCount; i++)
+            {
+				tAttributeValueListRef attributeValueListRef = NULL;
+				tAttributeEntryPtr attributeInfoPtr = NULL;
+				
+				ThrowIfDSErr(::dsGetAttributeEntry(node, mData, attrListRef, i, &attributeValueListRef, &attributeInfoPtr));
+				
+				if (attributeInfoPtr->fAttributeValueCount > 0)
+				{
+					// Determine what the attribute is and where in the result list it should be put
+					std::auto_ptr<char> attrname(CStringFromBuffer(&attributeInfoPtr->fAttributeSignature));
+					CFStringUtil cfattrname(attrname.get());
+					
+					// Determine whether string/base64 encoding is needed
+					bool base64 = false;
+					CFStringRef encoding = (CFStringRef)::CFDictionaryGetValue(attributes, cfattrname.get());
+					if (encoding && (::CFStringCompare(encoding, CFSTR("base64"), 0) == kCFCompareEqualTo))
+						base64 = true;
+					
+					if (attributeInfoPtr->fAttributeValueCount > 1)
+					{
+						values = ::CFArrayCreateMutable(kCFAllocatorDefault, 0, &kCFTypeArrayCallBacks);
+						
+						for(unsigned long k = 1; k <= attributeInfoPtr->fAttributeValueCount; k++)
+						{
+							// Get the attribute value and store in results
+							tAttributeValueEntryPtr attributeValue = NULL;
+							ThrowIfDSErr(::dsGetAttributeValue(node, mData, k, attributeValueListRef, &attributeValue));
+							std::auto_ptr<char> data;
+							if (base64)
+								data.reset(CStringBase64FromBuffer(&attributeValue->fAttributeValueData));
+							else
+								data.reset(CStringFromBuffer(&attributeValue->fAttributeValueData));
+							CFStringUtil strvalue(data.get());
+							::CFArrayAppendValue(values, strvalue.get());
+							::dsDeallocAttributeValueEntry(mDir, attributeValue);
+							attributeValue = NULL;
+						}
+						::CFDictionarySetValue(result, cfattrname.get(), values);
+						::CFRelease(values);
+						values = NULL;
+					}
+					else
+					{
+						// Get the attribute value and store in results
+						tAttributeValueEntryPtr attributeValue = NULL;
+						ThrowIfDSErr(::dsGetAttributeValue(node, mData, 1, attributeValueListRef, &attributeValue));
+						std::auto_ptr<char> data;
+						if (base64)
+							data.reset(CStringBase64FromBuffer(&attributeValue->fAttributeValueData));
+						else
+							data.reset(CStringFromBuffer(&attributeValue->fAttributeValueData));
+						CFStringUtil strvalue(data.get());
+						if (strvalue.get() != NULL)
+						{
+							::CFDictionarySetValue(result, cfattrname.get(), strvalue.get());
+						}
+						::dsDeallocAttributeValueEntry(mDir, attributeValue);
+						attributeValue = NULL;
+					}
+				}
+				
+				::dsCloseAttributeValueList(attributeValueListRef);
+				attributeValueListRef = NULL;
+				::dsDeallocAttributeEntry(mDir, attributeInfoPtr);
+				attributeInfoPtr = NULL;
+            }
+        } while (context != NULL); // Loop until all data has been obtained.
+		
+        ::dsDataListDeallocate(mDir, attrTypes);
+        free(attrTypes);
+        RemoveBuffer();
+		if (node != 0L)
+		{
+			::dsCloseDirNode(node);
+			node = 0L;
+		}
+        CloseService();
+    }
+    catch(CDirectoryServiceException& dsStatus)
+    {
+        // Cleanup
+        if (context != NULL)
+            ::dsReleaseContinueData(mDir, context);
+		
+        if (attrTypes != NULL)
+        {
+            ::dsDataListDeallocate(mDir, attrTypes);
+            free(attrTypes);
+            attrTypes = NULL;
+        }
+        RemoveBuffer();
+		if (node != 0L)
+		{
+			::dsCloseDirNode(node);
+			node = 0L;
+		}
+        CloseService();
+		
+        if (values != NULL)
+        {
+            ::CFRelease(values);
+            values = NULL;
+        }
+        if (result != NULL)
+        {
+            ::CFRelease(result);
+            result = NULL;
+        }
+        throw;
+    }
+	
+    return result;
+}
+
 // _ListAllRecordsWithAttributes
 //
 // Get specific attributes for records of a specified type in the directory.

Modified: PyOpenDirectory/trunk/src/CDirectoryService.h
===================================================================
--- PyOpenDirectory/trunk/src/CDirectoryService.h	2009-03-24 20:13:00 UTC (rev 3916)
+++ PyOpenDirectory/trunk/src/CDirectoryService.h	2009-03-25 00:02:34 UTC (rev 3917)
@@ -31,7 +31,8 @@
     CDirectoryService(const char* nodename);
     virtual ~CDirectoryService();
 
-    CFMutableArrayRef ListNodes(bool using_python=true);
+    CFMutableArrayRef		ListNodes(bool using_python=true);
+    CFMutableDictionaryRef	GetNodeAttributes(const char* nodename, CFDictionaryRef attributes, bool using_python=true);
 
     CFMutableArrayRef ListAllRecordsWithAttributes(CFArrayRef recordTypes, CFDictionaryRef attributes, UInt32 maxRecordCount=0, bool using_python=true);
     CFMutableArrayRef QueryRecordsWithAttribute(const char* attr, const char* value, int matchType, bool casei, CFArrayRef recordTypes, CFDictionaryRef attributes, UInt32 maxRecordCount=0, bool using_python=true);
@@ -67,6 +68,7 @@
     UInt32                mDataSize;
 
     CFMutableArrayRef _ListNodes();
+    CFMutableDictionaryRef	_GetNodeAttributes(const char* nodename, CFDictionaryRef attributes);
 
     CFMutableArrayRef _ListAllRecordsWithAttributes(CFArrayRef recordTypes, CFArrayRef names, CFDictionaryRef attrs, UInt32 maxRecordCount);
     CFMutableArrayRef _QueryRecordsWithAttributes(const char* attr, const char* value, int matchType, const char* compound, bool casei, CFArrayRef recordTypes, CFDictionaryRef attrs, UInt32 maxRecordCount);

Modified: PyOpenDirectory/trunk/src/PythonWrapper.cpp
===================================================================
--- PyOpenDirectory/trunk/src/PythonWrapper.cpp	2009-03-24 20:13:00 UTC (rev 3916)
+++ PyOpenDirectory/trunk/src/PythonWrapper.cpp	2009-03-25 00:02:34 UTC (rev 3917)
@@ -671,6 +671,67 @@
 }
 
 /*
+ def getNodeAttributes(obj, nodename, attributes):
+ """
+ Return key attributes for the specified directory node. The attributes
+ can be a C{str} for the attribute name, or a C{tuple} or C{list} where the first C{str}
+ is the attribute name, and the second C{str} is an encoding type, either "str" or "base64".
+ 
+ @param obj: C{object} the object obtained from an odInit call.
+ @param nodename: C{str} containing the OD nodename to query.
+ @param attributes: C{list} or C{tuple} containing the attributes to return for each record.
+ @return: C{dict} of attributes found.
+ """
+ */
+extern "C" PyObject *getNodeAttributes(PyObject *self, PyObject *args)
+{
+    PyObject* pyds;
+    const char* nodename;
+    PyObject* attributes;
+    if (!PyArg_ParseTuple(args, "OsO", &pyds, &nodename, &attributes) || !PyCObject_Check(pyds) || !PyTupleOrList::typeOK(attributes))
+    {
+        PyErr_SetObject(ODException_class, Py_BuildValue("((s:i))", "DirectoryServices getNodeAttributes: could not parse arguments", 0));
+        return NULL;
+    }
+	
+    // Convert list to CFArray of CFString
+    CFDictionaryRef cfattributes = NULL;
+	try
+	{
+		cfattributes = AttributesToCFDictionary(attributes);
+	}
+	catch(PyObjectException& ex)
+	{
+		std::string msg("DirectoryServices getNodeAttributes: could not parse attributes list: ");
+		msg += ex.what();
+		PyErr_SetObject(ODException_class, Py_BuildValue("((s:i))", msg.c_str(), 0));
+        CFRelease(cfattributes);
+		return NULL;
+	}
+	
+    CDirectoryServiceManager* dsmgr = static_cast<CDirectoryServiceManager*>(PyCObject_AsVoidPtr(pyds));
+    if (dsmgr != NULL)
+    {
+        std::auto_ptr<CDirectoryService> ds(dsmgr->GetService());
+        CFMutableDictionaryRef results = NULL;
+        results = ds->GetNodeAttributes(nodename, cfattributes);
+        if (results != NULL)
+        {
+            PyObject* result = CFDictionaryToPyDict(results);
+            CFRelease(results);
+            CFRelease(cfattributes);
+			
+            return result;
+        }
+    }
+    else
+        PyErr_SetObject(ODException_class, Py_BuildValue("((s:i))", "DirectoryServices getNodeAttributes: invalid directory service argument", 0));
+	
+    CFRelease(cfattributes);
+    return NULL;
+}
+
+/*
  def listAllRecordsWithAttributes(obj, recordType, attributes, count=0):
 	 """
 	 List records in Open Directory, and return key attributes for each one. The attributes
@@ -899,8 +960,10 @@
 static PyMethodDef ODMethods[] = {
     {"odInit",  odInit, METH_VARARGS,
         "Initialize the Open Directory system."},
-    {"listNodes",  listNodes, METH_VARARGS,
-        "List all the nodes currently configured in Open Directory."},
+	{"listNodes",  listNodes, METH_VARARGS,
+		"List all the nodes currently configured in Open Directory."},
+	{"getNodeAttributes",  getNodeAttributes, METH_VARARGS,
+		"Return key attributes for the specified directory node."},
     {"listAllRecordsWithAttributes",  listAllRecordsWithAttributes, METH_VARARGS,
         "List all records of the specified type in Open Directory, returning requested attributes."},
     {"queryRecordsWithAttribute",  queryRecordsWithAttribute, METH_VARARGS,

Modified: PyOpenDirectory/trunk/support/PyOpenDirectory.xcodeproj/cyrusdaboo.mode1v3
===================================================================
--- PyOpenDirectory/trunk/support/PyOpenDirectory.xcodeproj/cyrusdaboo.mode1v3	2009-03-24 20:13:00 UTC (rev 3916)
+++ PyOpenDirectory/trunk/support/PyOpenDirectory.xcodeproj/cyrusdaboo.mode1v3	2009-03-25 00:02:34 UTC (rev 3917)
@@ -231,6 +231,8 @@
 			<key>Layout</key>
 			<array>
 				<dict>
+					<key>BecomeActive</key>
+					<true/>
 					<key>ContentConfiguration</key>
 					<dict>
 						<key>PBXBottomSmartGroupGIDs</key>
@@ -255,7 +257,7 @@
 						<dict>
 							<key>PBXSmartGroupTreeModuleColumnWidthsKey</key>
 							<array>
-								<real>244</real>
+								<real>287</real>
 							</array>
 							<key>PBXSmartGroupTreeModuleColumnsKey_v4</key>
 							<array>
@@ -274,13 +276,12 @@
 							<key>PBXSmartGroupTreeModuleOutlineStateSelectionKey</key>
 							<array>
 								<array>
-									<integer>4</integer>
 									<integer>1</integer>
 									<integer>0</integer>
 								</array>
 							</array>
 							<key>PBXSmartGroupTreeModuleOutlineStateVisibleRectKey</key>
-							<string>{{0, 0}, {244, 1060}}</string>
+							<string>{{0, 0}, {287, 760}}</string>
 						</dict>
 						<key>PBXTopSmartGroupGIDs</key>
 						<array/>
@@ -292,70 +293,36 @@
 					<key>GeometryConfiguration</key>
 					<dict>
 						<key>Frame</key>
-						<string>{{0, 0}, {261, 1078}}</string>
+						<string>{{0, 0}, {304, 778}}</string>
 						<key>GroupTreeTableConfiguration</key>
 						<array>
 							<string>MainColumn</string>
-							<real>244</real>
+							<real>287</real>
 						</array>
 						<key>RubberWindowFrame</key>
-						<string>0 59 1920 1119 0 0 1920 1178 </string>
+						<string>0 59 1440 819 0 0 1440 878 </string>
 					</dict>
 					<key>Module</key>
 					<string>PBXSmartGroupTreeModule</string>
 					<key>Proportion</key>
-					<string>261pt</string>
+					<string>304pt</string>
 				</dict>
 				<dict>
 					<key>Dock</key>
 					<array>
 						<dict>
-							<key>BecomeActive</key>
-							<true/>
 							<key>ContentConfiguration</key>
 							<dict>
 								<key>PBXProjectModuleGUID</key>
 								<string>1CE0B20306471E060097A5F4</string>
 								<key>PBXProjectModuleLabel</key>
-								<string>CDirectoryServiceManager.h</string>
+								<string>&lt;No Editor&gt;</string>
 								<key>PBXSplitModuleInNavigatorKey</key>
 								<dict>
 									<key>Split0</key>
 									<dict>
 										<key>PBXProjectModuleGUID</key>
 										<string>1CE0B20406471E060097A5F4</string>
-										<key>PBXProjectModuleLabel</key>
-										<string>CDirectoryServiceManager.h</string>
-										<key>_historyCapacity</key>
-										<integer>0</integer>
-										<key>bookmark</key>
-										<string>AF02EA010EF9578E005EC935</string>
-										<key>history</key>
-										<array>
-											<string>AF02E9ED0EF9578E005EC935</string>
-											<string>AF02E9EE0EF9578E005EC935</string>
-											<string>AF02E9EF0EF9578E005EC935</string>
-											<string>AF02E9F00EF9578E005EC935</string>
-											<string>AF02E9F10EF9578E005EC935</string>
-											<string>AF02E9F20EF9578E005EC935</string>
-											<string>AF02E9F30EF9578E005EC935</string>
-											<string>AF02E9F40EF9578E005EC935</string>
-											<string>AF02E9F50EF9578E005EC935</string>
-										</array>
-										<key>prevStack</key>
-										<array>
-											<string>AF02E9F60EF9578E005EC935</string>
-											<string>AF02E9F70EF9578E005EC935</string>
-											<string>AF02E9F80EF9578E005EC935</string>
-											<string>AF02E9F90EF9578E005EC935</string>
-											<string>AF02E9FA0EF9578E005EC935</string>
-											<string>AF02E9FB0EF9578E005EC935</string>
-											<string>AF02E9FC0EF9578E005EC935</string>
-											<string>AF02E9FD0EF9578E005EC935</string>
-											<string>AF02E9FE0EF9578E005EC935</string>
-											<string>AF02E9FF0EF9578E005EC935</string>
-											<string>AF02EA000EF9578E005EC935</string>
-										</array>
 									</dict>
 									<key>SplitCount</key>
 									<string>1</string>
@@ -366,14 +333,14 @@
 							<key>GeometryConfiguration</key>
 							<dict>
 								<key>Frame</key>
-								<string>{{0, 0}, {1654, 1073}}</string>
+								<string>{{0, 0}, {1131, 0}}</string>
 								<key>RubberWindowFrame</key>
-								<string>0 59 1920 1119 0 0 1920 1178 </string>
+								<string>0 59 1440 819 0 0 1440 878 </string>
 							</dict>
 							<key>Module</key>
 							<string>PBXNavigatorGroup</string>
 							<key>Proportion</key>
-							<string>1073pt</string>
+							<string>0pt</string>
 						</dict>
 						<dict>
 							<key>ContentConfiguration</key>
@@ -386,18 +353,18 @@
 							<key>GeometryConfiguration</key>
 							<dict>
 								<key>Frame</key>
-								<string>{{0, 1078}, {1654, 0}}</string>
+								<string>{{0, 5}, {1131, 773}}</string>
 								<key>RubberWindowFrame</key>
-								<string>0 59 1920 1119 0 0 1920 1178 </string>
+								<string>0 59 1440 819 0 0 1440 878 </string>
 							</dict>
 							<key>Module</key>
 							<string>XCDetailModule</string>
 							<key>Proportion</key>
-							<string>0pt</string>
+							<string>773pt</string>
 						</dict>
 					</array>
 					<key>Proportion</key>
-					<string>1654pt</string>
+					<string>1131pt</string>
 				</dict>
 			</array>
 			<key>Name</key>
@@ -412,12 +379,14 @@
 			</array>
 			<key>TableOfContents</key>
 			<array>
-				<string>AF02EA020EF9578E005EC935</string>
+				<string>AF444EFD0F798637005606BB</string>
 				<string>1CE0B1FE06471DED0097A5F4</string>
-				<string>AF02EA030EF9578E005EC935</string>
+				<string>AF444EFE0F798637005606BB</string>
 				<string>1CE0B20306471E060097A5F4</string>
 				<string>1CE0B20506471E060097A5F4</string>
 			</array>
+			<key>ToolbarConfigUserDefaultsMinorVersion</key>
+			<string>2</string>
 			<key>ToolbarConfiguration</key>
 			<string>xcode.toolbar.config.defaultV3</string>
 		</dict>
@@ -548,15 +517,15 @@
 	<integer>5</integer>
 	<key>WindowOrderList</key>
 	<array>
-		<string>AF02EA040EF9578E005EC935</string>
-		<string>AF02EA050EF9578E005EC935</string>
+		<string>AF444F450F79A3AA005606BB</string>
+		<string>AF444F460F79A3AA005606BB</string>
+		<string>1C78EAAD065D492600B07095</string>
 		<string>AF275A0D0CAC0FEA005A6274</string>
 		<string>1CD10A99069EF8BA00B06720</string>
-		<string>1C78EAAD065D492600B07095</string>
 		<string>/Volumes/Data/Users/cyrusdaboo/Documents/Development/Apple/eclipse/PyOpenDirectory/support/PyOpenDirectory.xcodeproj</string>
 	</array>
 	<key>WindowString</key>
-	<string>0 59 1920 1119 0 0 1920 1178 </string>
+	<string>0 59 1440 819 0 0 1440 878 </string>
 	<key>WindowToolsV3</key>
 	<array>
 		<dict>
@@ -577,7 +546,7 @@
 								<key>PBXProjectModuleGUID</key>
 								<string>1CD0528F0623707200166675</string>
 								<key>PBXProjectModuleLabel</key>
-								<string></string>
+								<string>&lt;No Editor&gt;</string>
 								<key>StatusBarVisibility</key>
 								<true/>
 							</dict>
@@ -586,7 +555,7 @@
 								<key>Frame</key>
 								<string>{{0, 0}, {1224, 0}}</string>
 								<key>RubberWindowFrame</key>
-								<string>26 406 1224 772 0 0 1920 1178 </string>
+								<string>8 106 1224 772 0 0 1440 878 </string>
 							</dict>
 							<key>Module</key>
 							<string>PBXNavigatorGroup</string>
@@ -597,7 +566,7 @@
 							<key>ContentConfiguration</key>
 							<dict>
 								<key>PBXBuildLogShowsTranscriptDefaultKey</key>
-								<string>{{0, 229}, {1224, 497}}</string>
+								<string>{{0, 5}, {1224, 721}}</string>
 								<key>PBXProjectModuleGUID</key>
 								<string>XCMainBuildResultsModuleGUID</string>
 								<key>PBXProjectModuleLabel</key>
@@ -612,7 +581,7 @@
 								<key>Frame</key>
 								<string>{{0, 5}, {1224, 726}}</string>
 								<key>RubberWindowFrame</key>
-								<string>26 406 1224 772 0 0 1920 1178 </string>
+								<string>8 106 1224 772 0 0 1440 878 </string>
 							</dict>
 							<key>Module</key>
 							<string>PBXBuildResultsModule</string>
@@ -635,14 +604,14 @@
 			<key>TableOfContents</key>
 			<array>
 				<string>AF275A0D0CAC0FEA005A6274</string>
-				<string>AF02E9DF0EF95396005EC935</string>
+				<string>AF444F280F79A186005606BB</string>
 				<string>1CD0528F0623707200166675</string>
 				<string>XCMainBuildResultsModuleGUID</string>
 			</array>
 			<key>ToolbarConfiguration</key>
 			<string>xcode.toolbar.config.buildV3</string>
 			<key>WindowString</key>
-			<string>26 406 1224 772 0 0 1920 1178 </string>
+			<string>8 106 1224 772 0 0 1440 878 </string>
 			<key>WindowToolGUID</key>
 			<string>AF275A0D0CAC0FEA005A6274</string>
 			<key>WindowToolIsVisible</key>
@@ -677,8 +646,8 @@
 										<string>yes</string>
 										<key>sizes</key>
 										<array>
-											<string>{{0, 0}, {484, 393}}</string>
-											<string>{{484, 0}, {956, 393}}</string>
+											<string>{{0, 0}, {484, 414}}</string>
+											<string>{{484, 0}, {956, 414}}</string>
 										</array>
 									</dict>
 									<key>VerticalSplitView</key>
@@ -693,8 +662,8 @@
 										<string>yes</string>
 										<key>sizes</key>
 										<array>
-											<string>{{0, 0}, {1440, 393}}</string>
-											<string>{{0, 393}, {1440, 384}}</string>
+											<string>{{0, 0}, {1440, 414}}</string>
+											<string>{{0, 414}, {1440, 363}}</string>
 										</array>
 									</dict>
 								</dict>
@@ -727,12 +696,12 @@
 										<real>542</real>
 									</array>
 									<key>Frame</key>
-									<string>{{484, 0}, {956, 393}}</string>
+									<string>{{484, 0}, {956, 414}}</string>
 									<key>RubberWindowFrame</key>
-									<string>480 360 1440 818 0 0 1920 1178 </string>
+									<string>0 60 1440 818 0 0 1440 878 </string>
 								</dict>
 								<key>RubberWindowFrame</key>
-								<string>480 360 1440 818 0 0 1920 1178 </string>
+								<string>0 60 1440 818 0 0 1440 878 </string>
 							</dict>
 							<key>Module</key>
 							<string>PBXDebugSessionModule</string>
@@ -755,18 +724,18 @@
 			<key>TableOfContents</key>
 			<array>
 				<string>1CD10A99069EF8BA00B06720</string>
-				<string>AF02E9E00EF95396005EC935</string>
+				<string>AF444F0B0F798D84005606BB</string>
 				<string>1C162984064C10D400B95A72</string>
-				<string>AF02E9E10EF95396005EC935</string>
-				<string>AF02E9E20EF95396005EC935</string>
-				<string>AF02E9E30EF95396005EC935</string>
-				<string>AF02E9E40EF95396005EC935</string>
-				<string>AF02E9E50EF95396005EC935</string>
+				<string>AF444F0C0F798D84005606BB</string>
+				<string>AF444F0D0F798D84005606BB</string>
+				<string>AF444F0E0F798D84005606BB</string>
+				<string>AF444F0F0F798D84005606BB</string>
+				<string>AF444F100F798D84005606BB</string>
 			</array>
 			<key>ToolbarConfiguration</key>
 			<string>xcode.toolbar.config.debugV3</string>
 			<key>WindowString</key>
-			<string>480 360 1440 818 0 0 1920 1178 </string>
+			<string>0 60 1440 818 0 0 1440 878 </string>
 			<key>WindowToolGUID</key>
 			<string>1CD10A99069EF8BA00B06720</string>
 			<key>WindowToolIsVisible</key>
@@ -894,7 +863,7 @@
 								<key>Frame</key>
 								<string>{{0, 0}, {1085, 479}}</string>
 								<key>RubberWindowFrame</key>
-								<string>402 371 1085 520 0 0 1920 1178 </string>
+								<string>171 214 1085 520 0 0 1440 878 </string>
 							</dict>
 							<key>Module</key>
 							<string>PBXDebugCLIModule</string>
@@ -917,17 +886,17 @@
 			<key>TableOfContents</key>
 			<array>
 				<string>1C78EAAD065D492600B07095</string>
-				<string>AF02E9E60EF95396005EC935</string>
+				<string>AF444F340F79A280005606BB</string>
 				<string>1C78EAAC065D492600B07095</string>
 			</array>
 			<key>ToolbarConfiguration</key>
 			<string>xcode.toolbar.config.consoleV3</string>
 			<key>WindowString</key>
-			<string>402 371 1085 520 0 0 1920 1178 </string>
+			<string>171 214 1085 520 0 0 1440 878 </string>
 			<key>WindowToolGUID</key>
 			<string>1C78EAAD065D492600B07095</string>
 			<key>WindowToolIsVisible</key>
-			<true/>
+			<false/>
 		</dict>
 		<dict>
 			<key>Identifier</key>

Modified: PyOpenDirectory/trunk/support/PyOpenDirectory.xcodeproj/cyrusdaboo.pbxuser
===================================================================
--- PyOpenDirectory/trunk/support/PyOpenDirectory.xcodeproj/cyrusdaboo.pbxuser	2009-03-24 20:13:00 UTC (rev 3916)
+++ PyOpenDirectory/trunk/support/PyOpenDirectory.xcodeproj/cyrusdaboo.pbxuser	2009-03-25 00:02:34 UTC (rev 3917)
@@ -8,6 +8,7 @@
 			8DD76F620486A84900D96B5E /* PyOpenDirectory */,
 		);
 		breakpoints = (
+			AF444F3C0F79A3A5005606BB /* test.cpp:80 */,
 		);
 		codeSenseManager = AF155A2E0A501F7B007E1E6E /* Code sense */;
 		executables = (
@@ -43,7 +44,7 @@
 				PBXFileTableDataSourceColumnSortingKey = PBXFileDataSource_Filename_ColumnID;
 				PBXFileTableDataSourceColumnWidthsKey = (
 					20,
-					1415,
+					892,
 					20,
 					48,
 					43,
@@ -60,43 +61,20 @@
 					PBXFileDataSource_Target_ColumnID,
 				);
 			};
-			PBXPerProjectTemplateStateSaveDate = 251221906;
-			PBXWorkspaceStateSaveDate = 251221906;
+			PBXPerProjectTemplateStateSaveDate = 259621147;
+			PBXWorkspaceStateSaveDate = 259621147;
 		};
-		perUserProjectItems = {
-			AF02E9ED0EF9578E005EC935 = AF02E9ED0EF9578E005EC935 /* PBXTextBookmark */;
-			AF02E9EE0EF9578E005EC935 = AF02E9EE0EF9578E005EC935 /* PBXTextBookmark */;
-			AF02E9EF0EF9578E005EC935 = AF02E9EF0EF9578E005EC935 /* PBXTextBookmark */;
-			AF02E9F00EF9578E005EC935 = AF02E9F00EF9578E005EC935 /* PBXTextBookmark */;
-			AF02E9F10EF9578E005EC935 = AF02E9F10EF9578E005EC935 /* PBXTextBookmark */;
-			AF02E9F20EF9578E005EC935 = AF02E9F20EF9578E005EC935 /* PBXTextBookmark */;
-			AF02E9F30EF9578E005EC935 = AF02E9F30EF9578E005EC935 /* PBXTextBookmark */;
-			AF02E9F40EF9578E005EC935 = AF02E9F40EF9578E005EC935 /* PBXTextBookmark */;
-			AF02E9F50EF9578E005EC935 = AF02E9F50EF9578E005EC935 /* PBXTextBookmark */;
-			AF02E9F60EF9578E005EC935 = AF02E9F60EF9578E005EC935 /* PBXTextBookmark */;
-			AF02E9F70EF9578E005EC935 = AF02E9F70EF9578E005EC935 /* PBXTextBookmark */;
-			AF02E9F80EF9578E005EC935 = AF02E9F80EF9578E005EC935 /* PBXTextBookmark */;
-			AF02E9F90EF9578E005EC935 = AF02E9F90EF9578E005EC935 /* PBXTextBookmark */;
-			AF02E9FA0EF9578E005EC935 = AF02E9FA0EF9578E005EC935 /* PBXTextBookmark */;
-			AF02E9FB0EF9578E005EC935 = AF02E9FB0EF9578E005EC935 /* PBXTextBookmark */;
-			AF02E9FC0EF9578E005EC935 = AF02E9FC0EF9578E005EC935 /* PBXTextBookmark */;
-			AF02E9FD0EF9578E005EC935 = AF02E9FD0EF9578E005EC935 /* PBXTextBookmark */;
-			AF02E9FE0EF9578E005EC935 = AF02E9FE0EF9578E005EC935 /* PBXTextBookmark */;
-			AF02E9FF0EF9578E005EC935 = AF02E9FF0EF9578E005EC935 /* PBXTextBookmark */;
-			AF02EA000EF9578E005EC935 = AF02EA000EF9578E005EC935 /* PBXTextBookmark */;
-			AF02EA010EF9578E005EC935 = AF02EA010EF9578E005EC935 /* PBXTextBookmark */;
-		};
 		sourceControlManager = AF155A2D0A501F7B007E1E6E /* Source Control */;
 		userBuildSettings = {
 		};
 	};
 	08FB7796FE84155DC02AAC07 /* test.cpp */ = {
 		uiCtxt = {
-			sepNavIntBoundsRect = "{{0, 0}, {1593, 4788}}";
-			sepNavSelRange = "{4457, 0}";
-			sepNavVisRange = "{4065, 2579}";
+			sepNavIntBoundsRect = "{{0, 0}, {1379, 5404}}";
+			sepNavSelRange = "{2804, 0}";
+			sepNavVisRange = "{2302, 755}";
 			sepNavVisRect = "{{0, 1574}, {1521, 647}}";
-			sepNavWindowFrame = "{{344, 35}, {1220, 1036}}";
+			sepNavWindowFrame = "{{168, 4}, {1220, 874}}";
 		};
 	};
 	8DD76F620486A84900D96B5E /* PyOpenDirectory */ = {
@@ -107,230 +85,20 @@
 	};
 	AF02AC560CBE690500F478B8 /* CDirectoryServiceException.cpp */ = {
 		uiCtxt = {
-			sepNavIntBoundsRect = "{{0, 0}, {1379, 840}}";
-			sepNavSelRange = "{1658, 0}";
-			sepNavVisRange = "{981, 763}";
+			sepNavIntBoundsRect = "{{0, 0}, {1593, 1041}}";
+			sepNavSelRange = "{608, 0}";
+			sepNavVisRange = "{0, 1744}";
 			sepNavWindowFrame = "{{684, 53}, {1145, 959}}";
 		};
 	};
 	AF02AC570CBE690500F478B8 /* CDirectoryServiceException.h */ = {
 		uiCtxt = {
-			sepNavIntBoundsRect = "{{0, 0}, {1113, 687}}";
+			sepNavIntBoundsRect = "{{0, 0}, {1593, 1041}}";
 			sepNavSelRange = "{1019, 0}";
-			sepNavVisRange = "{0, 1370}";
+			sepNavVisRange = "{0, 1391}";
 			sepNavWindowFrame = "{{73, 219}, {1145, 959}}";
 		};
 	};
-	AF02E9ED0EF9578E005EC935 /* PBXTextBookmark */ = {
-		isa = PBXTextBookmark;
-		fRef = AFC1CA770E809C5200FAB3DB /* base64.h */;
-		name = "base64.h: 1";
-		rLen = 0;
-		rLoc = 0;
-		rType = 0;
-		vrLen = 746;
-		vrLoc = 0;
-	};
-	AF02E9EE0EF9578E005EC935 /* PBXTextBookmark */ = {
-		isa = PBXTextBookmark;
-		fRef = AFC1CA780E809C5200FAB3DB /* base64.cpp */;
-		name = "base64.cpp: 45";
-		rLen = 0;
-		rLoc = 1633;
-		rType = 0;
-		vrLen = 2561;
-		vrLoc = 0;
-	};
-	AF02E9EF0EF9578E005EC935 /* PBXTextBookmark */ = {
-		isa = PBXTextBookmark;
-		fRef = AF155A310A501F84007E1E6E /* PythonWrapper.cpp */;
-		name = "PythonWrapper.cpp: 1";
-		rLen = 0;
-		rLoc = 0;
-		rType = 0;
-		vrLen = 1657;
-		vrLoc = 0;
-	};
-	AF02E9F00EF9578E005EC935 /* PBXTextBookmark */ = {
-		isa = PBXTextBookmark;
-		fRef = AFC9AC0A0EF8A3FC0050787E /* CDirectoryServiceAuth.h */;
-		name = "CDirectoryServiceAuth.h: 45";
-		rLen = 0;
-		rLoc = 1662;
-		rType = 0;
-		vrLen = 1665;
-		vrLoc = 0;
-	};
-	AF02E9F10EF9578E005EC935 /* PBXTextBookmark */ = {
-		isa = PBXTextBookmark;
-		fRef = AFC9AC0B0EF8A3FC0050787E /* CDirectoryServiceAuth.cpp */;
-		name = "CDirectoryServiceAuth.cpp: 146";
-		rLen = 0;
-		rLoc = 4391;
-		rType = 0;
-		vrLen = 2290;
-		vrLoc = 3525;
-	};
-	AF02E9F20EF9578E005EC935 /* PBXTextBookmark */ = {
-		isa = PBXTextBookmark;
-		fRef = AF155A300A501F84007E1E6E /* CDirectoryService.h */;
-		name = "CDirectoryService.h: 32";
-		rLen = 0;
-		rLoc = 978;
-		rType = 0;
-		vrLen = 2623;
-		vrLoc = 0;
-	};
-	AF02E9F30EF9578E005EC935 /* PBXTextBookmark */ = {
-		isa = PBXTextBookmark;
-		fRef = AF155A2F0A501F84007E1E6E /* CDirectoryService.cpp */;
-		name = "CDirectoryService.cpp: 710";
-		rLen = 0;
-		rLoc = 26937;
-		rType = 0;
-		vrLen = 2731;
-		vrLoc = 5528;
-	};
-	AF02E9F40EF9578E005EC935 /* PBXTextBookmark */ = {
-		isa = PBXTextBookmark;
-		fRef = AF41D9AB0CBDBAE200AB863D /* CDirectoryServiceManager.cpp */;
-		name = "CDirectoryServiceManager.cpp: 23";
-		rLen = 0;
-		rLoc = 821;
-		rType = 0;
-		vrLen = 1469;
-		vrLoc = 0;
-	};
-	AF02E9F50EF9578E005EC935 /* PBXTextBookmark */ = {
-		isa = PBXTextBookmark;
-		fRef = AF41D9AC0CBDBAE200AB863D /* CDirectoryServiceManager.h */;
-		name = "CDirectoryServiceManager.h: 39";
-		rLen = 12;
-		rLoc = 1107;
-		rType = 0;
-		vrLen = 1124;
-		vrLoc = 0;
-	};
-	AF02E9F60EF9578E005EC935 /* PBXTextBookmark */ = {
-		isa = PBXTextBookmark;
-		fRef = AFC1CA770E809C5200FAB3DB /* base64.h */;
-		name = "base64.h: 1";
-		rLen = 0;
-		rLoc = 0;
-		rType = 0;
-		vrLen = 746;
-		vrLoc = 0;
-	};
-	AF02E9F70EF9578E005EC935 /* PBXTextBookmark */ = {
-		isa = PBXTextBookmark;
-		fRef = AFC1CA780E809C5200FAB3DB /* base64.cpp */;
-		name = "base64.cpp: 45";
-		rLen = 0;
-		rLoc = 1633;
-		rType = 0;
-		vrLen = 2561;
-		vrLoc = 0;
-	};
-	AF02E9F80EF9578E005EC935 /* PBXTextBookmark */ = {
-		isa = PBXTextBookmark;
-		fRef = AF155A310A501F84007E1E6E /* PythonWrapper.cpp */;
-		name = "PythonWrapper.cpp: 842";
-		rLen = 0;
-		rLoc = 29065;
-		rType = 0;
-		vrLen = 3751;
-		vrLoc = 22585;
-	};
-	AF02E9F90EF9578E005EC935 /* PBXTextBookmark */ = {
-		isa = PBXTextBookmark;
-		fRef = AFC9AC0A0EF8A3FC0050787E /* CDirectoryServiceAuth.h */;
-		name = "CDirectoryServiceAuth.h: 45";
-		rLen = 0;
-		rLoc = 1662;
-		rType = 0;
-		vrLen = 1665;
-		vrLoc = 0;
-	};
-	AF02E9FA0EF9578E005EC935 /* PBXTextBookmark */ = {
-		isa = PBXTextBookmark;
-		fRef = AF155A310A501F84007E1E6E /* PythonWrapper.cpp */;
-		name = "PythonWrapper.cpp: 1";
-		rLen = 0;
-		rLoc = 0;
-		rType = 0;
-		vrLen = 1657;
-		vrLoc = 0;
-	};
-	AF02E9FB0EF9578E005EC935 /* PBXTextBookmark */ = {
-		isa = PBXTextBookmark;
-		fRef = AFC9AC0A0EF8A3FC0050787E /* CDirectoryServiceAuth.h */;
-		name = "CDirectoryServiceAuth.h: 45";
-		rLen = 0;
-		rLoc = 1662;
-		rType = 0;
-		vrLen = 1665;
-		vrLoc = 0;
-	};
-	AF02E9FC0EF9578E005EC935 /* PBXTextBookmark */ = {
-		isa = PBXTextBookmark;
-		fRef = AFC9AC0B0EF8A3FC0050787E /* CDirectoryServiceAuth.cpp */;
-		name = "CDirectoryServiceAuth.cpp: 146";
-		rLen = 0;
-		rLoc = 4391;
-		rType = 0;
-		vrLen = 2290;
-		vrLoc = 3525;
-	};
-	AF02E9FD0EF9578E005EC935 /* PBXTextBookmark */ = {
-		isa = PBXTextBookmark;
-		fRef = AF155A300A501F84007E1E6E /* CDirectoryService.h */;
-		name = "CDirectoryService.h: 32";
-		rLen = 0;
-		rLoc = 978;
-		rType = 0;
-		vrLen = 2623;
-		vrLoc = 0;
-	};
-	AF02E9FE0EF9578E005EC935 /* PBXTextBookmark */ = {
-		isa = PBXTextBookmark;
-		fRef = AF155A2F0A501F84007E1E6E /* CDirectoryService.cpp */;
-		name = "CDirectoryService.cpp: 710";
-		rLen = 0;
-		rLoc = 26937;
-		rType = 0;
-		vrLen = 2731;
-		vrLoc = 5528;
-	};
-	AF02E9FF0EF9578E005EC935 /* PBXTextBookmark */ = {
-		isa = PBXTextBookmark;
-		fRef = AF41D9AC0CBDBAE200AB863D /* CDirectoryServiceManager.h */;
-		name = "CDirectoryServiceManager.h: 39";
-		rLen = 12;
-		rLoc = 1107;
-		rType = 0;
-		vrLen = 1124;
-		vrLoc = 0;
-	};
-	AF02EA000EF9578E005EC935 /* PBXTextBookmark */ = {
-		isa = PBXTextBookmark;
-		fRef = AF41D9AB0CBDBAE200AB863D /* CDirectoryServiceManager.cpp */;
-		name = "CDirectoryServiceManager.cpp: 23";
-		rLen = 0;
-		rLoc = 821;
-		rType = 0;
-		vrLen = 1469;
-		vrLoc = 0;
-	};
-	AF02EA010EF9578E005EC935 /* PBXTextBookmark */ = {
-		isa = PBXTextBookmark;
-		fRef = AF41D9AC0CBDBAE200AB863D /* CDirectoryServiceManager.h */;
-		name = "CDirectoryServiceManager.h: 39";
-		rLen = 12;
-		rLoc = 1107;
-		rType = 0;
-		vrLen = 1124;
-		vrLoc = 0;
-	};
 	AF155A290A501F5C007E1E6E /* PyOpenDirectory */ = {
 		isa = PBXExecutable;
 		activeArgIndices = (
@@ -338,13 +106,10 @@
 		argumentStrings = (
 		);
 		autoAttachOnCrash = 1;
-		breakpointsEnabled = 0;
+		breakpointsEnabled = 1;
 		configStateDict = {
 		};
 		customDataFormattersEnabled = 1;
-		dataTipCustomDataFormattersEnabled = 1;
-		dataTipShowTypeColumn = 1;
-		dataTipSortType = 0;
 		debuggerPlugin = GDBDebugging;
 		disassemblyDisplayState = 0;
 		dylibVariantSuffix = "";
@@ -357,7 +122,6 @@
 		name = PyOpenDirectory;
 		savedGlobals = {
 		};
-		showTypeColumn = 0;
 		sourceDirectories = (
 		);
 		variableFormatDictionary = {
@@ -382,8 +146,6 @@
 		isa = PBXSourceControlManager;
 		fallbackIsa = XCSourceControlManager;
 		isSCMEnabled = 0;
-		repositoryNamesForRoots = {
-		};
 		scmConfiguration = {
 			repositoryNamesForRoots = {
 			};
@@ -396,36 +158,36 @@
 	};
 	AF155A2F0A501F84007E1E6E /* CDirectoryService.cpp */ = {
 		uiCtxt = {
-			sepNavIntBoundsRect = "{{0, 0}, {1593, 12992}}";
-			sepNavSelRange = "{26937, 0}";
-			sepNavVisRange = "{5528, 2731}";
+			sepNavIntBoundsRect = "{{0, 0}, {1140, 17822}}";
+			sepNavSelRange = "{2771, 0}";
+			sepNavVisRange = "{10094, 2039}";
 			sepNavVisRect = "{{0, 0}, {1309, 1017}}";
-			sepNavWindowFrame = "{{85, 4}, {1280, 874}}";
+			sepNavWindowFrame = "{{85, 4}, {1280, 1174}}";
 		};
 	};
 	AF155A300A501F84007E1E6E /* CDirectoryService.h */ = {
 		uiCtxt = {
-			sepNavIntBoundsRect = "{{0, 0}, {1593, 1232}}";
-			sepNavSelRange = "{978, 0}";
-			sepNavVisRange = "{0, 2623}";
+			sepNavIntBoundsRect = "{{0, 0}, {1290, 1330}}";
+			sepNavSelRange = "{1038, 120}";
+			sepNavVisRange = "{890, 2046}";
 			sepNavVisRect = "{{0, 123}, {752, 676}}";
 			sepNavWindowFrame = "{{50, 9}, {1390, 869}}";
 		};
 	};
 	AF155A310A501F84007E1E6E /* PythonWrapper.cpp */ = {
 		uiCtxt = {
-			sepNavIntBoundsRect = "{{0, 0}, {1593, 12096}}";
-			sepNavSelRange = "{0, 0}";
-			sepNavVisRange = "{0, 1657}";
+			sepNavIntBoundsRect = "{{0, 0}, {1163, 14070}}";
+			sepNavSelRange = "{21895, 0}";
+			sepNavVisRange = "{21578, 468}";
 			sepNavVisRect = "{{0, 0}, {1521, 647}}";
 			sepNavWindowFrame = "{{89, 4}, {1043, 828}}";
 		};
 	};
 	AF155AFB0A502C09007E1E6E /* CFStringUtil.h */ = {
 		uiCtxt = {
-			sepNavIntBoundsRect = "{{0, 0}, {1113, 687}}";
-			sepNavSelRange = "{762, 19}";
-			sepNavVisRange = "{0, 1165}";
+			sepNavIntBoundsRect = "{{0, 0}, {1070, 741}}";
+			sepNavSelRange = "{790, 12}";
+			sepNavVisRange = "{0, 1120}";
 			sepNavVisRect = "{{0, 0}, {766, 699}}";
 			sepNavWindowFrame = "{{746, 4}, {811, 828}}";
 		};
@@ -442,7 +204,7 @@
 	AF41D9AB0CBDBAE200AB863D /* CDirectoryServiceManager.cpp */ = {
 		uiCtxt = {
 			sepNavIntBoundsRect = "{{0, 0}, {1593, 1041}}";
-			sepNavSelRange = "{1031, 0}";
+			sepNavSelRange = "{713, 0}";
 			sepNavVisRange = "{0, 1469}";
 			sepNavWindowFrame = "{{558, 246}, {1280, 828}}";
 		};
@@ -450,11 +212,28 @@
 	AF41D9AC0CBDBAE200AB863D /* CDirectoryServiceManager.h */ = {
 		uiCtxt = {
 			sepNavIntBoundsRect = "{{0, 0}, {1593, 1041}}";
-			sepNavSelRange = "{1107, 12}";
-			sepNavVisRange = "{0, 1124}";
+			sepNavSelRange = "{916, 0}";
+			sepNavVisRange = "{0, 1074}";
 			sepNavWindowFrame = "{{677, 13}, {1280, 828}}";
 		};
 	};
+	AF444F3C0F79A3A5005606BB /* test.cpp:80 */ = {
+		isa = PBXFileBreakpoint;
+		actions = (
+		);
+		breakpointStyle = 0;
+		continueAfterActions = 0;
+		countType = 0;
+		delayBeforeContinue = 0;
+		fileReference = 08FB7796FE84155DC02AAC07 /* test.cpp */;
+		functionName = "main (int argc, const char * argv[])";
+		hitCount = 1;
+		ignoreCount = 0;
+		lineNumber = 80;
+		location = PyOpenDirectory;
+		modificationTime = 259630172.337334;
+		state = 2;
+	};
 	AFC1CA770E809C5200FAB3DB /* base64.h */ = {
 		uiCtxt = {
 			sepNavIntBoundsRect = "{{0, 0}, {1593, 1041}}";
@@ -472,16 +251,16 @@
 	};
 	AFC9AC0A0EF8A3FC0050787E /* CDirectoryServiceAuth.h */ = {
 		uiCtxt = {
-			sepNavIntBoundsRect = "{{0, 0}, {1593, 1041}}";
+			sepNavIntBoundsRect = "{{0, 0}, {1593, 1018}}";
 			sepNavSelRange = "{1662, 0}";
 			sepNavVisRange = "{0, 1665}";
 		};
 	};
 	AFC9AC0B0EF8A3FC0050787E /* CDirectoryServiceAuth.cpp */ = {
 		uiCtxt = {
-			sepNavIntBoundsRect = "{{0, 0}, {1593, 4158}}";
-			sepNavSelRange = "{4391, 0}";
-			sepNavVisRange = "{3525, 2290}";
+			sepNavIntBoundsRect = "{{0, 0}, {1535, 4200}}";
+			sepNavSelRange = "{4382, 16}";
+			sepNavVisRange = "{2963, 2221}";
 		};
 	};
 }

Modified: PyOpenDirectory/trunk/test.py
===================================================================
--- PyOpenDirectory/trunk/test.py	2009-03-24 20:13:00 UTC (rev 3916)
+++ PyOpenDirectory/trunk/test.py	2009-03-25 00:02:34 UTC (rev 3917)
@@ -34,6 +34,15 @@
 			for n in l:
 				print "Node: %s" % n
 	
+	def getNodeAttributes():
+		attrs = opendirectory.getNodeAttributes(ref, "/Search", (dsattributes.kDS1AttrSearchPath,))
+		if attrs is None:
+			print "Failed to get node info"
+		else:
+			print "\ngetNodeAttributes number of results = %d" % (len(attrs),)
+			for k,v in attrs.iteritems():
+				print "Node Attribute: %s: %s" % (k, v,)
+	
 	def listUsers():
 		d = opendirectory.listAllRecordsWithAttributes(ref, dsattributes.kDSStdRecordTypeUsers,
 													   (
@@ -361,6 +370,8 @@
 			print "Failed to authenticate user"
 	
 	listNodes()
+	getNodeAttributes()
+
 	listUsers()
 	listGroups()
 	listComputers()
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20090324/b0b0afc2/attachment-0001.html>


More information about the calendarserver-changes mailing list