ObjFW  Artifact [d737be39ca]

Artifact d737be39ca03c99ad770acc300da8e2989e195a73a5c260dc1d699662fb022cc:

  • File src/exceptions/OFAddressTranslationFailedException.m — part of check-in [3d16a30f41] at 2013-06-22 12:12:36 on branch trunk — Rework exceptions. This mostly removes the argument for the class in which the exception occurred. As backtraces were recently added for all platforms, the passed class does not give any extra information on where the exception occurred anymore. This also removes a few other arguments which were not too helpful. In the past, the idea was to pass as many arguments as possible so that it is easier to find the origin of the exception. However, as backtraces are a much better way to find the origin, those are not useful anymore and just make the exception more cumbersome to use. The rule is now to only pass arguments that might help in recovering from the exception or provide information that is otherwise not easily accessible. (user: js size: 2441)

/*
 * Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013
 *   Jonathan Schleifer <js@webkeks.org>
 *
 * All rights reserved.
 *
 * This file is part of ObjFW. It may be distributed under the terms of the
 * Q Public License 1.0, which can be found in the file LICENSE.QPL included in
 * the packaging of this file.
 *
 * Alternatively, it may be distributed under the terms of the GNU General
 * Public License, either version 2 or 3, which can be found in the file
 * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this
 * file.
 */

#include "config.h"

#import "OFAddressTranslationFailedException.h"
#import "OFString.h"
#import "OFTCPSocket.h"

#import "common.h"

@implementation OFAddressTranslationFailedException
+ (instancetype)exceptionWithSocket: (OFTCPSocket*)socket
{
	return [[[self alloc] initWithSocket: socket] autorelease];
}

+ (instancetype)exceptionWithHost: (OFString*)host
			   socket: (OFTCPSocket*)socket
{
	return [[[self alloc] initWithHost: host
				    socket: socket] autorelease];
}

- init
{
	@try {
		[self doesNotRecognizeSelector: _cmd];
	} @catch (id e) {
		[self release];
		@throw e;
	}

	abort();
}

- initWithSocket: (OFTCPSocket*)socket
{
	self = [super init];

	@try {
		_socket = [socket retain];
		_errNo  = GET_AT_ERRNO;
	} @catch (id e) {
		[self release];
		@throw e;
	}

	return self;
}

- initWithHost: (OFString*)host
	socket: (OFTCPSocket*)socket
{
	self = [super init];

	@try {
		_host   = [host copy];
		_socket = [socket retain];
		_errNo  = GET_AT_ERRNO;
	} @catch (id e) {
		[self release];
		@throw e;
	}

	return self;
}

- (void)dealloc
{
	[_host release];
	[_socket release];

	[super dealloc];
}

- (OFString*)description
{
	if (_host != nil)
		return [OFString stringWithFormat:
		    @"The host %@ could not be translated to an address for a "
		    @"socket of type %@. This means that either the host was "
		    @"not found, there was a problem with the name server, "
		    @"there was a problem with your network connection or you "
		    @"specified an invalid host. " ERRFMT, _host,
		    [_socket class], AT_ERRPARAM];
	else
		return [OFString stringWithFormat:
		    @"An address could not be translated translation for a "
		    @"socket of type %@! " ERRFMT, [_socket class],
		    AT_ERRPARAM];
}

- (OFString*)host
{
	OF_GETTER(_host, false)
}

- (OFTCPSocket*)socket
{
	OF_GETTER(_socket, false)
}

- (int)errNo
{
	return _errNo;
}
@end