This is StructuredHeaderFieldBody.m in view mode; [Download] [Up]
//---------------------------------------------------------------------------------------
// StructuredHeaderFieldBody.m created by erik on Sun 23-Mar-1997
// This code is part of the Alexandra Newsreader Project. For copyright details see
// GNU public license version 2 or above. No warranties implied. Use at own risk.
// More information can be found at <http://www.object-factory.com/Alexandra>.
// @(#)$Id: StructuredHeaderFieldBody.m,v 1.1 1998/05/05 15:29:57 erik Exp $
//---------------------------------------------------------------------------------------
#import "Utilities.h"
#import "Message.h"
//---------------------------------------------------------------------------------------
@implementation StructuredHeaderFieldBody
//---------------------------------------------------------------------------------------
//---------------------------------------------------------------------------------------
// STRING TO OBJECT
//---------------------------------------------------------------------------------------
- initWithString:(NSString *)string;
{
NSArray *fieldBodyParts;
NSEnumerator *fieldBodyPartEnum;
NSString *mainPart, *parameterPart, *attribute, *attrValue;
NSScanner *scanner;
TRACE_IN
NSAssert1([self class] != [StructuredHeaderFieldBody class], @"%@ is an abstract superclass and cannot be instantiated", [self class]);
[super init];
fieldBodyParts = [string componentsSeparatedByString:@";"];
fieldBodyPartEnum = [fieldBodyParts objectEnumerator];
if((mainPart = [fieldBodyPartEnum nextObject]) == nil)
[NSException raise:MIMEFormatException format:@"no value in '%@'", self];
[self takeValueFromString:mainPart];
// forgiving, ie. simply skips syntactially incorrect attribute/value pairs...
parameters = [[NSMutableDictionary allocWithZone:[self zone]] init];
while((parameterPart = [fieldBodyPartEnum nextObject]) != nil)
{
scanner = [NSScanner scannerWithString:parameterPart];
if([scanner scanCharactersFromSet:[NSCharacterSet MIMETokenCharacterSet] intoString:&attribute] == NO)
continue;
attribute = [attribute lowercaseString];
if([scanner scanString:@"=" intoString:NULL] == NO)
continue;
if([scanner scanString:DOUBLEQUOTE intoString:NULL] == NO)
{
if([scanner scanCharactersFromSet:[NSCharacterSet MIMETokenCharacterSet] intoString:&attrValue] == YES)
[parameters setObject:attrValue forKey:attribute];
}
else
{
if([scanner scanUpToString:DOUBLEQUOTE intoString:&attrValue] == YES)
[parameters setObject:attrValue forKey:attribute];
}
}
return self;
}
//---------------------------------------------------------------------------------------
// OBJECT TO STRING
//---------------------------------------------------------------------------------------
- (NSString *)stringRepresentation;
{
TRACE_IN
if(stringRep == nil)
{
NSMutableString *fieldBody;
NSString *attribute, *value;
NSEnumerator *attributeEnumerator;
fieldBody = [[[NSMutableString alloc] init] autorelease];
[self appendValueToString:fieldBody];
attributeEnumerator = [parameters keyEnumerator];
while((attribute = [attributeEnumerator nextObject]) != nil)
{
value = [parameters objectForKey:attribute];
if([value rangeOfCharacterFromSet:[NSCharacterSet MIMENonTokenCharacterSet]].length != 0)
value = [NSString stringWithFormat:@"\"%@\"", value];
[fieldBody appendString:@"; "];
[fieldBody appendString:attribute];
[fieldBody appendString:@"="];
[fieldBody appendString:value];
// [fieldBody appendFormat:@"; %@=%@", attribute, value];
}
stringRep = [fieldBody copyWithZone:[self zone]];
}
return stringRep;
}
//-------------------------------------------------------------------------------------------
// TRANSFER REPRESENTATIONS
//-------------------------------------------------------------------------------------------
- initFromTransferRepresentation:(NSData *)data;
{
NSString *string;
string = [[[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding] autorelease];
[self initWithString:string];
return self;
}
- (NSData *)transferRepresentation;
{
return [[self stringRepresentation] dataUsingEncoding:NSASCIIStringEncoding];
}
//---------------------------------------------------------------------------------------
// VALUE
// Concrete Subclasses must implement this
//---------------------------------------------------------------------------------------
- (void)takeValueFromString:(NSString *)string;
{
[NSException raise:NSInternalInconsistencyException format:@"Subclass %@ of StructuredHeaderFieldValue must provide concrete implementation of %@.", NSStringFromClass(isa), NSStringFromSelector(_cmd)];
}
- (void)appendValueToString:(NSMutableString *)string;
{
[NSException raise:NSInternalInconsistencyException format:@"Subclass %@ of StructuredHeaderFieldValue must provide concrete implementation of %@.", NSStringFromClass(isa), NSStringFromSelector(_cmd)];
}
//---------------------------------------------------------------------------------------
// PARAMETERS
//---------------------------------------------------------------------------------------
- (void)setParameter:(NSString *)value forKey:(NSString *)key;
{
TRACE_IN
if([key rangeOfCharacterFromSet:[NSCharacterSet MIMENonTokenCharacterSet]].length != 0)
[NSException raise:NSInvalidArgumentException format:@"invalid char in parameter '%@'", key];
if([value rangeOfCharacterFromSet:[NSCharacterSet MIMENonTokenCharacterSet]].length != 0)
{
if([value rangeOfCharacterFromSet:[[NSCharacterSet standardASCIICharacterSet] invertedSet]].length != 0)
[NSException raise:NSInvalidArgumentException format:@"invalid char in attribute value '%@'", value];
else if([value rangeOfString:DOUBLEQUOTE].length != 0)
[NSException raise:NSInvalidArgumentException format:@"invalid doublequote in attribute value '%@'", value];
}
[parameters setObject:value forKey:key];
[self invalidateStringRep];
}
- (NSString *)parameterForKey:(NSString *)key;
{
TRACE_IN
return [parameters objectForKey:key];
}
- (NSDictionary *)parameters;
{
TRACE_IN
return parameters;
}
//---------------------------------------------------------------------------------------
// NSObject Stuff
//---------------------------------------------------------------------------------------
- (void)dealloc
{
TRACE_IN
[parameters release];
[super dealloc];
}
//---------------------------------------------------------------------------------------
@end
//---------------------------------------------------------------------------------------
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.