/* 
   Copyright (C) 1996 
	Ovidiu Predescu <ovidiu@bx.logicnet.ro>
	Mircea Oancea <mircea@jupiter.elcom.pub.ro>

   Author: Ovidiu Predescu <ovidiu@bx.logicnet.ro>

   This file is part of the FoundationExtensions library.

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

   This library 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
   Library General Public License for more details.

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

#include <Foundation/NSString.h>
#include <Foundation/NSDictionary.h>
#include <Foundation/NSValue.h>
#include <extensions/exceptions/NSCoderExceptions.h>
#include "../MissingMethods.h"


@implementation NSCoderException
@end /* NSCoderExceptions */


@implementation InvalidSignatureForCoder
- init
{
    self = [self initWithName:NSInvalidArgumentException
	    reason:@"Invalid coder signature"
	    userInfo:nil];
    return self;
}
@end /* InvalidSignatureForCoder */


@implementation DifferentKindOfCodersException
- initForClassName:(NSString*)class1 andClassName:(NSString*)class2
{
    self = [self initWithName:NSInvalidArgumentException
	    reason:@"Invalid coder signature"
	    userInfo:[NSDictionary dictionaryWithObjectsAndKeys:
					class1, @"first class",
					class2, @"second class", nil]];
    return self;
}
@end /* DifferentKindOfCodersException */


@implementation CoderHasAlreadyWrittenRootObjectException
- init
{
    self = [self initWithName:NSInvalidArgumentException
	    reason:@"Coder has already written root object"
	    userInfo:nil];
    return self;
}
@end /* CoderHasAlreadyWrittenRootObjectException */


@implementation RootObjectHasNotBeenWrittenException
- init
{
    self = [self initWithName:NSInvalidArgumentException
	    reason:@"Root object has not been written before"
	    userInfo:nil];
    return self;
}
@end /* RootObjectHasNotBeenWrittenException */

@implementation UnexpectedTypeException
+ allocForExpected:(NSString*)_expected andGot:(NSString*)_got
{
    UnexpectedTypeException* exception = [self alloc];
    exception->expected = _expected;
    exception->got = _got;

    exception = [exception initWithName:NSInvalidArgumentException
	    reason:@"Different type was written in archive"
	    userInfo:[NSDictionary dictionaryWithObjectsAndKeys:
				    exception->expected, @"expected to read",
				    exception->got, @"got from archive", nil]];

    return exception;
}

+ allocForExpectedSize:(int)_expected andGotSize:(int)_got
{
    UnexpectedTypeException* exception = [self alloc];
    exception->expected = [[NSNumber numberWithInt:_expected] stringValue];
    exception->got = [[NSNumber numberWithInt:_got] stringValue];

    exception = [exception initWithName:NSInvalidArgumentException
	    reason:@"Different number of elements was written in archive"
	    userInfo:[NSDictionary dictionaryWithObjectsAndKeys:
				exception->expected, @"expected to read",
				exception->got, @"got from archive", nil]];

    return exception;
}
@end /* UnexpectedTypeException */


@implementation ReadUnknownTagException
- initForTag:(char)_tag
{
    tag = _tag;
    self = [self initWithName:NSInvalidArgumentException
	    reason:@"Invalid tag read from archive"
	    userInfo:[NSDictionary dictionaryWithObjectsAndKeys:
			[[NSNumber numberWithChar:tag] stringValue], @"tag",
			nil]];
    return self;
}
@end /* ReadUnknownTagException */

