--- /dev/null
+/*
+ * Copyright (c) 2000-2001,2011,2014 Apple Inc. All Rights Reserved.
+ *
+ * The contents of this file constitute Original Code as defined in and are
+ * subject to the Apple Public Source License Version 1.2 (the 'License').
+ * You may not use this file except in compliance with the License. Please obtain
+ * a copy of the License at http://www.apple.com/publicsource and read it before
+ * using this file.
+ *
+ * This Original Code and all software distributed under the License are
+ * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS
+ * OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, INCLUDING WITHOUT
+ * LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
+ * PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. Please see the License for the
+ * specific language governing rights and limitations under the License.
+ */
+
+
+/*
+ File: MDSAttrUtils.h
+
+ Contains: Stateless functions used by MDSAttrParser.
+
+ Copyright (c) 2001,2011,2014 Apple Inc. All Rights Reserved.
+*/
+
+#ifndef _MDS_ATTR_UTILS_H_
+#define _MDS_ATTR_UTILS_H_ 1
+
+#include <Security/cssmtype.h>
+#include <security_utilities/debugging.h>
+#include <CoreFoundation/CoreFoundation.h>
+#include "MDSAttrStrings.h"
+#include "MDSSession.h"
+
+/* log parsing events */
+#define MPDebug(args...) secdebug("MDS_Parse", ## args)
+
+/* log scanning events */
+#define MSDebug(args...) secdebug("MDS_Scan", ## args)
+
+/*
+ * I can't believe that CFRelease does not do this...
+ */
+#define CF_RELEASE(c) if(c != NULL) { CFRelease(c); c = NULL; }
+
+namespace Security
+{
+
+/*
+ * Fill in one CSSM_DB_ATTRIBUTE_DATA with specified data, type and attribute name.
+ * CSSM_DB_ATTRIBUTE_DATA.Value and its referent are new[]'d and copied.
+ * Assumes:
+ * -- AttributeNameFormat = CSSM_DB_ATTRIBUTE_NAME_AS_STRING
+ */
+extern void MDSRawValueToDbAttr(
+ const void *value,
+ size_t len,
+ CSSM_DB_ATTRIBUTE_FORMAT attrFormat, // CSSM_DB_ATTRIBUTE_FORMAT_STRING, etc.
+ const char *attrName,
+ CSSM_DB_ATTRIBUTE_DATA &attr,
+ uint32 numValues = 1);
+
+/*
+ * Free data new[]'d in the above function.
+ */
+extern void MDSFreeDbRecordAttrs(
+ CSSM_DB_ATTRIBUTE_DATA *attrs,
+ unsigned numAttrs);
+
+
+/* safely get a new[]'d C string from a CFString */
+char *MDSCFStringToCString(
+ CFStringRef cfStr);
+
+/* copy a new[]'d C string from a C string */
+char *MDSCopyCstring(
+ const char *inStr);
+
+/*
+ * Given a CFTypeRef which is either a CFString or a CFNumber, do our best to
+ * convert it to a uint32. If it's a CFString, we'll use a MDSNameValuePair
+ * to convert it. CFStrings expressed as decimal numbers are also converted
+ * properly. (MAYBE we'll convert hex strings too...TBD...)
+ * Returns true if conversion was successful.
+ */
+bool MDSCfTypeToUInt32(
+ CFTypeRef cfValue,
+ const MDSNameValuePair *nameValues, // optional for converting strings to numbers
+ const char *key, // for debug logging only
+ uint32 &value, // RETURNED
+ size_t &valueLen); // RETURNED
+
+/*
+ * Insert a record, defined by a CSSM_DB_ATTRIBUTE_DATA array, into specified
+ * DL and DB. Returns true on success.
+ */
+bool MDSInsertRecord(
+ const CSSM_DB_ATTRIBUTE_DATA *inAttr,
+ unsigned numAttrs,
+ CSSM_DB_RECORDTYPE recordType,
+ MDSSession &dl,
+ CSSM_DB_HANDLE dbHand);
+
+/*
+ * Convert a number expressed as a CFString to a uint32 using the specified
+ * name/value conversion table. The string may have multiple fields from that
+ * table, ORd together in normal C syntax. Like
+ *
+ * CSSM_SERVICE_CSP | CSSM_SERVICE_DL
+ */
+CSSM_RETURN MDSStringToUint32(
+ CFStringRef str,
+ const MDSNameValuePair *table,
+ uint32 &value); // RETURNED
+
+
+} // end namespace Security
+
+#endif /* _MDS_ATTR_UTILS_H_ */