Plugins/Purple Service/AIPurpleGTalkAccount.m
author Thijs Alkemade <thijsalkemade@gmail.com>
Tue, 18 Sep 2012 23:06:14 +0200
branchGTalkOAuth2Support
changeset 5089 a761745f82a1
parent 0 e22ad6bc8b46
permissions -rw-r--r--
Started working on OAuth2 support for GTalk.

Abstracted the OAuth2 support of Facebook into a separate AIPurpleOAuthJabberAccount.

Logging in on GTalk gets to the auth token.

Refs #16161
0
e22ad6bc8b46 svn 1.5 merge tracking is terrible. This is a manual merge of the Sparkle 1.5 branch into trunk
David Smith
parents:
diff changeset
     1
/* 
e22ad6bc8b46 svn 1.5 merge tracking is terrible. This is a manual merge of the Sparkle 1.5 branch into trunk
David Smith
parents:
diff changeset
     2
 * Adium is the legal property of its developers, whose names are listed in the copyright file included
e22ad6bc8b46 svn 1.5 merge tracking is terrible. This is a manual merge of the Sparkle 1.5 branch into trunk
David Smith
parents:
diff changeset
     3
 * with this source distribution.
e22ad6bc8b46 svn 1.5 merge tracking is terrible. This is a manual merge of the Sparkle 1.5 branch into trunk
David Smith
parents:
diff changeset
     4
 * 
e22ad6bc8b46 svn 1.5 merge tracking is terrible. This is a manual merge of the Sparkle 1.5 branch into trunk
David Smith
parents:
diff changeset
     5
 * This program is free software; you can redistribute it and/or modify it under the terms of the GNU
e22ad6bc8b46 svn 1.5 merge tracking is terrible. This is a manual merge of the Sparkle 1.5 branch into trunk
David Smith
parents:
diff changeset
     6
 * General Public License as published by the Free Software Foundation; either version 2 of the License,
e22ad6bc8b46 svn 1.5 merge tracking is terrible. This is a manual merge of the Sparkle 1.5 branch into trunk
David Smith
parents:
diff changeset
     7
 * or (at your option) any later version.
e22ad6bc8b46 svn 1.5 merge tracking is terrible. This is a manual merge of the Sparkle 1.5 branch into trunk
David Smith
parents:
diff changeset
     8
 * 
e22ad6bc8b46 svn 1.5 merge tracking is terrible. This is a manual merge of the Sparkle 1.5 branch into trunk
David Smith
parents:
diff changeset
     9
 * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
e22ad6bc8b46 svn 1.5 merge tracking is terrible. This is a manual merge of the Sparkle 1.5 branch into trunk
David Smith
parents:
diff changeset
    10
 * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General
e22ad6bc8b46 svn 1.5 merge tracking is terrible. This is a manual merge of the Sparkle 1.5 branch into trunk
David Smith
parents:
diff changeset
    11
 * Public License for more details.
e22ad6bc8b46 svn 1.5 merge tracking is terrible. This is a manual merge of the Sparkle 1.5 branch into trunk
David Smith
parents:
diff changeset
    12
 * 
e22ad6bc8b46 svn 1.5 merge tracking is terrible. This is a manual merge of the Sparkle 1.5 branch into trunk
David Smith
parents:
diff changeset
    13
 * You should have received a copy of the GNU General Public License along with this program; if not,
e22ad6bc8b46 svn 1.5 merge tracking is terrible. This is a manual merge of the Sparkle 1.5 branch into trunk
David Smith
parents:
diff changeset
    14
 * write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
e22ad6bc8b46 svn 1.5 merge tracking is terrible. This is a manual merge of the Sparkle 1.5 branch into trunk
David Smith
parents:
diff changeset
    15
 */
e22ad6bc8b46 svn 1.5 merge tracking is terrible. This is a manual merge of the Sparkle 1.5 branch into trunk
David Smith
parents:
diff changeset
    16
e22ad6bc8b46 svn 1.5 merge tracking is terrible. This is a manual merge of the Sparkle 1.5 branch into trunk
David Smith
parents:
diff changeset
    17
#import "AIPurpleGTalkAccount.h"
e22ad6bc8b46 svn 1.5 merge tracking is terrible. This is a manual merge of the Sparkle 1.5 branch into trunk
David Smith
parents:
diff changeset
    18
5089
a761745f82a1 Started working on OAuth2 support for GTalk.
Thijs Alkemade <thijsalkemade@gmail.com>
parents: 0
diff changeset
    19
#define ADIUM_APP_ID "853036734951.apps.googleusercontent.com"
a761745f82a1 Started working on OAuth2 support for GTalk.
Thijs Alkemade <thijsalkemade@gmail.com>
parents: 0
diff changeset
    20
0
e22ad6bc8b46 svn 1.5 merge tracking is terrible. This is a manual merge of the Sparkle 1.5 branch into trunk
David Smith
parents:
diff changeset
    21
@implementation AIPurpleGTalkAccount
e22ad6bc8b46 svn 1.5 merge tracking is terrible. This is a manual merge of the Sparkle 1.5 branch into trunk
David Smith
parents:
diff changeset
    22
e22ad6bc8b46 svn 1.5 merge tracking is terrible. This is a manual merge of the Sparkle 1.5 branch into trunk
David Smith
parents:
diff changeset
    23
- (const char *)purpleAccountName
e22ad6bc8b46 svn 1.5 merge tracking is terrible. This is a manual merge of the Sparkle 1.5 branch into trunk
David Smith
parents:
diff changeset
    24
{
e22ad6bc8b46 svn 1.5 merge tracking is terrible. This is a manual merge of the Sparkle 1.5 branch into trunk
David Smith
parents:
diff changeset
    25
	NSString	 *userNameWithGmailDotCom = nil;
e22ad6bc8b46 svn 1.5 merge tracking is terrible. This is a manual merge of the Sparkle 1.5 branch into trunk
David Smith
parents:
diff changeset
    26
e22ad6bc8b46 svn 1.5 merge tracking is terrible. This is a manual merge of the Sparkle 1.5 branch into trunk
David Smith
parents:
diff changeset
    27
	/*
e22ad6bc8b46 svn 1.5 merge tracking is terrible. This is a manual merge of the Sparkle 1.5 branch into trunk
David Smith
parents:
diff changeset
    28
	 * Purple stores the username in the format username@server/resource.  We need to pass it a username in this format
e22ad6bc8b46 svn 1.5 merge tracking is terrible. This is a manual merge of the Sparkle 1.5 branch into trunk
David Smith
parents:
diff changeset
    29
	 *
e22ad6bc8b46 svn 1.5 merge tracking is terrible. This is a manual merge of the Sparkle 1.5 branch into trunk
David Smith
parents:
diff changeset
    30
	 * Append @gmail.com if no domain is specified.
e22ad6bc8b46 svn 1.5 merge tracking is terrible. This is a manual merge of the Sparkle 1.5 branch into trunk
David Smith
parents:
diff changeset
    31
	 * Valid domains include gmail.com, googlemail.com, and google-hosted domains like e.co.za.
e22ad6bc8b46 svn 1.5 merge tracking is terrible. This is a manual merge of the Sparkle 1.5 branch into trunk
David Smith
parents:
diff changeset
    32
	 */
e22ad6bc8b46 svn 1.5 merge tracking is terrible. This is a manual merge of the Sparkle 1.5 branch into trunk
David Smith
parents:
diff changeset
    33
	if ([UID rangeOfString:@"@"].location == NSNotFound) {
e22ad6bc8b46 svn 1.5 merge tracking is terrible. This is a manual merge of the Sparkle 1.5 branch into trunk
David Smith
parents:
diff changeset
    34
		userNameWithGmailDotCom = [UID stringByAppendingString:@"@gmail.com"];
e22ad6bc8b46 svn 1.5 merge tracking is terrible. This is a manual merge of the Sparkle 1.5 branch into trunk
David Smith
parents:
diff changeset
    35
	} else {
e22ad6bc8b46 svn 1.5 merge tracking is terrible. This is a manual merge of the Sparkle 1.5 branch into trunk
David Smith
parents:
diff changeset
    36
		userNameWithGmailDotCom = UID;
e22ad6bc8b46 svn 1.5 merge tracking is terrible. This is a manual merge of the Sparkle 1.5 branch into trunk
David Smith
parents:
diff changeset
    37
	}
e22ad6bc8b46 svn 1.5 merge tracking is terrible. This is a manual merge of the Sparkle 1.5 branch into trunk
David Smith
parents:
diff changeset
    38
e22ad6bc8b46 svn 1.5 merge tracking is terrible. This is a manual merge of the Sparkle 1.5 branch into trunk
David Smith
parents:
diff changeset
    39
	NSString *completeUserName = [NSString stringWithFormat:@"%@/%@",userNameWithGmailDotCom, [self resourceName]];
e22ad6bc8b46 svn 1.5 merge tracking is terrible. This is a manual merge of the Sparkle 1.5 branch into trunk
David Smith
parents:
diff changeset
    40
e22ad6bc8b46 svn 1.5 merge tracking is terrible. This is a manual merge of the Sparkle 1.5 branch into trunk
David Smith
parents:
diff changeset
    41
	return [completeUserName UTF8String];
e22ad6bc8b46 svn 1.5 merge tracking is terrible. This is a manual merge of the Sparkle 1.5 branch into trunk
David Smith
parents:
diff changeset
    42
}
e22ad6bc8b46 svn 1.5 merge tracking is terrible. This is a manual merge of the Sparkle 1.5 branch into trunk
David Smith
parents:
diff changeset
    43
e22ad6bc8b46 svn 1.5 merge tracking is terrible. This is a manual merge of the Sparkle 1.5 branch into trunk
David Smith
parents:
diff changeset
    44
- (NSString *)serverSuffix
e22ad6bc8b46 svn 1.5 merge tracking is terrible. This is a manual merge of the Sparkle 1.5 branch into trunk
David Smith
parents:
diff changeset
    45
{
e22ad6bc8b46 svn 1.5 merge tracking is terrible. This is a manual merge of the Sparkle 1.5 branch into trunk
David Smith
parents:
diff changeset
    46
	return @"@gmail.com";
e22ad6bc8b46 svn 1.5 merge tracking is terrible. This is a manual merge of the Sparkle 1.5 branch into trunk
David Smith
parents:
diff changeset
    47
}
e22ad6bc8b46 svn 1.5 merge tracking is terrible. This is a manual merge of the Sparkle 1.5 branch into trunk
David Smith
parents:
diff changeset
    48
e22ad6bc8b46 svn 1.5 merge tracking is terrible. This is a manual merge of the Sparkle 1.5 branch into trunk
David Smith
parents:
diff changeset
    49
/*!
e22ad6bc8b46 svn 1.5 merge tracking is terrible. This is a manual merge of the Sparkle 1.5 branch into trunk
David Smith
parents:
diff changeset
    50
 * @brief Allow a file transfer with an object?
e22ad6bc8b46 svn 1.5 merge tracking is terrible. This is a manual merge of the Sparkle 1.5 branch into trunk
David Smith
parents:
diff changeset
    51
 *
e22ad6bc8b46 svn 1.5 merge tracking is terrible. This is a manual merge of the Sparkle 1.5 branch into trunk
David Smith
parents:
diff changeset
    52
 * As of July 28th, 2006, GTalk allows transfers.
e22ad6bc8b46 svn 1.5 merge tracking is terrible. This is a manual merge of the Sparkle 1.5 branch into trunk
David Smith
parents:
diff changeset
    53
 */
e22ad6bc8b46 svn 1.5 merge tracking is terrible. This is a manual merge of the Sparkle 1.5 branch into trunk
David Smith
parents:
diff changeset
    54
- (BOOL)allowFileTransferWithListObject:(AIListObject *)inListObject
e22ad6bc8b46 svn 1.5 merge tracking is terrible. This is a manual merge of the Sparkle 1.5 branch into trunk
David Smith
parents:
diff changeset
    55
{
e22ad6bc8b46 svn 1.5 merge tracking is terrible. This is a manual merge of the Sparkle 1.5 branch into trunk
David Smith
parents:
diff changeset
    56
	return YES;
e22ad6bc8b46 svn 1.5 merge tracking is terrible. This is a manual merge of the Sparkle 1.5 branch into trunk
David Smith
parents:
diff changeset
    57
}
e22ad6bc8b46 svn 1.5 merge tracking is terrible. This is a manual merge of the Sparkle 1.5 branch into trunk
David Smith
parents:
diff changeset
    58
e22ad6bc8b46 svn 1.5 merge tracking is terrible. This is a manual merge of the Sparkle 1.5 branch into trunk
David Smith
parents:
diff changeset
    59
- (AIReconnectDelayType)shouldAttemptReconnectAfterDisconnectionError:(NSString **)disconnectionError
e22ad6bc8b46 svn 1.5 merge tracking is terrible. This is a manual merge of the Sparkle 1.5 branch into trunk
David Smith
parents:
diff changeset
    60
{
e22ad6bc8b46 svn 1.5 merge tracking is terrible. This is a manual merge of the Sparkle 1.5 branch into trunk
David Smith
parents:
diff changeset
    61
	AIReconnectDelayType shouldAttemptReconnect = [super shouldAttemptReconnectAfterDisconnectionError:disconnectionError];
e22ad6bc8b46 svn 1.5 merge tracking is terrible. This is a manual merge of the Sparkle 1.5 branch into trunk
David Smith
parents:
diff changeset
    62
	
e22ad6bc8b46 svn 1.5 merge tracking is terrible. This is a manual merge of the Sparkle 1.5 branch into trunk
David Smith
parents:
diff changeset
    63
	if (disconnectionError && *disconnectionError) {
e22ad6bc8b46 svn 1.5 merge tracking is terrible. This is a manual merge of the Sparkle 1.5 branch into trunk
David Smith
parents:
diff changeset
    64
		if (([*disconnectionError rangeOfString:@"401"].location != NSNotFound) ||
e22ad6bc8b46 svn 1.5 merge tracking is terrible. This is a manual merge of the Sparkle 1.5 branch into trunk
David Smith
parents:
diff changeset
    65
			([*disconnectionError rangeOfString:@"Authentication Failure"].location != NSNotFound) ||
e22ad6bc8b46 svn 1.5 merge tracking is terrible. This is a manual merge of the Sparkle 1.5 branch into trunk
David Smith
parents:
diff changeset
    66
			([*disconnectionError rangeOfString:@"Not Authorized"].location != NSNotFound)) {
e22ad6bc8b46 svn 1.5 merge tracking is terrible. This is a manual merge of the Sparkle 1.5 branch into trunk
David Smith
parents:
diff changeset
    67
			[self setLastDisconnectionError:AILocalizedString(@"Incorrect username or password","Error message displayed when the server reports username or password as being incorrect.")];
e22ad6bc8b46 svn 1.5 merge tracking is terrible. This is a manual merge of the Sparkle 1.5 branch into trunk
David Smith
parents:
diff changeset
    68
			[self serverReportedInvalidPassword];
e22ad6bc8b46 svn 1.5 merge tracking is terrible. This is a manual merge of the Sparkle 1.5 branch into trunk
David Smith
parents:
diff changeset
    69
			shouldAttemptReconnect = AIReconnectImmediately;
e22ad6bc8b46 svn 1.5 merge tracking is terrible. This is a manual merge of the Sparkle 1.5 branch into trunk
David Smith
parents:
diff changeset
    70
		}
e22ad6bc8b46 svn 1.5 merge tracking is terrible. This is a manual merge of the Sparkle 1.5 branch into trunk
David Smith
parents:
diff changeset
    71
	}
e22ad6bc8b46 svn 1.5 merge tracking is terrible. This is a manual merge of the Sparkle 1.5 branch into trunk
David Smith
parents:
diff changeset
    72
e22ad6bc8b46 svn 1.5 merge tracking is terrible. This is a manual merge of the Sparkle 1.5 branch into trunk
David Smith
parents:
diff changeset
    73
	return shouldAttemptReconnect;
e22ad6bc8b46 svn 1.5 merge tracking is terrible. This is a manual merge of the Sparkle 1.5 branch into trunk
David Smith
parents:
diff changeset
    74
}
e22ad6bc8b46 svn 1.5 merge tracking is terrible. This is a manual merge of the Sparkle 1.5 branch into trunk
David Smith
parents:
diff changeset
    75
e22ad6bc8b46 svn 1.5 merge tracking is terrible. This is a manual merge of the Sparkle 1.5 branch into trunk
David Smith
parents:
diff changeset
    76
- (void)configurePurpleAccount
e22ad6bc8b46 svn 1.5 merge tracking is terrible. This is a manual merge of the Sparkle 1.5 branch into trunk
David Smith
parents:
diff changeset
    77
{
e22ad6bc8b46 svn 1.5 merge tracking is terrible. This is a manual merge of the Sparkle 1.5 branch into trunk
David Smith
parents:
diff changeset
    78
	[super configurePurpleAccount];
e22ad6bc8b46 svn 1.5 merge tracking is terrible. This is a manual merge of the Sparkle 1.5 branch into trunk
David Smith
parents:
diff changeset
    79
	
e22ad6bc8b46 svn 1.5 merge tracking is terrible. This is a manual merge of the Sparkle 1.5 branch into trunk
David Smith
parents:
diff changeset
    80
	// force connect server
e22ad6bc8b46 svn 1.5 merge tracking is terrible. This is a manual merge of the Sparkle 1.5 branch into trunk
David Smith
parents:
diff changeset
    81
	purple_account_set_string(account, "connect_server", "talk.google.com");
e22ad6bc8b46 svn 1.5 merge tracking is terrible. This is a manual merge of the Sparkle 1.5 branch into trunk
David Smith
parents:
diff changeset
    82
}
e22ad6bc8b46 svn 1.5 merge tracking is terrible. This is a manual merge of the Sparkle 1.5 branch into trunk
David Smith
parents:
diff changeset
    83
e22ad6bc8b46 svn 1.5 merge tracking is terrible. This is a manual merge of the Sparkle 1.5 branch into trunk
David Smith
parents:
diff changeset
    84
- (BOOL)allowAccountUnregistrationIfSupportedByLibpurple
e22ad6bc8b46 svn 1.5 merge tracking is terrible. This is a manual merge of the Sparkle 1.5 branch into trunk
David Smith
parents:
diff changeset
    85
{
e22ad6bc8b46 svn 1.5 merge tracking is terrible. This is a manual merge of the Sparkle 1.5 branch into trunk
David Smith
parents:
diff changeset
    86
	return NO;
e22ad6bc8b46 svn 1.5 merge tracking is terrible. This is a manual merge of the Sparkle 1.5 branch into trunk
David Smith
parents:
diff changeset
    87
}
e22ad6bc8b46 svn 1.5 merge tracking is terrible. This is a manual merge of the Sparkle 1.5 branch into trunk
David Smith
parents:
diff changeset
    88
5089
a761745f82a1 Started working on OAuth2 support for GTalk.
Thijs Alkemade <thijsalkemade@gmail.com>
parents: 0
diff changeset
    89
//- (NSString *)graphURLForToken:(NSString *)token
a761745f82a1 Started working on OAuth2 support for GTalk.
Thijs Alkemade <thijsalkemade@gmail.com>
parents: 0
diff changeset
    90
//{
a761745f82a1 Started working on OAuth2 support for GTalk.
Thijs Alkemade <thijsalkemade@gmail.com>
parents: 0
diff changeset
    91
//	return [NSString stringWithFormat:@"https://graph.facebook.com/me?access_token=%@", token];
a761745f82a1 Started working on OAuth2 support for GTalk.
Thijs Alkemade <thijsalkemade@gmail.com>
parents: 0
diff changeset
    92
//}
a761745f82a1 Started working on OAuth2 support for GTalk.
Thijs Alkemade <thijsalkemade@gmail.com>
parents: 0
diff changeset
    93
//
a761745f82a1 Started working on OAuth2 support for GTalk.
Thijs Alkemade <thijsalkemade@gmail.com>
parents: 0
diff changeset
    94
//- (NSString *)promoteURLForToken:(NSString *)token
a761745f82a1 Started working on OAuth2 support for GTalk.
Thijs Alkemade <thijsalkemade@gmail.com>
parents: 0
diff changeset
    95
//{
a761745f82a1 Started working on OAuth2 support for GTalk.
Thijs Alkemade <thijsalkemade@gmail.com>
parents: 0
diff changeset
    96
//	return [NSString stringWithFormat:@"https://api.facebook.com/method/auth.promoteSession?access_token=%@&format=JSON", token];
a761745f82a1 Started working on OAuth2 support for GTalk.
Thijs Alkemade <thijsalkemade@gmail.com>
parents: 0
diff changeset
    97
//}
a761745f82a1 Started working on OAuth2 support for GTalk.
Thijs Alkemade <thijsalkemade@gmail.com>
parents: 0
diff changeset
    98
a761745f82a1 Started working on OAuth2 support for GTalk.
Thijs Alkemade <thijsalkemade@gmail.com>
parents: 0
diff changeset
    99
- (NSString *)authorizeURL
a761745f82a1 Started working on OAuth2 support for GTalk.
Thijs Alkemade <thijsalkemade@gmail.com>
parents: 0
diff changeset
   100
{
a761745f82a1 Started working on OAuth2 support for GTalk.
Thijs Alkemade <thijsalkemade@gmail.com>
parents: 0
diff changeset
   101
	return @"https://accounts.google.nl/o/oauth2/auth?"
a761745f82a1 Started working on OAuth2 support for GTalk.
Thijs Alkemade <thijsalkemade@gmail.com>
parents: 0
diff changeset
   102
	@"client_id=" ADIUM_APP_ID "&"
a761745f82a1 Started working on OAuth2 support for GTalk.
Thijs Alkemade <thijsalkemade@gmail.com>
parents: 0
diff changeset
   103
	@"redirect_uri=urn:ietf:wg:oauth:2.0:oob&"
a761745f82a1 Started working on OAuth2 support for GTalk.
Thijs Alkemade <thijsalkemade@gmail.com>
parents: 0
diff changeset
   104
	@"response_type=code&"
a761745f82a1 Started working on OAuth2 support for GTalk.
Thijs Alkemade <thijsalkemade@gmail.com>
parents: 0
diff changeset
   105
	@"access_type=offline&"
a761745f82a1 Started working on OAuth2 support for GTalk.
Thijs Alkemade <thijsalkemade@gmail.com>
parents: 0
diff changeset
   106
	@"scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fgoogletalk";
a761745f82a1 Started working on OAuth2 support for GTalk.
Thijs Alkemade <thijsalkemade@gmail.com>
parents: 0
diff changeset
   107
}
a761745f82a1 Started working on OAuth2 support for GTalk.
Thijs Alkemade <thijsalkemade@gmail.com>
parents: 0
diff changeset
   108
a761745f82a1 Started working on OAuth2 support for GTalk.
Thijs Alkemade <thijsalkemade@gmail.com>
parents: 0
diff changeset
   109
- (NSString *)frameURLHost
a761745f82a1 Started working on OAuth2 support for GTalk.
Thijs Alkemade <thijsalkemade@gmail.com>
parents: 0
diff changeset
   110
{
a761745f82a1 Started working on OAuth2 support for GTalk.
Thijs Alkemade <thijsalkemade@gmail.com>
parents: 0
diff changeset
   111
	return @"urn:ietf:wg:oauth:2.0:oob";
a761745f82a1 Started working on OAuth2 support for GTalk.
Thijs Alkemade <thijsalkemade@gmail.com>
parents: 0
diff changeset
   112
}
a761745f82a1 Started working on OAuth2 support for GTalk.
Thijs Alkemade <thijsalkemade@gmail.com>
parents: 0
diff changeset
   113
a761745f82a1 Started working on OAuth2 support for GTalk.
Thijs Alkemade <thijsalkemade@gmail.com>
parents: 0
diff changeset
   114
- (NSString *)frameURLPath
a761745f82a1 Started working on OAuth2 support for GTalk.
Thijs Alkemade <thijsalkemade@gmail.com>
parents: 0
diff changeset
   115
{
a761745f82a1 Started working on OAuth2 support for GTalk.
Thijs Alkemade <thijsalkemade@gmail.com>
parents: 0
diff changeset
   116
	return @"";
a761745f82a1 Started working on OAuth2 support for GTalk.
Thijs Alkemade <thijsalkemade@gmail.com>
parents: 0
diff changeset
   117
}
a761745f82a1 Started working on OAuth2 support for GTalk.
Thijs Alkemade <thijsalkemade@gmail.com>
parents: 0
diff changeset
   118
0
e22ad6bc8b46 svn 1.5 merge tracking is terrible. This is a manual merge of the Sparkle 1.5 branch into trunk
David Smith
parents:
diff changeset
   119
@end