[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><No Editor></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><No Editor></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