[CalendarServer-changes] [1052] PyOpenDirectory/branches/users/cdaboo/od-schema-1044

source_changes at macosforge.org source_changes at macosforge.org
Tue Jan 16 12:30:25 PST 2007


Revision: 1052
          http://trac.macosforge.org/projects/calendarserver/changeset/1052
Author:   cdaboo at apple.com
Date:     2007-01-16 12:30:25 -0800 (Tue, 16 Jan 2007)

Log Message:
-----------
Added new query method to allow querying for specific records that match particular attribute/value criteria.

Modified Paths:
--------------
    PyOpenDirectory/branches/users/cdaboo/od-schema-1044/pysrc/dsattributes.py
    PyOpenDirectory/branches/users/cdaboo/od-schema-1044/pysrc/opendirectory.py
    PyOpenDirectory/branches/users/cdaboo/od-schema-1044/src/CDirectoryService.cpp
    PyOpenDirectory/branches/users/cdaboo/od-schema-1044/src/CDirectoryService.h
    PyOpenDirectory/branches/users/cdaboo/od-schema-1044/src/PythonWrapper.cpp
    PyOpenDirectory/branches/users/cdaboo/od-schema-1044/support/PyOpenDirectory.xcodeproj/cyrusdaboo.mode1
    PyOpenDirectory/branches/users/cdaboo/od-schema-1044/support/PyOpenDirectory.xcodeproj/cyrusdaboo.mode1v3
    PyOpenDirectory/branches/users/cdaboo/od-schema-1044/support/PyOpenDirectory.xcodeproj/cyrusdaboo.pbxuser
    PyOpenDirectory/branches/users/cdaboo/od-schema-1044/support/PyOpenDirectory.xcodeproj/project.pbxproj
    PyOpenDirectory/branches/users/cdaboo/od-schema-1044/support/test.cpp
    PyOpenDirectory/branches/users/cdaboo/od-schema-1044/test.py

Modified: PyOpenDirectory/branches/users/cdaboo/od-schema-1044/pysrc/dsattributes.py
===================================================================
--- PyOpenDirectory/branches/users/cdaboo/od-schema-1044/pysrc/dsattributes.py	2007-01-16 18:30:59 UTC (rev 1051)
+++ PyOpenDirectory/branches/users/cdaboo/od-schema-1044/pysrc/dsattributes.py	2007-01-16 20:30:25 UTC (rev 1052)
@@ -21,6 +21,18 @@
 This comes directly (with C->Python conversion) from <DirectoryServices/DirServicesConst.h>
 """
 
+# Specific match types
+
+eDSExact             =    0x2001
+eDSStartsWith        =    0x2002
+eDSEndsWith          =    0x2003
+eDSContains          =    0x2004
+
+eDSLessThan          =    0x2005
+eDSGreaterThan       =    0x2006
+eDSLessEqual         =    0x2007
+eDSGreaterEqual      =    0x2008
+
 # Specific Record Type Constants
 
 """

Modified: PyOpenDirectory/branches/users/cdaboo/od-schema-1044/pysrc/opendirectory.py
===================================================================
--- PyOpenDirectory/branches/users/cdaboo/od-schema-1044/pysrc/opendirectory.py	2007-01-16 18:30:59 UTC (rev 1051)
+++ PyOpenDirectory/branches/users/cdaboo/od-schema-1044/pysrc/opendirectory.py	2007-01-16 20:30:25 UTC (rev 1052)
@@ -40,6 +40,21 @@
         or C{None} otherwise.
     """
 
+def queryRecordsWithAttributes(obj, query, matchType, casei, allmatch, recordType, attributes):
+    """
+    List records in Open Directory matching specified criteria, and return key attributes for each one.
+    
+    @param obj: C{object} the object obtained from an odInit call.
+    @param query: C{dict} containing attribute/value pairs to search.
+    @param matchType: C{int} DS match type to use when searching.
+    @param casei: C{True} to do case-insenstive match, C{False} otherwise.
+    @param allmatch: C{True} to do require all attribute/value pairs to match (AND), C{False} otherwise (OR).
+    @param recordType: C{str} containing the OD record type to lookup.
+    @param attributes: C{list} containing the attributes to return for each record.
+    @return: C{dict} containing a C{dict} of attributes for each record found, 
+        or C{None} otherwise.
+    """
+
 def authenticateUserBasic(obj, user, pswd):
     """
     Authenticate a user with a password to Open Directory.

Modified: PyOpenDirectory/branches/users/cdaboo/od-schema-1044/src/CDirectoryService.cpp
===================================================================
--- PyOpenDirectory/branches/users/cdaboo/od-schema-1044/src/CDirectoryService.cpp	2007-01-16 18:30:59 UTC (rev 1051)
+++ PyOpenDirectory/branches/users/cdaboo/od-schema-1044/src/CDirectoryService.cpp	2007-01-16 20:30:25 UTC (rev 1052)
@@ -23,7 +23,7 @@
 
 #include "CFStringUtil.h"
 
-#include <Python.h>
+#include <Python/Python.h>
 
 #include <stdlib.h>
 #include <string.h>
@@ -108,6 +108,39 @@
 	}
 }
 
+// QueryRecordsWithAttributes
+// 
+// Get specific attributes for one or more user records with matching attributes in the directory.
+//
+// @param query: CFDictionary of CFString listing the attributes to query.
+// @param matchType: the match type to query.
+// @param casei: true if case-insensitive match is to be used, false otherwise.
+// @param allmatch: true if a match to every attribute/value must occur (AND), false if only one needs to match (OR).
+// @param recordType: the record type to list.
+// @param attributes: CFArray of CFString listing the attributes to return for each record.
+// @return: CFMutableDictionaryRef composed of CFMutableDictionaryRef of CFStringRef key and value entries
+//			for each attribute/value requested in the record indexed by uid,
+//		    or NULL if it fails.
+//
+CFMutableDictionaryRef CDirectoryService::QueryRecordsWithAttributes(CFDictionaryRef query, int matchType, bool casei, bool allmatch, const char* recordType, CFArrayRef attributes)
+{
+	try
+	{
+		// Get attribute map
+		return _QueryRecordsWithAttributes(query, matchType, casei, allmatch, recordType, attributes);
+	}
+	catch(long dserror)
+	{
+		PyErr_SetObject(ODException_class, Py_BuildValue("((s:i))", "DirectoryServices Error", dserror));		
+		return NULL;
+	}
+	catch(...)
+	{
+		PyErr_SetObject(ODException_class, Py_BuildValue("((s:i))", "Unknown Error", -1));		
+		return NULL;
+	}
+}
+
 // AuthenticateUserBasic
 // 
 // Authenticate a user to the directory using plain text credentials.
@@ -169,6 +202,7 @@
 // Get specific attributes for records of a specified type in the directory.
 //
 // @param type: the record type to check.
+// @param names: a list of record names to target if NULL all records are matched.
 // @param attrs: a list of attributes to return.
 // @return: CFMutableDictionaryRef composed of CFMutableDictionaryRef of CFStringRef key and value entries
 //			for each attribute/value requested in the record indexed by uid,
@@ -375,6 +409,234 @@
 	return result;
 }
 
+// _QueryRecordsWithAttributes
+// 
+// Get specific attributes for records of a specified type in the directory.
+//
+// @param query: a dictionary containg attribute/value pairs to match in records.
+// @param matchType: the match type to to use.
+// @param casei: true if case-insensitive match is to be used, false otherwise.
+// @param allmatch: true if a match to every attribute/value must occur (AND), false if only one needs to match (OR).
+// @param type: the record type to check.
+// @param attrs: a list of attributes to return.
+// @return: CFMutableDictionaryRef composed of CFMutableDictionaryRef of CFStringRef key and value entries
+//			for each attribute/value requested in the record indexed by uid,
+//		    or NULL if it fails.
+//
+CFMutableDictionaryRef CDirectoryService::_QueryRecordsWithAttributes(CFDictionaryRef query, int matchType, bool casei, bool allmatch, const char* type, CFArrayRef attrs)
+{
+	CFMutableDictionaryRef result = NULL;
+	CFMutableDictionaryRef vresult = NULL;
+	CFMutableArrayRef values = NULL;
+	tDataNodePtr queryAttr = NULL;
+	tDataNodePtr queryValue = NULL;
+	tDataListPtr recTypes = NULL;
+	tDataListPtr attrTypes = NULL;
+	tContextData context = NULL;
+	tAttributeListRef attrListRef = 0L;
+	tRecordEntry* pRecEntry = NULL;
+	
+	// Must have attributes
+	if (::CFArrayGetCount(attrs) == 0)
+		return NULL;
+
+	try
+	{
+		// Make sure we have a valid directory service
+		OpenService();
+		
+		// Open the node we want to query
+		OpenNode();
+		
+		// We need a buffer for what comes next
+		CreateBuffer();
+		
+		// Determine attribute to search
+		if (::CFDictionaryGetCount(query) == 1)
+		{
+			BuildSimpleQuery(query, queryAttr, queryValue);
+			if (casei)
+				matchType |= 0x0100;
+			else
+				matchType &= 0xFEFF;
+		}
+		else
+		{
+			queryAttr = ::dsDataNodeAllocateString(mDir, kDS1AttrDistinguishedName);
+			BuildCompoundQuery(query, (tDirPatternMatch)matchType, allmatch, queryValue);
+			matchType = (casei) ? eDSiCompoundExpression : eDSCompoundExpression;
+		}
+
+		// Build data list of types
+		recTypes = ::dsDataListAllocate(mDir);
+		ThrowIfNULL(recTypes);
+		ThrowIfDSErr(::dsBuildListFromStringsAlloc(mDir, recTypes,  type, NULL));
+
+		// Build data list of attributes
+		attrTypes = ::dsDataListAllocate(mDir);
+		ThrowIfNULL(attrTypes);
+		BuildStringDataList(attrs, attrTypes);
+		
+		result = ::CFDictionaryCreateMutable(kCFAllocatorDefault, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);
+		
+		do
+		{
+			// List all the appropriate records
+			unsigned long recCount = 0;
+			tDirStatus err;
+			do
+			{
+				err = ::dsDoAttributeValueSearchWithData(mNode, mData, recTypes, queryAttr, (tDirPatternMatch)matchType, queryValue, attrTypes, false, &recCount, &context);
+				if (err == eDSBufferTooSmall)
+					ReallocBuffer();
+			} while(err == eDSBufferTooSmall);
+			ThrowIfDSErr(err);
+			for(unsigned long i = 1; i <= recCount; i++)
+			{
+				// Get the record entry
+				ThrowIfDSErr(::dsGetRecordEntry(mNode, mData, i, &attrListRef, &pRecEntry));
+				
+				// Get the entry's name
+				char* temp = NULL;
+				ThrowIfDSErr(::dsGetRecordNameFromEntry(pRecEntry, &temp));
+				std::auto_ptr<char> recname(temp);
+				
+				// Create a dictionary for the values
+				vresult = ::CFDictionaryCreateMutable(kCFAllocatorDefault, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);
+				
+				// Look at each requested attribute and get one value
+				for(unsigned long j = 1; j <= pRecEntry->fRecordAttributeCount; j++)
+				{
+					tAttributeValueListRef attributeValueListRef = NULL;
+					tAttributeEntryPtr attributeInfoPtr = NULL;
+					
+					ThrowIfDSErr(::dsGetAttributeEntry(mNode, mData, attrListRef, j, &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());
+						
+						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(mNode, mData, k, attributeValueListRef, &attributeValue));
+								std::auto_ptr<char> data(CStringFromBuffer(&attributeValue->fAttributeValueData));
+								CFStringUtil strvalue(data.get());
+								::CFArrayAppendValue(values, strvalue.get());
+								::dsDeallocAttributeValueEntry(mDir, attributeValue);
+								attributeValue = NULL;
+							}
+							::CFDictionarySetValue(vresult, cfattrname.get(), values);
+							::CFRelease(values);
+							values = NULL;
+						}
+						else
+						{
+							// Get the attribute value and store in results
+							tAttributeValueEntryPtr attributeValue = NULL;
+							ThrowIfDSErr(::dsGetAttributeValue(mNode, mData, 1, attributeValueListRef, &attributeValue));
+							std::auto_ptr<char> data(CStringFromBuffer(&attributeValue->fAttributeValueData));
+							CFStringUtil strvalue(data.get());
+							::CFDictionarySetValue(vresult, cfattrname.get(), strvalue.get());
+							::dsDeallocAttributeValueEntry(mDir, attributeValue);
+							attributeValue = NULL;
+						}
+					}
+					
+					::dsCloseAttributeValueList(attributeValueListRef);
+					attributeValueListRef = NULL;
+					::dsDeallocAttributeEntry(mDir, attributeInfoPtr);
+					attributeInfoPtr = NULL;
+				}
+				
+				// Add dictionary of values to result array
+				CFStringUtil str(recname.get());
+				::CFDictionarySetValue(result, str.get(), vresult);
+				::CFRelease(vresult);
+				vresult = NULL;
+				
+				// Clean-up
+				::dsCloseAttributeList(attrListRef);
+				attrListRef = 0L;
+				::dsDeallocRecordEntry(mDir, pRecEntry);
+				pRecEntry = NULL;
+			}
+		} while (context != NULL); // Loop until all data has been obtained.
+		
+		// Cleanup
+		::dsDataListDeallocate(mDir, recTypes);
+		::dsDataListDeallocate(mDir, attrTypes);
+		::dsDataNodeDeAllocate(mDir, queryValue);
+		::dsDataNodeDeAllocate(mDir, queryAttr);
+		free(recTypes);
+		free(attrTypes);
+		RemoveBuffer();
+		CloseNode();
+		CloseService();
+	}
+	catch(long dsStatus)
+	{
+		// Cleanup
+		if (context != NULL)
+			::dsReleaseContinueData(mDir, context);
+		if (attrListRef != 0L)
+			::dsCloseAttributeList(attrListRef);
+		if (pRecEntry != NULL)
+			dsDeallocRecordEntry(mDir, pRecEntry);
+		if (recTypes != NULL)
+		{
+			::dsDataListDeallocate(mDir, recTypes);
+			free(recTypes);
+			recTypes = NULL;
+		}
+		if (attrTypes != NULL)
+		{
+			::dsDataListDeallocate(mDir, attrTypes);
+			free(attrTypes);
+			attrTypes = NULL;
+		}
+		if (queryValue != NULL)
+		{
+			::dsDataNodeDeAllocate(mDir, queryValue);
+			queryValue = NULL;
+		}
+		if (queryAttr != NULL)
+		{
+			::dsDataNodeDeAllocate(mDir, queryAttr);
+			queryAttr = NULL;
+		}
+		RemoveBuffer();
+		CloseNode();
+		CloseService();
+		
+		if (values != NULL)
+		{
+			::CFRelease(values);
+			values = NULL;
+		}
+		if (vresult != NULL)
+		{
+			::CFRelease(vresult);
+			vresult = NULL;
+		}
+		if (result != NULL)
+		{
+			::CFRelease(result);
+			result = NULL;
+		}
+		throw;
+	}
+	
+	return result;
+}
+
 // AuthenticationGetNode
 // 
 // Authenticate a user to the directory.
@@ -846,6 +1108,106 @@
 	}
 }
 
+struct SBuildSimpleQueryIterator
+{
+	tDirReference		mDir;
+	tDataNodePtr&		mAttr;
+	tDataNodePtr&		mValue;
+	
+	SBuildSimpleQueryIterator(tDirReference dir, tDataNodePtr& attr, tDataNodePtr& value) :
+		mDir(dir), mAttr(attr), mValue(value) {}
+};
+
+// CFDictionary iterator callback that adds either the key or value to a DS list.
+static void BuildSimpleQueryIterator(const void* key, const void* value, void* ref)
+{
+	SBuildSimpleQueryIterator* info = (SBuildSimpleQueryIterator*)ref;
+
+	CFStringRef strkey = (CFStringRef)key;
+	CFStringUtil cstrkey(strkey);
+	info->mAttr = ::dsDataNodeAllocateString(info->mDir, cstrkey.temp_str());
+	ThrowIfNULL(info->mAttr);
+
+	CFStringRef strvalue = (CFStringRef)value;
+	CFStringUtil cstrvalue(strvalue);
+	info->mValue = ::dsDataNodeAllocateString(info->mDir, cstrvalue.temp_str());
+	ThrowIfNULL(info->mValue);
+}
+
+void CDirectoryService::BuildSimpleQuery(CFDictionaryRef dict, tDataNodePtr& attr, tDataNodePtr& value)
+{
+	SBuildSimpleQueryIterator info(mDir, attr, value);
+
+	::CFDictionaryApplyFunction(dict, BuildSimpleQueryIterator, &info);
+}
+
+struct SBuildCompoundQueryIterator
+{
+	CFStringRef			mFormat;
+	CFMutableStringRef	mCompound;
+	
+	SBuildCompoundQueryIterator(CFStringRef format, CFMutableStringRef compound) :
+		mFormat(format), mCompound(compound) {}
+};
+
+// CFDictionary iterator callback that adds either the key or value to a DS list.
+static void BuildCompoundQueryIterator(const void* key, const void* value, void* ref)
+{
+	SBuildCompoundQueryIterator* info = (SBuildCompoundQueryIterator*)ref;
+
+	CFStringRef strkey = (CFStringRef)key;
+	CFStringRef strvalue = (CFStringRef)value;
+	::CFStringAppendFormat(info->mCompound, NULL, info->mFormat, strkey, strvalue);
+}
+
+void CDirectoryService::BuildCompoundQuery(CFDictionaryRef dict, tDirPatternMatch matchType, bool allmatch, tDataNodePtr& value)
+{	
+	CFStringRef format = NULL;
+	switch(matchType)
+	{
+		case eDSExact:
+		case eDSiExact:
+			format = CFSTR("(%@=%@)");
+			break;
+		case eDSStartsWith:
+		case eDSiStartsWith:
+			format = CFSTR("(%@=%@*)");
+			break;
+		case eDSEndsWith:
+		case eDSiEndsWith:
+			format = CFSTR("(%@=*%@)");
+			break;
+		case eDSContains:
+		case eDSiContains:
+			format = CFSTR("(%@=*%@*)");
+			break;
+		case eDSLessThan:
+		case eDSiLessThan:
+			format = CFSTR("(%@<%@)");
+			break;
+		case eDSGreaterThan:
+		case eDSiGreaterThan:
+			format = CFSTR("(%@>%@)");
+			break;
+		default:
+			format = CFSTR("(%@=*%@*)");
+			break;
+	}
+
+	// Now build the compound expression using the match type format we just setup
+	CFMutableStringRef compound = CFStringCreateMutable(kCFAllocatorDefault, 0);
+	::CFStringAppend(compound, allmatch ? CFSTR("(&") : CFSTR("(|"));
+	
+	SBuildCompoundQueryIterator info(format, compound);
+	::CFDictionaryApplyFunction(dict, BuildCompoundQueryIterator, &info);
+
+	::CFStringAppend(compound, CFSTR(")"));
+	CFStringUtil cstrvalue(compound);
+	value = ::dsDataNodeAllocateString(mDir, cstrvalue.temp_str());
+	::CFRelease(compound);
+	ThrowIfNULL(value);
+}
+
 // CStringFromBuffer
 // 
 // Convert data in a buffer into a c-string.

Modified: PyOpenDirectory/branches/users/cdaboo/od-schema-1044/src/CDirectoryService.h
===================================================================
--- PyOpenDirectory/branches/users/cdaboo/od-schema-1044/src/CDirectoryService.h	2007-01-16 18:30:59 UTC (rev 1051)
+++ PyOpenDirectory/branches/users/cdaboo/od-schema-1044/src/CDirectoryService.h	2007-01-16 20:30:25 UTC (rev 1052)
@@ -33,6 +33,7 @@
 	~CDirectoryService();
 	
 	CFMutableDictionaryRef ListAllRecordsWithAttributes(const char* recordType, CFArrayRef attributes);
+	CFMutableDictionaryRef QueryRecordsWithAttributes(CFDictionaryRef query, int matchType, bool casei, bool allmatch, const char* recordType, CFArrayRef attributes);
 
 	bool AuthenticateUserBasic(const char* user, const char* pswd, bool& result);
 	bool AuthenticateUserDigest(const char* user, const char* challenge, const char* response, const char* method, bool& result);
@@ -45,6 +46,7 @@
 	UInt32				mDataSize;
 	
 	CFMutableDictionaryRef _ListAllRecordsWithAttributes(const char* type, CFArrayRef names, CFArrayRef attrs);
+	CFMutableDictionaryRef _QueryRecordsWithAttributes(CFDictionaryRef query, int matchType, bool casei, bool allmatch, const char* recordType, CFArrayRef attributes);
 
 	CFStringRef CDirectoryService::AuthenticationGetNode(const char* user);
 	bool NativeAuthenticationBasic(const char* user, const char* pswd);
@@ -64,6 +66,9 @@
 	void ReallocBuffer();
 
 	void BuildStringDataList(CFArrayRef strs, tDataListPtr data);
+	
+	void BuildSimpleQuery(CFDictionaryRef dict, tDataNodePtr& attr, tDataNodePtr& value);
+	void BuildCompoundQuery(CFDictionaryRef dict, tDirPatternMatch matchType, bool allmatch, tDataNodePtr& value);
 
 	char* CStringFromBuffer(tDataBufferPtr data);
 	char* CStringFromData(const char* data, size_t len);

Modified: PyOpenDirectory/branches/users/cdaboo/od-schema-1044/src/PythonWrapper.cpp
===================================================================
--- PyOpenDirectory/branches/users/cdaboo/od-schema-1044/src/PythonWrapper.cpp	2007-01-16 18:30:59 UTC (rev 1051)
+++ PyOpenDirectory/branches/users/cdaboo/od-schema-1044/src/PythonWrapper.cpp	2007-01-16 20:30:25 UTC (rev 1052)
@@ -345,6 +345,83 @@
 }
 
 /*
+def queryRecordsWithAttributes(obj, query, matchType, casei, allmatch, recordType, attributes):
+    """
+    List records in Open Directory matching specified criteria, and return key attributes for each one.
+    
+    @param obj: C{object} the object obtained from an odInit call.
+    @param query: C{dict} containing attribute/value pairs to search.
+    @param matchType: C{int} DS match type to use when searching.
+    @param casei: C{True} to do case-insenstive match, C{False} otherwise.
+    @param allmatch: C{True} to do require all attribute/value pairs to match (AND), C{False} otherwise (OR).
+    @param recordType: C{str} containing the OD record type to lookup.
+    @param attributes: C{list} containing the attributes to return for each record.
+    @return: C{dict} containing a C{dict} of attributes for each record found, 
+        or C{None} otherwise.
+    """
+ */
+extern "C" PyObject *queryRecordsWithAttributes(PyObject *self, PyObject *args)
+{
+	PyObject* pyds;
+	PyObject* query;
+	int matchType;
+	PyObject* caseio;
+	bool casei;
+	PyObject* allmatcho;
+	bool allmatch;
+	const char* recordType;
+	PyObject* attributes;
+    if (!PyArg_ParseTuple(args, "OOiOOsO", &pyds, &query, &matchType, &caseio, &allmatcho, &recordType, &attributes) ||
+    	!PyCObject_Check(pyds) || !PyDict_Check(query) || !PyBool_Check(caseio) || !PyBool_Check(allmatcho) || !PyList_Check(attributes))
+    {
+		PyErr_SetObject(ODException_class, Py_BuildValue("((s:i))", "DirectoryServices queryRecordsWithAttributes: could not parse arguments", 0));		
+        return NULL;
+    }
+	
+	// Convert dict to CFDictionary of CFString
+	CFDictionaryRef cfquery = PyDictToCFDictionary(query);
+	if (cfquery == NULL)
+    {
+		PyErr_SetObject(ODException_class, Py_BuildValue("((s:i))", "DirectoryServices queryRecordsWithAttributes: could not parse query dict", 0));		
+        return NULL;
+    }
+
+	casei = (caseio == Py_True);
+
+	allmatch = (allmatcho == Py_True);
+
+	// Convert list to CFArray of CFString
+	CFArrayRef cfattributes = PyListToCFArray(attributes);
+	if (cfattributes == NULL)
+    {
+		PyErr_SetObject(ODException_class, Py_BuildValue("((s:i))", "DirectoryServices queryRecordsWithAttributes: could not parse attributes list", 0));		
+		CFRelease(cfquery);
+        return NULL;
+    }
+
+	CDirectoryService* ds = static_cast<CDirectoryService*>(PyCObject_AsVoidPtr(pyds));
+	if (ds != NULL)
+	{
+		CFMutableDictionaryRef dict = ds->QueryRecordsWithAttributes(cfquery, matchType, casei, allmatch, recordType, cfattributes);
+		if (dict != NULL)
+		{
+			PyObject* result = CFDictionaryDictionaryToPyDict(dict);
+			CFRelease(dict);
+			CFRelease(cfquery);
+			CFRelease(cfattributes);
+			
+			return result;
+		}
+	}
+	else
+		PyErr_SetObject(ODException_class, Py_BuildValue("((s:i))", "DirectoryServices queryRecordsWithAttributes: invalid directory service argument", 0));		
+	
+	CFRelease(cfquery);
+	CFRelease(cfattributes);
+	return NULL;
+}
+
+/*
 def authenticateUserBasic(obj, user, pswd):
 	"""
 	Authenticate a user with a password to Open Directory.
@@ -433,6 +510,8 @@
 		"Initialize the Open Directory system."},
     {"listAllRecordsWithAttributes",  listAllRecordsWithAttributes, METH_VARARGS,
 		"List all records of the specified type in Open Directory, returning requested attributes."},
+    {"queryRecordsWithAttributes",  queryRecordsWithAttributes, METH_VARARGS,
+		"List records in Open Directory matching specified criteria, and return key attributes for each one."},
     {"authenticateUserBasic",  authenticateUserBasic, METH_VARARGS,
 		"Authenticate a user with a password to Open Directory using plain text authentication."},
     {"authenticateUserDigest",  authenticateUserDigest, METH_VARARGS,

Modified: PyOpenDirectory/branches/users/cdaboo/od-schema-1044/support/PyOpenDirectory.xcodeproj/cyrusdaboo.mode1
===================================================================
--- PyOpenDirectory/branches/users/cdaboo/od-schema-1044/support/PyOpenDirectory.xcodeproj/cyrusdaboo.mode1	2007-01-16 18:30:59 UTC (rev 1051)
+++ PyOpenDirectory/branches/users/cdaboo/od-schema-1044/support/PyOpenDirectory.xcodeproj/cyrusdaboo.mode1	2007-01-16 20:30:25 UTC (rev 1052)
@@ -185,48 +185,7 @@
 	<key>Notifications</key>
 	<array/>
 	<key>OpenEditors</key>
-	<array>
-		<dict>
-			<key>Content</key>
-			<dict>
-				<key>PBXProjectModuleGUID</key>
-				<string>AF8B08260AA33EF5008DBE58</string>
-				<key>PBXProjectModuleLabel</key>
-				<string>PythonWrapper.cpp</string>
-				<key>PBXSplitModuleInNavigatorKey</key>
-				<dict>
-					<key>Split0</key>
-					<dict>
-						<key>PBXProjectModuleGUID</key>
-						<string>AF8B08270AA33EF5008DBE58</string>
-						<key>PBXProjectModuleLabel</key>
-						<string>PythonWrapper.cpp</string>
-						<key>_historyCapacity</key>
-						<integer>0</integer>
-						<key>bookmark</key>
-						<string>AF5B518E0AA3689500DCCB52</string>
-						<key>history</key>
-						<array>
-							<string>AF8B08280AA33EF5008DBE58</string>
-						</array>
-					</dict>
-					<key>SplitCount</key>
-					<string>1</string>
-				</dict>
-				<key>StatusBarVisibility</key>
-				<true/>
-			</dict>
-			<key>Geometry</key>
-			<dict>
-				<key>Frame</key>
-				<string>{{0, 20}, {811, 731}}</string>
-				<key>PBXModuleWindowStatusBarHidden2</key>
-				<false/>
-				<key>RubberWindowFrame</key>
-				<string>113 60 811 772 0 0 1680 1028 </string>
-			</dict>
-		</dict>
-	</array>
+	<array/>
 	<key>PerspectiveWidths</key>
 	<array>
 		<integer>-1</integer>
@@ -238,11 +197,12 @@
 			<key>ChosenToolbarItems</key>
 			<array>
 				<string>active-target-popup</string>
+				<string>active-buildstyle-popup</string>
 				<string>action</string>
 				<string>NSToolbarFlexibleSpaceItem</string>
 				<string>buildOrClean</string>
-				<string>build-and-runOrDebug</string>
 				<string>build-and-debug</string>
+				<string>build-and-runOrDebug</string>
 				<string>com.apple.ide.PBXToolbarStopButton</string>
 				<string>get-info</string>
 				<string>toggle-editor</string>
@@ -327,7 +287,7 @@
 							<real>186</real>
 						</array>
 						<key>RubberWindowFrame</key>
-						<string>374 263 1006 600 0 0 1680 1028 </string>
+						<string>152 154 1006 600 0 0 1280 832 </string>
 					</dict>
 					<key>Module</key>
 					<string>PBXSmartGroupTreeModule</string>
@@ -364,7 +324,7 @@
 								<key>Frame</key>
 								<string>{{0, 0}, {798, 0}}</string>
 								<key>RubberWindowFrame</key>
-								<string>374 263 1006 600 0 0 1680 1028 </string>
+								<string>152 154 1006 600 0 0 1280 832 </string>
 							</dict>
 							<key>Module</key>
 							<string>PBXNavigatorGroup</string>
@@ -386,7 +346,7 @@
 								<key>Frame</key>
 								<string>{{0, 5}, {798, 554}}</string>
 								<key>RubberWindowFrame</key>
-								<string>374 263 1006 600 0 0 1680 1028 </string>
+								<string>152 154 1006 600 0 0 1280 832 </string>
 							</dict>
 							<key>Module</key>
 							<string>XCDetailModule</string>
@@ -410,9 +370,9 @@
 			</array>
 			<key>TableOfContents</key>
 			<array>
-				<string>AF5B51850AA343BE00DCCB52</string>
+				<string>AF15D5FF0B5726C000E9069E</string>
 				<string>1CE0B1FE06471DED0097A5F4</string>
-				<string>AF5B51860AA343BE00DCCB52</string>
+				<string>AF15D6000B5726C000E9069E</string>
 				<string>1CE0B20306471E060097A5F4</string>
 				<string>1CE0B20506471E060097A5F4</string>
 			</array>
@@ -546,11 +506,16 @@
 	<integer>5</integer>
 	<key>WindowOrderList</key>
 	<array>
-		<string>AF8B08260AA33EF5008DBE58</string>
+		<string>AF15D6040B5726C000E9069E</string>
+		<string>AF15D6050B5726C000E9069E</string>
+		<string>AF155AB60A502582007E1E6E</string>
+		<string>AF155A7F0A501FE9007E1E6E</string>
+		<string>1CD10A99069EF8BA00B06720</string>
+		<string>AF15D5DB0B571E0F00E9069E</string>
 		<string>/Users/cyrusdaboo/Documents/Development/Apple/eclipse/PyOpenDirectory/support/PyOpenDirectory.xcodeproj</string>
 	</array>
 	<key>WindowString</key>
-	<string>374 263 1006 600 0 0 1680 1028 </string>
+	<string>152 154 1006 600 0 0 1280 832 </string>
 	<key>WindowTools</key>
 	<array>
 		<dict>
@@ -573,7 +538,7 @@
 								<key>PBXProjectModuleGUID</key>
 								<string>1CD0528F0623707200166675</string>
 								<key>PBXProjectModuleLabel</key>
-								<string>test.cpp</string>
+								<string>CDirectoryService.cpp</string>
 								<key>StatusBarVisibility</key>
 								<true/>
 							</dict>
@@ -582,7 +547,7 @@
 								<key>Frame</key>
 								<string>{{0, 0}, {1075, 361}}</string>
 								<key>RubberWindowFrame</key>
-								<string>511 368 1075 643 0 0 1680 1028 </string>
+								<string>173 182 1075 643 0 0 1280 832 </string>
 							</dict>
 							<key>Module</key>
 							<string>PBXNavigatorGroup</string>
@@ -606,7 +571,7 @@
 								<key>Frame</key>
 								<string>{{0, 366}, {1075, 236}}</string>
 								<key>RubberWindowFrame</key>
-								<string>511 368 1075 643 0 0 1680 1028 </string>
+								<string>173 182 1075 643 0 0 1280 832 </string>
 							</dict>
 							<key>Module</key>
 							<string>PBXBuildResultsModule</string>
@@ -629,14 +594,14 @@
 			<key>TableOfContents</key>
 			<array>
 				<string>AF155A7F0A501FE9007E1E6E</string>
-				<string>AF8B08020AA33E0B008DBE58</string>
+				<string>AF15D5E40B571E2200E9069E</string>
 				<string>1CD0528F0623707200166675</string>
 				<string>XCMainBuildResultsModuleGUID</string>
 			</array>
 			<key>ToolbarConfiguration</key>
 			<string>xcode.toolbar.config.build</string>
 			<key>WindowString</key>
-			<string>511 368 1075 643 0 0 1680 1028 </string>
+			<string>173 182 1075 643 0 0 1280 832 </string>
 			<key>WindowToolGUID</key>
 			<string>AF155A7F0A501FE9007E1E6E</string>
 			<key>WindowToolIsVisible</key>
@@ -671,8 +636,8 @@
 										<string>yes</string>
 										<key>sizes</key>
 										<array>
-											<string>{{0, 0}, {457, 329}}</string>
-											<string>{{457, 0}, {561, 329}}</string>
+											<string>{{0, 0}, {454, 360}}</string>
+											<string>{{454, 0}, {564, 360}}</string>
 										</array>
 									</dict>
 									<key>VerticalSplitView</key>
@@ -687,8 +652,8 @@
 										<string>yes</string>
 										<key>sizes</key>
 										<array>
-											<string>{{0, 0}, {1018, 329}}</string>
-											<string>{{0, 329}, {1018, 374}}</string>
+											<string>{{0, 0}, {1018, 360}}</string>
+											<string>{{0, 360}, {1018, 343}}</string>
 										</array>
 									</dict>
 								</dict>
@@ -712,7 +677,7 @@
 								<key>Frame</key>
 								<string>{{0, 0}, {1018, 703}}</string>
 								<key>RubberWindowFrame</key>
-								<string>36 261 1018 744 0 0 1680 1028 </string>
+								<string>14 85 1018 744 0 0 1280 832 </string>
 							</dict>
 							<key>Module</key>
 							<string>PBXDebugSessionModule</string>
@@ -735,19 +700,19 @@
 			<key>TableOfContents</key>
 			<array>
 				<string>1CD10A99069EF8BA00B06720</string>
-				<string>AF155B9E0A503D93007E1E6E</string>
+				<string>AF15D5D50B571E0F00E9069E</string>
 				<string>1C162984064C10D400B95A72</string>
-				<string>AF155B9F0A503D93007E1E6E</string>
-				<string>AF155BA00A503D93007E1E6E</string>
-				<string>AF155BA10A503D93007E1E6E</string>
-				<string>AF155BA20A503D93007E1E6E</string>
-				<string>AF155BA30A503D93007E1E6E</string>
-				<string>AF155BA40A503D93007E1E6E</string>
+				<string>AF15D5D60B571E0F00E9069E</string>
+				<string>AF15D5D70B571E0F00E9069E</string>
+				<string>AF15D5D80B571E0F00E9069E</string>
+				<string>AF15D5D90B571E0F00E9069E</string>
+				<string>AF15D5DA0B571E0F00E9069E</string>
+				<string>AF15D5DB0B571E0F00E9069E</string>
 			</array>
 			<key>ToolbarConfiguration</key>
 			<string>xcode.toolbar.config.debug</string>
 			<key>WindowString</key>
-			<string>36 261 1018 744 0 0 1680 1028 </string>
+			<string>14 85 1018 744 0 0 1280 832 </string>
 			<key>WindowToolGUID</key>
 			<string>1CD10A99069EF8BA00B06720</string>
 			<key>WindowToolIsVisible</key>
@@ -873,7 +838,7 @@
 								<key>Frame</key>
 								<string>{{0, 0}, {440, 358}}</string>
 								<key>RubberWindowFrame</key>
-								<string>523 605 440 400 0 0 1680 1028 </string>
+								<string>354 416 440 400 0 0 1280 832 </string>
 							</dict>
 							<key>Module</key>
 							<string>PBXDebugCLIModule</string>
@@ -896,11 +861,11 @@
 			<key>TableOfContents</key>
 			<array>
 				<string>AF155AB60A502582007E1E6E</string>
-				<string>AF155C1A0A50583F007E1E6E</string>
+				<string>AF15D5E50B571E2200E9069E</string>
 				<string>1C78EAAC065D492600B07095</string>
 			</array>
 			<key>WindowString</key>
-			<string>523 605 440 400 0 0 1680 1028 </string>
+			<string>354 416 440 400 0 0 1280 832 </string>
 			<key>WindowToolGUID</key>
 			<string>AF155AB60A502582007E1E6E</string>
 			<key>WindowToolIsVisible</key>

Modified: PyOpenDirectory/branches/users/cdaboo/od-schema-1044/support/PyOpenDirectory.xcodeproj/cyrusdaboo.mode1v3
===================================================================
--- PyOpenDirectory/branches/users/cdaboo/od-schema-1044/support/PyOpenDirectory.xcodeproj/cyrusdaboo.mode1v3	2007-01-16 18:30:59 UTC (rev 1051)
+++ PyOpenDirectory/branches/users/cdaboo/od-schema-1044/support/PyOpenDirectory.xcodeproj/cyrusdaboo.mode1v3	2007-01-16 20:30:25 UTC (rev 1052)
@@ -195,7 +195,48 @@
 	<key>Notifications</key>
 	<array/>
 	<key>OpenEditors</key>
-	<array/>
+	<array>
+		<dict>
+			<key>Content</key>
+			<dict>
+				<key>PBXProjectModuleGUID</key>
+				<string>AF99D3960B5D69F100F4C984</string>
+				<key>PBXProjectModuleLabel</key>
+				<string>PythonWrapper.cpp</string>
+				<key>PBXSplitModuleInNavigatorKey</key>
+				<dict>
+					<key>Split0</key>
+					<dict>
+						<key>PBXProjectModuleGUID</key>
+						<string>AF99D3970B5D69F100F4C984</string>
+						<key>PBXProjectModuleLabel</key>
+						<string>PythonWrapper.cpp</string>
+						<key>_historyCapacity</key>
+						<integer>0</integer>
+						<key>bookmark</key>
+						<string>AF99D3AE0B5D6F5D00F4C984</string>
+						<key>history</key>
+						<array>
+							<string>AF99D3940B5D69C700F4C984</string>
+						</array>
+					</dict>
+					<key>SplitCount</key>
+					<string>1</string>
+				</dict>
+				<key>StatusBarVisibility</key>
+				<true/>
+			</dict>
+			<key>Geometry</key>
+			<dict>
+				<key>Frame</key>
+				<string>{{0, 20}, {972, 884}}</string>
+				<key>PBXModuleWindowStatusBarHidden2</key>
+				<false/>
+				<key>RubberWindowFrame</key>
+				<string>303 147 972 925 0 0 1920 1178 </string>
+			</dict>
+		</dict>
+	</array>
 	<key>PerspectiveWidths</key>
 	<array>
 		<integer>-1</integer>
@@ -304,14 +345,12 @@
 					<key>Dock</key>
 					<array>
 						<dict>
-							<key>BecomeActive</key>
-							<true/>
 							<key>ContentConfiguration</key>
 							<dict>
 								<key>PBXProjectModuleGUID</key>
 								<string>1CE0B20306471E060097A5F4</string>
 								<key>PBXProjectModuleLabel</key>
-								<string>CDirectoryService.cpp</string>
+								<string>test.cpp</string>
 								<key>PBXSplitModuleInNavigatorKey</key>
 								<dict>
 									<key>Split0</key>
@@ -319,27 +358,31 @@
 										<key>PBXProjectModuleGUID</key>
 										<string>1CE0B20406471E060097A5F4</string>
 										<key>PBXProjectModuleLabel</key>
-										<string>CDirectoryService.cpp</string>
+										<string>test.cpp</string>
 										<key>_historyCapacity</key>
 										<integer>0</integer>
 										<key>bookmark</key>
-										<string>AFAC4ECD0B4C437900D59661</string>
+										<string>AF99D3AD0B5D6F5D00F4C984</string>
 										<key>history</key>
 										<array>
-											<string>AF8974920B4AFA6600965268</string>
-											<string>AFAC4E900B4C267800D59661</string>
-											<string>AFAC4ECB0B4C437900D59661</string>
-											<string>AFAC4EBA0B4C41FE00D59661</string>
+											<string>AF99D2C70B5D2FD100F4C984</string>
+											<string>AF99D3790B5D55FC00F4C984</string>
+											<string>AF99D35C0B5D539800F4C984</string>
 										</array>
 										<key>prevStack</key>
 										<array>
-											<string>AF8974940B4AFA6600965268</string>
-											<string>AFAC4E700B4C18D400D59661</string>
-											<string>AFAC4E790B4C23EC00D59661</string>
-											<string>AFAC4E890B4C25AD00D59661</string>
-											<string>AFAC4E920B4C267800D59661</string>
-											<string>AFAC4EC00B4C431100D59661</string>
-											<string>AFAC4ECC0B4C437900D59661</string>
+											<string>AF99D2B40B5D2CF000F4C984</string>
+											<string>AF99D2BC0B5D2D2A00F4C984</string>
+											<string>AF99D2C80B5D2FD100F4C984</string>
+											<string>AF99D2E00B5D381900F4C984</string>
+											<string>AF99D3310B5D4C9300F4C984</string>
+											<string>AF99D3320B5D4C9300F4C984</string>
+											<string>AF99D3330B5D4C9300F4C984</string>
+											<string>AF99D3340B5D4C9300F4C984</string>
+											<string>AF99D3350B5D4C9300F4C984</string>
+											<string>AF99D35E0B5D539800F4C984</string>
+											<string>AF99D35F0B5D539800F4C984</string>
+											<string>AF99D37A0B5D55FC00F4C984</string>
 										</array>
 									</dict>
 									<key>SplitCount</key>
@@ -361,6 +404,8 @@
 							<string>503pt</string>
 						</dict>
 						<dict>
+							<key>BecomeActive</key>
+							<true/>
 							<key>ContentConfiguration</key>
 							<dict>
 								<key>PBXProjectModuleGUID</key>
@@ -397,9 +442,9 @@
 			</array>
 			<key>TableOfContents</key>
 			<array>
-				<string>AFAC4E720B4C18D400D59661</string>
+				<string>AF99D2690B5D1D6000F4C984</string>
 				<string>1CE0B1FE06471DED0097A5F4</string>
-				<string>AFAC4E730B4C18D400D59661</string>
+				<string>AF99D26A0B5D1D6000F4C984</string>
 				<string>1CE0B20306471E060097A5F4</string>
 				<string>1CE0B20506471E060097A5F4</string>
 			</array>
@@ -533,14 +578,50 @@
 	<integer>5</integer>
 	<key>WindowOrderList</key>
 	<array>
-		<string>AFAC4EC90B4C436E00D59661</string>
+		<string>AF99D3AF0B5D6F5D00F4C984</string>
+		<string>AF99D3AA0B5D6EB600F4C984</string>
+		<string>AF99D3AB0B5D6EB600F4C984</string>
+		<string>AF99D3990B5D69F100F4C984</string>
+		<string>AF99D3910B5D5FA700F4C984</string>
+		<string>AF99D37E0B5D56A900F4C984</string>
+		<string>AF99D3640B5D539800F4C984</string>
+		<string>AF99D3650B5D539800F4C984</string>
+		<string>AF99D3610B5D539800F4C984</string>
+		<string>AF99D3660B5D539800F4C984</string>
+		<string>AF99D3670B5D539800F4C984</string>
+		<string>AF99D3480B5D503D00F4C984</string>
+		<string>AF99D3410B5D4E3A00F4C984</string>
+		<string>AF99D33E0B5D4E3A00F4C984</string>
+		<string>AF99D3370B5D4C9300F4C984</string>
+		<string>AF99D3380B5D4C9300F4C984</string>
+		<string>AF99D3390B5D4C9300F4C984</string>
+		<string>AF99D3230B5D483900F4C984</string>
+		<string>AF99D31C0B5D471300F4C984</string>
+		<string>AF99D30F0B5D469A00F4C984</string>
+		<string>AF99D3030B5D3E5F00F4C984</string>
+		<string>AF99D3040B5D3E5F00F4C984</string>
+		<string>AF99D2EB0B5D3BA200F4C984</string>
+		<string>AF99D2EC0B5D3BA200F4C984</string>
+		<string>AF99D2ED0B5D3BA200F4C984</string>
+		<string>AF99D2E60B5D3BA200F4C984</string>
+		<string>AF99D2CB0B5D2FD100F4C984</string>
+		<string>AF99D2C10B5D2D2A00F4C984</string>
 		<string>AFBD6A500B4AC44700A565AE</string>
-		<string>AFAC4E740B4C18D400D59661</string>
-		<string>AFAC4E750B4C18D400D59661</string>
-		<string>AFAC4E760B4C18D400D59661</string>
-		<string>/Users/cyrusdaboo/Documents/Development/Apple/eclipse/PyOpenDirectory/support/PyOpenDirectory.xcodeproj</string>
+		<string>AF99D2A60B5D2C2C00F4C984</string>
+		<string>AF99D29B0B5D275900F4C984</string>
+		<string>AF99D29C0B5D275900F4C984</string>
+		<string>AF99D29D0B5D275900F4C984</string>
+		<string>AF99D29E0B5D275900F4C984</string>
+		<string>AF99D29F0B5D275900F4C984</string>
+		<string>AF99D2A00B5D275900F4C984</string>
+		<string>AF99D2A10B5D275900F4C984</string>
+		<string>AF99D2A20B5D275900F4C984</string>
+		<string>AF99D2980B5D275900F4C984</string>
+		<string>AF99D2A30B5D275900F4C984</string>
 		<string>1CD10A99069EF8BA00B06720</string>
+		<string>AF99D3960B5D69F100F4C984</string>
 		<string>1C78EAAD065D492600B07095</string>
+		<string>/Users/cyrusdaboo/Documents/Development/Apple/eclipse/PyOpenDirectory/support/PyOpenDirectory.xcodeproj</string>
 	</array>
 	<key>WindowString</key>
 	<string>3 232 1359 946 0 0 1920 1178 </string>
@@ -566,7 +647,7 @@
 								<key>PBXProjectModuleGUID</key>
 								<string>1CD0528F0623707200166675</string>
 								<key>PBXProjectModuleLabel</key>
-								<string>test.cpp</string>
+								<string>PythonWrapper.cpp</string>
 								<key>StatusBarVisibility</key>
 								<true/>
 							</dict>
@@ -622,7 +703,7 @@
 			<key>TableOfContents</key>
 			<array>
 				<string>AFBD6A500B4AC44700A565AE</string>
-				<string>AFAC4E640B4C182700D59661</string>
+				<string>AF99D2AE0B5D2CCB00F4C984</string>
 				<string>1CD0528F0623707200166675</string>
 				<string>XCMainBuildResultsModuleGUID</string>
 			</array>
@@ -664,8 +745,8 @@
 										<string>yes</string>
 										<key>sizes</key>
 										<array>
-											<string>{{0, 0}, {588, 382}}</string>
-											<string>{{588, 0}, {701, 382}}</string>
+											<string>{{0, 0}, {588, 390}}</string>
+											<string>{{588, 0}, {701, 390}}</string>
 										</array>
 									</dict>
 									<key>VerticalSplitView</key>
@@ -680,8 +761,8 @@
 										<string>yes</string>
 										<key>sizes</key>
 										<array>
-											<string>{{0, 0}, {1289, 382}}</string>
-											<string>{{0, 382}, {1289, 368}}</string>
+											<string>{{0, 0}, {1289, 390}}</string>
+											<string>{{0, 390}, {1289, 360}}</string>
 										</array>
 									</dict>
 								</dict>
@@ -709,17 +790,17 @@
 										<string>Name</string>
 										<real>213</real>
 										<string>Value</string>
-										<real>85</real>
+										<real>140</real>
 										<string>Summary</string>
-										<real>378</real>
+										<real>323</real>
 									</array>
 									<key>Frame</key>
-									<string>{{588, 0}, {701, 382}}</string>
+									<string>{{588, 0}, {701, 390}}</string>
 									<key>RubberWindowFrame</key>
-									<string>300 338 1289 791 0 0 1920 1178 </string>
+									<string>1 380 1289 791 0 0 1920 1178 </string>
 								</dict>
 								<key>RubberWindowFrame</key>
-								<string>300 338 1289 791 0 0 1920 1178 </string>
+								<string>1 380 1289 791 0 0 1920 1178 </string>
 							</dict>
 							<key>Module</key>
 							<string>PBXDebugSessionModule</string>
@@ -742,22 +823,22 @@
 			<key>TableOfContents</key>
 			<array>
 				<string>1CD10A99069EF8BA00B06720</string>
-				<string>AFAC4E650B4C182700D59661</string>
+				<string>AF99D26B0B5D1D6000F4C984</string>
 				<string>1C162984064C10D400B95A72</string>
-				<string>AFAC4E660B4C182700D59661</string>
-				<string>AFAC4E670B4C182700D59661</string>
-				<string>AFAC4E680B4C182700D59661</string>
-				<string>AFAC4E690B4C182700D59661</string>
-				<string>AFAC4E6A0B4C182700D59661</string>
+				<string>AF99D26C0B5D1D6000F4C984</string>
+				<string>AF99D26D0B5D1D6000F4C984</string>
+				<string>AF99D26E0B5D1D6000F4C984</string>
+				<string>AF99D26F0B5D1D6000F4C984</string>
+				<string>AF99D2700B5D1D6000F4C984</string>
 			</array>
 			<key>ToolbarConfiguration</key>
 			<string>xcode.toolbar.config.debugV3</string>
 			<key>WindowString</key>
-			<string>300 338 1289 791 0 0 1920 1178 </string>
+			<string>1 380 1289 791 0 0 1920 1178 </string>
 			<key>WindowToolGUID</key>
 			<string>1CD10A99069EF8BA00B06720</string>
 			<key>WindowToolIsVisible</key>
-			<true/>
+			<false/>
 		</dict>
 		<dict>
 			<key>FirstTimeWindowDisplayed</key>
@@ -881,7 +962,7 @@
 								<key>Frame</key>
 								<string>{{0, 0}, {1110, 583}}</string>
 								<key>RubberWindowFrame</key>
-								<string>695 422 1110 624 0 0 1920 1178 </string>
+								<string>768 420 1110 624 0 0 1920 1178 </string>
 							</dict>
 							<key>Module</key>
 							<string>PBXDebugCLIModule</string>
@@ -904,13 +985,13 @@
 			<key>TableOfContents</key>
 			<array>
 				<string>1C78EAAD065D492600B07095</string>
-				<string>AFAC4E6B0B4C182700D59661</string>
+				<string>AF99D2EA0B5D3BA200F4C984</string>
 				<string>1C78EAAC065D492600B07095</string>
 			</array>
 			<key>ToolbarConfiguration</key>
 			<string>xcode.toolbar.config.consoleV3</string>
 			<key>WindowString</key>
-			<string>695 422 1110 624 0 0 1920 1178 </string>
+			<string>768 420 1110 624 0 0 1920 1178 </string>
 			<key>WindowToolGUID</key>
 			<string>1C78EAAD065D492600B07095</string>
 			<key>WindowToolIsVisible</key>
@@ -1259,8 +1340,8 @@
 			<true/>
 			<key>TableOfContents</key>
 			<array>
-				<string>AFAC4EC90B4C436E00D59661</string>
-				<string>AFAC4ECA0B4C436E00D59661</string>
+				<string>AF99D31C0B5D471300F4C984</string>
+				<string>AF99D31D0B5D471300F4C984</string>
 				<string>1CE0B1FE06471DED0097A5F4</string>
 				<string>1CA1AED706398EBD00589147</string>
 			</array>
@@ -1269,7 +1350,7 @@
 			<key>WindowString</key>
 			<string>44 723 744 409 0 0 1920 1178 </string>
 			<key>WindowToolGUID</key>
-			<string>AFAC4EC90B4C436E00D59661</string>
+			<string>AF99D31C0B5D471300F4C984</string>
 			<key>WindowToolIsVisible</key>
 			<false/>
 		</dict>

Modified: PyOpenDirectory/branches/users/cdaboo/od-schema-1044/support/PyOpenDirectory.xcodeproj/cyrusdaboo.pbxuser
===================================================================
--- PyOpenDirectory/branches/users/cdaboo/od-schema-1044/support/PyOpenDirectory.xcodeproj/cyrusdaboo.pbxuser	2007-01-16 18:30:59 UTC (rev 1051)
+++ PyOpenDirectory/branches/users/cdaboo/od-schema-1044/support/PyOpenDirectory.xcodeproj/cyrusdaboo.pbxuser	2007-01-16 20:30:25 UTC (rev 1052)
@@ -1,6 +1,7 @@
 // !$*UTF8*$!
 {
 	08FB7793FE84155DC02AAC07 /* Project object */ = {
+		activeArchitecture = i386;
 		activeBuildConfigurationName = Debug;
 		activeExecutable = AF155A290A501F5C007E1E6E /* PyOpenDirectory */;
 		activeTarget = 8DD76F620486A84900D96B5E /* PyOpenDirectory */;
@@ -60,59 +61,154 @@
 					PBXFileDataSource_Target_ColumnID,
 				);
 			};
-			PBXPerProjectTemplateStateSaveDate = 189535876;
-			PBXWorkspaceStateSaveDate = 189535876;
+			PBXPerProjectTemplateStateSaveDate = 190651725;
+			PBXWorkspaceStateSaveDate = 190651725;
 		};
 		perUserProjectItems = {
-			AF8974920B4AFA6600965268 = AF8974920B4AFA6600965268 /* PBXTextBookmark */;
-			AF8974940B4AFA6600965268 = AF8974940B4AFA6600965268 /* PBXTextBookmark */;
-			AF8974950B4AFA6600965268 = AF8974950B4AFA6600965268 /* PBXTextBookmark */;
-			AF89749E0B4B07D600965268 = AF89749E0B4B07D600965268 /* PBXTextBookmark */;
-			AF8974D80B4B0BC500965268 = AF8974D80B4B0BC500965268 /* PBXTextBookmark */;
-			AF8974D90B4B0BC500965268 = AF8974D90B4B0BC500965268 /* PBXTextBookmark */;
-			AF8974DA0B4B0BC500965268 = AF8974DA0B4B0BC500965268 /* PBXTextBookmark */;
-			AF8974E30B4B0C6000965268 = AF8974E30B4B0C6000965268 /* PBXTextBookmark */;
-			AFAC4E620B4C182700D59661 /* PBXTextBookmark */ = AFAC4E620B4C182700D59661 /* PBXTextBookmark */;
-			AFAC4E630B4C182700D59661 /* PBXTextBookmark */ = AFAC4E630B4C182700D59661 /* PBXTextBookmark */;
-			AFAC4E6E0B4C18D400D59661 /* PBXTextBookmark */ = AFAC4E6E0B4C18D400D59661 /* PBXTextBookmark */;
-			AFAC4E6F0B4C18D400D59661 /* PBXTextBookmark */ = AFAC4E6F0B4C18D400D59661 /* PBXTextBookmark */;
-			AFAC4E700B4C18D400D59661 /* PBXTextBookmark */ = AFAC4E700B4C18D400D59661 /* PBXTextBookmark */;
-			AFAC4E710B4C18D400D59661 /* PBXTextBookmark */ = AFAC4E710B4C18D400D59661 /* PBXTextBookmark */;
-			AFAC4E780B4C23EC00D59661 /* PBXTextBookmark */ = AFAC4E780B4C23EC00D59661 /* PBXTextBookmark */;
-			AFAC4E790B4C23EC00D59661 /* PBXTextBookmark */ = AFAC4E790B4C23EC00D59661 /* PBXTextBookmark */;
-			AFAC4E7A0B4C23EC00D59661 /* PBXTextBookmark */ = AFAC4E7A0B4C23EC00D59661 /* PBXTextBookmark */;
-			AFAC4E7B0B4C246E00D59661 /* PBXTextBookmark */ = AFAC4E7B0B4C246E00D59661 /* PBXTextBookmark */;
-			AFAC4E810B4C259700D59661 /* PBXTextBookmark */ = AFAC4E810B4C259700D59661 /* PBXTextBookmark */;
-			AFAC4E820B4C259700D59661 /* PBXTextBookmark */ = AFAC4E820B4C259700D59661 /* PBXTextBookmark */;
-			AFAC4E840B4C259700D59661 /* PBXTextBookmark */ = AFAC4E840B4C259700D59661 /* PBXTextBookmark */;
-			AFAC4E850B4C259700D59661 /* PBXTextBookmark */ = AFAC4E850B4C259700D59661 /* PBXTextBookmark */;
-			AFAC4E870B4C25AD00D59661 /* PBXTextBookmark */ = AFAC4E870B4C25AD00D59661 /* PBXTextBookmark */;
-			AFAC4E880B4C25AD00D59661 /* PBXTextBookmark */ = AFAC4E880B4C25AD00D59661 /* PBXTextBookmark */;
-			AFAC4E890B4C25AD00D59661 /* PBXTextBookmark */ = AFAC4E890B4C25AD00D59661 /* PBXTextBookmark */;
-			AFAC4E8A0B4C25AD00D59661 /* PBXTextBookmark */ = AFAC4E8A0B4C25AD00D59661 /* PBXTextBookmark */;
-			AFAC4E900B4C267800D59661 /* PBXTextBookmark */ = AFAC4E900B4C267800D59661 /* PBXTextBookmark */;
-			AFAC4E910B4C267800D59661 /* PBXTextBookmark */ = AFAC4E910B4C267800D59661 /* PBXTextBookmark */;
-			AFAC4E920B4C267800D59661 /* PBXTextBookmark */ = AFAC4E920B4C267800D59661 /* PBXTextBookmark */;
-			AFAC4E930B4C267800D59661 /* PBXTextBookmark */ = AFAC4E930B4C267800D59661 /* PBXTextBookmark */;
-			AFAC4E980B4C26BC00D59661 /* PBXTextBookmark */ = AFAC4E980B4C26BC00D59661 /* PBXTextBookmark */;
-			AFAC4E9A0B4C279100D59661 /* PBXTextBookmark */ = AFAC4E9A0B4C279100D59661 /* PBXTextBookmark */;
-			AFAC4EB00B4C3E7700D59661 /* PBXTextBookmark */ = AFAC4EB00B4C3E7700D59661 /* PBXTextBookmark */;
-			AFAC4EB40B4C41C300D59661 /* PBXTextBookmark */ = AFAC4EB40B4C41C300D59661 /* PBXTextBookmark */;
-			AFAC4EB60B4C41D100D59661 /* PBXTextBookmark */ = AFAC4EB60B4C41D100D59661 /* PBXTextBookmark */;
-			AFAC4EB80B4C41E500D59661 /* PBXTextBookmark */ = AFAC4EB80B4C41E500D59661 /* PBXTextBookmark */;
-			AFAC4EB90B4C41E500D59661 /* PBXTextBookmark */ = AFAC4EB90B4C41E500D59661 /* PBXTextBookmark */;
-			AFAC4EBA0B4C41FE00D59661 /* PBXTextBookmark */ = AFAC4EBA0B4C41FE00D59661 /* PBXTextBookmark */;
-			AFAC4EBE0B4C431100D59661 /* PBXTextBookmark */ = AFAC4EBE0B4C431100D59661 /* PBXTextBookmark */;
-			AFAC4EBF0B4C431100D59661 /* PBXTextBookmark */ = AFAC4EBF0B4C431100D59661 /* PBXTextBookmark */;
-			AFAC4EC00B4C431100D59661 /* PBXTextBookmark */ = AFAC4EC00B4C431100D59661 /* PBXTextBookmark */;
-			AFAC4EC10B4C431100D59661 /* PBXTextBookmark */ = AFAC4EC10B4C431100D59661 /* PBXTextBookmark */;
-			AFAC4EC30B4C434200D59661 /* PBXTextBookmark */ = AFAC4EC30B4C434200D59661 /* PBXTextBookmark */;
-			AFAC4EC40B4C434200D59661 /* PBXTextBookmark */ = AFAC4EC40B4C434200D59661 /* PBXTextBookmark */;
-			AFAC4EC50B4C434200D59661 /* PBXTextBookmark */ = AFAC4EC50B4C434200D59661 /* PBXTextBookmark */;
-			AFAC4EC80B4C436E00D59661 /* PBXTextBookmark */ = AFAC4EC80B4C436E00D59661 /* PBXTextBookmark */;
-			AFAC4ECB0B4C437900D59661 /* PBXTextBookmark */ = AFAC4ECB0B4C437900D59661 /* PBXTextBookmark */;
-			AFAC4ECC0B4C437900D59661 /* PBXTextBookmark */ = AFAC4ECC0B4C437900D59661 /* PBXTextBookmark */;
-			AFAC4ECD0B4C437900D59661 /* PBXTextBookmark */ = AFAC4ECD0B4C437900D59661 /* PBXTextBookmark */;
+			AF99D25A0B5D1D4D00F4C984 /* PBXTextBookmark */ = AF99D25A0B5D1D4D00F4C984 /* PBXTextBookmark */;
+			AF99D2720B5D1D9600F4C984 /* PBXBookmark */ = AF99D2720B5D1D9600F4C984 /* PBXBookmark */;
+			AF99D2960B5D275900F4C984 /* PBXTextBookmark */ = AF99D2960B5D275900F4C984 /* PBXTextBookmark */;
+			AF99D2970B5D275900F4C984 /* PBXTextBookmark */ = AF99D2970B5D275900F4C984 /* PBXTextBookmark */;
+			AF99D29A0B5D275900F4C984 /* PBXTextBookmark */ = AF99D29A0B5D275900F4C984 /* PBXTextBookmark */;
+			AF99D2A40B5D2C2C00F4C984 /* PBXTextBookmark */ = AF99D2A40B5D2C2C00F4C984 /* PBXTextBookmark */;
+			AF99D2A50B5D2C2C00F4C984 /* PBXTextBookmark */ = AF99D2A50B5D2C2C00F4C984 /* PBXTextBookmark */;
+			AF99D2A80B5D2C2C00F4C984 /* PBXTextBookmark */ = AF99D2A80B5D2C2C00F4C984 /* PBXTextBookmark */;
+			AF99D2A90B5D2C2C00F4C984 /* PBXTextBookmark */ = AF99D2A90B5D2C2C00F4C984 /* PBXTextBookmark */;
+			AF99D2B10B5D2CEF00F4C984 /* PBXTextBookmark */ = AF99D2B10B5D2CEF00F4C984 /* PBXTextBookmark */;
+			AF99D2B20B5D2CEF00F4C984 /* PBXTextBookmark */ = AF99D2B20B5D2CEF00F4C984 /* PBXTextBookmark */;
+			AF99D2B30B5D2CF000F4C984 /* PBXTextBookmark */ = AF99D2B30B5D2CF000F4C984 /* PBXTextBookmark */;
+			AF99D2B40B5D2CF000F4C984 /* PBXTextBookmark */ = AF99D2B40B5D2CF000F4C984 /* PBXTextBookmark */;
+			AF99D2B50B5D2CF000F4C984 /* PBXTextBookmark */ = AF99D2B50B5D2CF000F4C984 /* PBXTextBookmark */;
+			AF99D2B60B5D2CF000F4C984 /* PBXTextBookmark */ = AF99D2B60B5D2CF000F4C984 /* PBXTextBookmark */;
+			AF99D2B70B5D2CF000F4C984 /* PBXTextBookmark */ = AF99D2B70B5D2CF000F4C984 /* PBXTextBookmark */;
+			AF99D2BB0B5D2D2A00F4C984 /* PBXTextBookmark */ = AF99D2BB0B5D2D2A00F4C984 /* PBXTextBookmark */;
+			AF99D2BC0B5D2D2A00F4C984 /* PBXTextBookmark */ = AF99D2BC0B5D2D2A00F4C984 /* PBXTextBookmark */;
+			AF99D2BD0B5D2D2A00F4C984 /* PBXTextBookmark */ = AF99D2BD0B5D2D2A00F4C984 /* PBXTextBookmark */;
+			AF99D2BE0B5D2D2A00F4C984 /* PBXTextBookmark */ = AF99D2BE0B5D2D2A00F4C984 /* PBXTextBookmark */;
+			AF99D2BF0B5D2D2A00F4C984 /* PBXTextBookmark */ = AF99D2BF0B5D2D2A00F4C984 /* PBXTextBookmark */;
+			AF99D2C00B5D2D2A00F4C984 /* PBXTextBookmark */ = AF99D2C00B5D2D2A00F4C984 /* PBXTextBookmark */;
+			AF99D2C40B5D2FA100F4C984 /* PBXTextBookmark */ = AF99D2C40B5D2FA100F4C984 /* PBXTextBookmark */;
+			AF99D2C50B5D2FA100F4C984 /* PBXTextBookmark */ = AF99D2C50B5D2FA100F4C984 /* PBXTextBookmark */;
+			AF99D2C70B5D2FD100F4C984 /* PBXTextBookmark */ = AF99D2C70B5D2FD100F4C984 /* PBXTextBookmark */;
+			AF99D2C80B5D2FD100F4C984 /* PBXTextBookmark */ = AF99D2C80B5D2FD100F4C984 /* PBXTextBookmark */;
+			AF99D2C90B5D2FD100F4C984 /* PBXTextBookmark */ = AF99D2C90B5D2FD100F4C984 /* PBXTextBookmark */;
+			AF99D2CA0B5D2FD100F4C984 /* PBXTextBookmark */ = AF99D2CA0B5D2FD100F4C984 /* PBXTextBookmark */;
+			AF99D2CF0B5D303C00F4C984 /* PBXTextBookmark */ = AF99D2CF0B5D303C00F4C984 /* PBXTextBookmark */;
+			AF99D2D00B5D303C00F4C984 /* PBXTextBookmark */ = AF99D2D00B5D303C00F4C984 /* PBXTextBookmark */;
+			AF99D2D30B5D311000F4C984 /* PBXTextBookmark */ = AF99D2D30B5D311000F4C984 /* PBXTextBookmark */;
+			AF99D2D40B5D311000F4C984 /* PBXTextBookmark */ = AF99D2D40B5D311000F4C984 /* PBXTextBookmark */;
+			AF99D2DA0B5D381700F4C984 /* PBXTextBookmark */ = AF99D2DA0B5D381700F4C984 /* PBXTextBookmark */;
+			AF99D2DB0B5D381700F4C984 /* PBXTextBookmark */ = AF99D2DB0B5D381700F4C984 /* PBXTextBookmark */;
+			AF99D2DC0B5D381700F4C984 /* PBXTextBookmark */ = AF99D2DC0B5D381700F4C984 /* PBXTextBookmark */;
+			AF99D2DD0B5D381700F4C984 /* PBXTextBookmark */ = AF99D2DD0B5D381700F4C984 /* PBXTextBookmark */;
+			AF99D2DE0B5D381900F4C984 /* PBXTextBookmark */ = AF99D2DE0B5D381900F4C984 /* PBXTextBookmark */;
+			AF99D2DF0B5D381900F4C984 /* PBXBookmark */ = AF99D2DF0B5D381900F4C984 /* PBXBookmark */;
+			AF99D2E00B5D381900F4C984 /* PBXTextBookmark */ = AF99D2E00B5D381900F4C984 /* PBXTextBookmark */;
+			AF99D2E10B5D381900F4C984 /* PBXTextBookmark */ = AF99D2E10B5D381900F4C984 /* PBXTextBookmark */;
+			AF99D2E20B5D381900F4C984 /* PBXTextBookmark */ = AF99D2E20B5D381900F4C984 /* PBXTextBookmark */;
+			AF99D2E30B5D3B8100F4C984 /* PBXBookmark */ = AF99D2E30B5D3B8100F4C984 /* PBXBookmark */;
+			AF99D2E50B5D3BA200F4C984 /* PBXTextBookmark */ = AF99D2E50B5D3BA200F4C984 /* PBXTextBookmark */;
+			AF99D2E80B5D3BA200F4C984 /* PBXTextBookmark */ = AF99D2E80B5D3BA200F4C984 /* PBXTextBookmark */;
+			AF99D2E90B5D3BA200F4C984 /* PBXTextBookmark */ = AF99D2E90B5D3BA200F4C984 /* PBXTextBookmark */;
+			AF99D2EE0B5D3CB700F4C984 /* PBXTextBookmark */ = AF99D2EE0B5D3CB700F4C984 /* PBXTextBookmark */;
+			AF99D2EF0B5D3CB700F4C984 /* PBXTextBookmark */ = AF99D2EF0B5D3CB700F4C984 /* PBXTextBookmark */;
+			AF99D2F00B5D3CB700F4C984 /* PBXTextBookmark */ = AF99D2F00B5D3CB700F4C984 /* PBXTextBookmark */;
+			AF99D2F10B5D3CB700F4C984 /* PBXTextBookmark */ = AF99D2F10B5D3CB700F4C984 /* PBXTextBookmark */;
+			AF99D2F20B5D3CB700F4C984 /* PBXTextBookmark */ = AF99D2F20B5D3CB700F4C984 /* PBXTextBookmark */;
+			AF99D2F30B5D3CB700F4C984 /* PBXTextBookmark */ = AF99D2F30B5D3CB700F4C984 /* PBXTextBookmark */;
+			AF99D2F40B5D3CB700F4C984 /* PBXTextBookmark */ = AF99D2F40B5D3CB700F4C984 /* PBXTextBookmark */;
+			AF99D3010B5D3E5F00F4C984 /* PBXTextBookmark */ = AF99D3010B5D3E5F00F4C984 /* PBXTextBookmark */;
+			AF99D3020B5D3E5F00F4C984 /* PBXTextBookmark */ = AF99D3020B5D3E5F00F4C984 /* PBXTextBookmark */;
+			AF99D3050B5D3E6300F4C984 /* PBXTextBookmark */ = AF99D3050B5D3E6300F4C984 /* PBXTextBookmark */;
+			AF99D3060B5D3E6300F4C984 /* PBXTextBookmark */ = AF99D3060B5D3E6300F4C984 /* PBXTextBookmark */;
+			AF99D30D0B5D469A00F4C984 /* PBXTextBookmark */ = AF99D30D0B5D469A00F4C984 /* PBXTextBookmark */;
+			AF99D30E0B5D469A00F4C984 /* PBXTextBookmark */ = AF99D30E0B5D469A00F4C984 /* PBXTextBookmark */;
+			AF99D3100B5D469C00F4C984 /* PBXTextBookmark */ = AF99D3100B5D469C00F4C984 /* PBXTextBookmark */;
+			AF99D3110B5D469C00F4C984 /* PBXTextBookmark */ = AF99D3110B5D469C00F4C984 /* PBXTextBookmark */;
+			AF99D3150B5D46D300F4C984 /* PBXTextBookmark */ = AF99D3150B5D46D300F4C984 /* PBXTextBookmark */;
+			AF99D3160B5D46D500F4C984 /* PBXTextBookmark */ = AF99D3160B5D46D500F4C984 /* PBXTextBookmark */;
+			AF99D31B0B5D471300F4C984 /* PBXTextBookmark */ = AF99D31B0B5D471300F4C984 /* PBXTextBookmark */;
+			AF99D3210B5D483900F4C984 /* PBXTextBookmark */ = AF99D3210B5D483900F4C984 /* PBXTextBookmark */;
+			AF99D3220B5D483900F4C984 /* PBXTextBookmark */ = AF99D3220B5D483900F4C984 /* PBXTextBookmark */;
+			AF99D32B0B5D4C0200F4C984 /* PBXTextBookmark */ = AF99D32B0B5D4C0200F4C984 /* PBXTextBookmark */;
+			AF99D32D0B5D4C7100F4C984 /* PBXTextBookmark */ = AF99D32D0B5D4C7100F4C984 /* PBXTextBookmark */;
+			AF99D32F0B5D4C9300F4C984 /* PBXTextBookmark */ = AF99D32F0B5D4C9300F4C984 /* PBXTextBookmark */;
+			AF99D3300B5D4C9300F4C984 /* PBXTextBookmark */ = AF99D3300B5D4C9300F4C984 /* PBXTextBookmark */;
+			AF99D3310B5D4C9300F4C984 /* PBXTextBookmark */ = AF99D3310B5D4C9300F4C984 /* PBXTextBookmark */;
+			AF99D3320B5D4C9300F4C984 /* PBXTextBookmark */ = AF99D3320B5D4C9300F4C984 /* PBXTextBookmark */;
+			AF99D3330B5D4C9300F4C984 /* PBXTextBookmark */ = AF99D3330B5D4C9300F4C984 /* PBXTextBookmark */;
+			AF99D3340B5D4C9300F4C984 /* PBXTextBookmark */ = AF99D3340B5D4C9300F4C984 /* PBXTextBookmark */;
+			AF99D3350B5D4C9300F4C984 /* PBXTextBookmark */ = AF99D3350B5D4C9300F4C984 /* PBXTextBookmark */;
+			AF99D3360B5D4C9300F4C984 /* PBXTextBookmark */ = AF99D3360B5D4C9300F4C984 /* PBXTextBookmark */;
+			AF99D33A0B5D4CF300F4C984 /* PBXTextBookmark */ = AF99D33A0B5D4CF300F4C984 /* PBXTextBookmark */;
+			AF99D33B0B5D4CF700F4C984 /* PBXBookmark */ = AF99D33B0B5D4CF700F4C984 /* PBXBookmark */;
+			AF99D33D0B5D4E3A00F4C984 /* PBXTextBookmark */ = AF99D33D0B5D4E3A00F4C984 /* PBXTextBookmark */;
+			AF99D3400B5D4E3A00F4C984 /* PBXTextBookmark */ = AF99D3400B5D4E3A00F4C984 /* PBXTextBookmark */;
+			AF99D3430B5D4E3A00F4C984 /* PBXTextBookmark */ = AF99D3430B5D4E3A00F4C984 /* PBXTextBookmark */;
+			AF99D3440B5D4E3A00F4C984 /* PBXTextBookmark */ = AF99D3440B5D4E3A00F4C984 /* PBXTextBookmark */;
+			AF99D3460B5D503D00F4C984 /* PBXTextBookmark */ = AF99D3460B5D503D00F4C984 /* PBXTextBookmark */;
+			AF99D3470B5D503D00F4C984 /* PBXTextBookmark */ = AF99D3470B5D503D00F4C984 /* PBXTextBookmark */;
+			AF99D34A0B5D503D00F4C984 /* PBXTextBookmark */ = AF99D34A0B5D503D00F4C984 /* PBXTextBookmark */;
+			AF99D34C0B5D503D00F4C984 /* PBXTextBookmark */ = AF99D34C0B5D503D00F4C984 /* PBXTextBookmark */;
+			AF99D34E0B5D503D00F4C984 /* PBXTextBookmark */ = AF99D34E0B5D503D00F4C984 /* PBXTextBookmark */;
+			AF99D3530B5D51EA00F4C984 /* PBXTextBookmark */ = AF99D3530B5D51EA00F4C984 /* PBXTextBookmark */;
+			AF99D3540B5D51EA00F4C984 /* PBXTextBookmark */ = AF99D3540B5D51EA00F4C984 /* PBXTextBookmark */;
+			AF99D3550B5D51EA00F4C984 /* PBXTextBookmark */ = AF99D3550B5D51EA00F4C984 /* PBXTextBookmark */;
+			AF99D3560B5D51EA00F4C984 /* PBXTextBookmark */ = AF99D3560B5D51EA00F4C984 /* PBXTextBookmark */;
+			AF99D35B0B5D52FC00F4C984 /* PBXBookmark */ = AF99D35B0B5D52FC00F4C984 /* PBXBookmark */;
+			AF99D35C0B5D539800F4C984 /* PBXTextBookmark */ = AF99D35C0B5D539800F4C984 /* PBXTextBookmark */;
+			AF99D35D0B5D539800F4C984 /* PBXTextBookmark */ = AF99D35D0B5D539800F4C984 /* PBXTextBookmark */;
+			AF99D35E0B5D539800F4C984 /* PBXTextBookmark */ = AF99D35E0B5D539800F4C984 /* PBXTextBookmark */;
+			AF99D35F0B5D539800F4C984 /* PBXTextBookmark */ = AF99D35F0B5D539800F4C984 /* PBXTextBookmark */;
+			AF99D3600B5D539800F4C984 /* PBXTextBookmark */ = AF99D3600B5D539800F4C984 /* PBXTextBookmark */;
+			AF99D3630B5D539800F4C984 /* PBXTextBookmark */ = AF99D3630B5D539800F4C984 /* PBXTextBookmark */;
+			AF99D3690B5D554E00F4C984 /* PBXTextBookmark */ = AF99D3690B5D554E00F4C984 /* PBXTextBookmark */;
+			AF99D36A0B5D554E00F4C984 /* PBXTextBookmark */ = AF99D36A0B5D554E00F4C984 /* PBXTextBookmark */;
+			AF99D36C0B5D556100F4C984 /* PBXTextBookmark */ = AF99D36C0B5D556100F4C984 /* PBXTextBookmark */;
+			AF99D36D0B5D556100F4C984 /* PBXTextBookmark */ = AF99D36D0B5D556100F4C984 /* PBXTextBookmark */;
+			AF99D36F0B5D559300F4C984 /* PBXTextBookmark */ = AF99D36F0B5D559300F4C984 /* PBXTextBookmark */;
+			AF99D3700B5D559300F4C984 /* PBXTextBookmark */ = AF99D3700B5D559300F4C984 /* PBXTextBookmark */;
+			AF99D3730B5D55E000F4C984 /* PBXTextBookmark */ = AF99D3730B5D55E000F4C984 /* PBXTextBookmark */;
+			AF99D3740B5D55E000F4C984 /* PBXTextBookmark */ = AF99D3740B5D55E000F4C984 /* PBXTextBookmark */;
+			AF99D3750B5D55E000F4C984 /* PBXTextBookmark */ = AF99D3750B5D55E000F4C984 /* PBXTextBookmark */;
+			AF99D3760B5D55E000F4C984 /* PBXTextBookmark */ = AF99D3760B5D55E000F4C984 /* PBXTextBookmark */;
+			AF99D3790B5D55FC00F4C984 /* PBXTextBookmark */ = AF99D3790B5D55FC00F4C984 /* PBXTextBookmark */;
+			AF99D37A0B5D55FC00F4C984 /* PBXTextBookmark */ = AF99D37A0B5D55FC00F4C984 /* PBXTextBookmark */;
+			AF99D37B0B5D55FC00F4C984 /* PBXTextBookmark */ = AF99D37B0B5D55FC00F4C984 /* PBXTextBookmark */;
+			AF99D37C0B5D561300F4C984 /* PBXBookmark */ = AF99D37C0B5D561300F4C984 /* PBXBookmark */;
+			AF99D37D0B5D56A900F4C984 /* PBXTextBookmark */ = AF99D37D0B5D56A900F4C984 /* PBXTextBookmark */;
+			AF99D3800B5D56A900F4C984 /* PBXTextBookmark */ = AF99D3800B5D56A900F4C984 /* PBXTextBookmark */;
+			AF99D3820B5D579A00F4C984 /* PBXTextBookmark */ = AF99D3820B5D579A00F4C984 /* PBXTextBookmark */;
+			AF99D3830B5D579A00F4C984 /* PBXTextBookmark */ = AF99D3830B5D579A00F4C984 /* PBXTextBookmark */;
+			AF99D3840B5D579A00F4C984 /* PBXTextBookmark */ = AF99D3840B5D579A00F4C984 /* PBXTextBookmark */;
+			AF99D3850B5D58E800F4C984 /* PBXTextBookmark */ = AF99D3850B5D58E800F4C984 /* PBXTextBookmark */;
+			AF99D3860B5D58E800F4C984 /* PBXTextBookmark */ = AF99D3860B5D58E800F4C984 /* PBXTextBookmark */;
+			AF99D3870B5D5A5C00F4C984 /* PBXTextBookmark */ = AF99D3870B5D5A5C00F4C984 /* PBXTextBookmark */;
+			AF99D3880B5D5A5C00F4C984 /* PBXTextBookmark */ = AF99D3880B5D5A5C00F4C984 /* PBXTextBookmark */;
+			AF99D3890B5D5DD300F4C984 /* PBXTextBookmark */ = AF99D3890B5D5DD300F4C984 /* PBXTextBookmark */;
+			AF99D38A0B5D5DD300F4C984 /* PBXTextBookmark */ = AF99D38A0B5D5DD300F4C984 /* PBXTextBookmark */;
+			AF99D38C0B5D5E2700F4C984 /* PBXTextBookmark */ = AF99D38C0B5D5E2700F4C984 /* PBXTextBookmark */;
+			AF99D38D0B5D5E2700F4C984 /* PBXTextBookmark */ = AF99D38D0B5D5E2700F4C984 /* PBXTextBookmark */;
+			AF99D38F0B5D5F8500F4C984 /* PBXBookmark */ = AF99D38F0B5D5F8500F4C984 /* PBXBookmark */;
+			AF99D3900B5D5FA700F4C984 /* PBXTextBookmark */ = AF99D3900B5D5FA700F4C984 /* PBXTextBookmark */;
+			AF99D3930B5D5FA700F4C984 /* PBXTextBookmark */ = AF99D3930B5D5FA700F4C984 /* PBXTextBookmark */;
+			AF99D3940B5D69C700F4C984 /* PBXBookmark */ = AF99D3940B5D69C700F4C984 /* PBXBookmark */;
+			AF99D3950B5D69F100F4C984 /* PBXTextBookmark */ = AF99D3950B5D69F100F4C984 /* PBXTextBookmark */;
+			AF99D3980B5D69F100F4C984 /* PBXTextBookmark */ = AF99D3980B5D69F100F4C984 /* PBXTextBookmark */;
+			AF99D39A0B5D6A5B00F4C984 /* PBXTextBookmark */ = AF99D39A0B5D6A5B00F4C984 /* PBXTextBookmark */;
+			AF99D39B0B5D6A5B00F4C984 /* PBXTextBookmark */ = AF99D39B0B5D6A5B00F4C984 /* PBXTextBookmark */;
+			AF99D39C0B5D6A7C00F4C984 /* PBXTextBookmark */ = AF99D39C0B5D6A7C00F4C984 /* PBXTextBookmark */;
+			AF99D39D0B5D6A7C00F4C984 /* PBXTextBookmark */ = AF99D39D0B5D6A7C00F4C984 /* PBXTextBookmark */;
+			AF99D39E0B5D6AFF00F4C984 /* PBXTextBookmark */ = AF99D39E0B5D6AFF00F4C984 /* PBXTextBookmark */;
+			AF99D39F0B5D6AFF00F4C984 /* PBXTextBookmark */ = AF99D39F0B5D6AFF00F4C984 /* PBXTextBookmark */;
+			AF99D3A00B5D6B3700F4C984 /* PBXTextBookmark */ = AF99D3A00B5D6B3700F4C984 /* PBXTextBookmark */;
+			AF99D3A10B5D6B3700F4C984 /* PBXTextBookmark */ = AF99D3A10B5D6B3700F4C984 /* PBXTextBookmark */;
+			AF99D3A20B5D6BCD00F4C984 /* PBXTextBookmark */ = AF99D3A20B5D6BCD00F4C984 /* PBXTextBookmark */;
+			AF99D3A30B5D6BCD00F4C984 /* PBXTextBookmark */ = AF99D3A30B5D6BCD00F4C984 /* PBXTextBookmark */;
+			AF99D3A80B5D6EB600F4C984 /* PBXTextBookmark */ = AF99D3A80B5D6EB600F4C984 /* PBXTextBookmark */;
+			AF99D3A90B5D6EB600F4C984 /* PBXTextBookmark */ = AF99D3A90B5D6EB600F4C984 /* PBXTextBookmark */;
+			AF99D3AD0B5D6F5D00F4C984 /* PBXTextBookmark */ = AF99D3AD0B5D6F5D00F4C984 /* PBXTextBookmark */;
+			AF99D3AE0B5D6F5D00F4C984 /* PBXTextBookmark */ = AF99D3AE0B5D6F5D00F4C984 /* PBXTextBookmark */;
 		};
 		sourceControlManager = AF155A2D0A501F7B007E1E6E /* Source Control */;
 		userBuildSettings = {
@@ -120,10 +216,10 @@
 	};
 	08FB7796FE84155DC02AAC07 /* test.cpp */ = {
 		uiCtxt = {
-			sepNavIntBoundsRect = "{{0, 0}, {1104, 2856}}";
-			sepNavSelRange = "{5935, 0}";
-			sepNavVisRect = "{{0, 1690}, {1104, 448}}";
-			sepNavWindowFrame = "{{436, 4}, {811, 828}}";
+			sepNavIntBoundsRect = "{{0, 0}, {2534, 3094}}";
+			sepNavSelRange = "{3457, 0}";
+			sepNavVisRect = "{{0, 1081}, {1090, 471}}";
+			sepNavWindowFrame = "{{50, 4}, {1175, 828}}";
 		};
 	};
 	8DD76F620486A84900D96B5E /* PyOpenDirectory */ = {
@@ -174,6 +270,7 @@
 			$esp = 1;
 			$gs = 1;
 			$ss = 1;
+			"matchType-int-CDirectoryService::_QueryRecordsWithAttributes" = 1;
 		};
 	};
 	AF155A2D0A501F7B007E1E6E /* Source Control */ = {
@@ -190,523 +287,1416 @@
 	};
 	AF155A2F0A501F84007E1E6E /* CDirectoryService.cpp */ = {
 		uiCtxt = {
-			sepNavIntBoundsRect = "{{0, 0}, {1104, 11914}}";
-			sepNavSelRange = "{9255, 26}";
-			sepNavVisRect = "{{0, 4025}, {1104, 471}}";
-			sepNavWindowFrame = "{{144, 200}, {1046, 828}}";
+			sepNavIntBoundsRect = "{{0, 0}, {987, 11074}}";
+			sepNavSelRange = "{34667, 11}";
+			sepNavVisRect = "{{0, 10046}, {987, 699}}";
+			sepNavWindowFrame = "{{144, 4}, {1046, 828}}";
 		};
 	};
 	AF155A300A501F84007E1E6E /* CDirectoryService.h */ = {
 		uiCtxt = {
-			sepNavIntBoundsRect = "{{0, 0}, {766, 1106}}";
-			sepNavSelRange = "{1276, 0}";
-			sepNavVisRect = "{{0, 163}, {766, 699}}";
-			sepNavWindowFrame = "{{15, 4}, {811, 828}}";
+			sepNavIntBoundsRect = "{{0, 0}, {1010, 1064}}";
+			sepNavSelRange = "{2642, 0}";
+			sepNavVisRect = "{{0, 267}, {931, 797}}";
+			sepNavWindowFrame = "{{179, 55}, {990, 926}}";
 		};
 	};
 	AF155A310A501F84007E1E6E /* PythonWrapper.cpp */ = {
 		uiCtxt = {
-			sepNavIntBoundsRect = "{{0, 0}, {1134, 6790}}";
-			sepNavSelRange = "{14121, 0}";
-			sepNavVisRect = "{{0, 1858}, {1134, 471}}";
+			sepNavIntBoundsRect = "{{0, 0}, {1016, 7406}}";
+			sepNavSelRange = "{3328, 36}";
+			sepNavVisRect = "{{0, 1639}, {913, 852}}";
 			sepNavWindowFrame = "{{113, 4}, {811, 828}}";
 		};
 	};
 	AF155AFB0A502C09007E1E6E /* CFStringUtil.h */ = {
 		uiCtxt = {
-			sepNavIntBoundsRect = "{{0, 0}, {766, 699}}";
-			sepNavSelRange = "{546, 0}";
-			sepNavVisRect = "{{0, 0}, {766, 699}}";
+			sepNavIntBoundsRect = "{{0, 0}, {752, 699}}";
+			sepNavSelRange = "{762, 19}";
+			sepNavVisRect = "{{0, 0}, {752, 699}}";
 			sepNavWindowFrame = "{{746, 81}, {811, 828}}";
 		};
 	};
 	AF155AFC0A502C09007E1E6E /* CFStringUtil.cpp */ = {
 		uiCtxt = {
-			sepNavIntBoundsRect = "{{0, 0}, {1242, 1736}}";
-			sepNavSelRange = "{2369, 0}";
-			sepNavVisRect = "{{0, 1307}, {1242, 313}}";
+			sepNavIntBoundsRect = "{{0, 0}, {752, 1736}}";
+			sepNavSelRange = "{2303, 0}";
+			sepNavVisRect = "{{0, 841}, {752, 895}}";
 			sepNavWindowFrame = "{{36, 4}, {811, 1024}}";
 		};
 	};
-	AF8974920B4AFA6600965268 /* PBXTextBookmark */ = {
+	AF99D25A0B5D1D4D00F4C984 /* PBXTextBookmark */ = {
 		isa = PBXTextBookmark;
+		fRef = 08FB7796FE84155DC02AAC07 /* test.cpp */;
+		rLen = 1;
+		rLoc = 108;
+		rType = 1;
+	};
+	AF99D2720B5D1D9600F4C984 /* PBXBookmark */ = {
+		isa = PBXBookmark;
+		fRef = AF155A2F0A501F84007E1E6E /* CDirectoryService.cpp */;
+	};
+	AF99D2960B5D275900F4C984 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
 		fRef = AF155A310A501F84007E1E6E /* PythonWrapper.cpp */;
-		name = "PythonWrapper.cpp: 485";
+		name = "PythonWrapper.cpp: 462";
 		rLen = 0;
-		rLoc = 14121;
+		rLoc = 14598;
 		rType = 0;
-		vrLen = 900;
-		vrLoc = 3735;
+		vrLen = 1473;
+		vrLoc = 8373;
 	};
-	AF8974940B4AFA6600965268 /* PBXTextBookmark */ = {
+	AF99D2970B5D275900F4C984 /* PBXTextBookmark */ = {
 		isa = PBXTextBookmark;
 		fRef = AF155A310A501F84007E1E6E /* PythonWrapper.cpp */;
-		name = Python/Python.h;
-		rLen = 15;
-		rLoc = 726;
+		name = "PythonWrapper.cpp: 225";
+		rLen = 65;
+		rLoc = 6280;
 		rType = 0;
-		vrLen = 1115;
-		vrLoc = 0;
+		vrLen = 1004;
+		vrLoc = 5827;
 	};
-	AF8974950B4AFA6600965268 /* PBXTextBookmark */ = {
+	AF99D29A0B5D275900F4C984 /* PBXTextBookmark */ = {
 		isa = PBXTextBookmark;
-		fRef = AF155A310A501F84007E1E6E /* PythonWrapper.cpp */;
-		name = "PythonWrapper.cpp: 485";
+		fRef = AF155A2F0A501F84007E1E6E /* CDirectoryService.cpp */;
+		name = "CDirectoryService.cpp: 456";
 		rLen = 0;
-		rLoc = 14121;
+		rLoc = 14011;
 		rType = 0;
-		vrLen = 900;
-		vrLoc = 3735;
+		vrLen = 1930;
+		vrLoc = 12882;
 	};
-	AF89749E0B4B07D600965268 /* PBXTextBookmark */ = {
+	AF99D2A40B5D2C2C00F4C984 /* PBXTextBookmark */ = {
 		isa = PBXTextBookmark;
+		fRef = AF155A310A501F84007E1E6E /* PythonWrapper.cpp */;
+		name = "PythonWrapper.cpp: 225";
+		rLen = 65;
+		rLoc = 6280;
+		rType = 0;
+		vrLen = 1004;
+		vrLoc = 5827;
+	};
+	AF99D2A50B5D2C2C00F4C984 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
 		fRef = AF155A2F0A501F84007E1E6E /* CDirectoryService.cpp */;
-		name = "CDirectoryService.cpp: 840";
+		name = "CDirectoryService.cpp: 492";
 		rLen = 0;
-		rLoc = 22889;
+		rLoc = 15065;
 		rType = 0;
-		vrLen = 1059;
-		vrLoc = 15544;
+		vrLen = 1976;
+		vrLoc = 13468;
 	};
-	AF8974D80B4B0BC500965268 /* PBXTextBookmark */ = {
+	AF99D2A80B5D2C2C00F4C984 /* PBXTextBookmark */ = {
 		isa = PBXTextBookmark;
-		fRef = 08FB7796FE84155DC02AAC07 /* test.cpp */;
-		name = "test.cpp: 59";
+		fRef = AF155A300A501F84007E1E6E /* CDirectoryService.h */;
 		rLen = 0;
-		rLoc = 1922;
+		rLoc = 2948;
 		rType = 0;
-		vrLen = 790;
-		vrLoc = 1868;
 	};
-	AF8974D90B4B0BC500965268 /* PBXTextBookmark */ = {
+	AF99D2A90B5D2C2C00F4C984 /* PBXTextBookmark */ = {
 		isa = PBXTextBookmark;
-		comments = "error: no matching function for call to 'CDirectoryService::_ListAllRecordsWithAttributes(const char*&, const __CFArray*&)'";
+		fRef = AF155A300A501F84007E1E6E /* CDirectoryService.h */;
+		name = "CDirectoryService.h: 71";
+		rLen = 87;
+		rLoc = 2644;
+		rType = 0;
+		vrLen = 2168;
+		vrLoc = 714;
+	};
+	AF99D2B10B5D2CEF00F4C984 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		comments = "error: Python.h: No such file or directory";
 		fRef = AF155A2F0A501F84007E1E6E /* CDirectoryService.cpp */;
 		rLen = 1;
-		rLoc = 92;
+		rLoc = 25;
 		rType = 1;
 	};
-	AF8974DA0B4B0BC500965268 /* PBXTextBookmark */ = {
+	AF99D2B20B5D2CEF00F4C984 /* PBXTextBookmark */ = {
 		isa = PBXTextBookmark;
-		fRef = 08FB7796FE84155DC02AAC07 /* test.cpp */;
-		name = "test.cpp: 59";
-		rLen = 0;
-		rLoc = 1922;
+		fRef = AF155A2F0A501F84007E1E6E /* CDirectoryService.cpp */;
+		name = "CDirectoryService.cpp: 26";
+		rLen = 27;
+		rLoc = 820;
 		rType = 0;
-		vrLen = 790;
-		vrLoc = 1868;
+		vrLen = 654;
+		vrLoc = 755;
 	};
-	AF8974E30B4B0C6000965268 /* PBXTextBookmark */ = {
+	AF99D2B30B5D2CF000F4C984 /* PBXTextBookmark */ = {
 		isa = PBXTextBookmark;
+		fRef = AF155A310A501F84007E1E6E /* PythonWrapper.cpp */;
+		name = "PythonWrapper.cpp: 225";
+		rLen = 65;
+		rLoc = 6280;
+		rType = 0;
+		vrLen = 1004;
+		vrLoc = 5827;
+	};
+	AF99D2B40B5D2CF000F4C984 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = AF155A310A501F84007E1E6E /* PythonWrapper.cpp */;
+		name = "PythonWrapper.cpp: 225";
+		rLen = 65;
+		rLoc = 6280;
+		rType = 0;
+		vrLen = 1004;
+		vrLoc = 5827;
+	};
+	AF99D2B50B5D2CF000F4C984 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
 		fRef = AF155A2F0A501F84007E1E6E /* CDirectoryService.cpp */;
-		name = "CDirectoryService.cpp: 843";
+		name = "CDirectoryService.cpp: 26";
+		rLen = 27;
+		rLoc = 820;
+		rType = 0;
+		vrLen = 1030;
+		vrLoc = 0;
+	};
+	AF99D2B60B5D2CF000F4C984 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = AF155A2F0A501F84007E1E6E /* CDirectoryService.cpp */;
+		name = "CDirectoryService.cpp: 424";
+		rLen = 147;
+		rLoc = 13167;
+		rType = 0;
+		vrLen = 2117;
+		vrLoc = 12455;
+	};
+	AF99D2B70B5D2CF000F4C984 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = AF155A300A501F84007E1E6E /* CDirectoryService.h */;
+		name = "CDirectoryService.h: 71";
+		rLen = 87;
+		rLoc = 2644;
+		rType = 0;
+		vrLen = 2168;
+		vrLoc = 714;
+	};
+	AF99D2BB0B5D2D2A00F4C984 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = AF155A2F0A501F84007E1E6E /* CDirectoryService.cpp */;
+		name = "CDirectoryService.cpp: 26";
+		rLen = 27;
+		rLoc = 820;
+		rType = 0;
+		vrLen = 1030;
+		vrLoc = 0;
+	};
+	AF99D2BC0B5D2D2A00F4C984 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = AF155A2F0A501F84007E1E6E /* CDirectoryService.cpp */;
+		name = "CDirectoryService.cpp: 26";
+		rLen = 27;
+		rLoc = 820;
+		rType = 0;
+		vrLen = 1030;
+		vrLoc = 0;
+	};
+	AF99D2BD0B5D2D2A00F4C984 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = AF155A310A501F84007E1E6E /* PythonWrapper.cpp */;
+		name = "PythonWrapper.cpp: 20";
+		rLen = 15;
+		rLoc = 721;
+		rType = 0;
+		vrLen = 1058;
+		vrLoc = 201;
+	};
+	AF99D2BE0B5D2D2A00F4C984 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = AF155A2F0A501F84007E1E6E /* CDirectoryService.cpp */;
+		name = "CDirectoryService.cpp: 424";
+		rLen = 147;
+		rLoc = 13167;
+		rType = 0;
+		vrLen = 2117;
+		vrLoc = 12455;
+	};
+	AF99D2BF0B5D2D2A00F4C984 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = AF155A2F0A501F84007E1E6E /* CDirectoryService.cpp */;
+		name = "CDirectoryService.cpp: 26";
 		rLen = 0;
-		rLoc = 22991;
+		rLoc = 843;
 		rType = 0;
-		vrLen = 1128;
-		vrLoc = 1882;
+		vrLen = 1778;
+		vrLoc = 0;
 	};
-	AFAC4E620B4C182700D59661 /* PBXTextBookmark */ = {
+	AF99D2C00B5D2D2A00F4C984 /* PBXTextBookmark */ = {
 		isa = PBXTextBookmark;
-		comments = "error: no matching function for call to 'CDirectoryService::BuildStringDataList(<type error>, tDataList*&)'";
+		fRef = AF155A300A501F84007E1E6E /* CDirectoryService.h */;
+		name = "CDirectoryService.h: 71";
+		rLen = 87;
+		rLoc = 2644;
+		rType = 0;
+		vrLen = 2168;
+		vrLoc = 714;
+	};
+	AF99D2C40B5D2FA100F4C984 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		comments = "error: 'recNames' was not declared in this scope";
 		fRef = AF155A2F0A501F84007E1E6E /* CDirectoryService.cpp */;
 		rLen = 1;
-		rLoc = 413;
+		rLoc = 592;
 		rType = 1;
 	};
-	AFAC4E630B4C182700D59661 /* PBXTextBookmark */ = {
+	AF99D2C50B5D2FA100F4C984 /* PBXTextBookmark */ = {
 		isa = PBXTextBookmark;
 		fRef = AF155A2F0A501F84007E1E6E /* CDirectoryService.cpp */;
-		name = "";
-		rLen = 3;
-		rLoc = 12268;
+		name = "CDirectoryService.cpp: 609";
+		rLen = 0;
+		rLoc = 19263;
 		rType = 0;
-		vrLen = 767;
-		vrLoc = 11968;
+		vrLen = 462;
+		vrLoc = 18712;
 	};
-	AFAC4E6E0B4C18D400D59661 /* PBXTextBookmark */ = {
+	AF99D2C70B5D2FD100F4C984 /* PBXTextBookmark */ = {
 		isa = PBXTextBookmark;
-		fRef = 08FB7796FE84155DC02AAC07 /* test.cpp */;
-		name = "test.cpp: 177";
+		fRef = AF155A310A501F84007E1E6E /* PythonWrapper.cpp */;
+		name = "PythonWrapper.cpp: 20";
+		rLen = 15;
+		rLoc = 721;
+		rType = 0;
+		vrLen = 1058;
+		vrLoc = 201;
+	};
+	AF99D2C80B5D2FD100F4C984 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = AF155A310A501F84007E1E6E /* PythonWrapper.cpp */;
+		name = "PythonWrapper.cpp: 20";
+		rLen = 15;
+		rLoc = 721;
+		rType = 0;
+		vrLen = 1058;
+		vrLoc = 201;
+	};
+	AF99D2C90B5D2FD100F4C984 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = AF155A2F0A501F84007E1E6E /* CDirectoryService.cpp */;
+		name = "CDirectoryService.cpp: 11";
 		rLen = 0;
-		rLoc = 5134;
+		rLoc = 389;
 		rType = 0;
-		vrLen = 1062;
-		vrLoc = 1408;
+		vrLen = 1037;
+		vrLoc = 0;
 	};
-	AFAC4E6F0B4C18D400D59661 /* PBXTextBookmark */ = {
+	AF99D2CA0B5D2FD100F4C984 /* PBXTextBookmark */ = {
 		isa = PBXTextBookmark;
-		comments = "error: no matching function for call to 'CDirectoryService::BuildStringDataList(<type error>, tDataList*&)'";
+		fRef = AF155A300A501F84007E1E6E /* CDirectoryService.h */;
+		name = "CDirectoryService.h: 71";
+		rLen = 87;
+		rLoc = 2644;
+		rType = 0;
+		vrLen = 2168;
+		vrLoc = 714;
+	};
+	AF99D2CF0B5D303C00F4C984 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		comments = "error: '::dsBuildNodeAllocateString' has not been declared";
 		fRef = AF155A2F0A501F84007E1E6E /* CDirectoryService.cpp */;
 		rLen = 1;
-		rLoc = 413;
+		rLoc = 1127;
 		rType = 1;
 	};
-	AFAC4E700B4C18D400D59661 /* PBXTextBookmark */ = {
+	AF99D2D00B5D303C00F4C984 /* PBXTextBookmark */ = {
 		isa = PBXTextBookmark;
-		fRef = 08FB7796FE84155DC02AAC07 /* test.cpp */;
-		name = "test.cpp: 177";
+		fRef = AF155A2F0A501F84007E1E6E /* CDirectoryService.cpp */;
+		name = "CDirectoryService.cpp: 1153";
+		rLen = 102;
+		rLoc = 32193;
+		rType = 0;
+		vrLen = 821;
+		vrLoc = 32006;
+	};
+	AF99D2D30B5D311000F4C984 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		comments = "error: expected `;' before ')' token";
+		fRef = AF155A2F0A501F84007E1E6E /* CDirectoryService.cpp */;
+		rLen = 1;
+		rLoc = 1132;
+		rType = 1;
+	};
+	AF99D2D40B5D311000F4C984 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = AF155A2F0A501F84007E1E6E /* CDirectoryService.cpp */;
+		name = "CDirectoryService.cpp: 1158";
 		rLen = 0;
-		rLoc = 5134;
+		rLoc = 32451;
 		rType = 0;
-		vrLen = 1062;
-		vrLoc = 1408;
+		vrLen = 967;
+		vrLoc = 32226;
 	};
-	AFAC4E710B4C18D400D59661 /* PBXTextBookmark */ = {
+	AF99D2DA0B5D381700F4C984 /* PBXTextBookmark */ = {
 		isa = PBXTextBookmark;
 		fRef = AF155A2F0A501F84007E1E6E /* CDirectoryService.cpp */;
-		name = "CDirectoryService.cpp: 1069";
+		name = "CDirectoryService.cpp: 1158";
 		rLen = 0;
-		rLoc = 30221;
+		rLoc = 32451;
 		rType = 0;
-		vrLen = 1047;
-		vrLoc = 11877;
+		vrLen = 967;
+		vrLoc = 32226;
 	};
-	AFAC4E780B4C23EC00D59661 /* PBXTextBookmark */ = {
+	AF99D2DB0B5D381700F4C984 /* PBXTextBookmark */ = {
 		isa = PBXTextBookmark;
-		comments = "error: conversion from 'int' to 'CFStringUtil' is ambiguous";
-		fRef = AF155A2F0A501F84007E1E6E /* CDirectoryService.cpp */;
+		comments = "error: invalid conversion from 'const char*' to 'int'";
+		fRef = AF155A310A501F84007E1E6E /* PythonWrapper.cpp */;
 		rLen = 1;
-		rLoc = 370;
+		rLoc = 404;
 		rType = 1;
 	};
-	AFAC4E790B4C23EC00D59661 /* PBXTextBookmark */ = {
+	AF99D2DC0B5D381700F4C984 /* PBXTextBookmark */ = {
 		isa = PBXTextBookmark;
 		fRef = AF155A2F0A501F84007E1E6E /* CDirectoryService.cpp */;
-		name = "CDirectoryService.cpp: 1069";
+		name = "CDirectoryService.cpp: 1158";
 		rLen = 0;
-		rLoc = 30221;
+		rLoc = 32451;
 		rType = 0;
-		vrLen = 1047;
-		vrLoc = 11877;
+		vrLen = 967;
+		vrLoc = 32226;
 	};
-	AFAC4E7A0B4C23EC00D59661 /* PBXTextBookmark */ = {
+	AF99D2DD0B5D381700F4C984 /* PBXTextBookmark */ = {
 		isa = PBXTextBookmark;
+		fRef = AF155A310A501F84007E1E6E /* PythonWrapper.cpp */;
+		name = "PythonWrapper.cpp: 395";
+		rLen = 0;
+		rLoc = 12611;
+		rType = 0;
+		vrLen = 906;
+		vrLoc = 11446;
+	};
+	AF99D2DE0B5D381900F4C984 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
 		fRef = AF155A2F0A501F84007E1E6E /* CDirectoryService.cpp */;
-		name = "return NULL;";
-		rLen = 15;
-		rLoc = 10914;
+		name = "CDirectoryService.cpp: 11";
+		rLen = 0;
+		rLoc = 389;
 		rType = 0;
-		vrLen = 1309;
-		vrLoc = 10178;
+		vrLen = 874;
+		vrLoc = 819;
 	};
-	AFAC4E7B0B4C246E00D59661 /* PBXTextBookmark */ = {
+	AF99D2DF0B5D381900F4C984 /* PBXBookmark */ = {
+		isa = PBXBookmark;
+		fRef = 08FB7796FE84155DC02AAC07 /* test.cpp */;
+	};
+	AF99D2E00B5D381900F4C984 /* PBXTextBookmark */ = {
 		isa = PBXTextBookmark;
 		fRef = AF155A2F0A501F84007E1E6E /* CDirectoryService.cpp */;
-		name = "CDirectoryService.cpp: 822";
+		name = "CDirectoryService.cpp: 11";
 		rLen = 0;
-		rLoc = 22141;
+		rLoc = 389;
 		rType = 0;
-		vrLen = 1064;
-		vrLoc = 10347;
+		vrLen = 874;
+		vrLoc = 819;
 	};
-	AFAC4E810B4C259700D59661 /* PBXTextBookmark */ = {
+	AF99D2E10B5D381900F4C984 /* PBXTextBookmark */ = {
 		isa = PBXTextBookmark;
+		fRef = 08FB7796FE84155DC02AAC07 /* test.cpp */;
+		name = "test.cpp: 87";
+		rLen = 0;
+		rLoc = 4743;
+		rType = 0;
+		vrLen = 1870;
+		vrLoc = 2601;
+	};
+	AF99D2E20B5D381900F4C984 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = AF155A300A501F84007E1E6E /* CDirectoryService.h */;
+		name = "CDirectoryService.h: 71";
+		rLen = 87;
+		rLoc = 2644;
+		rType = 0;
+		vrLen = 2168;
+		vrLoc = 714;
+	};
+	AF99D2E30B5D3B8100F4C984 /* PBXBookmark */ = {
+		isa = PBXBookmark;
+		fRef = 08FB7796FE84155DC02AAC07 /* test.cpp */;
+	};
+	AF99D2E50B5D3BA200F4C984 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = 08FB7796FE84155DC02AAC07 /* test.cpp */;
+		name = "test.cpp: 87";
+		rLen = 0;
+		rLoc = 4743;
+		rType = 0;
+		vrLen = 1796;
+		vrLoc = 2601;
+	};
+	AF99D2E80B5D3BA200F4C984 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = 08FB7796FE84155DC02AAC07 /* test.cpp */;
+		name = "test.cpp: 43";
+		rLen = 0;
+		rLoc = 1512;
+		rType = 0;
+		vrLen = 2245;
+		vrLoc = 817;
+	};
+	AF99D2E90B5D3BA200F4C984 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = AF155A300A501F84007E1E6E /* CDirectoryService.h */;
+		name = "CDirectoryService.h: 71";
+		rLen = 87;
+		rLoc = 2644;
+		rType = 0;
+		vrLen = 2114;
+		vrLoc = 714;
+	};
+	AF99D2EE0B5D3CB700F4C984 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = 08FB7796FE84155DC02AAC07 /* test.cpp */;
+		name = "test.cpp: 106";
+		rLen = 0;
+		rLoc = 4743;
+		rType = 0;
+		vrLen = 1793;
+		vrLoc = 2601;
+	};
+	AF99D2EF0B5D3CB700F4C984 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
 		fRef = AF155A2F0A501F84007E1E6E /* CDirectoryService.cpp */;
-		name = "CDirectoryService.cpp: 822";
+		name = "CDirectoryService.cpp: 668";
 		rLen = 0;
-		rLoc = 22141;
+		rLoc = 20796;
 		rType = 0;
-		vrLen = 1064;
-		vrLoc = 10347;
+		vrLen = 1857;
+		vrLoc = 19365;
 	};
-	AFAC4E820B4C259700D59661 /* PBXTextBookmark */ = {
+	AF99D2F00B5D3CB700F4C984 /* PBXTextBookmark */ = {
 		isa = PBXTextBookmark;
-		fRef = AFAC4E830B4C259700D59661 /* asm _class_isInitialized  0x90863f5e */;
+		fRef = 08FB7796FE84155DC02AAC07 /* test.cpp */;
 		rLen = 0;
-		rLoc = 1;
+		rLoc = 115;
 		rType = 1;
 	};
-	AFAC4E830B4C259700D59661 /* asm _class_isInitialized  0x90863f5e */ = {
-		isa = PBXFileReference;
-		lastKnownFileType = file;
-		path = "asm _class_isInitialized  0x90863f5e";
-		sourceTree = "<group>";
+	AF99D2F10B5D3CB700F4C984 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = 08FB7796FE84155DC02AAC07 /* test.cpp */;
+		name = "test.cpp: 43";
+		rLen = 0;
+		rLoc = 1512;
+		rType = 0;
+		vrLen = 2245;
+		vrLoc = 817;
 	};
-	AFAC4E840B4C259700D59661 /* PBXTextBookmark */ = {
+	AF99D2F20B5D3CB700F4C984 /* PBXTextBookmark */ = {
 		isa = PBXTextBookmark;
 		fRef = AF155A2F0A501F84007E1E6E /* CDirectoryService.cpp */;
-		name = "CDirectoryService.cpp: 822";
+		name = "CDirectoryService.cpp: 668";
 		rLen = 0;
-		rLoc = 22141;
+		rLoc = 20796;
 		rType = 0;
-		vrLen = 1064;
-		vrLoc = 10347;
+		vrLen = 1857;
+		vrLoc = 19365;
 	};
-	AFAC4E850B4C259700D59661 /* PBXTextBookmark */ = {
+	AF99D2F30B5D3CB700F4C984 /* PBXTextBookmark */ = {
 		isa = PBXTextBookmark;
-		fRef = AFAC4E860B4C259700D59661 /* asm _class_isInitialized  0x90863f5e */;
-		name = "(null): 2";
+		fRef = 08FB7796FE84155DC02AAC07 /* test.cpp */;
+		name = "test.cpp: 87";
 		rLen = 0;
-		rLoc = 42;
+		rLoc = 3402;
 		rType = 0;
-		vrLen = 168;
-		vrLoc = 0;
+		vrLen = 2693;
+		vrLoc = 2098;
 	};
-	AFAC4E860B4C259700D59661 /* asm _class_isInitialized  0x90863f5e */ = {
-		isa = PBXFileReference;
-		path = "asm _class_isInitialized  0x90863f5e";
-		sourceTree = "<group>";
+	AF99D2F40B5D3CB700F4C984 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = AF155A300A501F84007E1E6E /* CDirectoryService.h */;
+		name = "CDirectoryService.h: 71";
+		rLen = 87;
+		rLoc = 2644;
+		rType = 0;
+		vrLen = 2168;
+		vrLoc = 714;
 	};
-	AFAC4E870B4C25AD00D59661 /* PBXTextBookmark */ = {
+	AF99D3010B5D3E5F00F4C984 /* PBXTextBookmark */ = {
 		isa = PBXTextBookmark;
+		fRef = 08FB7796FE84155DC02AAC07 /* test.cpp */;
+		name = "test.cpp: 112";
+		rLen = 0;
+		rLoc = 4743;
+		rType = 0;
+		vrLen = 1212;
+		vrLoc = 2601;
+	};
+	AF99D3020B5D3E5F00F4C984 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = AF155A300A501F84007E1E6E /* CDirectoryService.h */;
+		name = "CDirectoryService.h: 71";
+		rLen = 87;
+		rLoc = 2644;
+		rType = 0;
+		vrLen = 2114;
+		vrLoc = 714;
+	};
+	AF99D3050B5D3E6300F4C984 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = 08FB7796FE84155DC02AAC07 /* test.cpp */;
+		name = "test.cpp: 112";
+		rLen = 0;
+		rLoc = 4743;
+		rType = 0;
+		vrLen = 1212;
+		vrLoc = 2601;
+	};
+	AF99D3060B5D3E6300F4C984 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = AF155A300A501F84007E1E6E /* CDirectoryService.h */;
+		name = "CDirectoryService.h: 71";
+		rLen = 87;
+		rLoc = 2644;
+		rType = 0;
+		vrLen = 2114;
+		vrLoc = 714;
+	};
+	AF99D30D0B5D469A00F4C984 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = 08FB7796FE84155DC02AAC07 /* test.cpp */;
+		name = "test.cpp: 112";
+		rLen = 0;
+		rLoc = 4743;
+		rType = 0;
+		vrLen = 1191;
+		vrLoc = 2601;
+	};
+	AF99D30E0B5D469A00F4C984 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = AF155A300A501F84007E1E6E /* CDirectoryService.h */;
+		name = "CDirectoryService.h: 71";
+		rLen = 87;
+		rLoc = 2644;
+		rType = 0;
+		vrLen = 2114;
+		vrLoc = 714;
+	};
+	AF99D3100B5D469C00F4C984 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = 08FB7796FE84155DC02AAC07 /* test.cpp */;
+		name = "test.cpp: 112";
+		rLen = 0;
+		rLoc = 4743;
+		rType = 0;
+		vrLen = 1191;
+		vrLoc = 2601;
+	};
+	AF99D3110B5D469C00F4C984 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = AF155A300A501F84007E1E6E /* CDirectoryService.h */;
+		name = "CDirectoryService.h: 71";
+		rLen = 87;
+		rLoc = 2644;
+		rType = 0;
+		vrLen = 2114;
+		vrLoc = 714;
+	};
+	AF99D3150B5D46D300F4C984 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = AF155A310A501F84007E1E6E /* PythonWrapper.cpp */;
+		name = "PythonWrapper.cpp: 395";
+		rLen = 0;
+		rLoc = 12611;
+		rType = 0;
+		vrLen = 906;
+		vrLoc = 11446;
+	};
+	AF99D3160B5D46D500F4C984 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = AF155A310A501F84007E1E6E /* PythonWrapper.cpp */;
+		name = "PythonWrapper.cpp: 395";
+		rLen = 0;
+		rLoc = 12611;
+		rType = 0;
+		vrLen = 906;
+		vrLoc = 11446;
+	};
+	AF99D31B0B5D471300F4C984 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = AF155A310A501F84007E1E6E /* PythonWrapper.cpp */;
+		name = "PythonWrapper.cpp: 395";
+		rLen = 0;
+		rLoc = 12611;
+		rType = 0;
+		vrLen = 906;
+		vrLoc = 11446;
+	};
+	AF99D3210B5D483900F4C984 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = 08FB7796FE84155DC02AAC07 /* test.cpp */;
+		name = "test.cpp: 85";
+		rLen = 0;
+		rLoc = 2879;
+		rType = 0;
+		vrLen = 1652;
+		vrLoc = 2601;
+	};
+	AF99D3220B5D483900F4C984 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = AF155A300A501F84007E1E6E /* CDirectoryService.h */;
+		name = "CDirectoryService.h: 71";
+		rLen = 87;
+		rLoc = 2644;
+		rType = 0;
+		vrLen = 2168;
+		vrLoc = 714;
+	};
+	AF99D32B0B5D4C0200F4C984 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = AF155A310A501F84007E1E6E /* PythonWrapper.cpp */;
+		name = "PythonWrapper.cpp: 395";
+		rLen = 0;
+		rLoc = 12611;
+		rType = 0;
+		vrLen = 906;
+		vrLoc = 11446;
+	};
+	AF99D32D0B5D4C7100F4C984 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = AF155A310A501F84007E1E6E /* PythonWrapper.cpp */;
+		name = "PythonWrapper.cpp: 395";
+		rLen = 0;
+		rLoc = 12611;
+		rType = 0;
+		vrLen = 906;
+		vrLoc = 11446;
+	};
+	AF99D32F0B5D4C9300F4C984 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = 08FB7796FE84155DC02AAC07 /* test.cpp */;
+		name = "test.cpp: 93";
+		rLen = 0;
+		rLoc = 3435;
+		rType = 0;
+		vrLen = 1105;
+		vrLoc = 2562;
+	};
+	AF99D3300B5D4C9300F4C984 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
 		fRef = AF155A2F0A501F84007E1E6E /* CDirectoryService.cpp */;
-		name = "CDirectoryService.cpp: 822";
 		rLen = 0;
-		rLoc = 22141;
+		rLoc = 457;
+		rType = 1;
+	};
+	AF99D3310B5D4C9300F4C984 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = 08FB7796FE84155DC02AAC07 /* test.cpp */;
+		name = "test.cpp: 93";
+		rLen = 0;
+		rLoc = 3450;
 		rType = 0;
-		vrLen = 1267;
-		vrLoc = 10178;
+		vrLen = 1230;
+		vrLoc = 2565;
 	};
-	AFAC4E880B4C25AD00D59661 /* PBXTextBookmark */ = {
+	AF99D3320B5D4C9300F4C984 /* PBXTextBookmark */ = {
 		isa = PBXTextBookmark;
-		fRef = AF155AFC0A502C09007E1E6E /* CFStringUtil.cpp */;
-		name = "FStringUtil(CFSt";
-		rLen = 16;
-		rLoc = 1112;
+		fRef = AF155A2F0A501F84007E1E6E /* CDirectoryService.cpp */;
+		name = "CDirectoryService.cpp: 11";
+		rLen = 0;
+		rLoc = 389;
 		rType = 0;
-		vrLen = 633;
-		vrLoc = 736;
+		vrLen = 839;
+		vrLoc = 13460;
 	};
-	AFAC4E890B4C25AD00D59661 /* PBXTextBookmark */ = {
+	AF99D3330B5D4C9300F4C984 /* PBXTextBookmark */ = {
 		isa = PBXTextBookmark;
+		fRef = 08FB7796FE84155DC02AAC07 /* test.cpp */;
+		name = "test.cpp: 93";
+		rLen = 0;
+		rLoc = 3450;
+		rType = 0;
+		vrLen = 1103;
+		vrLoc = 2565;
+	};
+	AF99D3340B5D4C9300F4C984 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
 		fRef = AF155A2F0A501F84007E1E6E /* CDirectoryService.cpp */;
-		name = "CDirectoryService.cpp: 822";
+		name = "CDirectoryService.cpp: 456";
 		rLen = 0;
-		rLoc = 22141;
+		rLoc = 14062;
 		rType = 0;
-		vrLen = 1267;
-		vrLoc = 10178;
+		vrLen = 839;
+		vrLoc = 13460;
 	};
-	AFAC4E8A0B4C25AD00D59661 /* PBXTextBookmark */ = {
+	AF99D3350B5D4C9300F4C984 /* PBXTextBookmark */ = {
 		isa = PBXTextBookmark;
-		fRef = AF155AFC0A502C09007E1E6E /* CFStringUtil.cpp */;
-		name = "CFStringUtil.cpp: 124";
+		fRef = 08FB7796FE84155DC02AAC07 /* test.cpp */;
+		name = "test.cpp: 93";
 		rLen = 0;
-		rLoc = 2726;
+		rLoc = 3435;
 		rType = 0;
-		vrLen = 533;
-		vrLoc = 842;
+		vrLen = 1105;
+		vrLoc = 2562;
 	};
-	AFAC4E900B4C267800D59661 /* PBXTextBookmark */ = {
+	AF99D3360B5D4C9300F4C984 /* PBXTextBookmark */ = {
 		isa = PBXTextBookmark;
-		fRef = AF155AFC0A502C09007E1E6E /* CFStringUtil.cpp */;
-		name = "CFStringUtil.cpp: 124";
+		fRef = AF155A2F0A501F84007E1E6E /* CDirectoryService.cpp */;
+		name = "CDirectoryService.cpp: 456";
 		rLen = 0;
-		rLoc = 2726;
+		rLoc = 14062;
 		rType = 0;
-		vrLen = 599;
-		vrLoc = 842;
+		vrLen = 839;
+		vrLoc = 13460;
 	};
-	AFAC4E910B4C267800D59661 /* PBXTextBookmark */ = {
+	AF99D33A0B5D4CF300F4C984 /* PBXTextBookmark */ = {
 		isa = PBXTextBookmark;
-		comments = "error: cannot convert 'CFStringUtil' to 'const __CFString*' in return";
+		fRef = AF155A310A501F84007E1E6E /* PythonWrapper.cpp */;
+		name = "PythonWrapper.cpp: 395";
+		rLen = 0;
+		rLoc = 12611;
+		rType = 0;
+		vrLen = 906;
+		vrLoc = 11446;
+	};
+	AF99D33B0B5D4CF700F4C984 /* PBXBookmark */ = {
+		isa = PBXBookmark;
 		fRef = AF155A2F0A501F84007E1E6E /* CDirectoryService.cpp */;
+	};
+	AF99D33D0B5D4E3A00F4C984 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = AF155A2F0A501F84007E1E6E /* CDirectoryService.cpp */;
+		name = "CDirectoryService.cpp: 424";
+		rLen = 5;
+		rLoc = 13257;
+		rType = 0;
+		vrLen = 980;
+		vrLoc = 13633;
+	};
+	AF99D3400B5D4E3A00F4C984 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = AF155A2F0A501F84007E1E6E /* CDirectoryService.cpp */;
+		name = "CDirectoryService.cpp: 1175";
+		rLen = 0;
+		rLoc = 34610;
+		rType = 0;
+		vrLen = 2047;
+		vrLoc = 31874;
+	};
+	AF99D3430B5D4E3A00F4C984 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = AF155A300A501F84007E1E6E /* CDirectoryService.h */;
+		rLen = 0;
+		rLoc = 2948;
+		rType = 0;
+	};
+	AF99D3440B5D4E3A00F4C984 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = AF155A300A501F84007E1E6E /* CDirectoryService.h */;
+		name = "CDirectoryService.h: 72";
+		rLen = 112;
+		rLoc = 2731;
+		rType = 0;
+		vrLen = 2227;
+		vrLoc = 755;
+	};
+	AF99D3460B5D503D00F4C984 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = AF155A2F0A501F84007E1E6E /* CDirectoryService.cpp */;
+		name = "CDirectoryService.cpp: 424";
+		rLen = 5;
+		rLoc = 13257;
+		rType = 0;
+		vrLen = 979;
+		vrLoc = 13633;
+	};
+	AF99D3470B5D503D00F4C984 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = AF155A2F0A501F84007E1E6E /* CDirectoryService.cpp */;
+		name = "CDirectoryService.cpp: 1203";
+		rLen = 0;
+		rLoc = 34430;
+		rType = 0;
+		vrLen = 2012;
+		vrLoc = 32467;
+	};
+	AF99D34A0B5D503D00F4C984 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = AF99D34B0B5D503D00F4C984 /* DirServicesTypes.h */;
 		rLen = 1;
-		rLoc = 391;
+		rLoc = 351;
 		rType = 1;
 	};
-	AFAC4E920B4C267800D59661 /* PBXTextBookmark */ = {
+	AF99D34B0B5D503D00F4C984 /* DirServicesTypes.h */ = {
+		isa = PBXFileReference;
+		lastKnownFileType = sourcecode.c.h;
+		name = DirServicesTypes.h;
+		path = /Developer/SDKs/MacOSX10.4u.sdk/System/Library/Frameworks/DirectoryService.framework/Versions/A/Headers/DirServicesTypes.h;
+		sourceTree = "<absolute>";
+	};
+	AF99D34C0B5D503D00F4C984 /* PBXTextBookmark */ = {
 		isa = PBXTextBookmark;
-		fRef = AF155AFC0A502C09007E1E6E /* CFStringUtil.cpp */;
-		name = "CFStringUtil.cpp: 124";
+		fRef = AF99D34D0B5D503D00F4C984 /* DirServicesTypes.h */;
+		name = "DirServicesTypes.h: 354";
+		rLen = 11;
+		rLoc = 12302;
+		rType = 0;
+		vrLen = 2488;
+		vrLoc = 10949;
+	};
+	AF99D34D0B5D503D00F4C984 /* DirServicesTypes.h */ = {
+		isa = PBXFileReference;
+		lastKnownFileType = sourcecode.c.h;
+		name = DirServicesTypes.h;
+		path = /Developer/SDKs/MacOSX10.4u.sdk/System/Library/Frameworks/DirectoryService.framework/Versions/A/Headers/DirServicesTypes.h;
+		sourceTree = "<absolute>";
+		uiCtxt = {
+			sepNavIntBoundsRect = "{{0, 0}, {862, 7238}}";
+			sepNavSelRange = "{12198, 899}";
+			sepNavVisRect = "{{0, 4246}, {862, 1040}}";
+			sepNavWindowFrame = "{{15, 4}, {921, 1169}}";
+		};
+	};
+	AF99D34E0B5D503D00F4C984 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = AF155A300A501F84007E1E6E /* CDirectoryService.h */;
+		name = "CDirectoryService.h: 72";
+		rLen = 112;
+		rLoc = 2731;
+		rType = 0;
+		vrLen = 2227;
+		vrLoc = 755;
+	};
+	AF99D3530B5D51EA00F4C984 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = AF155A310A501F84007E1E6E /* PythonWrapper.cpp */;
+		name = "PythonWrapper.cpp: 395";
 		rLen = 0;
-		rLoc = 2726;
+		rLoc = 12611;
 		rType = 0;
-		vrLen = 599;
-		vrLoc = 842;
+		vrLen = 906;
+		vrLoc = 11446;
 	};
-	AFAC4E930B4C267800D59661 /* PBXTextBookmark */ = {
+	AF99D3540B5D51EA00F4C984 /* PBXTextBookmark */ = {
 		isa = PBXTextBookmark;
+		comments = "error: 'compund' was not declared in this scope";
 		fRef = AF155A2F0A501F84007E1E6E /* CDirectoryService.cpp */;
-		name = "return CFStringUtil(result);";
-		rLen = 32;
-		rLoc = 11575;
+		rLen = 1;
+		rLoc = 1206;
+		rType = 1;
+	};
+	AF99D3550B5D51EA00F4C984 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = AF155A310A501F84007E1E6E /* PythonWrapper.cpp */;
+		name = "PythonWrapper.cpp: 395";
+		rLen = 0;
+		rLoc = 12611;
 		rType = 0;
-		vrLen = 1069;
-		vrLoc = 10993;
+		vrLen = 906;
+		vrLoc = 11446;
 	};
-	AFAC4E980B4C26BC00D59661 /* PBXTextBookmark */ = {
+	AF99D3560B5D51EA00F4C984 /* PBXTextBookmark */ = {
 		isa = PBXTextBookmark;
 		fRef = AF155A2F0A501F84007E1E6E /* CDirectoryService.cpp */;
-		name = "CDirectoryService.cpp: 826";
+		name = "CDirectoryService.cpp: 1229";
 		rLen = 0;
-		rLoc = 22175;
+		rLoc = 34590;
 		rType = 0;
-		vrLen = 741;
-		vrLoc = 12242;
+		vrLen = 561;
+		vrLoc = 34050;
 	};
-	AFAC4E9A0B4C279100D59661 /* PBXTextBookmark */ = {
+	AF99D35B0B5D52FC00F4C984 /* PBXBookmark */ = {
+		isa = PBXBookmark;
+		fRef = AF155A2F0A501F84007E1E6E /* CDirectoryService.cpp */;
+	};
+	AF99D35C0B5D539800F4C984 /* PBXTextBookmark */ = {
 		isa = PBXTextBookmark;
+		fRef = 08FB7796FE84155DC02AAC07 /* test.cpp */;
+		name = "test.cpp: 87";
+		rLen = 0;
+		rLoc = 2905;
+		rType = 0;
+		vrLen = 1170;
+		vrLoc = 2556;
+	};
+	AF99D35D0B5D539800F4C984 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
 		fRef = AF155A2F0A501F84007E1E6E /* CDirectoryService.cpp */;
-		name = "CDirectoryService.cpp: 826";
+		name = "CDirectoryService.cpp: 424";
+		rLen = 5;
+		rLoc = 13257;
+		rType = 0;
+		vrLen = 997;
+		vrLoc = 13633;
+	};
+	AF99D35E0B5D539800F4C984 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = AF155A2F0A501F84007E1E6E /* CDirectoryService.cpp */;
+		name = "CDirectoryService.cpp: 424";
+		rLen = 5;
+		rLoc = 13257;
+		rType = 0;
+		vrLen = 997;
+		vrLoc = 13633;
+	};
+	AF99D35F0B5D539800F4C984 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = 08FB7796FE84155DC02AAC07 /* test.cpp */;
+		name = "test.cpp: 87";
 		rLen = 0;
-		rLoc = 22175;
+		rLoc = 2905;
 		rType = 0;
-		vrLen = 1055;
-		vrLoc = 10993;
+		vrLen = 1170;
+		vrLoc = 2556;
 	};
-	AFAC4EB00B4C3E7700D59661 /* PBXTextBookmark */ = {
+	AF99D3600B5D539800F4C984 /* PBXTextBookmark */ = {
 		isa = PBXTextBookmark;
 		fRef = AF155A2F0A501F84007E1E6E /* CDirectoryService.cpp */;
-		name = "CDirectoryService.cpp: 827";
+		name = "CDirectoryService.cpp: 1215";
 		rLen = 0;
-		rLoc = 22211;
+		rLoc = 33956;
 		rType = 0;
-		vrLen = 939;
-		vrLoc = 10994;
+		vrLen = 902;
+		vrLoc = 34152;
 	};
-	AFAC4EB40B4C41C300D59661 /* PBXTextBookmark */ = {
+	AF99D3630B5D539800F4C984 /* PBXTextBookmark */ = {
 		isa = PBXTextBookmark;
 		fRef = AF155A2F0A501F84007E1E6E /* CDirectoryService.cpp */;
-		name = "CDirectoryService.cpp: 851";
+		name = "CDirectoryService.cpp: 1223";
 		rLen = 0;
-		rLoc = 22653;
+		rLoc = 34300;
 		rType = 0;
-		vrLen = 1010;
-		vrLoc = 10903;
+		vrLen = 1338;
+		vrLoc = 34369;
 	};
-	AFAC4EB60B4C41D100D59661 /* PBXTextBookmark */ = {
+	AF99D3690B5D554E00F4C984 /* PBXTextBookmark */ = {
 		isa = PBXTextBookmark;
+		comments = "error: expected primary-expression before ')' token";
 		fRef = AF155A2F0A501F84007E1E6E /* CDirectoryService.cpp */;
-		name = "CDirectoryService.cpp: 851";
+		rLen = 1;
+		rLoc = 1198;
+		rType = 1;
+	};
+	AF99D36A0B5D554E00F4C984 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = AF155A2F0A501F84007E1E6E /* CDirectoryService.cpp */;
+		name = "CDirectoryService.cpp: 1223";
 		rLen = 0;
-		rLoc = 22652;
+		rLoc = 34300;
 		rType = 0;
-		vrLen = 1010;
-		vrLoc = 10902;
+		vrLen = 742;
+		vrLoc = 34650;
 	};
-	AFAC4EB80B4C41E500D59661 /* PBXTextBookmark */ = {
+	AF99D36C0B5D556100F4C984 /* PBXTextBookmark */ = {
 		isa = PBXTextBookmark;
-		comments = "error: 'RemoveBuffer' was not declared in this scope";
+		comments = "error: expected primary-expression before ')' token";
 		fRef = AF155A2F0A501F84007E1E6E /* CDirectoryService.cpp */;
 		rLen = 1;
-		rLoc = 801;
+		rLoc = 1198;
 		rType = 1;
 	};
-	AFAC4EB90B4C41E500D59661 /* PBXTextBookmark */ = {
+	AF99D36D0B5D556100F4C984 /* PBXTextBookmark */ = {
 		isa = PBXTextBookmark;
 		fRef = AF155A2F0A501F84007E1E6E /* CDirectoryService.cpp */;
-		name = "CDirectoryService.cpp: 851";
+		name = "CDirectoryService.cpp: 1223";
 		rLen = 0;
-		rLoc = 22671;
+		rLoc = 34268;
 		rType = 0;
-		vrLen = 652;
-		vrLoc = 21167;
+		vrLen = 741;
+		vrLoc = 34650;
 	};
-	AFAC4EBA0B4C41FE00D59661 /* PBXTextBookmark */ = {
+	AF99D36F0B5D559300F4C984 /* PBXTextBookmark */ = {
 		isa = PBXTextBookmark;
+		comments = "error: expected primary-expression before ')' token";
 		fRef = AF155A2F0A501F84007E1E6E /* CDirectoryService.cpp */;
 		rLen = 1;
-		rLoc = 303;
+		rLoc = 1198;
 		rType = 1;
 	};
-	AFAC4EBE0B4C431100D59661 /* PBXTextBookmark */ = {
+	AF99D3700B5D559300F4C984 /* PBXTextBookmark */ = {
 		isa = PBXTextBookmark;
 		fRef = AF155A2F0A501F84007E1E6E /* CDirectoryService.cpp */;
-		name = "CDirectoryService.cpp: 851";
+		name = "CDirectoryService.cpp: 1223";
 		rLen = 0;
-		rLoc = 22671;
+		rLoc = 34296;
 		rType = 0;
-		vrLen = 1010;
-		vrLoc = 10902;
+		vrLen = 748;
+		vrLoc = 34650;
 	};
-	AFAC4EBF0B4C431100D59661 /* PBXTextBookmark */ = {
+	AF99D3730B5D55E000F4C984 /* PBXTextBookmark */ = {
 		isa = PBXTextBookmark;
-		comments = "error: invalid conversion from 'const __CFArray*' to '__CFArray*'";
-		fRef = 08FB7796FE84155DC02AAC07 /* test.cpp */;
+		fRef = AF155A2F0A501F84007E1E6E /* CDirectoryService.cpp */;
+		name = "CDirectoryService.cpp: 1223";
+		rLen = 0;
+		rLoc = 34296;
+		rType = 0;
+		vrLen = 748;
+		vrLoc = 34650;
+	};
+	AF99D3740B5D55E000F4C984 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		comments = "error: no matching function for call to 'CDirectoryService::QueryRecordsWithAttributes(const __CFDictionary*&, tDirPatternMatch, bool, const char*&, const __CFArray*&)'";
+		fRef = AF155A310A501F84007E1E6E /* PythonWrapper.cpp */;
 		rLen = 1;
-		rLoc = 147;
+		rLoc = 404;
 		rType = 1;
 	};
-	AFAC4EC00B4C431100D59661 /* PBXTextBookmark */ = {
+	AF99D3750B5D55E000F4C984 /* PBXTextBookmark */ = {
 		isa = PBXTextBookmark;
 		fRef = AF155A2F0A501F84007E1E6E /* CDirectoryService.cpp */;
-		name = "CDirectoryService.cpp: 851";
+		name = "CDirectoryService.cpp: 1223";
 		rLen = 0;
-		rLoc = 22671;
+		rLoc = 34296;
 		rType = 0;
-		vrLen = 1010;
-		vrLoc = 10902;
+		vrLen = 748;
+		vrLoc = 34650;
 	};
-	AFAC4EC10B4C431100D59661 /* PBXTextBookmark */ = {
+	AF99D3760B5D55E000F4C984 /* PBXTextBookmark */ = {
 		isa = PBXTextBookmark;
-		fRef = 08FB7796FE84155DC02AAC07 /* test.cpp */;
-		name = "PrintArray(arrayvalue);";
-		rLen = 26;
-		rLoc = 4366;
+		fRef = AF155A310A501F84007E1E6E /* PythonWrapper.cpp */;
+		name = "PythonWrapper.cpp: 397";
+		rLen = 0;
+		rLoc = 12580;
 		rType = 0;
-		vrLen = 1015;
-		vrLoc = 3547;
+		vrLen = 917;
+		vrLoc = 11467;
 	};
-	AFAC4EC30B4C434200D59661 /* PBXTextBookmark */ = {
+	AF99D3790B5D55FC00F4C984 /* PBXTextBookmark */ = {
 		isa = PBXTextBookmark;
 		fRef = AF155A2F0A501F84007E1E6E /* CDirectoryService.cpp */;
-		name = "CDirectoryService.cpp: 851";
+		name = "CDirectoryService.cpp: 1215";
 		rLen = 0;
-		rLoc = 22671;
+		rLoc = 33956;
 		rType = 0;
-		vrLen = 652;
-		vrLoc = 21167;
+		vrLen = 902;
+		vrLoc = 34152;
 	};
-	AFAC4EC40B4C434200D59661 /* PBXTextBookmark */ = {
+	AF99D37A0B5D55FC00F4C984 /* PBXTextBookmark */ = {
 		isa = PBXTextBookmark;
 		fRef = AF155A2F0A501F84007E1E6E /* CDirectoryService.cpp */;
-		name = "CDirectoryService.cpp: 851";
+		name = "CDirectoryService.cpp: 1215";
 		rLen = 0;
-		rLoc = 22671;
+		rLoc = 33956;
 		rType = 0;
-		vrLen = 652;
-		vrLoc = 21167;
+		vrLen = 902;
+		vrLoc = 34152;
 	};
-	AFAC4EC50B4C434200D59661 /* PBXTextBookmark */ = {
+	AF99D37B0B5D55FC00F4C984 /* PBXTextBookmark */ = {
 		isa = PBXTextBookmark;
 		fRef = 08FB7796FE84155DC02AAC07 /* test.cpp */;
-		name = "test.cpp: 204";
+		name = "test.cpp: 95";
 		rLen = 0;
-		rLoc = 5935;
+		rLoc = 3457;
 		rType = 0;
-		vrLen = 837;
-		vrLoc = 3572;
+		vrLen = 2065;
+		vrLoc = 2724;
 	};
-	AFAC4EC80B4C436E00D59661 /* PBXTextBookmark */ = {
+	AF99D37C0B5D561300F4C984 /* PBXBookmark */ = {
+		isa = PBXBookmark;
+		fRef = AF155A310A501F84007E1E6E /* PythonWrapper.cpp */;
+	};
+	AF99D37D0B5D56A900F4C984 /* PBXTextBookmark */ = {
 		isa = PBXTextBookmark;
 		fRef = 08FB7796FE84155DC02AAC07 /* test.cpp */;
-		name = "test.cpp: 204";
+		name = "test.cpp: 95";
 		rLen = 0;
-		rLoc = 5935;
+		rLoc = 3457;
 		rType = 0;
-		vrLen = 832;
-		vrLoc = 3572;
+		vrLen = 2065;
+		vrLoc = 2724;
 	};
-	AFAC4ECB0B4C437900D59661 /* PBXTextBookmark */ = {
+	AF99D3800B5D56A900F4C984 /* PBXTextBookmark */ = {
 		isa = PBXTextBookmark;
+		fRef = AF155A310A501F84007E1E6E /* PythonWrapper.cpp */;
+		name = "PythonWrapper.cpp: 348";
+		rLen = 874;
+		rLoc = 10132;
+		rType = 0;
+		vrLen = 2588;
+		vrLoc = 9565;
+	};
+	AF99D3820B5D579A00F4C984 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
 		fRef = 08FB7796FE84155DC02AAC07 /* test.cpp */;
-		name = "test.cpp: 204";
+		name = "test.cpp: 95";
 		rLen = 0;
-		rLoc = 5935;
+		rLoc = 3457;
 		rType = 0;
-		vrLen = 964;
-		vrLoc = 3540;
+		vrLen = 2065;
+		vrLoc = 2724;
 	};
-	AFAC4ECC0B4C437900D59661 /* PBXTextBookmark */ = {
+	AF99D3830B5D579A00F4C984 /* PBXTextBookmark */ = {
 		isa = PBXTextBookmark;
+		fRef = AF155A310A501F84007E1E6E /* PythonWrapper.cpp */;
+		name = "PythonWrapper.cpp: 348";
+		rLen = 874;
+		rLoc = 10132;
+		rType = 0;
+		vrLen = 2588;
+		vrLoc = 9565;
+	};
+	AF99D3840B5D579A00F4C984 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = AF155A310A501F84007E1E6E /* PythonWrapper.cpp */;
+		name = "PythonWrapper.cpp: 372";
+		rLen = 0;
+		rLoc = 11301;
+		rType = 0;
+		vrLen = 2572;
+		vrLoc = 10228;
+	};
+	AF99D3850B5D58E800F4C984 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
 		fRef = 08FB7796FE84155DC02AAC07 /* test.cpp */;
-		name = "test.cpp: 204";
+		name = "test.cpp: 95";
 		rLen = 0;
-		rLoc = 5935;
+		rLoc = 3457;
 		rType = 0;
-		vrLen = 964;
-		vrLoc = 3540;
+		vrLen = 2065;
+		vrLoc = 2724;
 	};
-	AFAC4ECD0B4C437900D59661 /* PBXTextBookmark */ = {
+	AF99D3860B5D58E800F4C984 /* PBXTextBookmark */ = {
 		isa = PBXTextBookmark;
+		fRef = AF155A310A501F84007E1E6E /* PythonWrapper.cpp */;
+		name = "PythonWrapper.cpp: 373";
+		rLen = 0;
+		rLoc = 11489;
+		rType = 0;
+		vrLen = 2560;
+		vrLoc = 10084;
+	};
+	AF99D3870B5D5A5C00F4C984 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = 08FB7796FE84155DC02AAC07 /* test.cpp */;
+		name = "test.cpp: 95";
+		rLen = 0;
+		rLoc = 3457;
+		rType = 0;
+		vrLen = 2065;
+		vrLoc = 2724;
+	};
+	AF99D3880B5D5A5C00F4C984 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = AF155A310A501F84007E1E6E /* PythonWrapper.cpp */;
+		name = "PythonWrapper.cpp: 374";
+		rLen = 0;
+		rLoc = 11350;
+		rType = 0;
+		vrLen = 2584;
+		vrLoc = 10129;
+	};
+	AF99D3890B5D5DD300F4C984 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = 08FB7796FE84155DC02AAC07 /* test.cpp */;
+		name = "test.cpp: 95";
+		rLen = 0;
+		rLoc = 3457;
+		rType = 0;
+		vrLen = 2065;
+		vrLoc = 2724;
+	};
+	AF99D38A0B5D5DD300F4C984 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = AF155A310A501F84007E1E6E /* PythonWrapper.cpp */;
+		name = "PythonWrapper.cpp: 390";
+		rLen = 0;
+		rLoc = 12064;
+		rType = 0;
+		vrLen = 2434;
+		vrLoc = 9558;
+	};
+	AF99D38C0B5D5E2700F4C984 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = 08FB7796FE84155DC02AAC07 /* test.cpp */;
+		name = "test.cpp: 95";
+		rLen = 0;
+		rLoc = 3457;
+		rType = 0;
+		vrLen = 2065;
+		vrLoc = 2724;
+	};
+	AF99D38D0B5D5E2700F4C984 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = AF155A310A501F84007E1E6E /* PythonWrapper.cpp */;
+		name = "PythonWrapper.cpp: 391";
+		rLen = 0;
+		rLoc = 12049;
+		rType = 0;
+		vrLen = 2624;
+		vrLoc = 10317;
+	};
+	AF99D38F0B5D5F8500F4C984 /* PBXBookmark */ = {
+		isa = PBXBookmark;
 		fRef = AF155A2F0A501F84007E1E6E /* CDirectoryService.cpp */;
-		name = "printf(\"%d\", dsStatus);";
-		rLen = 26;
-		rLoc = 9255;
+	};
+	AF99D3900B5D5FA700F4C984 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = 08FB7796FE84155DC02AAC07 /* test.cpp */;
+		name = "test.cpp: 95";
+		rLen = 0;
+		rLoc = 3457;
 		rType = 0;
-		vrLen = 814;
-		vrLoc = 8902;
+		vrLen = 2065;
+		vrLoc = 2724;
 	};
+	AF99D3930B5D5FA700F4C984 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = AF155A2F0A501F84007E1E6E /* CDirectoryService.cpp */;
+		name = "CDirectoryService.cpp: 1222";
+		rLen = 0;
+		rLoc = 34075;
+		rType = 0;
+		vrLen = 1249;
+		vrLoc = 34284;
+	};
+	AF99D3940B5D69C700F4C984 /* PBXBookmark */ = {
+		isa = PBXBookmark;
+		fRef = AF155A310A501F84007E1E6E /* PythonWrapper.cpp */;
+	};
+	AF99D3950B5D69F100F4C984 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = 08FB7796FE84155DC02AAC07 /* test.cpp */;
+		name = "test.cpp: 95";
+		rLen = 0;
+		rLoc = 3457;
+		rType = 0;
+		vrLen = 2065;
+		vrLoc = 2724;
+	};
+	AF99D3980B5D69F100F4C984 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = AF155A310A501F84007E1E6E /* PythonWrapper.cpp */;
+		name = "PythonWrapper.cpp: 374";
+		rLen = 0;
+		rLoc = 11301;
+		rType = 0;
+		vrLen = 2034;
+		vrLoc = 10970;
+	};
+	AF99D39A0B5D6A5B00F4C984 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = 08FB7796FE84155DC02AAC07 /* test.cpp */;
+		name = "test.cpp: 95";
+		rLen = 0;
+		rLoc = 3457;
+		rType = 0;
+		vrLen = 2065;
+		vrLoc = 2724;
+	};
+	AF99D39B0B5D6A5B00F4C984 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = AF155A310A501F84007E1E6E /* PythonWrapper.cpp */;
+		name = "PythonWrapper.cpp: 375";
+		rLen = 0;
+		rLoc = 11514;
+		rType = 0;
+		vrLen = 2038;
+		vrLoc = 10970;
+	};
+	AF99D39C0B5D6A7C00F4C984 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = 08FB7796FE84155DC02AAC07 /* test.cpp */;
+		name = "test.cpp: 95";
+		rLen = 0;
+		rLoc = 3457;
+		rType = 0;
+		vrLen = 2065;
+		vrLoc = 2724;
+	};
+	AF99D39D0B5D6A7C00F4C984 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = AF155A310A501F84007E1E6E /* PythonWrapper.cpp */;
+		name = "PythonWrapper.cpp: 374";
+		rLen = 16;
+		rLoc = 11270;
+		rType = 0;
+		vrLen = 2038;
+		vrLoc = 10970;
+	};
+	AF99D39E0B5D6AFF00F4C984 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = 08FB7796FE84155DC02AAC07 /* test.cpp */;
+		name = "test.cpp: 95";
+		rLen = 0;
+		rLoc = 3457;
+		rType = 0;
+		vrLen = 2065;
+		vrLoc = 2724;
+	};
+	AF99D39F0B5D6AFF00F4C984 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = AF155A310A501F84007E1E6E /* PythonWrapper.cpp */;
+		name = "PythonWrapper.cpp: 374";
+		rLen = 0;
+		rLoc = 11301;
+		rType = 0;
+		vrLen = 2037;
+		vrLoc = 10970;
+	};
+	AF99D3A00B5D6B3700F4C984 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = 08FB7796FE84155DC02AAC07 /* test.cpp */;
+		name = "test.cpp: 95";
+		rLen = 0;
+		rLoc = 3457;
+		rType = 0;
+		vrLen = 2065;
+		vrLoc = 2724;
+	};
+	AF99D3A10B5D6B3700F4C984 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = AF155A310A501F84007E1E6E /* PythonWrapper.cpp */;
+		name = "PythonWrapper.cpp: 375";
+		rLen = 0;
+		rLoc = 11409;
+		rType = 0;
+		vrLen = 2034;
+		vrLoc = 10970;
+	};
+	AF99D3A20B5D6BCD00F4C984 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = 08FB7796FE84155DC02AAC07 /* test.cpp */;
+		name = "test.cpp: 95";
+		rLen = 0;
+		rLoc = 3457;
+		rType = 0;
+		vrLen = 2065;
+		vrLoc = 2724;
+	};
+	AF99D3A30B5D6BCD00F4C984 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = AF155A310A501F84007E1E6E /* PythonWrapper.cpp */;
+		name = "PythonWrapper.cpp: 514";
+		rLen = 0;
+		rLoc = 16188;
+		rType = 0;
+		vrLen = 2154;
+		vrLoc = 14864;
+	};
+	AF99D3A80B5D6EB600F4C984 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = 08FB7796FE84155DC02AAC07 /* test.cpp */;
+		name = "test.cpp: 95";
+		rLen = 0;
+		rLoc = 3457;
+		rType = 0;
+		vrLen = 2065;
+		vrLoc = 2724;
+	};
+	AF99D3A90B5D6EB600F4C984 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = AF155A310A501F84007E1E6E /* PythonWrapper.cpp */;
+		name = "PythonWrapper.cpp: 121";
+		rLen = 36;
+		rLoc = 3328;
+		rType = 0;
+		vrLen = 1678;
+		vrLoc = 3258;
+	};
+	AF99D3AD0B5D6F5D00F4C984 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = 08FB7796FE84155DC02AAC07 /* test.cpp */;
+		name = "test.cpp: 95";
+		rLen = 0;
+		rLoc = 3457;
+		rType = 0;
+		vrLen = 2065;
+		vrLoc = 2724;
+	};
+	AF99D3AE0B5D6F5D00F4C984 /* PBXTextBookmark */ = {
+		isa = PBXTextBookmark;
+		fRef = AF155A310A501F84007E1E6E /* PythonWrapper.cpp */;
+		name = "PythonWrapper.cpp: 121";
+		rLen = 36;
+		rLoc = 3328;
+		rType = 0;
+		vrLen = 1678;
+		vrLoc = 3258;
+	};
 }

Modified: PyOpenDirectory/branches/users/cdaboo/od-schema-1044/support/PyOpenDirectory.xcodeproj/project.pbxproj
===================================================================
--- PyOpenDirectory/branches/users/cdaboo/od-schema-1044/support/PyOpenDirectory.xcodeproj/project.pbxproj	2007-01-16 18:30:59 UTC (rev 1051)
+++ PyOpenDirectory/branches/users/cdaboo/od-schema-1044/support/PyOpenDirectory.xcodeproj/project.pbxproj	2007-01-16 20:30:25 UTC (rev 1052)
@@ -15,6 +15,7 @@
 		AF155A380A501F9D007E1E6E /* DirectoryService.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF155A360A501F9D007E1E6E /* DirectoryService.framework */; };
 		AF155AFD0A502C09007E1E6E /* CFStringUtil.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = AF155AFB0A502C09007E1E6E /* CFStringUtil.h */; };
 		AF155AFE0A502C09007E1E6E /* CFStringUtil.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AF155AFC0A502C09007E1E6E /* CFStringUtil.cpp */; };
+		AFEF82220B571AC200ACEED3 /* Python.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AFEF82210B571AC200ACEED3 /* Python.framework */; };
 /* End PBXBuildFile section */
 
 /* Begin PBXCopyFilesBuildPhase section */
@@ -41,6 +42,7 @@
 		AF155A360A501F9D007E1E6E /* DirectoryService.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = DirectoryService.framework; path = /System/Library/Frameworks/DirectoryService.framework; sourceTree = "<absolute>"; };
 		AF155AFB0A502C09007E1E6E /* CFStringUtil.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CFStringUtil.h; path = ../src/CFStringUtil.h; sourceTree = SOURCE_ROOT; };
 		AF155AFC0A502C09007E1E6E /* CFStringUtil.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = CFStringUtil.cpp; path = ../src/CFStringUtil.cpp; sourceTree = SOURCE_ROOT; };
+		AFEF82210B571AC200ACEED3 /* Python.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Python.framework; path = /Library/Frameworks/Python.framework; sourceTree = "<absolute>"; };
 /* End PBXFileReference section */
 
 /* Begin PBXFrameworksBuildPhase section */
@@ -50,6 +52,7 @@
 			files = (
 				AF155A370A501F9D007E1E6E /* CoreFoundation.framework in Frameworks */,
 				AF155A380A501F9D007E1E6E /* DirectoryService.framework in Frameworks */,
+				AFEF82220B571AC200ACEED3 /* Python.framework in Frameworks */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -90,6 +93,7 @@
 		AF155A3D0A501FA0007E1E6E /* Frameworks */ = {
 			isa = PBXGroup;
 			children = (
+				AFEF82210B571AC200ACEED3 /* Python.framework */,
 				AF155A350A501F9D007E1E6E /* CoreFoundation.framework */,
 				AF155A360A501F9D007E1E6E /* DirectoryService.framework */,
 			);

Modified: PyOpenDirectory/branches/users/cdaboo/od-schema-1044/support/test.cpp
===================================================================
--- PyOpenDirectory/branches/users/cdaboo/od-schema-1044/support/test.cpp	2007-01-16 18:30:59 UTC (rev 1051)
+++ PyOpenDirectory/branches/users/cdaboo/od-schema-1044/support/test.cpp	2007-01-16 20:30:25 UTC (rev 1052)
@@ -34,11 +34,13 @@
 void PrintArrayArray(CFMutableArrayRef list);
 void PrintArray(CFArrayRef list);
 void AuthenticateUser(CDirectoryService* dir, const char* user, const char* pswd);
+void AuthenticateUserDigest(CDirectoryService* dir, const char* user, const char* challenge, const char* response, const char* method);
 
 int main (int argc, const char * argv[]) {
     
 	CDirectoryService* dir = new CDirectoryService("/Search");
 
+#if 0
 	CFStringRef strings[2];
 	strings[0] = CFSTR(kDS1AttrDistinguishedName);
 	strings[1] = CFSTR(kDS1AttrGeneratedUID);
@@ -76,18 +78,62 @@
 
 	AuthenticateUser(dir, "cdaboo", "appledav1234");
 	AuthenticateUser(dir, "cdaboo", "appledav6585");
+#elif 1
+	CFStringRef keys[2];
+	keys[0] = CFSTR(kDS1AttrFirstName);
+	keys[1] = CFSTR(kDS1AttrLastName);
+	CFStringRef values[2];
+	values[0] = CFSTR("cyrus");
+	values[1] = CFSTR("daboo");
+	CFDictionaryRef kvdict = CFDictionaryCreate(kCFAllocatorDefault, (const void **)keys, (const void**)values, 2, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);
+                        
+	CFStringRef strings[2];
+	strings[0] = CFSTR(kDS1AttrDistinguishedName);
+	strings[1] = CFSTR(kDS1AttrGeneratedUID);
+	CFArrayRef array = CFArrayCreate(kCFAllocatorDefault, (const void **)strings, 2, &kCFTypeArrayCallBacks);
+                        
+	CFMutableDictionaryRef dict = dir->QueryRecordsWithAttributes(kvdict, eDSContains, false, false, kDSStdRecordTypeUsers, array);
+	if (dict != NULL)
+	{
+		printf("\n*** Users: %d ***\n", CFDictionaryGetCount(dict));
+		CFDictionaryApplyFunction(dict, PrintDictionaryDictionary, NULL);
+		CFRelease(dict);
+	}
+	else
+	{
+		printf("\nNo Users returned\n");
+	}
+	CFRelease(array);
 	
+#else
+	const char* u = "cyrusdaboo";
+	//const char* c = "nonce=\"1\", qop=\"auth\", realm=\"Test\", algorithm=\"md5\", opaque=\"1\"";
+	//const char* r = "username=\"cyrusdaboo\", nonce=\"1\", cnonce=\"1\", nc=\"1\", realm=\"Test\", algorithm=\"md5\", opaque=\"1\", qop=\"auth\", uri=\"/\", response=\"4241f31ffe6f9c99b891f88e9c41caa9\"";
+	const char* c = "WWW-Authenticate: digest nonce=\"1621696297327727918745238639\", opaque=\"121994e78694cbdff74f12cb32ee6f00-MTYyMTY5NjI5NzMyNzcyNzkxODc0NTIzODYzOSwxMjcuMC4wLjEsMTE2ODU2ODg5NQ==\", realm=\"Test Realm\", algorithm=\"md5\", qop=\"auth\"";
+	const char* r = "Authorization: Digest username=\"cyrusdaboo\", realm=\"Test Realm\", nonce=\"1621696297327727918745238639\", uri=\"/principals/users/cyrusdaboo/\", response=\"e260f13cffcc15572ddeec9c31de437b\", opaque=\"121994e78694cbdff74f12cb32ee6f00-MTYyMTY5NjI5NzMyNzcyNzkxODc0NTIzODYzOSwxMjcuMC4wLjEsMTE2ODU2ODg5NQ==\", algorithm=\"md5\", cnonce=\"70cbd8f04227d8d46c0193b290beaf0d\", nc=00000001, qop=\"auth\"";
+	AuthenticateUserDigest(dir, u, c, r, "GET");
+#endif
 	return 0;
 }
 
 void AuthenticateUser(CDirectoryService* dir, const char* user, const char* pswd)
 {
-	if (dir->AuthenticateUserBasic(user, pswd))
+	bool result = false;
+	if (dir->AuthenticateUserBasic(user, pswd, result))
 		printf("Authenticated user: %s\n", user);
 	else
 		printf("Not Authenticated user: %s\n", user);
 }
 
+void AuthenticateUserDigest(CDirectoryService* dir, const char* user, const char* challenge, const char* response, const char* method)
+{
+	bool result = false;
+	if (dir->AuthenticateUserDigest(user, challenge, response, method, result))
+		printf("Authenticated user: %s\n", user);
+	else
+		printf("Not Authenticated user: %s\n", user);
+}
+
 void CFDictionaryIterator(const void* key, const void* value, void* ref)
 {
 	CFStringRef strkey = (CFStringRef)key;

Modified: PyOpenDirectory/branches/users/cdaboo/od-schema-1044/test.py
===================================================================
--- PyOpenDirectory/branches/users/cdaboo/od-schema-1044/test.py	2007-01-16 18:30:59 UTC (rev 1051)
+++ PyOpenDirectory/branches/users/cdaboo/od-schema-1044/test.py	2007-01-16 20:30:25 UTC (rev 1052)
@@ -26,34 +26,109 @@
 		print "Failed odInit"
 	else:
 		print "OK odInit"
+
+	def listUsers():
+		d = opendirectory.listAllRecordsWithAttributes(ref, dsattributes.kDSStdRecordTypeUsers,
+													   [dsattributes.kDS1AttrGeneratedUID, dsattributes.kDS1AttrDistinguishedName,])
+		if d is None:
+			print "Failed to list users"
+		else:
+			names = [v for v in d.iterkeys()]
+			names.sort()
+			for n in names:
+				print "Name: %s" % n
+				print "dict: %s" % str(d[n])
 	
-	d = opendirectory.listAllRecordsWithAttributes(ref, dsattributes.kDSStdRecordTypeUsers,
-												   [dsattributes.kDS1AttrGeneratedUID, dsattributes.kDS1AttrDistinguishedName,])
-	if d is None:
-		print "Failed to list users"
-	else:
-		names = [v for v in d.iterkeys()]
-		names.sort()
-		for n in names:
-			print "Name: %s" % n
-			print "dict: %s" % str(d[n])
+	def listGroups():
+		d = opendirectory.listAllRecordsWithAttributes(ref, dsattributes.kDSStdRecordTypeGroups,
+													   [dsattributes.kDS1AttrGeneratedUID, dsattributes.kDSNAttrGroupMembers,])
+		if d is None:
+			print "Failed to list groups"
+		else:
+			names = [v for v in d.iterkeys()]
+			names.sort()
+			for n in names:
+				print "Name: %s" % n
+				print "dict: %s" % str(d[n])
 	
-	d = opendirectory.listAllRecordsWithAttributes(ref, dsattributes.kDSStdRecordTypeGroups,
-												   [dsattributes.kDS1AttrGeneratedUID, dsattributes.kDSNAttrGroupMembers,])
-	if d is None:
-		print "Failed to list groups"
-	else:
-		names = [v for v in d.iterkeys()]
-		names.sort()
-		for n in names:
-			print "Name: %s" % n
-			print "dict: %s" % str(d[n])
+	def query(title, dict, matchType, casei, allmatch, recordType, attrs):
+		d = opendirectory.queryRecordsWithAttributes(
+		    ref,
+		    dict,
+		    matchType,
+		    casei,
+		    allmatch,
+			recordType,
+			attrs
+		)
+		if d is None:
+			print "Failed to query users"
+		else:
+			names = [v for v in d.iterkeys()]
+			names.sort()
+			print "\n%s number of results = %d" % (title, len(names),)
+			for n in names:
+				print "Name: %s" % n
+				print "dict: %s" % str(d[n])
+		
+	def queryUsers():
+		query(
+			"queryUsers",
+		    {dsattributes.kDS1AttrFirstName: "cyrus",},
+		    dsattributes.eDSExact,
+		    True,
+		    True,
+			dsattributes.kDSStdRecordTypeUsers,
+			[dsattributes.kDS1AttrGeneratedUID, dsattributes.kDS1AttrDistinguishedName,]
+		)
+		
+	def queryUsersCompoundOr():
+		query(
+			"queryUsersCompoundOr",
+		    {dsattributes.kDS1AttrFirstName: "chris", dsattributes.kDS1AttrLastName: "roy",},
+		    dsattributes.eDSContains,
+		    True,
+		    False,
+			dsattributes.kDSStdRecordTypeUsers,
+			[dsattributes.kDS1AttrGeneratedUID, dsattributes.kDS1AttrDistinguishedName,]
+		)
+		
+	def queryUsersCompoundOrExact():
+		query(
+			"queryUsersCompoundOrExact",
+		    {dsattributes.kDS1AttrFirstName: "chris", dsattributes.kDS1AttrLastName: "roy",},
+		    dsattributes.eDSExact,
+		    True,
+		    False,
+			dsattributes.kDSStdRecordTypeUsers,
+			[dsattributes.kDS1AttrGeneratedUID, dsattributes.kDS1AttrDistinguishedName,]
+		)
+		
+	def queryUsersCompoundAnd():
+		query(
+			"queryUsersCompoundAnd",
+		    {dsattributes.kDS1AttrFirstName: "chris", dsattributes.kDS1AttrLastName: "roy",},
+		    dsattributes.eDSContains,
+		    True,
+		    True,
+			dsattributes.kDSStdRecordTypeUsers,
+			[dsattributes.kDS1AttrGeneratedUID, dsattributes.kDS1AttrDistinguishedName,]
+		)
+		
+	def authentciateBasic():
+		if opendirectory.authenticateUserBasic(ref, "test", "test"):
+			print "Authenticated user"
+		else:
+			print "Failed to authenticate user"
 	
-	if opendirectory.authenticateUserBasic(ref, "test", "test"):
-		print "Authenticated user"
-	else:
-		print "Failed to authenticate user"
-	
+	listUsers()
+	listGroups()
+	queryUsers()
+	queryUsersCompoundOr()
+	queryUsersCompoundOrExact()
+	queryUsersCompoundAnd()
+	authentciateBasic()
+
 	ref = None
 except opendirectory.ODError, ex:
 	print ex

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


More information about the calendarserver-changes mailing list