DSoAttributeUtils.m [plain text]
/*
* Copyright (c) 2003 Apple Computer, Inc. All rights reserved.
*
* @APPLE_LICENSE_HEADER_START@
*
* This file contains Original Code and/or Modifications of Original Code
* as defined in and that are subject to the Apple Public Source License
* Version 2.0 (the 'License'). You may not use this file except in
* compliance with the License. Please obtain a copy of the License at
* http://www.opensource.apple.com/apsl/ and read it before using this
* file.
*
* The 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.
*
* @APPLE_LICENSE_HEADER_END@
*/
/*!
* @header DSoAttributeUtils
*/
#import "DSoAttributeUtils.h"
#import "DSoDirectory.h"
#import "DSoNode.h"
#import "DSoBuffer.h"
#import "DSoException.h"
@interface DSoAttributeUtils(PrivateMethods)
+ (id) _getAttributesInNode:(DSoNode*)inNode
fromBuffer:(DSoBuffer*)inBuf
listReference:(tAttributeListRef)inListRef
count:(unsigned long)inCount
includeValues:(BOOL)inIncludeVals
allowBinary:(BOOL)inAllowBinary;
@end
@implementation DSoAttributeUtils
+ (NSDictionary*)getAttributesAndValuesInNode:(DSoNode*)inNode
fromBuffer:(DSoBuffer*)inBuf
listReference:(tAttributeListRef)inListRef
count:(unsigned long)inCount
{
return [DSoAttributeUtils _getAttributesInNode: inNode
fromBuffer: inBuf
listReference: inListRef
count: inCount
includeValues: YES
allowBinary: NO];
}
+ (NSDictionary*)getAttributesAndValuesInNode:(DSoNode*)inNode
fromBuffer:(DSoBuffer*)inBuf
listReference:(tAttributeListRef)inListRef
count:(unsigned long)inCount
allowBinary:(BOOL)inAllowBinary
{
return [DSoAttributeUtils _getAttributesInNode: inNode
fromBuffer: inBuf
listReference: inListRef
count: inCount
includeValues: YES
allowBinary: inAllowBinary];
}
+ (NSArray*)getAttributesInNode:(DSoNode*)inNode
fromBuffer:(DSoBuffer*)inBuf
listReference:(tAttributeListRef)inListRef
count:(unsigned long)inCount
{
return [DSoAttributeUtils _getAttributesInNode: inNode
fromBuffer: inBuf
listReference: inListRef
count: inCount
includeValues: NO
allowBinary: NO];
}
+ (NSArray*)getAttributesInNode:(DSoNode*)inNode
fromBuffer:(DSoBuffer*)inBuf
listReference:(tAttributeListRef)inListRef
count:(unsigned long)inCount
allowBinary:(BOOL)inAllowBinary
{
return [DSoAttributeUtils _getAttributesInNode: inNode
fromBuffer: inBuf
listReference: inListRef
count: inCount
includeValues: NO
allowBinary: inAllowBinary];
}
+ (BOOL) _isBinaryAttribute:(char *)inBuffer length:(unsigned long)inLength
{
BOOL returnValue = NO;
if( strlen(inBuffer) != inLength ) {
returnValue = YES;
}
// we'll add more here if necessary...
return returnValue;
}
+ (id) getAttributeFromBuffer:(tDataBufferPtr)inBufferPtr allowBinary:(BOOL)inAllowBinary
{
id returnValue = nil;
if( inBufferPtr->fBufferLength )
{
@try
{
returnValue = [NSString stringWithUTF8String: inBufferPtr->fBufferData];
// if the lengths don't match, we should it treat as binary
if( returnValue && strlen([returnValue UTF8String]) != inBufferPtr->fBufferLength ) {
returnValue = nil;
}
} @catch ( NSException *exception ) {
// must not have been a UTF8 string...
returnValue = nil;
}
if( returnValue == nil || [DSoAttributeUtils _isBinaryAttribute: inBufferPtr->fBufferData
length: inBufferPtr->fBufferLength] )
{
returnValue = [NSData dataWithBytes: inBufferPtr->fBufferData length: inBufferPtr->fBufferLength];
if( !inAllowBinary ) {
NSString *description = [returnValue description];
// make a string that contains just the hex, not including the '<>'
returnValue = [description substringWithRange: NSMakeRange(1,[description length]-2)];
}
}
} else {
returnValue = [NSString string];
}
return returnValue;
}
+ (id) _getAttributesInNode:(DSoNode*)inNode
fromBuffer:(DSoBuffer*)inBuf
listReference:(tAttributeListRef)inListRef
count:(unsigned long)inCount
includeValues:(BOOL)inIncludeVals
allowBinary:(BOOL)inAllowBinary
{
tAttributeValueListRef valueRef = 0;
tAttributeEntryPtr pAttrEntry = nil;
tAttributeValueEntryPtr pValueEntry = nil;
tDirStatus err = eDSNoErr;
char *attributeName = nil;
NSMutableArray *attributeValues = nil;
id attributes = nil;
unsigned long i = 0;
unsigned long j = 0;
// This is a multi-purpose routine, that might return an NSArray of the attribute names,
// or an NSDictionary of the attribute names and their values.
if (inIncludeVals)
attributes = [[NSMutableDictionary alloc] init];
else
attributes = [[NSMutableArray alloc] init];
for (i = 1; i <= inCount && !err; i++)
{
err = dsGetAttributeEntry([inNode dsNodeReference], [inBuf dsDataBuffer],inListRef,
i, &valueRef, &pAttrEntry);
if (!err)
{
attributeName = pAttrEntry->fAttributeSignature.fBufferData;
// If we should also include the values, then retrieve those and place them into the NSDictionary
if (inIncludeVals)
{
attributeValues = [[NSMutableArray alloc] initWithCapacity:pAttrEntry->fAttributeValueCount];
for (j =1; j <= pAttrEntry->fAttributeValueCount; j++)
{
err = dsGetAttributeValue([inNode dsNodeReference],[inBuf dsDataBuffer], j, valueRef, &pValueEntry );
if (err == eDSNoErr)
{
id value = [DSoAttributeUtils getAttributeFromBuffer: &pValueEntry->fAttributeValueData allowBinary: inAllowBinary];
[attributeValues addObject: value];
err = dsDeallocAttributeValueEntry([[inNode directory] dsDirRef], pValueEntry);
pValueEntry = nil;
}
else
{
break; // we'll release below
}
}
if (err == eDSNoErr)
{
[attributes setObject: attributeValues forKey:[NSString stringWithUTF8String:attributeName]];
}
[attributeValues release];
attributeValues = nil;
}
else // we aren't including the values, we are returning an NSArray of just the attribute names.
{
[attributes addObject:[NSString stringWithUTF8String:attributeName]];
}
dsCloseAttributeValueList(valueRef);
dsDeallocAttributeEntry([[inNode directory] dsDirRef], pAttrEntry);
} // end if (!err)
} // end for (...)
if (err)
{
[attributes release];
attributes = nil;
[DSoException raiseWithStatus:err];
}
return [attributes autorelease];
}
@end