/*
  Copyright (C) 2000-2005 SKYRIX Software AG

  This file is part of SOPE.

  SOPE is free software; you can redistribute it and/or modify it under
  the terms of the GNU Lesser General Public License as published by the
  Free Software Foundation; either version 2, or (at your option) any
  later version.

  SOPE is distributed in the hope that it will be useful, but WITHOUT ANY
  WARRANTY; without even the implied warranty of MERCHANTABILITY or
  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
  License for more details.

  You should have received a copy of the GNU Lesser General Public
  License along with SOPE; see the file COPYING.  If not, write to the
  Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
  02111-1307, USA.
*/

#include "NGMimeBodyPart.h"
#include "NGMimeType.h"
#include "common.h"
#include "NGMimeFileData.h"
#include <NGMime/NGMimePartParser.h>

@implementation NGMimeBodyPart

+ (int)version {
  return 2;
}

static NGMimeType *defaultType = nil;

+ (void)initialize {
  static BOOL isInitialized = NO;
  if (!isInitialized) {
    isInitialized = YES;
    
    defaultType =
      [[NGMimeType mimeType:@"text/plain; charset=us-ascii"] retain];
  }
}
  
+ (id)bodyPartWithHeader:(NGHashMap *)_header {
  return [[[self alloc] initWithHeader:_header] autorelease];
}

- (id)initWithHeader:(NGHashMap *)_header {
  if ((self = [super init])) {
    self->header = [_header retain];
    self->body   = nil;
  }
  return self;
}
- (id)init {
  return [self initWithHeader:nil];
}

- (void)dealloc {
  [self->header release];
  [self->body   release];
  [super dealloc];
}

/* NGPart */

- (NSEnumerator *)valuesOfHeaderFieldWithName:(NSString *)_name {
  return [self->header objectEnumeratorForKey:_name];
}
- (NSEnumerator *)headerFieldNames {
  return [self->header keyEnumerator];
}

- (void)setBody:(id)_body {
  ASSIGN(self->body, _body);
}
- (id)body {
  return self->body;
}

/* NGMimePart */

- (NGMimeType *)contentType {
  id type;
  static NGMimeHeaderNames *Fields = NULL;

  if (!Fields)
    Fields = (NGMimeHeaderNames *)[NGMimePartParser headerFieldNames];
  
  
  type = [self->header objectForKey:Fields->contentType];
  
  if (![type isKindOfClass:[NGMimeType class]])
    type = [NGMimeType mimeType:[type stringValue]];
  
  return (type != nil ? type : defaultType);
}

- (NSString *)contentId {
  return [[self->header objectForKey:@"content-id"] stringValue];
}

- (NSArray *)contentLanguage {
  id value;
  
  value = [self->header objectForKey:@"content-language"];
  if (![value isKindOfClass:[NSArray class]])
    value = [value componentsSeparatedByString:@","];

  return value;
}

- (NSString *)contentMd5 {
  return [[self->header objectForKey:@"content-md5"] stringValue];
}

- (NSString *)encoding {
  return [[self->header objectForKey:@"content-transfer-encoding"]
                        stringValue];
}

- (NSString *)contentDescription {
  return [[self->header objectForKey:@"content-description"] stringValue];
}

/* description */

- (NSString *)description {
  NSMutableString *d = [[NSMutableString alloc] init];
  id b = [self body];

  [d appendFormat:@"<%@[0x%08X]: header=%@",
       NSStringFromClass([self class]), self, self->header];

  if (b) [d appendFormat:@" bodyClass=%@", NSStringFromClass([b class])];

  if ([b isKindOfClass:[NGMimeFileData class]]) {
    [d appendFormat:@" body=%@", b];
  }
  else if ([b isKindOfClass:[NSString class]] ||
           [b isKindOfClass:[NSData class]]) {
    if ([b length] < 512) {
      [d appendFormat:@" bodyLen=%i body=%@", [b length], b];
    }
    else
      [d appendFormat:@" body[len=%i]", [b length]];
  }
  else
    [d appendFormat:@" body=%@", b];
  

  [d appendString:@">"];

  return AUTORELEASE(d);
}

@end /* NGMimeBodyPart */
