adium/adium

Merged adium-1.6 into default.

2013-04-16, Thijs Alkemade
89cb5b023ca8
Merged adium-1.6 into default.
--- a/Adium.xcodeproj/project.pbxproj Thu Mar 21 00:01:23 2013 -0400
+++ b/Adium.xcodeproj/project.pbxproj Tue Apr 16 17:27:41 2013 +0200
@@ -107,17 +107,12 @@
112E7FA60FC86BB400657119 /* AITwitterActionsHTMLFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 112E7FA50FC86BB400657119 /* AITwitterActionsHTMLFilter.m */; };
1130EA99109B445500FB3454 /* pref-defaultclient.tiff in Resources */ = {isa = PBXBuildFile; fileRef = 1130EA98109B445500FB3454 /* pref-defaultclient.tiff */; };
1130EA9D109B445D00FB3454 /* pref-mention.tiff in Resources */ = {isa = PBXBuildFile; fileRef = 1130EA9B109B445D00FB3454 /* pref-mention.tiff */; };
- 113891830F6B6AFF00A7D7DC /* AILaconicaService.m in Sources */ = {isa = PBXBuildFile; fileRef = 113891820F6B6AFF00A7D7DC /* AILaconicaService.m */; };
- 1138918A0F6B6B2800A7D7DC /* AILaconicaAccount.m in Sources */ = {isa = PBXBuildFile; fileRef = 113891890F6B6B2800A7D7DC /* AILaconicaAccount.m */; };
- 1138918D0F6B6B3F00A7D7DC /* AILaconicaPlugin.m in Sources */ = {isa = PBXBuildFile; fileRef = 1138918C0F6B6B3F00A7D7DC /* AILaconicaPlugin.m */; };
- 113891950F6B6B9C00A7D7DC /* AILaconicaAccountViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 113891940F6B6B9C00A7D7DC /* AILaconicaAccountViewController.m */; };
113892270F6B70CA00A7D7DC /* laconica-small.png in Resources */ = {isa = PBXBuildFile; fileRef = 113892250F6B70CA00A7D7DC /* laconica-small.png */; };
113892280F6B70CA00A7D7DC /* laconica.png in Resources */ = {isa = PBXBuildFile; fileRef = 113892260F6B70CA00A7D7DC /* laconica.png */; };
113900B10F85BEF60081A418 /* AIURLHandlerPreferences.xib in Resources */ = {isa = PBXBuildFile; fileRef = 113900B00F85BEF60081A418 /* AIURLHandlerPreferences.xib */; };
113900B40F85BF880081A418 /* AIURLHandlerWindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = 113900B30F85BF880081A418 /* AIURLHandlerWindowController.m */; };
1139011C0F85C9450081A418 /* AIURLHandlerPlugin.m in Sources */ = {isa = PBXBuildFile; fileRef = 1139011B0F85C9450081A418 /* AIURLHandlerPlugin.m */; };
1139FFAA0F85260E0081A418 /* AIIRCChannelLinker.m in Sources */ = {isa = PBXBuildFile; fileRef = 1139FFA90F85260E0081A418 /* AIIRCChannelLinker.m */; };
- 113F26A00F5CC03F00954772 /* AITwitterURLParser.m in Sources */ = {isa = PBXBuildFile; fileRef = 113F269F0F5CC03F00954772 /* AITwitterURLParser.m */; };
114849B90F7841C600EA5264 /* AIAuthorizationRequestsWindowController.h in Headers */ = {isa = PBXBuildFile; fileRef = 114849B70F7841C600EA5264 /* AIAuthorizationRequestsWindowController.h */; settings = {ATTRIBUTES = (Public, ); }; };
114849BA0F7841C600EA5264 /* AIAuthorizationRequestsWindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = 114849B80F7841C600EA5264 /* AIAuthorizationRequestsWindowController.m */; };
114849BC0F78420300EA5264 /* AIAuthorizationRequestsWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = 114849BB0F78420300EA5264 /* AIAuthorizationRequestsWindow.xib */; };
@@ -1033,6 +1028,7 @@
5A3B4D7C16D878AC00903E40 /* STTwitterOAuth.m in Sources */ = {isa = PBXBuildFile; fileRef = 5A3B4D7216D878AB00903E40 /* STTwitterOAuth.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; };
5A3B4D7E16D878AC00903E40 /* STHTTPRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = 5A3B4D7816D878AC00903E40 /* STHTTPRequest.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; };
5A44595E169143130078AB0A /* AIPreferenceCVPrototypeView.m in Sources */ = {isa = PBXBuildFile; fileRef = 5A445957169118C60078AB0A /* AIPreferenceCVPrototypeView.m */; };
+ 5A4B77E916FBDDC700DF398C /* NSData+Base64.m in Sources */ = {isa = PBXBuildFile; fileRef = 5A4B77E716FBDDC600DF398C /* NSData+Base64.m */; };
5A4BD41D13F855B000A4D3F7 /* SearchTerms.plist in Resources */ = {isa = PBXBuildFile; fileRef = 5A4BD41B13F855B000A4D3F7 /* SearchTerms.plist */; };
5A4BD41E13F8568100A4D3F7 /* Preferences.xib in Resources */ = {isa = PBXBuildFile; fileRef = 5ACF27331392C585004B6AEF /* Preferences.xib */; };
5A4BD43313F856E300A4D3F7 /* Preferences-AddressBookIntegration.xib in Resources */ = {isa = PBXBuildFile; fileRef = 5AC7F26313B42952002D7265 /* Preferences-AddressBookIntegration.xib */; };
@@ -1847,8 +1843,6 @@
1139FFA90F85260E0081A418 /* AIIRCChannelLinker.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AIIRCChannelLinker.m; path = Source/AIIRCChannelLinker.m; sourceTree = "<group>"; };
113E06A910D0ABA0005D5B9A /* adiumPurpleMedia.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = adiumPurpleMedia.m; path = "Plugins/Purple Service/adiumPurpleMedia.m"; sourceTree = "<group>"; };
113E06AE10D0ABE3005D5B9A /* adiumPurpleMedia.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = adiumPurpleMedia.h; path = "Plugins/Purple Service/adiumPurpleMedia.h"; sourceTree = "<group>"; };
- 113F269E0F5CC03F00954772 /* AITwitterURLParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AITwitterURLParser.h; path = "Plugins/Twitter Plugin/AITwitterURLParser.h"; sourceTree = "<group>"; };
- 113F269F0F5CC03F00954772 /* AITwitterURLParser.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AITwitterURLParser.m; path = "Plugins/Twitter Plugin/AITwitterURLParser.m"; sourceTree = "<group>"; };
1147FCC210D1CB4C004E9E8D /* AIMediaWindowController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AIMediaWindowController.h; path = Source/AIMediaWindowController.h; sourceTree = "<group>"; };
1147FCC310D1CB4C004E9E8D /* AIMediaWindowController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AIMediaWindowController.m; path = Source/AIMediaWindowController.m; sourceTree = "<group>"; };
1147FCC710D1CB83004E9E8D /* AIMediaWindow.xib */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xib; name = AIMediaWindow.xib; path = Resources/AIMediaWindow.xib; sourceTree = "<group>"; };
@@ -3898,6 +3892,9 @@
5A3B4D7816D878AC00903E40 /* STHTTPRequest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = STHTTPRequest.m; path = "Plugins/Twitter Plugin/STTwitter/Vendor/STHTTPRequest.m"; sourceTree = "<group>"; };
5A445956169118C60078AB0A /* AIPreferenceCVPrototypeView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AIPreferenceCVPrototypeView.h; path = Source/AIPreferenceCVPrototypeView.h; sourceTree = "<group>"; };
5A445957169118C60078AB0A /* AIPreferenceCVPrototypeView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AIPreferenceCVPrototypeView.m; path = Source/AIPreferenceCVPrototypeView.m; sourceTree = "<group>"; };
+ 5A4B77E716FBDDC600DF398C /* NSData+Base64.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "NSData+Base64.m"; path = "Plugins/Twitter Plugin/STTwitter/NSData+Base64.m"; sourceTree = "<group>"; };
+ 5A4B77E816FBDDC700DF398C /* NSData+Base64.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "NSData+Base64.h"; path = "Plugins/Twitter Plugin/STTwitter/NSData+Base64.h"; sourceTree = "<group>"; };
+ 5A4B77FA16FCABEC00DF398C /* Dock Tile Plugin.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = "Dock Tile Plugin.xcconfig"; sourceTree = "<group>"; };
5A4BD41C13F855B000A4D3F7 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = en; path = Resources/en.lproj/SearchTerms.plist; sourceTree = "<group>"; };
5A4BD47213F858EE00A4D3F7 /* Preferences-ContactList.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = "Preferences-ContactList.xib"; path = "Resources/Preferences-ContactList.xib"; sourceTree = "<group>"; };
5A4BD48813F859EF00A4D3F7 /* Preferences-WindowHandling.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = "Preferences-WindowHandling.xib"; path = "Resources/Preferences-WindowHandling.xib"; sourceTree = "<group>"; };
@@ -5055,8 +5052,6 @@
11BD73D20F5A54BB007D438A /* twitter.png */,
EFB1C3120DDBDA3100B3973D /* AITwitterIMPlugin.h */,
EFB1C3130DDBDA3100B3973D /* AITwitterIMPlugin.m */,
- 113F269E0F5CC03F00954772 /* AITwitterURLParser.h */,
- 113F269F0F5CC03F00954772 /* AITwitterURLParser.m */,
112523170F5F7F86003FC58A /* AITwitterURLHandler.h */,
112523180F5F7F86003FC58A /* AITwitterURLHandler.m */,
11F738FA0F58D19B00B3285B /* AITwitterPlugin.h */,
@@ -7319,6 +7314,8 @@
5A3B4D6A16D878AB00903E40 /* STTwitter */ = {
isa = PBXGroup;
children = (
+ 5A4B77E716FBDDC600DF398C /* NSData+Base64.m */,
+ 5A4B77E816FBDDC700DF398C /* NSData+Base64.h */,
5A0D236816F4C7BC005DF211 /* STTwitterAppOnly.m */,
5A0D236916F4C7BC005DF211 /* STTwitterAppOnly.h */,
5A3B4D6B16D878AB00903E40 /* NSString+STTwitter.h */,
@@ -8090,6 +8087,7 @@
63C7E1160FAFA35E00B310AC /* Plist Macros.xcconfig */,
63C7E1170FAFA35E00B310AC /* Setup Build Directory.xcconfig */,
63C7E11A0FAFA35E00B310AC /* AdiumApplescriptRunner.xcconfig */,
+ 5A4B77FA16FCABEC00DF398C /* Dock Tile Plugin.xcconfig */,
);
path = xcconfigs;
sourceTree = "<group>";
@@ -10520,13 +10518,8 @@
11F738F90F58D18700B3285B /* AITwitterService.m in Sources */,
11F738FC0F58D19B00B3285B /* AITwitterPlugin.m in Sources */,
11F739020F58D1C400B3285B /* AITwitterAccountViewController.m in Sources */,
- 113F26A00F5CC03F00954772 /* AITwitterURLParser.m in Sources */,
112523190F5F7F86003FC58A /* AITwitterURLHandler.m in Sources */,
1109661A0F61D3E70064CA0E /* AITwitterReplyWindowController.m in Sources */,
- 113891830F6B6AFF00A7D7DC /* AILaconicaService.m in Sources */,
- 1138918A0F6B6B2800A7D7DC /* AILaconicaAccount.m in Sources */,
- 1138918D0F6B6B3F00A7D7DC /* AILaconicaPlugin.m in Sources */,
- 113891950F6B6B9C00A7D7DC /* AILaconicaAccountViewController.m in Sources */,
1163F0EC0F6C7A8300F12F5D /* AIURLShortenerPlugin.m in Sources */,
11700A350F7E8BE80078D6AB /* AISpecialPasswordPromptController.m in Sources */,
112B490A0F82FB1700690E84 /* AIGroupChatStatusTooltipPlugin.m in Sources */,
@@ -10571,6 +10564,7 @@
5A3B4D7C16D878AC00903E40 /* STTwitterOAuth.m in Sources */,
5A3B4D7E16D878AC00903E40 /* STHTTPRequest.m in Sources */,
5A0D236A16F4C7BC005DF211 /* STTwitterAppOnly.m in Sources */,
+ 5A4B77E916FBDDC700DF398C /* NSData+Base64.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -12360,7 +12354,6 @@
isa = XCBuildConfiguration;
baseConfigurationReference = 63C7E2050FAFAA4700B310AC /* Unit tests.xcconfig */;
buildSettings = {
- COMBINE_HIDPI_IMAGES = YES;
};
name = Debug;
};
@@ -12368,7 +12361,6 @@
isa = XCBuildConfiguration;
baseConfigurationReference = 63C7E2050FAFAA4700B310AC /* Unit tests.xcconfig */;
buildSettings = {
- COMBINE_HIDPI_IMAGES = YES;
};
name = Release;
};
@@ -12376,7 +12368,6 @@
isa = XCBuildConfiguration;
baseConfigurationReference = 63C7E2050FAFAA4700B310AC /* Unit tests.xcconfig */;
buildSettings = {
- COMBINE_HIDPI_IMAGES = YES;
};
name = "Release-Debug";
};
@@ -12384,11 +12375,6 @@
isa = XCBuildConfiguration;
baseConfigurationReference = 63C7E2060FAFAA4700B310AC /* AdiumLibpurple.xcconfig */;
buildSettings = {
- COMBINE_HIDPI_IMAGES = YES;
- FRAMEWORK_SEARCH_PATHS = (
- "$(inherited)",
- "\"$(SRCROOT)/Frameworks\"",
- );
};
name = Debug;
};
@@ -12396,11 +12382,6 @@
isa = XCBuildConfiguration;
baseConfigurationReference = 63C7E2060FAFAA4700B310AC /* AdiumLibpurple.xcconfig */;
buildSettings = {
- COMBINE_HIDPI_IMAGES = YES;
- FRAMEWORK_SEARCH_PATHS = (
- "$(inherited)",
- "\"$(SRCROOT)/Frameworks\"",
- );
};
name = Release;
};
@@ -12408,11 +12389,6 @@
isa = XCBuildConfiguration;
baseConfigurationReference = 63C7E2060FAFAA4700B310AC /* AdiumLibpurple.xcconfig */;
buildSettings = {
- COMBINE_HIDPI_IMAGES = YES;
- FRAMEWORK_SEARCH_PATHS = (
- "$(inherited)",
- "\"$(SRCROOT)/Frameworks\"",
- );
};
name = "Release-Debug";
};
@@ -12420,7 +12396,6 @@
isa = XCBuildConfiguration;
baseConfigurationReference = 63C7E1150FAFA35E00B310AC /* Touch Framework Bundles to Executable Date.xcconfig */;
buildSettings = {
- COMBINE_HIDPI_IMAGES = YES;
};
name = Debug;
};
@@ -12428,7 +12403,6 @@
isa = XCBuildConfiguration;
baseConfigurationReference = 63C7E1150FAFA35E00B310AC /* Touch Framework Bundles to Executable Date.xcconfig */;
buildSettings = {
- COMBINE_HIDPI_IMAGES = YES;
};
name = Release;
};
@@ -12436,7 +12410,6 @@
isa = XCBuildConfiguration;
baseConfigurationReference = 63C7E1150FAFA35E00B310AC /* Touch Framework Bundles to Executable Date.xcconfig */;
buildSettings = {
- COMBINE_HIDPI_IMAGES = YES;
};
name = "Release-Debug";
};
@@ -12444,7 +12417,6 @@
isa = XCBuildConfiguration;
baseConfigurationReference = 63C7E2030FAFAA4700B310AC /* AIUtilities.framework.xcconfig */;
buildSettings = {
- COMBINE_HIDPI_IMAGES = YES;
};
name = Debug;
};
@@ -12452,7 +12424,6 @@
isa = XCBuildConfiguration;
baseConfigurationReference = 63C7E2030FAFAA4700B310AC /* AIUtilities.framework.xcconfig */;
buildSettings = {
- COMBINE_HIDPI_IMAGES = YES;
};
name = Release;
};
@@ -12460,7 +12431,6 @@
isa = XCBuildConfiguration;
baseConfigurationReference = 63C7E2030FAFAA4700B310AC /* AIUtilities.framework.xcconfig */;
buildSettings = {
- COMBINE_HIDPI_IMAGES = YES;
};
name = "Release-Debug";
};
@@ -12468,7 +12438,6 @@
isa = XCBuildConfiguration;
baseConfigurationReference = 63C7E2080FAFAA4700B310AC /* Spotlight Importer.xcconfig */;
buildSettings = {
- COMBINE_HIDPI_IMAGES = YES;
};
name = Debug;
};
@@ -12476,7 +12445,6 @@
isa = XCBuildConfiguration;
baseConfigurationReference = 63C7E2080FAFAA4700B310AC /* Spotlight Importer.xcconfig */;
buildSettings = {
- COMBINE_HIDPI_IMAGES = YES;
};
name = Release;
};
@@ -12484,12 +12452,12 @@
isa = XCBuildConfiguration;
baseConfigurationReference = 63C7E2080FAFAA4700B310AC /* Spotlight Importer.xcconfig */;
buildSettings = {
- COMBINE_HIDPI_IMAGES = YES;
};
name = "Release-Debug";
};
761CE34516F9087D000EE361 /* Debug */ = {
isa = XCBuildConfiguration;
+ baseConfigurationReference = 5A4B77FA16FCABEC00DF398C /* Dock Tile Plugin.xcconfig */;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
ARCHS = "$(ARCHS_STANDARD_64_BIT)";
@@ -12522,6 +12490,7 @@
};
761CE34616F9087D000EE361 /* Release */ = {
isa = XCBuildConfiguration;
+ baseConfigurationReference = 5A4B77FA16FCABEC00DF398C /* Dock Tile Plugin.xcconfig */;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
ARCHS = "$(ARCHS_STANDARD_64_BIT)";
@@ -12555,6 +12524,7 @@
};
761CE34716F9087D000EE361 /* Release-Debug */ = {
isa = XCBuildConfiguration;
+ baseConfigurationReference = 5A4B77FA16FCABEC00DF398C /* Dock Tile Plugin.xcconfig */;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
ARCHS = "$(ARCHS_STANDARD_64_BIT)";
@@ -12683,7 +12653,6 @@
isa = XCBuildConfiguration;
baseConfigurationReference = 63C7E2070FAFAA4700B310AC /* Adium.framework.xcconfig */;
buildSettings = {
- COMBINE_HIDPI_IMAGES = YES;
};
name = Debug;
};
@@ -12691,7 +12660,6 @@
isa = XCBuildConfiguration;
baseConfigurationReference = 63C7E2070FAFAA4700B310AC /* Adium.framework.xcconfig */;
buildSettings = {
- COMBINE_HIDPI_IMAGES = YES;
};
name = Release;
};
@@ -12699,7 +12667,6 @@
isa = XCBuildConfiguration;
baseConfigurationReference = 63C7E2070FAFAA4700B310AC /* Adium.framework.xcconfig */;
buildSettings = {
- COMBINE_HIDPI_IMAGES = YES;
};
name = "Release-Debug";
};
@@ -12772,8 +12739,6 @@
isa = XCBuildConfiguration;
baseConfigurationReference = 63C7E1170FAFA35E00B310AC /* Setup Build Directory.xcconfig */;
buildSettings = {
- COMBINE_HIDPI_IMAGES = YES;
- PRODUCT_NAME = "Setup Build Directory";
};
name = Debug;
};
@@ -12781,8 +12746,6 @@
isa = XCBuildConfiguration;
baseConfigurationReference = 63C7E1170FAFA35E00B310AC /* Setup Build Directory.xcconfig */;
buildSettings = {
- COMBINE_HIDPI_IMAGES = YES;
- PRODUCT_NAME = "Setup Build Directory";
};
name = Release;
};
@@ -12790,8 +12753,6 @@
isa = XCBuildConfiguration;
baseConfigurationReference = 63C7E1170FAFA35E00B310AC /* Setup Build Directory.xcconfig */;
buildSettings = {
- COMBINE_HIDPI_IMAGES = YES;
- PRODUCT_NAME = "Setup Build Directory";
};
name = "Release-Debug";
};
@@ -12799,7 +12760,6 @@
isa = XCBuildConfiguration;
baseConfigurationReference = 63C7E1160FAFA35E00B310AC /* Plist Macros.xcconfig */;
buildSettings = {
- COMBINE_HIDPI_IMAGES = YES;
};
name = Debug;
};
@@ -12807,7 +12767,6 @@
isa = XCBuildConfiguration;
baseConfigurationReference = 63C7E1160FAFA35E00B310AC /* Plist Macros.xcconfig */;
buildSettings = {
- COMBINE_HIDPI_IMAGES = YES;
};
name = Release;
};
@@ -12815,7 +12774,6 @@
isa = XCBuildConfiguration;
baseConfigurationReference = 63C7E1160FAFA35E00B310AC /* Plist Macros.xcconfig */;
buildSettings = {
- COMBINE_HIDPI_IMAGES = YES;
};
name = "Release-Debug";
};
--- a/AdiumHelp/pgs/Accounts-Sametime.html Thu Mar 21 00:01:23 2013 -0400
+++ b/AdiumHelp/pgs/Accounts-Sametime.html Tue Apr 16 17:27:41 2013 +0200
@@ -46,7 +46,8 @@
</table>
<p>IBM Lotus Sametime is a messaging protocol used primarily in corporate environments.
<p>Adium's Sametime support is provided via the <a class="ext_link" href="http://meanwhile.sf.net/">Meanwhile</a> library and Pidgin plugin, an open re-implementation of the protocol developed by Christopher (siege) O'Brien. Sametime-specific issues and requests are best directed to the appropriate <a class="ext_link" href="http://sf.net/tracker/?group_id=110565</a>">Meanwhile project trackers</a>. Questions regarding the Meanwhile library and Pidgin plugin may be answered on the <a class="ext_link" href="http://meanwhile.sourceforge.net/faq/">Meanwhile FAQ</a> page.
- <p><strong>Technical note</strong>: The Meanwhile library's client ID is 0x1700. If you can connect with the official Lotus client but receive a "Not Authorized" error when connecting with Adium, you may need to ask your IT department to enable access for the Meanwhile client ID. Alternately, in Adium 1.0 or later, select "Hide client identity" in the Options of tab of your Sametime account's preferences within Adium.</p>
+ <p><strong>Technical note</strong>: The Meanwhile library's client ID is 0x1700. If you can connect with the official Lotus client but receive a "Not Authorized" error when connecting with Adium, you may need to ask your IT department to enable access for the Meanwhile client ID. Alternately, select "Hide client identity" in the Options of tab of your Sametime account's preferences within Adium.</p>
+ <p><a class="ext_link" href="http://www.nomaen.com/2012/01/connecting-with-ibmers-via-sametime-in.html">This blog post</a> has instructions on how to setup Sametime as an IBM employee.</p>
</div>
</div>
<div class="taskboxline">
--- a/ChangeLogs/Changes.txt Thu Mar 21 00:01:23 2013 -0400
+++ b/ChangeLogs/Changes.txt Tue Apr 16 17:27:41 2013 +0200
@@ -57,8 +57,10 @@
- Fixed DNS leaks in libpurple. / Added a "Tor (SOCKS5)" proxy option, which uses the Tor proxy option of libpurple. (#15161)
- "Proxy bypass when registered jabber handle" (#15957)
+Version 1.5.7 (XX/XX/20XX)
+ * Fix a bug that could cause SSL connections to be closed prematurely. (#16356)
-Version 1.5.6 (3/XX/2013)
+Version 1.5.6 (3/18/2013)
* Fix a crash on startup on 10.6.8.
* Fix a crash when accepting or canceling the certificate verification dialog. (#16280)
* Fix a crash or hang when trying to use OTR on 32-bits Macs. (#16203)
--- a/Frameworks/AutoHyperlinks Framework/xcconfigs/AutoHyperlinks.xcconfig Thu Mar 21 00:01:23 2013 -0400
+++ b/Frameworks/AutoHyperlinks Framework/xcconfigs/AutoHyperlinks.xcconfig Tue Apr 16 17:27:41 2013 +0200
@@ -31,3 +31,8 @@
GCC_WARN_UNUSED_VALUE = YES
GCC_TREAT_WARNINGS_AS_ERRORS = NO
RUN_CLANG_STATIC_ANALYZER = YES
+CLANG_WARN_CONSTANT_CONVERSION = YES
+CLANG_WARN_ENUM_CONVERSION = YES
+CLANG_WARN_INT_CONVERSION = YES
+CLANG_WARN__DUPLICATE_METHOD_MATCH = YES
+GCC_WARN_UNINITIALIZED_AUTOS = YES
--- a/Plugins/Purple Service/AIPurpleCertificateTrustWarningAlert.m Thu Mar 21 00:01:23 2013 -0400
+++ b/Plugins/Purple Service/AIPurpleCertificateTrustWarningAlert.m Tue Apr 16 17:27:41 2013 +0200
@@ -90,6 +90,7 @@
- (void)dealloc {
CFRelease(certificates);
+ CFRelease(trustRef);
}
- (IBAction)showWindow:(id)sender {
@@ -248,9 +249,6 @@
CFRelease(data);
}
}
-
- CFRelease(trustRef);
- trustRef = NULL;
[parentWindow performClose:nil];
}
--- a/Plugins/Purple Service/libpurple_extensions/ssl-cdsa.c Thu Mar 21 00:01:23 2013 -0400
+++ b/Plugins/Purple Service/libpurple_extensions/ssl-cdsa.c Tue Apr 16 17:27:41 2013 +0200
@@ -229,17 +229,18 @@
switch(theErr) {
case ENOENT:
/* connection closed */
- rtn = errSSLClosedGraceful;
+ rtn = errSSLClosedGraceful;
break;
case ECONNRESET:
rtn = errSSLClosedAbort;
break;
+ case 0:
case EAGAIN:
rtn = errSSLWouldBlock;
break;
default:
- fprintf(stderr,"SocketRead: read(%lu) error %d\n",
- (unsigned long)bytesToGo, theErr);
+ fprintf(stderr,"SocketRead: read(%lu) error %d\n",
+ (unsigned long)bytesToGo, theErr);
rtn = errSSLFatalAlert;
break;
}
--- a/Plugins/Twitter Plugin/AITwitterAccount.h Thu Mar 21 00:01:23 2013 -0400
+++ b/Plugins/Twitter Plugin/AITwitterAccount.h Tue Apr 16 17:27:41 2013 +0200
@@ -193,7 +193,7 @@
- (void)destroyDirectMessage:(NSString *)messageID
forUser:(NSString *)userID;
-- (NSAttributedString *)linkifiedAttributedStringFromString:(NSAttributedString *)inString;
+- (void)linkifyEntities:(NSArray *)entities inString:(NSMutableAttributedString **)inString forLinkType:(AITwitterLinkType)linkType;
- (NSString *)addressForLinkType:(AITwitterLinkType)linkType
userID:(NSString *)userID
--- a/Plugins/Twitter Plugin/AITwitterAccount.m Thu Mar 21 00:01:23 2013 -0400
+++ b/Plugins/Twitter Plugin/AITwitterAccount.m Tue Apr 16 17:27:41 2013 +0200
@@ -15,7 +15,6 @@
*/
#import "AITwitterAccount.h"
-#import "AITwitterURLParser.h"
#import "AITwitterReplyWindowController.h"
#import <AIUtilities/AIAttributedStringAdditions.h>
#import <AIUtilities/AIStringAdditions.h>
@@ -43,12 +42,12 @@
- (void)updateTimelineChat:(AIGroupChat *)timelineChat;
-- (NSAttributedString *)parseMessage:(NSString *)inMessage
- tweetID:(NSString *)tweetID
- userID:(NSString *)userID
- inReplyToUser:(NSString *)replyUserID
- inReplyToTweetID:(NSString *)replyTweetID;
-- (NSAttributedString *)parseDirectMessage:(NSString *)inMessage
+- (NSAttributedString *)parseStatus:(NSDictionary *)inStatus
+ tweetID:(NSString *)tweetID
+ userID:(NSString *)userID
+ inReplyToUser:(NSString *)replyUserID
+ inReplyToTweetID:(NSString *)replyTweetID;
+- (NSAttributedString *)parseDirectMessage:(NSDictionary *)inMessage
withID:(NSString *)dmID
fromUser:(NSString *)sourceUID;
- (NSAttributedString *)attributedStringWithLinkLabel:(NSString *)label
@@ -613,21 +612,11 @@
AILogWithSignature(@"%@ Updating statuses for profile, user %@", self, inContact);
for (NSDictionary *update in statuses) {
- NSAttributedString *message;
- NSDictionary *retweet = [update valueForKey:TWITTER_STATUS_RETWEET];
- NSString *text = [update objectForKey:TWITTER_STATUS_TEXT];
-
- if (retweet && [retweet isKindOfClass:[NSDictionary class]]) {
- text = [NSString stringWithFormat:@"RT @%@: %@",
- [[retweet objectForKey:TWITTER_STATUS_USER] objectForKey:TWITTER_STATUS_UID],
- [retweet objectForKey:TWITTER_STATUS_TEXT]];
- }
-
- message = [self parseMessage:text
- tweetID:[update objectForKey:TWITTER_STATUS_ID]
- userID:inContact.UID
- inReplyToUser:[update objectForKey:TWITTER_STATUS_REPLY_UID]
- inReplyToTweetID:[update objectForKey:TWITTER_STATUS_REPLY_ID]];
+ NSAttributedString *message = [self parseStatus:update
+ tweetID:[update objectForKey:TWITTER_STATUS_ID]
+ userID:inContact.UID
+ inReplyToUser:[update objectForKey:TWITTER_STATUS_REPLY_UID]
+ inReplyToTweetID:[update objectForKey:TWITTER_STATUS_REPLY_ID]];
[profileArray addObject:[NSDictionary dictionaryWithObjectsAndKeys:message, KEY_VALUE, nil]];
}
@@ -904,7 +893,7 @@
[twitterEngine getRateLimitsForResources:@[ @"users", @"statuses", @"friendships", @"direct_messages" ]
successBlock:^(NSDictionary *rateLimits) {
NSMutableString *formattedString = [NSMutableString string];
- [rateLimits[@"resources"] enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
+ [[rateLimits objectForKey:@"resources"] enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
if ([obj isKindOfClass:[NSDictionary class]]) {
__block BOOL displayedHeader = NO;
[obj enumerateKeysAndObjectsUsingBlock:^(id subKey, id subObj, BOOL *subStop) {
@@ -929,7 +918,11 @@
}];
}
}];
- [[NSAlert alertWithMessageText:AILocalizedString(@"Current Twitter rate limits", "Message in the rate limits status window") defaultButton:nil alternateButton:nil otherButton:nil informativeTextWithFormat:@"%@", formattedString] beginSheetModalForWindow:nil modalDelegate:nil didEndSelector:nil contextInfo:nil];
+ [[NSAlert alertWithMessageText:AILocalizedString(@"Current Twitter rate limits", "Message in the rate limits status window")
+ defaultButton:nil
+ alternateButton:nil
+ otherButton:nil
+ informativeTextWithFormat:@"%@", formattedString] beginSheetModalForWindow:nil modalDelegate:nil didEndSelector:nil contextInfo:nil];
} errorBlock:^(NSError *error) {
[self requestFailed:AITwitterRateLimitStatus withError:error userInfo:nil];
}];
@@ -1027,23 +1020,25 @@
[listContact setValue:[NSNumber numberWithBool:YES] forProperty:TWITTER_PROPERTY_REQUESTED_USER_ICON notify:NotifyNever];
// Grab the user icon and set it as their serverside icon.
- NSString *imageURL = [url stringByReplacingOccurrencesOfString:@"_normal." withString:@"_bigger."];
- NSURLRequest *imageRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:imageURL]];
- [NSURLConnection sendAsynchronousRequest:imageRequest
- queue:[NSOperationQueue currentQueue]
- completionHandler:^(NSURLResponse *resp, NSData *data, NSError *error) {
- NSImage *image = [[NSImage alloc] initWithData:data];
-
- if (image) {
- AILogWithSignature(@"%@ Updated user icon for %@", self, listContact);
- [listContact setServersideIconData:[image TIFFRepresentation]
- notify:NotifyLater];
-
- [listContact setValue:nil forProperty:TWITTER_PROPERTY_REQUESTED_USER_ICON notify:NotifyNever];
- } else {
- [self requestFailed:AITwitterUserIconPull withError:error userInfo:@{ @"ListContact" : listContact }];
- }
- }];
+ dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
+ NSString *imageURL = [url stringByReplacingOccurrencesOfString:@"_normal." withString:@"_bigger."];
+ NSURLRequest *imageRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:imageURL]];
+ NSError *error = nil;
+ NSData *data = [NSURLConnection sendSynchronousRequest:imageRequest returningResponse:nil error:&error];
+ NSImage *image = [[NSImage alloc] initWithData:data];
+
+ if (image) {
+ dispatch_async(dispatch_get_main_queue(), ^{
+ AILogWithSignature(@"%@ Updated user icon for %@", self, listContact);
+ [listContact setServersideIconData:[image TIFFRepresentation]
+ notify:NotifyLater];
+
+ [listContact setValue:nil forProperty:TWITTER_PROPERTY_REQUESTED_USER_ICON notify:NotifyNever];
+ });
+ } else {
+ [self requestFailed:AITwitterUserIconPull withError:error userInfo:@{ @"ListContact" : listContact }];
+ }
+ });
}
}
@@ -1312,7 +1307,7 @@
} else if (linkType == AITwitterLinkUserPage) {
address = [NSString stringWithFormat:@"https://twitter.com/%@", userID];
} else if (linkType == AITwitterLinkSearchHash) {
- address = [NSString stringWithFormat:@"http://search.twitter.com/search?q=%%23%@", context];
+ address = [NSString stringWithFormat:@"http://twitter.com/search?q=%%23%@", context];
} else if (linkType == AITwitterLinkReply) {
address = [NSString stringWithFormat:@"twitterreply://%@@%@?action=reply&status=%@", self.internalObjectID, userID, statusID];
} else if (linkType == AITwitterLinkRetweet) {
@@ -1480,61 +1475,89 @@
/*!
* @brief Parse an attributed string into a linkified version.
*/
-- (NSAttributedString *)linkifiedAttributedStringFromString:(NSAttributedString *)inString
-{
- NSAttributedString *attributedString;
-
- static NSCharacterSet *usernameCharacters = nil;
- static NSCharacterSet *hashCharacters = nil;
-
- if (!usernameCharacters) {
- usernameCharacters = [NSCharacterSet characterSetWithCharactersInString:@"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_"];
- }
-
- if (!hashCharacters) {
- NSMutableCharacterSet *disallowedCharacters = [[NSCharacterSet punctuationCharacterSet] mutableCopy];
- [disallowedCharacters formUnionWithCharacterSet:[NSCharacterSet whitespaceCharacterSet]];
- [disallowedCharacters removeCharactersInString:@"_"];
+- (void)linkifyEntities:(NSArray *)entities inString:(NSMutableAttributedString **)inString forLinkType:(AITwitterLinkType)linkType {
+ [entities enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
+ NSString *text = @"";
+ NSString *userID = nil;
+ NSString *context = nil;
+ if (linkType == AITwitterLinkUserPage) {
+ userID = [obj objectForKey:@"screen_name"];
+ text = [NSString stringWithFormat:@"@%@", userID];
+ } else if (linkType == AITwitterLinkSearchHash) {
+ context = [obj objectForKey:@"text"];
+ text = [NSString stringWithFormat:@"#%@", context];
+ }
- hashCharacters = [disallowedCharacters invertedSet];
- }
-
- attributedString = [AITwitterURLParser linkifiedStringFromAttributedString:inString
- forPrefixCharacter:@"@"
- forLinkType:AITwitterLinkUserPage
- forAccount:self
- validCharacterSet:usernameCharacters];
-
- attributedString = [AITwitterURLParser linkifiedStringFromAttributedString:attributedString
- forPrefixCharacter:@"#"
- forLinkType:AITwitterLinkSearchHash
- forAccount:self
- validCharacterSet:hashCharacters];
-
- return attributedString;
+ NSString *linkURL = [self addressForLinkType:linkType
+ userID:userID
+ statusID:nil
+ context:context];
+
+ [*inString replaceOccurrencesOfString:text
+ withString:text
+ attributes:@{ NSLinkAttributeName : linkURL }
+ options:NSCaseInsensitiveSearch
+ range:NSMakeRange(0, [*inString length])];
+ }];
}
/*!
* @brief Parses a Twitter message into an attributed string
*/
-- (NSAttributedString *)parseMessage:(NSString *)inMessage
- tweetID:(NSString *)tweetID
- userID:(NSString *)userID
- inReplyToUser:(NSString *)replyUserID
- inReplyToTweetID:(NSString *)replyTweetID
+- (NSAttributedString *)parseStatus:(NSDictionary *)inStatus
+ tweetID:(NSString *)tweetID
+ userID:(NSString *)userID
+ inReplyToUser:(NSString *)replyUserID
+ inReplyToTweetID:(NSString *)replyTweetID
{
- NSAttributedString *message;
+ NSMutableAttributedString *mutableMessage;
+ NSDictionary *retweet = [inStatus objectForKey:TWITTER_STATUS_RETWEET];
+
+ if (retweet && [retweet isKindOfClass:[NSDictionary class]]) {
+ NSString *text = [[retweet objectForKey:TWITTER_STATUS_TEXT] stringByUnescapingFromXMLWithEntities:nil];
+ mutableMessage = [[NSMutableAttributedString alloc] initWithString:text];
+ [mutableMessage replaceCharactersInRange:NSMakeRange(0, 0)
+ withString:[NSString stringWithFormat:@"RT @%@: ",
+ [[retweet objectForKey:TWITTER_STATUS_USER] objectForKey:TWITTER_STATUS_UID]]];
+ } else {
+ NSString *text = [[inStatus objectForKey:TWITTER_STATUS_TEXT] stringByUnescapingFromXMLWithEntities:nil];
+ mutableMessage = [[NSMutableAttributedString alloc] initWithString:text];
+ }
- message = [NSAttributedString stringWithString:[inMessage stringByUnescapingFromXMLWithEntities:nil]];
+ //Extract hashtags, users, and URLs
+ NSDictionary *entities = [inStatus objectForKey:@"entities"];
+ NSArray *hashtags = [entities objectForKey:@"hashtags"];
+ NSArray *urls = [entities objectForKey:@"urls"];
+ NSArray *users = [entities objectForKey:@"user_mentions"];
+ NSArray *media = [entities objectForKey:@"media"];
+
+ [self linkifyEntities:users inString:&mutableMessage forLinkType:AITwitterLinkUserPage];
+ [self linkifyEntities:hashtags inString:&mutableMessage forLinkType:AITwitterLinkSearchHash];
+ [urls enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
+ NSString *linkURL = [obj objectForKey:@"url"];
+ NSString *expandedURL = [obj objectForKey:@"expanded_url"];
+ [mutableMessage replaceOccurrencesOfString:linkURL
+ withString:expandedURL
+ attributes:@{ NSLinkAttributeName : linkURL }
+ options:NSLiteralSearch
+ range:NSMakeRange(0, mutableMessage.length)];
+ }];
+ [media enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
+ NSString *linkURL = [obj objectForKey:@"url"];
+ NSString *displayURL = [obj objectForKey:@"display_url"];
+ [mutableMessage replaceOccurrencesOfString:linkURL
+ withString:displayURL
+ attributes:@{ NSLinkAttributeName : linkURL }
+ options:NSLiteralSearch
+ range:NSMakeRange(0, mutableMessage.length)];
+ }];
- message = [self linkifiedAttributedStringFromString:message];
+ NSString *message = [mutableMessage string];
BOOL replyTweet = (replyTweetID.length > 0);
BOOL tweetLink = (tweetID.length && userID.length);
if (replyTweet || tweetLink) {
- NSMutableAttributedString *mutableMessage = [message mutableCopy];
-
NSUInteger startIndex = message.length;
[mutableMessage appendString:@" (" withAttributes:nil];
@@ -1548,9 +1571,9 @@
statusID:replyTweetID
context:nil];
- if([inMessage hasPrefix:@"@"] &&
- inMessage.length >= replyUserID.length + 1 &&
- [replyUserID isCaseInsensitivelyEqualToString:[inMessage substringWithRange:NSMakeRange(1, replyUserID.length)]]) {
+ if([message hasPrefix:@"@"] &&
+ message.length >= replyUserID.length + 1 &&
+ [replyUserID isCaseInsensitivelyEqualToString:[message substringWithRange:NSMakeRange(1, replyUserID.length)]]) {
// If the message has a "@" prefix, it's a proper in_reply_to_status_id if the usernames match. Set a link appropriately.
[mutableMessage setAttributes:[NSDictionary dictionaryWithObjectsAndKeys:linkAddress, NSLinkAttributeName, nil]
range:NSMakeRange(0, replyUserID.length + 1)];
@@ -1598,7 +1621,7 @@
linkAddress = [self addressForLinkType:AITwitterLinkQuote
userID:userID
statusID:tweetID
- context:[inMessage stringByAddingPercentEscapesForAllCharacters]];
+ context:[message stringByAddingPercentEscapesForAllCharacters]];
#define PILCROW_SIGN @"\u00B6"
@@ -1630,7 +1653,7 @@
linkAddress = [self addressForLinkType:AITwitterLinkDestroyStatus
userID:userID
statusID:tweetID
- context:[inMessage stringByAddingPercentEscapesForAllCharacters]];
+ context:[message stringByAddingPercentEscapesForAllCharacters]];
[mutableMessage appendAttributedString:[self attributedStringWithLinkLabel:@"\u232B"
linkDestination:linkAddress
@@ -1670,24 +1693,25 @@
return mutableMessage;
} else {
- return message;
+ return [[NSAttributedString alloc] initWithString:message];
}
}
/*!
* @brief Parse a direct message
*/
-- (NSAttributedString *)parseDirectMessage:(NSString *)inMessage
+- (NSAttributedString *)parseDirectMessage:(NSDictionary *)inMessage
withID:(NSString *)dmID
fromUser:(NSString *)sourceUID
{
- NSAttributedString *message;
-
- message = [NSAttributedString stringWithString:[inMessage stringByUnescapingFromXMLWithEntities:nil]];
+ NSString *message = [[inMessage objectForKey:TWITTER_DM_TEXT] stringByUnescapingFromXMLWithEntities:nil];
+ NSMutableAttributedString *mutableMessage = [[NSMutableAttributedString alloc] initWithString:message];
- message = [self linkifiedAttributedStringFromString:message];
-
- NSMutableAttributedString *mutableMessage = [message mutableCopy];
+ NSDictionary *entities = [inMessage objectForKey:@"entities"];
+ NSArray *hashtags = [entities objectForKey:@"hashtags"];
+ NSArray *users = [entities objectForKey:@"user_mentions"];
+ [self linkifyEntities:users inString:&mutableMessage forLinkType:AITwitterLinkUserPage];
+ [self linkifyEntities:hashtags inString:&mutableMessage forLinkType:AITwitterLinkSearchHash];
NSUInteger startIndex = message.length;
@@ -1696,7 +1720,7 @@
NSString *linkAddress = [self addressForLinkType:AITwitterLinkDestroyDM
userID:sourceUID
statusID:dmID
- context:[inMessage stringByAddingPercentEscapesForAllCharacters]];
+ context:[message stringByAddingPercentEscapesForAllCharacters]];
[mutableMessage appendAttributedString:[self attributedStringWithLinkLabel:@"\u232B"
linkDestination:linkAddress
@@ -1783,26 +1807,22 @@
[[AIContactObserverManager sharedManager] delayListObjectNotifications];
for (NSDictionary *status in sortedQueuedUpdates) {
- NSDictionary *retweet = [status objectForKey:TWITTER_STATUS_RETWEET];
- NSString *text = [status objectForKey:TWITTER_STATUS_TEXT];
-
- if (retweet && [retweet isKindOfClass:[NSDictionary class]]) {
- text = [NSString stringWithFormat:@"RT @%@: %@",
- [[retweet objectForKey:TWITTER_STATUS_USER] objectForKey:TWITTER_STATUS_UID],
- [retweet objectForKey:TWITTER_STATUS_TEXT]];
- }
+ NSString *contactUID = [[status objectForKey:TWITTER_STATUS_USER] objectForKey:TWITTER_STATUS_UID];
+ NSAttributedString *message = [self parseStatus:status
+ tweetID:[status objectForKey:TWITTER_STATUS_ID]
+ userID:contactUID
+ inReplyToUser:[status objectForKey:TWITTER_STATUS_REPLY_UID]
+ inReplyToTweetID:[status objectForKey:TWITTER_STATUS_REPLY_ID]];
NSDate *date = [status objectForKey:TWITTER_STATUS_CREATED];
- NSString *contactUID = [[status objectForKey:TWITTER_STATUS_USER] objectForKey:TWITTER_STATUS_UID];
-
id fromObject = nil;
if (![self.UID isCaseInsensitivelyEqualToString:contactUID]) {
AIListContact *listContact = [self contactWithUID:contactUID];
// Update the user's status message
- [listContact setStatusMessage:[NSAttributedString stringWithString:[text stringByUnescapingFromXMLWithEntities:nil]]
+ [listContact setStatusMessage:message
notify:NotifyNow];
[self updateUserIcon:[[status objectForKey:TWITTER_STATUS_USER] objectForKey:TWITTER_INFO_ICON] forContact:listContact];
@@ -1814,12 +1834,6 @@
fromObject = (id)self;
}
- NSAttributedString *message = [self parseMessage:text
- tweetID:[status objectForKey:TWITTER_STATUS_ID]
- userID:contactUID
- inReplyToUser:[status objectForKey:TWITTER_STATUS_REPLY_UID]
- inReplyToTweetID:[status objectForKey:TWITTER_STATUS_REPLY_ID]];
-
AIContentMessage *contentMessage = [AIContentMessage messageInChat:timelineChat
withSource:fromObject
destination:self
@@ -1848,7 +1862,6 @@
for (NSDictionary *message in sortedQueuedDM) {
NSDate *date = [NSDate dateWithNaturalLanguageString:[message objectForKey:TWITTER_DM_CREATED]];
- NSString *text = [message objectForKey:TWITTER_DM_TEXT];
NSString *fromUID = [message objectForKey:TWITTER_DM_SENDER_UID];
NSString *toUID = [message objectForKey:TWITTER_DM_RECIPIENT_UID];
@@ -1871,7 +1884,7 @@
withSource:source
destination:destination
date:date
- message:[self parseDirectMessage:text
+ message:[self parseDirectMessage:message
withID:[message objectForKey:TWITTER_DM_ID]
fromUser:chat.listObject.UID]
autoreply:NO];
@@ -2225,35 +2238,36 @@
[self setValue:[userInfo objectForKey:@"location"] forProperty:@"Profile Location" notify:NotifyLater];
[self setValue:[userInfo objectForKey:@"description"] forProperty:@"Profile Description" notify:NotifyLater];
-
- NSString *imageURL = [userInfo objectForKey:TWITTER_INFO_ICON];
- NSURLRequest *imageRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:imageURL]];
- [NSURLConnection sendAsynchronousRequest:imageRequest
- queue:[NSOperationQueue currentQueue]
- completionHandler:^(NSURLResponse *resp, NSData *data, NSError *error) {
- NSImage *image = [[NSImage alloc] initWithData:data];
-
- if (image) {
- AILogWithSignature(@"Updated self icon for %@", self);
-
- // Set a property so that we don't re-send the image we're just now downloading.
- [self setValue:[NSNumber numberWithBool:YES] forProperty:TWITTER_PROPERTY_REQUESTED_USER_ICON notify:NotifyNever];
-
- [self setPreference:[NSNumber numberWithBool:YES]
- forKey:KEY_USE_USER_ICON
- group:GROUP_ACCOUNT_STATUS];
-
- [self setPreference:[image TIFFRepresentation]
- forKey:KEY_USER_ICON
- group:GROUP_ACCOUNT_STATUS];
-
- [self notifyOfChangedPropertiesSilently:NO];
-
- [self setValue:nil forProperty:TWITTER_PROPERTY_REQUESTED_USER_ICON notify:NotifyNever];
- } else {
- [self requestFailed:AITwitterSelfUserIconPull withError:error userInfo:nil];
- }
- }];
+ dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
+ NSString *imageURL = [userInfo objectForKey:TWITTER_INFO_ICON];
+ NSURLRequest *imageRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:imageURL]];
+ NSError *error = nil;
+ NSData *data = [NSURLConnection sendSynchronousRequest:imageRequest returningResponse:nil error:&error];
+ NSImage *image = [[NSImage alloc] initWithData:data];
+
+ if (image) {
+ dispatch_async(dispatch_get_main_queue(), ^{
+ AILogWithSignature(@"Updated self icon for %@", self);
+
+ // Set a property so that we don't re-send the image we're just now downloading.
+ [self setValue:[NSNumber numberWithBool:YES] forProperty:TWITTER_PROPERTY_REQUESTED_USER_ICON notify:NotifyNever];
+
+ [self setPreference:[NSNumber numberWithBool:YES]
+ forKey:KEY_USE_USER_ICON
+ group:GROUP_ACCOUNT_STATUS];
+
+ [self setPreference:[image TIFFRepresentation]
+ forKey:KEY_USER_ICON
+ group:GROUP_ACCOUNT_STATUS];
+
+ [self notifyOfChangedPropertiesSilently:NO];
+
+ [self setValue:nil forProperty:TWITTER_PROPERTY_REQUESTED_USER_ICON notify:NotifyNever];
+ });
+ } else {
+ [self requestFailed:AITwitterSelfUserIconPull withError:error userInfo:nil];
+ }
+ });
}
}
--- a/Plugins/Twitter Plugin/AITwitterURLParser.h Thu Mar 21 00:01:23 2013 -0400
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,29 +0,0 @@
-/*
- * Adium is the legal property of its developers, whose names are listed in the copyright file included
- * with this source distribution.
- *
- * This program is free software; you can redistribute it and/or modify it under the terms of the GNU
- * General Public License as published by the Free Software Foundation; either version 2 of the License,
- * or (at your option) any later version.
- *
- * This program 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 General
- * Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along with this program; if not,
- * write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#import "AITwitterAccount.h"
-
-@interface AITwitterURLParser : NSObject {
-
-}
-
-+(NSAttributedString *)linkifiedStringFromAttributedString:(NSAttributedString *)inString
- forPrefixCharacter:(NSString *)prefixCharacter
- forLinkType:(AITwitterLinkType)linkType
- forAccount:(AITwitterAccount *)account
- validCharacterSet:(NSCharacterSet *)validValues;
-
-@end
--- a/Plugins/Twitter Plugin/AITwitterURLParser.m Thu Mar 21 00:01:23 2013 -0400
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,86 +0,0 @@
-/*
- * Adium is the legal property of its developers, whose names are listed in the copyright file included
- * with this source distribution.
- *
- * This program is free software; you can redistribute it and/or modify it under the terms of the GNU
- * General Public License as published by the Free Software Foundation; either version 2 of the License,
- * or (at your option) any later version.
- *
- * This program 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 General
- * Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along with this program; if not,
- * write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- */
-
-#import "AITwitterURLParser.h"
-#import <AIUtilities/AIStringAdditions.h>
-
-@implementation AITwitterURLParser
-
-+(NSAttributedString *)linkifiedStringFromAttributedString:(NSAttributedString *)inString
- forPrefixCharacter:(NSString *)prefixCharacter
- forLinkType:(AITwitterLinkType)linkType
- forAccount:(AITwitterAccount *)account
- validCharacterSet:(NSCharacterSet *)validValues
-{
- NSMutableAttributedString *newString = [inString mutableCopy];
-
- NSScanner *scanner = [NSScanner scannerWithString:[inString string]];
-
- [scanner setCharactersToBeSkipped:nil];
-
- [newString beginEditing];
-
- while(!scanner.isAtEnd) {
- [scanner scanUpToString:prefixCharacter intoString:NULL];
-
- if(scanner.isAtEnd) {
- break;
- }
-
- NSUInteger startLocation = scanner.scanLocation;
- NSString *linkText = nil;
-
- // Advance to the start of the string we want.
- // Check to make sure we aren't exceeding the string bounds.
- if(startLocation + 1 < scanner.string.length) {
- scanner.scanLocation++;
- } else {
- break;
- }
-
- // Grab any valid characters we can.
- BOOL scannedCharacters = [scanner scanCharactersFromSet:validValues intoString:&linkText];
-
- if(scannedCharacters) {
- if((scanner.scanLocation - linkText.length) == prefixCharacter.length ||
- [[NSCharacterSet whitespaceAndNewlineCharacterSet] characterIsMember:[scanner.string characterAtIndex:(scanner.scanLocation - linkText.length - prefixCharacter.length - 1)]]) {
-
- NSString *linkURL = nil;
- if(linkType == AITwitterLinkUserPage) {
- linkURL = [account addressForLinkType:linkType userID:[linkText stringByEncodingURLEscapes] statusID:nil context:nil];
- } else if (linkType == AITwitterLinkSearchHash) {
- linkURL = [account addressForLinkType:linkType userID:nil statusID:nil context:[linkText stringByEncodingURLEscapes]];
- } else if (linkType == AITwitterLinkGroup) {
- linkURL = [account addressForLinkType:linkType userID:nil statusID:nil context:[linkText stringByEncodingURLEscapes]];
- }
-
- if(linkURL) {
- [newString addAttribute:NSLinkAttributeName
- value:linkURL
- range:NSMakeRange(startLocation + 1, linkText.length)];
- }
- }
- } else {
- scanner.scanLocation++;
- }
- }
-
- [newString endEditing];
-
- return newString;
-}
-
-@end
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Plugins/Twitter Plugin/STTwitter/NSData+Base64.h Tue Apr 16 17:27:41 2013 +0200
@@ -0,0 +1,42 @@
+//
+// NSData+Base64.h
+// base64
+//
+// Created by Matt Gallagher on 2009/06/03.
+// Copyright 2009 Matt Gallagher. All rights reserved.
+//
+// This software is provided 'as-is', without any express or implied
+// warranty. In no event will the authors be held liable for any damages
+// arising from the use of this software. Permission is granted to anyone to
+// use this software for any purpose, including commercial applications, and to
+// alter it and redistribute it freely, subject to the following restrictions:
+//
+// 1. The origin of this software must not be misrepresented; you must not
+// claim that you wrote the original software. If you use this software
+// in a product, an acknowledgment in the product documentation would be
+// appreciated but is not required.
+// 2. Altered source versions must be plainly marked as such, and must not be
+// misrepresented as being the original software.
+// 3. This notice may not be removed or altered from any source
+// distribution.
+//
+
+#import <Foundation/Foundation.h>
+
+void *NewBase64Decode(
+ const char *inputBuffer,
+ size_t length,
+ size_t *outputLength);
+
+char *NewBase64Encode(
+ const void *inputBuffer,
+ size_t length,
+ bool separateLines,
+ size_t *outputLength);
+
+@interface NSData (Base64)
+
++ (NSData *)dataFromBase64String:(NSString *)aString;
+- (NSString *)base64EncodedString;
+
+@end
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Plugins/Twitter Plugin/STTwitter/NSData+Base64.m Tue Apr 16 17:27:41 2013 +0200
@@ -0,0 +1,312 @@
+//
+// NSData+Base64.m
+// base64
+//
+// Created by Matt Gallagher on 2009/06/03.
+// Copyright 2009 Matt Gallagher. All rights reserved.
+//
+// This software is provided 'as-is', without any express or implied
+// warranty. In no event will the authors be held liable for any damages
+// arising from the use of this software. Permission is granted to anyone to
+// use this software for any purpose, including commercial applications, and to
+// alter it and redistribute it freely, subject to the following restrictions:
+//
+// 1. The origin of this software must not be misrepresented; you must not
+// claim that you wrote the original software. If you use this software
+// in a product, an acknowledgment in the product documentation would be
+// appreciated but is not required.
+// 2. Altered source versions must be plainly marked as such, and must not be
+// misrepresented as being the original software.
+// 3. This notice may not be removed or altered from any source
+// distribution.
+//
+
+#import "NSData+Base64.h"
+
+//
+// Mapping from 6 bit pattern to ASCII character.
+//
+static unsigned char base64EncodeLookup[65] =
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
+
+//
+// Definition for "masked-out" areas of the base64DecodeLookup mapping
+//
+#define xx 65
+
+//
+// Mapping from ASCII character to 6 bit pattern.
+//
+static unsigned char base64DecodeLookup[256] =
+{
+ xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx,
+ xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx,
+ xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, 62, xx, xx, xx, 63,
+ 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, xx, xx, xx, xx, xx, xx,
+ xx, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
+ 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, xx, xx, xx, xx, xx,
+ xx, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
+ 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, xx, xx, xx, xx, xx,
+ xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx,
+ xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx,
+ xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx,
+ xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx,
+ xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx,
+ xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx,
+ xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx,
+ xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx,
+};
+
+//
+// Fundamental sizes of the binary and base64 encode/decode units in bytes
+//
+#define BINARY_UNIT_SIZE 3
+#define BASE64_UNIT_SIZE 4
+
+//
+// NewBase64Decode
+//
+// Decodes the base64 ASCII string in the inputBuffer to a newly malloced
+// output buffer.
+//
+// inputBuffer - the source ASCII string for the decode
+// length - the length of the string or -1 (to specify strlen should be used)
+// outputLength - if not-NULL, on output will contain the decoded length
+//
+// returns the decoded buffer. Must be free'd by caller. Length is given by
+// outputLength.
+//
+void *NewBase64Decode(
+ const char *inputBuffer,
+ size_t length,
+ size_t *outputLength)
+{
+ if (length == -1)
+ {
+ length = strlen(inputBuffer);
+ }
+
+ size_t outputBufferSize =
+ ((length+BASE64_UNIT_SIZE-1) / BASE64_UNIT_SIZE) * BINARY_UNIT_SIZE;
+ unsigned char *outputBuffer = (unsigned char *)malloc(outputBufferSize);
+
+ size_t i = 0;
+ size_t j = 0;
+ while (i < length)
+ {
+ //
+ // Accumulate 4 valid characters (ignore everything else)
+ //
+ unsigned char accumulated[BASE64_UNIT_SIZE];
+ size_t accumulateIndex = 0;
+ while (i < length)
+ {
+ unsigned char decode = base64DecodeLookup[inputBuffer[i++]];
+ if (decode != xx)
+ {
+ accumulated[accumulateIndex] = decode;
+ accumulateIndex++;
+
+ if (accumulateIndex == BASE64_UNIT_SIZE)
+ {
+ break;
+ }
+ }
+ }
+
+ //
+ // Store the 6 bits from each of the 4 characters as 3 bytes
+ //
+ // (Uses improved bounds checking suggested by Alexandre Colucci)
+ //
+ if(accumulateIndex >= 2)
+ outputBuffer[j] = (accumulated[0] << 2) | (accumulated[1] >> 4);
+ if(accumulateIndex >= 3)
+ outputBuffer[j + 1] = (accumulated[1] << 4) | (accumulated[2] >> 2);
+ if(accumulateIndex >= 4)
+ outputBuffer[j + 2] = (accumulated[2] << 6) | accumulated[3];
+ j += accumulateIndex - 1;
+ }
+
+ if (outputLength)
+ {
+ *outputLength = j;
+ }
+ return outputBuffer;
+}
+
+//
+// NewBase64Encode
+//
+// Encodes the arbitrary data in the inputBuffer as base64 into a newly malloced
+// output buffer.
+//
+// inputBuffer - the source data for the encode
+// length - the length of the input in bytes
+// separateLines - if zero, no CR/LF characters will be added. Otherwise
+// a CR/LF pair will be added every 64 encoded chars.
+// outputLength - if not-NULL, on output will contain the encoded length
+// (not including terminating 0 char)
+//
+// returns the encoded buffer. Must be free'd by caller. Length is given by
+// outputLength.
+//
+char *NewBase64Encode(
+ const void *buffer,
+ size_t length,
+ bool separateLines,
+ size_t *outputLength)
+{
+ const unsigned char *inputBuffer = (const unsigned char *)buffer;
+
+ #define MAX_NUM_PADDING_CHARS 2
+ #define OUTPUT_LINE_LENGTH 64
+ #define INPUT_LINE_LENGTH ((OUTPUT_LINE_LENGTH / BASE64_UNIT_SIZE) * BINARY_UNIT_SIZE)
+ #define CR_LF_SIZE 2
+
+ //
+ // Byte accurate calculation of final buffer size
+ //
+ size_t outputBufferSize =
+ ((length / BINARY_UNIT_SIZE)
+ + ((length % BINARY_UNIT_SIZE) ? 1 : 0))
+ * BASE64_UNIT_SIZE;
+ if (separateLines)
+ {
+ outputBufferSize +=
+ (outputBufferSize / OUTPUT_LINE_LENGTH) * CR_LF_SIZE;
+ }
+
+ //
+ // Include space for a terminating zero
+ //
+ outputBufferSize += 1;
+
+ //
+ // Allocate the output buffer
+ //
+ char *outputBuffer = (char *)malloc(outputBufferSize);
+ if (!outputBuffer)
+ {
+ return NULL;
+ }
+
+ size_t i = 0;
+ size_t j = 0;
+ const size_t lineLength = separateLines ? INPUT_LINE_LENGTH : length;
+ size_t lineEnd = lineLength;
+
+ while (true)
+ {
+ if (lineEnd > length)
+ {
+ lineEnd = length;
+ }
+
+ for (; i + BINARY_UNIT_SIZE - 1 < lineEnd; i += BINARY_UNIT_SIZE)
+ {
+ //
+ // Inner loop: turn 48 bytes into 64 base64 characters
+ //
+ outputBuffer[j++] = base64EncodeLookup[(inputBuffer[i] & 0xFC) >> 2];
+ outputBuffer[j++] = base64EncodeLookup[((inputBuffer[i] & 0x03) << 4)
+ | ((inputBuffer[i + 1] & 0xF0) >> 4)];
+ outputBuffer[j++] = base64EncodeLookup[((inputBuffer[i + 1] & 0x0F) << 2)
+ | ((inputBuffer[i + 2] & 0xC0) >> 6)];
+ outputBuffer[j++] = base64EncodeLookup[inputBuffer[i + 2] & 0x3F];
+ }
+
+ if (lineEnd == length)
+ {
+ break;
+ }
+
+ //
+ // Add the newline
+ //
+ outputBuffer[j++] = '\r';
+ outputBuffer[j++] = '\n';
+ lineEnd += lineLength;
+ }
+
+ if (i + 1 < length)
+ {
+ //
+ // Handle the single '=' case
+ //
+ outputBuffer[j++] = base64EncodeLookup[(inputBuffer[i] & 0xFC) >> 2];
+ outputBuffer[j++] = base64EncodeLookup[((inputBuffer[i] & 0x03) << 4)
+ | ((inputBuffer[i + 1] & 0xF0) >> 4)];
+ outputBuffer[j++] = base64EncodeLookup[(inputBuffer[i + 1] & 0x0F) << 2];
+ outputBuffer[j++] = '=';
+ }
+ else if (i < length)
+ {
+ //
+ // Handle the double '=' case
+ //
+ outputBuffer[j++] = base64EncodeLookup[(inputBuffer[i] & 0xFC) >> 2];
+ outputBuffer[j++] = base64EncodeLookup[(inputBuffer[i] & 0x03) << 4];
+ outputBuffer[j++] = '=';
+ outputBuffer[j++] = '=';
+ }
+ outputBuffer[j] = 0;
+
+ //
+ // Set the output length and return the buffer
+ //
+ if (outputLength)
+ {
+ *outputLength = j;
+ }
+ return outputBuffer;
+}
+
+@implementation NSData (Base64)
+
+//
+// dataFromBase64String:
+//
+// Creates an NSData object containing the base64 decoded representation of
+// the base64 string 'aString'
+//
+// Parameters:
+// aString - the base64 string to decode
+//
+// returns the autoreleased NSData representation of the base64 string
+//
++ (NSData *)dataFromBase64String:(NSString *)aString
+{
+ NSData *data = [aString dataUsingEncoding:NSASCIIStringEncoding];
+ size_t outputLength;
+ void *outputBuffer = NewBase64Decode([data bytes], [data length], &outputLength);
+ NSData *result = [NSData dataWithBytes:outputBuffer length:outputLength];
+ free(outputBuffer);
+ return result;
+}
+
+//
+// base64EncodedString
+//
+// Creates an NSString object that contains the base 64 encoding of the
+// receiver's data. Lines are broken at 64 characters long.
+//
+// returns an autoreleased NSString being the base 64 representation of the
+// receiver.
+//
+- (NSString *)base64EncodedString
+{
+ size_t outputLength;
+ char *outputBuffer =
+ NewBase64Encode([self bytes], [self length], true, &outputLength);
+
+ NSString *result =
+ [[NSString alloc]
+ initWithBytes:outputBuffer
+ length:outputLength
+ encoding:NSASCIIStringEncoding];
+ free(outputBuffer);
+ return result;
+}
+
+@end
--- a/Plugins/Twitter Plugin/STTwitter/STTwitterAPIWrapper.h Thu Mar 21 00:01:23 2013 -0400
+++ b/Plugins/Twitter Plugin/STTwitter/STTwitterAPIWrapper.h Tue Apr 16 17:27:41 2013 +0200
@@ -20,7 +20,7 @@
//
#import <Foundation/Foundation.h>
-
+#import "STTwitterOAuth.h"
/*
Partial Objective-C front-end for https://dev.twitter.com/docs/api/1.1
*/
@@ -42,7 +42,11 @@
https://dev.twitter.com/blog/new-withheld-content-fields-api-responses
*/
-@interface STTwitterAPIWrapper : NSObject
+@interface STTwitterAPIWrapper : NSObject {
+ NSObject <STTwitterOAuthProtocol> *_oauth;
+ NSString *_consumerName;
+ NSString *_userName;
+}
+ (STTwitterAPIWrapper *)twitterAPIWithOAuthConsumerName:(NSString *)consumerName
consumerKey:(NSString *)consumerKey
--- a/Plugins/Twitter Plugin/STTwitter/STTwitterAPIWrapper.m Thu Mar 21 00:01:23 2013 -0400
+++ b/Plugins/Twitter Plugin/STTwitter/STTwitterAPIWrapper.m Tue Apr 16 17:27:41 2013 +0200
@@ -18,6 +18,10 @@
@implementation STTwitterAPIWrapper
+@synthesize oauth = _oauth;
+@synthesize consumerName = _consumerName;
+@synthesize userName = _userName;
+
#if TARGET_OS_IPHONE
#else
@@ -183,8 +187,8 @@
if (!mparams)
mparams = [NSMutableDictionary new];
- if (optionalSinceID) mparams[@"since_id"] = optionalSinceID;
- if (optionalCount != NSNotFound) mparams[@"count"] = [@(optionalCount) stringValue];
+ if (optionalSinceID) [mparams setObject:optionalSinceID forKey:@"since_id"];
+ if (optionalCount != NSNotFound) [mparams setObject:[@(optionalCount) stringValue] forKey:@"count"];
__block NSMutableArray *statuses = [NSMutableArray new];
__block void (^requestHandler)(id response) = nil;
@@ -200,7 +204,7 @@
if (lastID) {
NSUInteger maxID = [[NSDecimalNumber decimalNumberWithString:lastID] unsignedIntegerValue];
if (maxID != NSNotFound)
- mparams[@"max_id"] = [@(--maxID) stringValue];
+ [mparams setObject:[@(--maxID) stringValue] forKey:@"max_id"];
}
[_oauth getResource:timeline parameters:mparams
@@ -293,16 +297,16 @@
NSMutableDictionary *md = [NSMutableDictionary dictionaryWithObject:status forKey:@"status"];
if(optionalExistingStatusID) {
- md[@"in_reply_to_status_id"] = optionalExistingStatusID;
+ [md setObject:optionalExistingStatusID forKey:@"in_reply_to_status_id"];
}
if(optionalPlaceID) {
- md[@"place_id"] = optionalPlaceID;
- md[@"display_coordinates"] = @"true";
+ [md setObject:optionalPlaceID forKey:@"place_id"];
+ [md setObject:@"true" forKey:@"display_coordinates"];
} else if(optionalLat && optionalLon) {
- md[@"lat"] = optionalLat;
- md[@"lon"] = optionalLon;
- md[@"display_coordinates"] = @"true";
+ [md setObject:optionalLat forKey:@"lat"];
+ [md setObject:optionalLon forKey:@"lon"];
+ [md setObject:@"true" forKey:@"display_coordinates"];
}
[_oauth postResource:@"statuses/update.json" parameters:md successBlock:^(id response) {
@@ -326,16 +330,16 @@
NSMutableDictionary *md = [[ @{ @"status":status, @"media[]":data, @"postDataKey":@"media[]" } mutableCopy] autorelease];
if(optionalExistingStatusID) {
- md[@"in_reply_to_status_id"] = optionalExistingStatusID;
+ [md setObject:optionalExistingStatusID forKey:@"in_reply_to_status_id"];
}
if(optionalPlaceID) {
- md[@"place_id"] = optionalPlaceID;
- md[@"display_coordinates"] = @"true";
+ [md setObject:optionalPlaceID forKey:@"place_id"];
+ [md setObject:@"true" forKey:@"display_coordinates"];
} else if(optionalLat && optionalLon) {
- md[@"lat"] = optionalLat;
- md[@"lon"] = optionalLon;
- md[@"display_coordinates"] = @"true";
+ [md setObject:optionalLat forKey:@"lat"];
+ [md setObject:optionalLon forKey:@"lon"];
+ [md setObject:@"true" forKey:@"display_coordinates"];
}
[_oauth postResource:@"statuses/update_with_media.json" parameters:md successBlock:^(id response) {
@@ -431,7 +435,7 @@
if (response) {
[ids addObjectsFromArray:[response objectForKey:@"users"]];
cursor = [[response objectForKey:@"next_cursor_str"] copy];
- d[@"cursor"] = cursor;
+ [d setObject:cursor forKey:@"cursor"];
}
if ([cursor isEqualToString:@"0"]) {
@@ -487,7 +491,7 @@
successBlock:(void(^)(NSDictionary *relationship))successBlock
errorBlock:(void(^)(NSError *error))errorBlock {
NSMutableDictionary *d = [NSMutableDictionary dictionaryWithObject:screenName forKey:@"screen_name"];
- d[@"device"] = notify ? @"true" : @"false";
+ [d setObject:notify ? @"true" : @"false" forKey:@"device"];
[_oauth getResource:@"friendships/update.json" parameters:d successBlock:^(id response) {
successBlock(removeNull(response));
--- a/Plugins/Twitter Plugin/STTwitter/STTwitterAppOnly.h Thu Mar 21 00:01:23 2013 -0400
+++ b/Plugins/Twitter Plugin/STTwitter/STTwitterAppOnly.h Tue Apr 16 17:27:41 2013 +0200
@@ -10,7 +10,9 @@
#import "STTwitterOAuthProtocol.h"
@interface STTwitterAppOnly : NSObject <STTwitterOAuthProtocol> {
-
+ NSString *_consumerKey;
+ NSString *_consumerSecret;
+ NSString *_bearerToken;
}
@property (nonatomic, retain) NSString *consumerKey;
--- a/Plugins/Twitter Plugin/STTwitter/STTwitterAppOnly.m Thu Mar 21 00:01:23 2013 -0400
+++ b/Plugins/Twitter Plugin/STTwitter/STTwitterAppOnly.m Tue Apr 16 17:27:41 2013 +0200
@@ -9,13 +9,15 @@
#import "STTwitterAppOnly.h"
#import "STHTTPRequest.h"
#import "NSString+STTwitter.h"
-
-@interface NSData (Base64)
-- (NSString *)base64Encoding; // private API
-@end
+#import "NSData+Base64.h"
@implementation STTwitterAppOnly
+@synthesize consumerKey = _consumerKey;
+@synthesize consumerSecret = _consumerSecret;
+@synthesize bearerToken = _bearerToken;
+
+
- (void)dealloc {
[_consumerKey release];
[_consumerSecret release];
@@ -98,7 +100,7 @@
NSString *encodedConsumerSecret = [consumerSecret st_stringByAddingRFC3986PercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSString *bearerTokenCredentials = [NSString stringWithFormat:@"%@:%@", encodedConsumerToken, encodedConsumerSecret];
NSData *data = [bearerTokenCredentials dataUsingEncoding:NSUTF8StringEncoding];
- return [data base64Encoding];
+ return [data base64EncodedString];
}
- (void)verifyCredentialsWithSuccessBlock:(void(^)(NSString *username))successBlock
--- a/Plugins/Twitter Plugin/STTwitter/STTwitterOAuth.h Thu Mar 21 00:01:23 2013 -0400
+++ b/Plugins/Twitter Plugin/STTwitter/STTwitterOAuth.h Tue Apr 16 17:27:41 2013 +0200
@@ -20,7 +20,19 @@
...
*/
-@interface STTwitterOAuth : NSObject <STTwitterOAuthProtocol>
+@interface STTwitterOAuth : NSObject <STTwitterOAuthProtocol> {
+ NSString *_username;
+ NSString *_password;
+ NSString *_oauthConsumerName;
+ NSString *_oauthConsumerKey;
+ NSString *_oauthConsumerSecret;
+ NSString *_oauthRequestToken;
+ NSString *_oauthRequestTokenSecret;
+ NSString *_oauthAccessToken;
+ NSString *_oauthAccessTokenSecret;
+ NSString *_testOauthNonce;
+ NSString *_testOauthTimestamp;
+}
+ (STTwitterOAuth *)twitterServiceWithConsumerName:(NSString *)consumerName
consumerKey:(NSString *)consumerKey
--- a/Plugins/Twitter Plugin/STTwitter/STTwitterOAuth.m Thu Mar 21 00:01:23 2013 -0400
+++ b/Plugins/Twitter Plugin/STTwitter/STTwitterOAuth.m Tue Apr 16 17:27:41 2013 +0200
@@ -9,13 +9,11 @@
#import "STTwitterOAuth.h"
#import "STHTTPRequest.h"
#import "NSString+STTwitter.h"
+#import "NSData+Base64.h"
+#import "JSONKit.h"
#include <CommonCrypto/CommonHMAC.h>
-@interface NSData (Base64)
-- (NSString *)base64Encoding; // private API
-@end
-
@interface STTwitterOAuth ()
@property (nonatomic, retain) NSString *username;
@@ -38,6 +36,18 @@
@implementation STTwitterOAuth
+@synthesize username = _username;
+@synthesize password = _password;
+@synthesize oauthConsumerName = _oauthConsumerName;
+@synthesize oauthConsumerKey = _oauthConsumerKey;
+@synthesize oauthConsumerSecret = _oauthConsumerSecret;
+@synthesize oauthRequestToken = _oauthRequestToken;
+@synthesize oauthRequestTokenSecret = _oauthRequestTokenSecret;
+@synthesize oauthAccessToken = _oauthAccessToken;
+@synthesize oauthAccessTokenSecret = _oauthAccessTokenSecret;
+@synthesize testOauthNonce = _testOauthNonce;
+@synthesize testOauthTimestamp = _testOauthTimestamp;
+
- (void)dealloc {
[_username release];
[_password release];
@@ -276,8 +286,8 @@
NSURL *url = [NSURL URLWithString:s];
- self.oauthRequestToken = d[@"oauth_token"];
- self.oauthRequestTokenSecret = d[@"oauth_token_secret"]; // unused
+ self.oauthRequestToken = [d objectForKey:@"oauth_token"];
+ self.oauthRequestTokenSecret = [d objectForKey:@"oauth_token_secret"]; // unused
successBlock(url, _oauthRequestToken);
@@ -303,10 +313,10 @@
// https://api.twitter.com/oauth/authorize?oauth_token=OAUTH_TOKEN&oauth_token_secret=OAUTH_TOKEN_SECRET&user_id=USER_ID&screen_name=SCREEN_NAME
- self.oauthAccessToken = dict[@"oauth_token"];
- self.oauthAccessTokenSecret = dict[@"oauth_token_secret"];
+ self.oauthAccessToken = [dict objectForKey:@"oauth_token"];
+ self.oauthAccessTokenSecret = [dict objectForKey:@"oauth_token_secret"];
- successBlock(_oauthAccessToken, _oauthAccessTokenSecret, dict[@"user_id"], dict[@"screen_name"]);
+ successBlock(_oauthAccessToken, _oauthAccessTokenSecret, [dict objectForKey:@"user_id"], [dict objectForKey:@"screen_name"]);
} errorBlock:^(NSError *error) {
errorBlock(error);
}];
@@ -333,10 +343,10 @@
// https://api.twitter.com/oauth/authorize?oauth_token=OAUTH_TOKEN&oauth_token_secret=OAUTH_TOKEN_SECRET&user_id=USER_ID&screen_name=SCREEN_NAME
- self.oauthAccessToken = dict[@"oauth_token"];
- self.oauthAccessTokenSecret = dict[@"oauth_token_secret"];
+ self.oauthAccessToken = [dict objectForKey:@"oauth_token"];
+ self.oauthAccessTokenSecret = [dict objectForKey:@"oauth_token_secret"];
- successBlock(_oauthAccessToken, _oauthAccessTokenSecret, dict[@"user_id"], dict[@"screen_name"]);
+ successBlock(_oauthAccessToken, _oauthAccessTokenSecret, [dict objectForKey:@"user_id"], [dict objectForKey:@"screen_name"]);
} errorBlock:^(NSError *error) {
errorBlock(error);
@@ -426,7 +436,7 @@
r.completionBlock = ^(NSDictionary *headers, NSString *body) {
NSError *jsonError = nil;
- id json = [NSJSONSerialization JSONObjectWithData:r.responseData options:NSJSONReadingMutableLeaves error:&jsonError];
+ id json = [r.responseData objectFromJSONDataWithParseOptions:JKParseOptionNone error:&jsonError];
if(json == nil) {
errorBlock(jsonError);
@@ -478,10 +488,10 @@
r.completionBlock = ^(NSDictionary *headers, NSString *body) {
NSError *jsonError = nil;
- id json = [NSJSONSerialization JSONObjectWithData:r.responseData options:NSJSONReadingMutableLeaves error:&jsonError];
+ id json = [r.responseData objectFromJSONDataWithParseOptions:JKParseOptionNone error:&jsonError];
if(json == nil) {
- errorBlock(jsonError);
+ successBlock(body); // response is not necessarily json, eg. https://api.twitter.com/oauth/request_token
return;
}
@@ -554,7 +564,7 @@
NSArray *kv = [s componentsSeparatedByString:@"="];
NSAssert([kv count] == 2, @"-- bad length");
if([kv count] != 2) continue;
- [ma addObject:@{kv[0] : kv[1]}];
+ [ma addObject:@{[kv objectAtIndex:0] : [kv objectAtIndex:1]}];
}
return ma;
@@ -588,7 +598,7 @@
unsigned char buf[CC_SHA1_DIGEST_LENGTH];
CCHmac(kCCHmacAlgSHA1, [key UTF8String], [key length], [self UTF8String], [self length], buf);
NSData *data = [NSData dataWithBytes:buf length:CC_SHA1_DIGEST_LENGTH];
- return [data base64Encoding];
+ return [data base64EncodedString];
}
- (NSDictionary *)parametersDictionary {
@@ -603,7 +613,7 @@
continue;
}
- [md setObject:keyValue[1] forKey:keyValue[0]];
+ [md setObject:[keyValue objectAtIndex:1] forKey:[keyValue objectAtIndex:0]];
}
return md;
@@ -618,33 +628,3 @@
@end
-@implementation NSData (STTwitterOAuth)
-
-- (NSString *)base64EncodedString {
-
-#if TARGET_OS_IPHONE
- return [self base64Encoding]; // private API
-#else
-
- CFDataRef retval = NULL;
- SecTransformRef encodeTrans = SecEncodeTransformCreate(kSecBase64Encoding, NULL);
- if (encodeTrans == NULL) return nil;
-
- if (SecTransformSetAttribute(encodeTrans, kSecTransformInputAttributeName, (CFDataRef)self, NULL)) {
- retval = SecTransformExecute(encodeTrans, NULL);
- }
- CFRelease(encodeTrans);
-
- NSString *s = [[NSString alloc] initWithData:(NSData *)retval encoding:NSUTF8StringEncoding];
-
- if(retval) {
- CFRelease(retval);
- }
-
- return [s autorelease];
-
-#endif
-
-}
-@end
-
--- a/Plugins/Twitter Plugin/STTwitter/Vendor/STHTTPRequest.h Thu Mar 21 00:01:23 2013 -0400
+++ b/Plugins/Twitter Plugin/STTwitter/Vendor/STHTTPRequest.h Tue Apr 16 17:27:41 2013 +0200
@@ -22,7 +22,33 @@
typedef void (^completionBlock_t)(NSDictionary *headers, NSString *body);
typedef void (^errorBlock_t)(NSError *error);
-@interface STHTTPRequest : NSObject <NSURLConnectionDelegate>
+@interface STHTTPRequest : NSObject <NSURLConnectionDelegate> {
+ NSURLConnection *_connection;
+ NSMutableData *_responseData;
+ NSString *_responseStringEncodingName;
+ NSDictionary *_responseHeaders;
+ NSURL *_url;
+ NSError *_error;
+ NSString *_POSTFilePath;
+ NSData *_POSTFileData;
+ NSString *_POSTFileMimeType;
+ NSString *_POSTFileName;
+ NSString *_POSTFileParameter;
+
+ uploadProgressBlock_t _uploadProgressBlock;
+ completionBlock_t _completionBlock;
+ errorBlock_t _errorBlock;
+ NSStringEncoding _postDataEncoding;
+ NSDictionary *_POSTDictionary;
+ NSData *_POSTData;
+ NSMutableDictionary *_requestHeaders;
+ NSInteger _responseStatus;
+ NSString *_responseString;
+ NSStringEncoding _forcedResponseEncoding;
+ BOOL _encodePOSTDictionary;
+ NSUInteger _timeoutSeconds;
+ BOOL _addCredentialsToURL;
+}
@property (copy) uploadProgressBlock_t uploadProgressBlock;
@property (copy) completionBlock_t completionBlock;
--- a/Plugins/Twitter Plugin/STTwitter/Vendor/STHTTPRequest.m Thu Mar 21 00:01:23 2013 -0400
+++ b/Plugins/Twitter Plugin/STTwitter/Vendor/STHTTPRequest.m Tue Apr 16 17:27:41 2013 +0200
@@ -7,6 +7,7 @@
//
#import "STHTTPRequest.h"
+#import "NSData+Base64.h"
#define DEBUG 0
@@ -30,11 +31,32 @@
@property (nonatomic, retain) NSString *POSTFileParameter;
@end
-@interface NSData (Base64)
-- (NSString *)base64Encoding; // private API
-@end
+@implementation STHTTPRequest
-@implementation STHTTPRequest
+@synthesize connection = _connection;
+@synthesize responseData = _responseData;
+@synthesize responseStringEncodingName = _responseStringEncodingName;
+@synthesize responseHeaders = _responseHeaders;
+@synthesize url = _url;
+@synthesize error = _error;
+@synthesize POSTFilePath = _POSTFilePath;
+@synthesize POSTFileData = _POSTFileData;
+@synthesize POSTFileMimeType = _POSTFileMimeType;
+@synthesize POSTFileName = _POSTFileName;
+@synthesize POSTFileParameter = _POSTFileParameter;
+@synthesize uploadProgressBlock = _uploadProgressBlock;
+@synthesize completionBlock = _completionBlock;
+@synthesize errorBlock = _errorBlock;
+@synthesize postDataEncoding = _postDataEncoding;
+@synthesize POSTDictionary = _POSTDictionary;
+@synthesize POSTData = _POSTData;
+@synthesize requestHeaders = _requestHeaders;
+@synthesize responseStatus = _responseStatus;
+@synthesize responseString = _responseString;
+@synthesize forcedResponseEncoding = _forcedResponseEncoding;
+@synthesize encodePOSTDictionary = _encodePOSTDictionary;
+@synthesize timeoutSeconds = _timeoutSeconds;
+@synthesize addCredentialsToURL = _addCredentialsToURL;
#pragma mark Initializers
@@ -360,7 +382,7 @@
if(credentialForHost) {
NSString *authString = [NSString stringWithFormat:@"%@:%@", credentialForHost.user, credentialForHost.password];
NSData *authData = [authString dataUsingEncoding:NSASCIIStringEncoding];
- NSString *authValue = [NSString stringWithFormat:@"Basic %@", [authData base64Encoding]];
+ NSString *authValue = [NSString stringWithFormat:@"Basic %@", [authData base64EncodedString]];
[request addValue:authValue forHTTPHeaderField:@"Authorization"];
}
--- a/xcconfigs/AdiumLibpurple.xcconfig Thu Mar 21 00:01:23 2013 -0400
+++ b/xcconfigs/AdiumLibpurple.xcconfig Tue Apr 16 17:27:41 2013 +0200
@@ -13,6 +13,7 @@
DYLIB_COMPATIBILITY_VERSION = 1
LD_RUNPATH_SEARCH_PATHS = @executable_path/../Frameworks
HEADER_SEARCH_PATHS = $(HEADER_SEARCH_PATHS_QUOTED_FOR_TARGET_1) $(HEADER_SEARCH_PATHS_QUOTED_FOR_TARGET_2) $(HEADER_SEARCH_PATHS_QUOTED_FOR_TARGET_3) $(HEADER_SEARCH_PATHS_QUOTED_FOR_TARGET_4) $(HEADER_SEARCH_PATHS_QUOTED_FOR_TARGET_5)
+FRAMEWORK_SEARCH_PATHS = "$(inherited)" "$(SRCROOT)/Frameworks"
INSTALL_PATH = @executable_path/../Frameworks
FRAMEWORK_VERSION = A
GCC_PREPROCESSOR_DEFINITIONS = $(value) ENABLE_NLS HAVE_CDSA
--- a/xcconfigs/Base.xcconfig Thu Mar 21 00:01:23 2013 -0400
+++ b/xcconfigs/Base.xcconfig Tue Apr 16 17:27:41 2013 +0200
@@ -42,7 +42,12 @@
GCC_WARN_UNUSED_VALUE = YES
GCC_WARN_UNINITIALIZED_AUTOS = YES
+GCC_TREAT_WARNINGS_AS_ERRORS = NO
+RUN_CLANG_STATIC_ANALYZER = NO
+COMBINE_HIDPI_IMAGES = YES
CLANG_WARN_CONSTANT_CONVERSION = YES
+CLANG_WARN_ENUM_CONVERSION = YES
CLANG_WARN_INT_CONVERSION = YES
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES
CLANG_WARN_ENUM_CONVERSION = YES
+GCC_WARN_UNINITIALIZED_AUTOS = YES
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/xcconfigs/Dock Tile Plugin.xcconfig Tue Apr 16 17:27:41 2013 +0200
@@ -0,0 +1,5 @@
+GCC_PREFIX_HEADER = Other/Adium Dock Tile Plugin/AIDockTilePlugin-Prefix.pch
+INFOPLIST_FILE = Other/Adium Dock Tile Plugin/AIDockTilePlugin-Info.plist
+INSTALL_PATH = Contents/PlugIns;
+PRODUCT_NAME = $(TARGET_NAME)
+WRAPPER_EXTENSION = docktileplugin;