From ba535a0e0df0502d5505ce7df062a5841052bd47 Mon Sep 17 00:00:00 2001 From: Evan Schoenberg Date: Fri, 14 Sep 2007 20:17:56 +0000 Subject: [PATCH] Merged [20921], [20922], [20969], [20971]: Added MySpace service and account for the new libpurple 2.2.0 myspace support. No reason to keep this out of the 1.1.x series of releases. git-svn-id: svn://svn.adiumx.com/adium/branches/adium-1.1@20980 1c916fce-81e2-0310-a464-8ca513f45935 --- Adium.xcodeproj/project.pbxproj | 44 +++++++++ Plugins/Purple Service/ESPurpleGaduGaduAccount.m | 10 --- Plugins/Purple Service/ESPurpleICQAccount.m | 8 -- Plugins/Purple Service/ESPurpleJabberAccount.m | 10 --- Plugins/Purple Service/ESPurpleYahooAccount.m | 10 --- Plugins/Purple Service/PurpleMySpaceAccount.h | 14 +++ Plugins/Purple Service/PurpleMySpaceAccount.m | 56 ++++++++++++ .../PurpleMySpaceAccountViewController.h | 14 +++ .../PurpleMySpaceAccountViewController.m | 13 +++ Plugins/Purple Service/PurpleMySpaceService.h | 14 +++ Plugins/Purple Service/PurpleMySpaceService.m | 98 +++++++++++++++++++++ Plugins/Purple Service/myspace-large.png | Bin 0 -> 3308 bytes Plugins/Purple Service/myspace-small.png | Bin 0 -> 832 bytes 13 files changed, 253 insertions(+), 38 deletions(-) create mode 100644 Plugins/Purple Service/PurpleMySpaceAccount.h create mode 100644 Plugins/Purple Service/PurpleMySpaceAccount.m create mode 100644 Plugins/Purple Service/PurpleMySpaceAccountViewController.h create mode 100644 Plugins/Purple Service/PurpleMySpaceAccountViewController.m create mode 100644 Plugins/Purple Service/PurpleMySpaceService.h create mode 100644 Plugins/Purple Service/PurpleMySpaceService.m create mode 100644 Plugins/Purple Service/myspace-large.png create mode 100644 Plugins/Purple Service/myspace-small.png diff --git a/Adium.xcodeproj/project.pbxproj b/Adium.xcodeproj/project.pbxproj index ecd1bf5ad..d32bb3a82 100644 --- a/Adium.xcodeproj/project.pbxproj +++ b/Adium.xcodeproj/project.pbxproj @@ -180,6 +180,15 @@ 34382CEA0A50386C004BF6A2 /* DCMessageContextDisplayPlugin.m in Sources */ = {isa = PBXBuildFile; fileRef = 34382CE60A50386C004BF6A2 /* DCMessageContextDisplayPlugin.m */; }; 34382CEF0A50387A004BF6A2 /* MessageContextDisplayDefaults.plist in Resources */ = {isa = PBXBuildFile; fileRef = 34382CEE0A50387A004BF6A2 /* MessageContextDisplayDefaults.plist */; }; 3439FDAA05794D1300B2E449 /* JMSQLLoggerAdvancedPreferences.m in Sources */ = {isa = PBXBuildFile; fileRef = B799BC8005793C1200338E54 /* JMSQLLoggerAdvancedPreferences.m */; }; + 343BB5B90C96D54000506F9B /* PurpleMyspaceService.h in Headers */ = {isa = PBXBuildFile; fileRef = 343BB5B70C96D54000506F9B /* PurpleMyspaceService.h */; }; + 343BB5BA0C96D54000506F9B /* PurpleMyspaceService.m in Sources */ = {isa = PBXBuildFile; fileRef = 343BB5B80C96D54000506F9B /* PurpleMyspaceService.m */; }; + 343BB5BD0C96D55400506F9B /* PurpleMyspaceAccount.h in Headers */ = {isa = PBXBuildFile; fileRef = 343BB5BB0C96D55400506F9B /* PurpleMyspaceAccount.h */; }; + 343BB5BE0C96D55400506F9B /* PurpleMyspaceAccount.m in Sources */ = {isa = PBXBuildFile; fileRef = 343BB5BC0C96D55400506F9B /* PurpleMyspaceAccount.m */; }; + 343BB5C10C96D56B00506F9B /* PurpleMyspaceAccountViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 343BB5BF0C96D56B00506F9B /* PurpleMyspaceAccountViewController.h */; }; + 343BB5C20C96D56B00506F9B /* PurpleMyspaceAccountViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 343BB5C00C96D56B00506F9B /* PurpleMyspaceAccountViewController.m */; }; + 343BB5C40C96D57900506F9B /* PurpleDefaultsMyspace.plist in Resources */ = {isa = PBXBuildFile; fileRef = 343BB5C30C96D57900506F9B /* PurpleDefaultsMyspace.plist */; }; + 343BB63B0C96DC1100506F9B /* myspace-small.png in Resources */ = {isa = PBXBuildFile; fileRef = 343BB6390C96DC1100506F9B /* myspace-small.png */; }; + 343BB63C0C96DC1100506F9B /* myspace-large.png in Resources */ = {isa = PBXBuildFile; fileRef = 343BB63A0C96DC1100506F9B /* myspace-large.png */; }; 343EB3FE08086D2F00E27095 /* AccountProxy.nib in Resources */ = {isa = PBXBuildFile; fileRef = 343EB3FD08086D2F00E27095 /* AccountProxy.nib */; }; 343EB40208086D9000E27095 /* AppearancePrefs.nib in Resources */ = {isa = PBXBuildFile; fileRef = 343EB40108086D9000E27095 /* AppearancePrefs.nib */; }; 343EB41708086D9100E27095 /* StatusSortConfiguration.nib in Resources */ = {isa = PBXBuildFile; fileRef = 343EB41608086D9100E27095 /* StatusSortConfiguration.nib */; }; @@ -1961,6 +1970,15 @@ 343A7F2D06935DC500150CEC /* ESPurpleMeanwhileAccount.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = ESPurpleMeanwhileAccount.h; path = "Plugins/Purple Service/ESPurpleMeanwhileAccount.h"; sourceTree = ""; }; 343A7F3706935DD700150CEC /* ESMeanwhileService.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; name = ESMeanwhileService.m; path = "Plugins/Purple Service/ESMeanwhileService.m"; sourceTree = ""; }; 343A7F3806935DD700150CEC /* ESMeanwhileService.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = ESMeanwhileService.h; path = "Plugins/Purple Service/ESMeanwhileService.h"; sourceTree = ""; }; + 343BB5B70C96D54000506F9B /* PurpleMyspaceService.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PurpleMyspaceService.h; path = "Plugins/Purple Service/PurpleMyspaceService.h"; sourceTree = ""; }; + 343BB5B80C96D54000506F9B /* PurpleMyspaceService.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = PurpleMyspaceService.m; path = "Plugins/Purple Service/PurpleMyspaceService.m"; sourceTree = ""; }; + 343BB5BB0C96D55400506F9B /* PurpleMyspaceAccount.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PurpleMyspaceAccount.h; path = "Plugins/Purple Service/PurpleMyspaceAccount.h"; sourceTree = ""; }; + 343BB5BC0C96D55400506F9B /* PurpleMyspaceAccount.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = PurpleMyspaceAccount.m; path = "Plugins/Purple Service/PurpleMyspaceAccount.m"; sourceTree = ""; }; + 343BB5BF0C96D56B00506F9B /* PurpleMyspaceAccountViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PurpleMyspaceAccountViewController.h; path = "Plugins/Purple Service/PurpleMyspaceAccountViewController.h"; sourceTree = ""; }; + 343BB5C00C96D56B00506F9B /* PurpleMyspaceAccountViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = PurpleMyspaceAccountViewController.m; path = "Plugins/Purple Service/PurpleMyspaceAccountViewController.m"; sourceTree = ""; }; + 343BB5C30C96D57900506F9B /* PurpleDefaultsMyspace.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist; name = PurpleDefaultsMyspace.plist; path = "Plugins/Purple Service/PurpleDefaultsMyspace.plist"; sourceTree = ""; }; + 343BB6390C96DC1100506F9B /* myspace-small.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "myspace-small.png"; path = "Plugins/Purple Service/myspace-small.png"; sourceTree = ""; }; + 343BB63A0C96DC1100506F9B /* myspace-large.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "myspace-large.png"; path = "Plugins/Purple Service/myspace-large.png"; sourceTree = ""; }; 343C45E20816C0FE00FF5FA7 /* it */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = it; path = "Plugins/WebKit Message View/it.lproj/WebKitPreferencesView.nib"; sourceTree = ""; }; 343C45E50816C13300FF5FA7 /* nl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nl; path = Resources/nl.lproj/Localizable.strings; sourceTree = ""; }; 343C45E80816C13D00FF5FA7 /* nl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nl; path = "Plugins/WebKit Message View/nl.lproj/Localizable.strings"; sourceTree = ""; }; @@ -4108,6 +4126,22 @@ name = Meanwhile; sourceTree = ""; }; + 343BB51B0C96CCD100506F9B /* Myspace */ = { + isa = PBXGroup; + children = ( + 343BB5B70C96D54000506F9B /* PurpleMyspaceService.h */, + 343BB5B80C96D54000506F9B /* PurpleMyspaceService.m */, + 343BB5BB0C96D55400506F9B /* PurpleMyspaceAccount.h */, + 343BB5BC0C96D55400506F9B /* PurpleMyspaceAccount.m */, + 343BB5BF0C96D56B00506F9B /* PurpleMyspaceAccountViewController.h */, + 343BB5C00C96D56B00506F9B /* PurpleMyspaceAccountViewController.m */, + 343BB5C30C96D57900506F9B /* PurpleDefaultsMyspace.plist */, + 343BB6390C96DC1100506F9B /* myspace-small.png */, + 343BB63A0C96DC1100506F9B /* myspace-large.png */, + ); + name = Myspace; + sourceTree = ""; + }; 343C89B005704DEC005E0632 /* Address Book Integration */ = { isa = PBXGroup; children = ( @@ -4162,6 +4196,7 @@ 34416053059FC2270019246B /* Jabber */, 343A7F2206935DAF00150CEC /* Meanwhile */, 344159A2059F971C0019246B /* MSN */, + 343BB51B0C96CCD100506F9B /* Myspace */, 34415960059F94F80019246B /* Oscar */, 34C2E6650634CF010018E5D2 /* Novell GroupWise */, 3419E72D0A88086E00C3FC68 /* QQ */, @@ -7059,6 +7094,9 @@ 344499E90B23CA5D0054B761 /* adiumPurpleAccounts.h in Headers */, 34B1268E0B924E28003B0451 /* adiumPurpleDnsRequest.h in Headers */, 34A663920BF66D96008637BB /* PurpleCommon.h in Headers */, + 343BB5B90C96D54000506F9B /* PurpleMyspaceService.h in Headers */, + 343BB5BD0C96D55400506F9B /* PurpleMyspaceAccount.h in Headers */, + 343BB5C10C96D56B00506F9B /* PurpleMyspaceAccountViewController.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -7654,6 +7692,9 @@ 34D073D60B1E1A5000D63DF2 /* PurpleDefaultsMac.plist in Resources */, 34D073D70B1E1A5000D63DF2 /* PurpleDefaultsAIM.plist in Resources */, 34CAA3FB0BD3998E00AE92DC /* ESPurpleOscarAccountView.nib in Resources */, + 343BB5C40C96D57900506F9B /* PurpleDefaultsMyspace.plist in Resources */, + 343BB63B0C96DC1100506F9B /* myspace-small.png in Resources */, + 343BB63C0C96DC1100506F9B /* myspace-large.png in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -8187,6 +8228,9 @@ 34D073D20B1E1A4500D63DF2 /* ESAIMService.m in Sources */, 344499EA0B23CA5D0054B761 /* adiumPurpleAccounts.m in Sources */, 34B1268F0B924E28003B0451 /* adiumPurpleDnsRequest.m in Sources */, + 343BB5BA0C96D54000506F9B /* PurpleMyspaceService.m in Sources */, + 343BB5BE0C96D55400506F9B /* PurpleMyspaceAccount.m in Sources */, + 343BB5C20C96D56B00506F9B /* PurpleMyspaceAccountViewController.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/Plugins/Purple Service/ESPurpleGaduGaduAccount.m b/Plugins/Purple Service/ESPurpleGaduGaduAccount.m index 4d96dea96..088153ad4 100644 --- a/Plugins/Purple Service/ESPurpleGaduGaduAccount.m +++ b/Plugins/Purple Service/ESPurpleGaduGaduAccount.m @@ -65,16 +65,6 @@ return nil; } -/*! - * @brief Supports offline messaging? - * - * Gadu-Gadu supports offline messaging. - */ -- (BOOL)canSendOfflineMessageToContact:(AIListContact *)inContact -{ - return YES; -} - - (void)uploadContactListToServer { char *buddylist = ggp_buddylist_dump(account); diff --git a/Plugins/Purple Service/ESPurpleICQAccount.m b/Plugins/Purple Service/ESPurpleICQAccount.m index 92440702c..1bb8f2c71 100644 --- a/Plugins/Purple Service/ESPurpleICQAccount.m +++ b/Plugins/Purple Service/ESPurpleICQAccount.m @@ -57,14 +57,6 @@ return NO; } -/*! - * @brief ICQ supports offline messaging - */ -- (BOOL)canSendOfflineMessageToContact:(AIListContact *)inContact -{ - return YES; -} - #pragma mark Contact updates - (const char *)purpleStatusIDForStatus:(AIStatus *)statusState diff --git a/Plugins/Purple Service/ESPurpleJabberAccount.m b/Plugins/Purple Service/ESPurpleJabberAccount.m index a0c404816..72b577b8a 100644 --- a/Plugins/Purple Service/ESPurpleJabberAccount.m +++ b/Plugins/Purple Service/ESPurpleJabberAccount.m @@ -206,16 +206,6 @@ extern void jabber_roster_request(JabberStream *js); return YES; } -/*! - * @brief Supports offline messaging? - * - * Jabber supports offline messaging. - */ -- (BOOL)canSendOfflineMessageToContact:(AIListContact *)inContact -{ - return YES; -} - - (AIListContact *)contactWithUID:(NSString *)sourceUID { AIListContact *contact; diff --git a/Plugins/Purple Service/ESPurpleYahooAccount.m b/Plugins/Purple Service/ESPurpleYahooAccount.m index c0011b295..2b21b70e1 100644 --- a/Plugins/Purple Service/ESPurpleYahooAccount.m +++ b/Plugins/Purple Service/ESPurpleYahooAccount.m @@ -83,16 +83,6 @@ } /*! - * @brief Supports offline messaging? - * - * Yahoo! supports offline messaging. - */ -- (BOOL)canSendOfflineMessageToContact:(AIListContact *)inContact -{ - return YES; -} - -/*! * @brief Should set aliases serverside? * * Yahoo supports serverside aliases. diff --git a/Plugins/Purple Service/PurpleMySpaceAccount.h b/Plugins/Purple Service/PurpleMySpaceAccount.h new file mode 100644 index 000000000..d60ef59c7 --- /dev/null +++ b/Plugins/Purple Service/PurpleMySpaceAccount.h @@ -0,0 +1,14 @@ +// +// PurpleMyspaceAccount.h +// Adium +// +// Created by Evan Schoenberg on 9/11/07. +// + +#import "CBPurpleAccount.h" + +@interface PurpleMyspaceAccount : CBPurpleAccount { + +} + +@end diff --git a/Plugins/Purple Service/PurpleMySpaceAccount.m b/Plugins/Purple Service/PurpleMySpaceAccount.m new file mode 100644 index 000000000..061ecf5c7 --- /dev/null +++ b/Plugins/Purple Service/PurpleMySpaceAccount.m @@ -0,0 +1,56 @@ +// +// PurpleMyspaceAccount.m +// Adium +// +// Created by Evan Schoenberg on 9/11/07. +// + +#import "PurpleMyspaceAccount.h" +#import + +@implementation PurpleMyspaceAccount + +- (const char*)protocolPlugin +{ + return "prpl-myspace"; +} + +- (NSString *)connectionStringForStep:(int)step +{ + switch (step) { + case 0: + return AILocalizedString(@"Connecting",nil); + break; + case 1: + return AILocalizedString(@"Reading challenge",nil); + break; + case 2: + return AILocalizedString(@"Logging in","Connection step"); + break; + case 3: + return AILocalizedString(@"Connected","Connection step"); + break; + } + + return nil; +} + +- (NSString *)encodedAttributedString:(NSAttributedString *)inAttributedString forListObject:(AIListObject *)inListObject +{ + return [AIHTMLDecoder encodeHTML:inAttributedString + headers:YES + fontTags:YES + includingColorTags:YES + closeFontTags:YES + styleTags:YES + closeStyleTagsOnFontChange:YES + encodeNonASCII:YES + encodeSpaces:NO + imagesPath:nil + attachmentsAsText:YES + onlyIncludeOutgoingImages:NO + simpleTagsOnly:NO + bodyBackground:NO]; +} + +@end diff --git a/Plugins/Purple Service/PurpleMySpaceAccountViewController.h b/Plugins/Purple Service/PurpleMySpaceAccountViewController.h new file mode 100644 index 000000000..8036f6ac6 --- /dev/null +++ b/Plugins/Purple Service/PurpleMySpaceAccountViewController.h @@ -0,0 +1,14 @@ +// +// PurpleMyspaceAccountViewController.h +// Adium +// +// Created by Evan Schoenberg on 9/11/07. +// + +#import "AIAccountViewController.h" + +@interface PurpleMyspaceAccountViewController : AIAccountViewController { + +} + +@end diff --git a/Plugins/Purple Service/PurpleMySpaceAccountViewController.m b/Plugins/Purple Service/PurpleMySpaceAccountViewController.m new file mode 100644 index 000000000..a3bcbc9a6 --- /dev/null +++ b/Plugins/Purple Service/PurpleMySpaceAccountViewController.m @@ -0,0 +1,13 @@ +// +// PurpleMyspaceAccountViewController.m +// Adium +// +// Created by Evan Schoenberg on 9/11/07. +// + +#import "PurpleMyspaceAccountViewController.h" + + +@implementation PurpleMyspaceAccountViewController + +@end diff --git a/Plugins/Purple Service/PurpleMySpaceService.h b/Plugins/Purple Service/PurpleMySpaceService.h new file mode 100644 index 000000000..1f0949344 --- /dev/null +++ b/Plugins/Purple Service/PurpleMySpaceService.h @@ -0,0 +1,14 @@ +// +// PurpleMyspaceService.h +// Adium +// +// Created by Evan Schoenberg on 9/11/07. +// + +#import "PurpleService.h" + +@interface PurpleMyspaceService : PurpleService { + +} + +@end diff --git a/Plugins/Purple Service/PurpleMySpaceService.m b/Plugins/Purple Service/PurpleMySpaceService.m new file mode 100644 index 000000000..891d46f09 --- /dev/null +++ b/Plugins/Purple Service/PurpleMySpaceService.m @@ -0,0 +1,98 @@ +// +// PurpleMyspaceService.m +// Adium +// +// Created by Evan Schoenberg on 9/11/07. +// + +#import "PurpleMyspaceService.h" +#import "PurpleMyspaceAccount.h" +#import "PurpleMyspaceAccountViewController.h" +#import +#import + +@implementation PurpleMyspaceService + +//Account Creation +- (Class)accountClass{ + return [PurpleMyspaceAccount class]; +} + +- (AIAccountViewController *)accountViewController{ + return [PurpleMyspaceAccountViewController accountViewController]; +} + +- (DCJoinChatViewController *)joinChatView{ + return nil; +} + +//Service Description +- (NSString *)serviceCodeUniqueID{ + return @"libpurple-Myspace"; +} +- (NSString *)serviceID{ + return @"Myspace"; +} +- (NSString *)serviceClass{ + return @"Myspace"; +} +- (NSString *)shortDescription{ + return @"Myspace"; +} +- (NSString *)longDescription{ + return @"MyspaceIM"; +} +- (NSCharacterSet *)allowedCharacters{ + return [NSCharacterSet characterSetWithCharactersInString:@"+abcdefghijklmnopqrstuvwxyz0123456789@._-"]; +} +- (NSCharacterSet *)ignoredCharacters{ + return [NSCharacterSet characterSetWithCharactersInString:@""]; +} +- (int)allowedLength{ + return 999; +} +- (BOOL)caseSensitive{ + return NO; +} +- (AIServiceImportance)serviceImportance{ + return AIServiceSecondary; +} + +- (void)registerStatuses{ + [[adium statusController] registerStatus:STATUS_NAME_AVAILABLE + withDescription:[[adium statusController] localizedDescriptionForCoreStatusName:STATUS_NAME_AVAILABLE] + ofType:AIAvailableStatusType + forService:self]; + + [[adium statusController] registerStatus:STATUS_NAME_AWAY + withDescription:[[adium statusController] localizedDescriptionForCoreStatusName:STATUS_NAME_AWAY] + ofType:AIAwayStatusType + forService:self]; + + [[adium statusController] registerStatus:STATUS_NAME_INVISIBLE + withDescription:[[adium statusController] localizedDescriptionForCoreStatusName:STATUS_NAME_INVISIBLE] + ofType:AIInvisibleStatusType + forService:self]; +} + +/*! + * @brief Default icon + * + * Service Icon packs should always include images for all the built-in Adium services. This method allows external + * service plugins to specify an image which will be used when the service icon pack does not specify one. It will + * also be useful if new services are added to Adium itself after a significant number of Service Icon packs exist + * which do not yet have an image for this service. If the active Service Icon pack provides an image for this service, + * this method will not be called. + * + * The service should _not_ cache this icon internally; multiple calls should return unique NSImage objects. + * + * @param iconType The AIServiceIconType of the icon to return. This specifies the desired size of the icon. + * @return NSImage to use for this service by default + */ +- (NSImage *)defaultServiceIconOfType:(AIServiceIconType)iconType +{ + return [NSImage imageNamed:((iconType == AIServiceIconSmall) ? @"myspace-small" : @"myspace-small") + forClass:[self class]]; +} + +@end diff --git a/Plugins/Purple Service/myspace-large.png b/Plugins/Purple Service/myspace-large.png new file mode 100644 index 0000000000000000000000000000000000000000..a07f8e1f9f914d473879a9feada8ad09d0916772 GIT binary patch literal 3308 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