From ae387a46cdf1f5d46089e3238452f9df36d555e6 Mon Sep 17 00:00:00 2001 From: Takuto Nishioka Date: Tue, 3 Jul 2012 12:20:33 +0900 Subject: [PATCH] import the project --- ASFBPost.xcodeproj/project.pbxproj | 416 +++++++++ ASFBPost/ASFBPost-Info.plist | 49 + ASFBPost/ASFBPost-Prefix.pch | 30 + ASFBPost/ASFBPostController.h | 13 + ASFBPost/ASFBPostController.m | 430 +++++++++ ASFBPost/AppDelegate.h | 14 + ASFBPost/AppDelegate.m | 60 ++ ASFBPost/MainController.h | 10 + ASFBPost/MainController.m | 42 + ASFBPost/main.m | 14 + README.md | 26 +- Resources/en.lproj/Localizable.strings | 9 + Resources/ja.lproj/Localizable.strings | 9 + Resources/sample.jpg | Bin 0 -> 182197 bytes Resources/sample_thumb.jpg | Bin 0 -> 39071 bytes Vendor/AppStair/ASColor+Hex.h | 12 + Vendor/AppStair/ASColor+Hex.m | 21 + .../FBConnect.bundle/images/LoginNormal.png | Bin 0 -> 4271 bytes .../images/LoginNormal@2x.png | Bin 0 -> 6326 bytes .../FBConnect.bundle/images/LoginPressed.png | Bin 0 -> 4304 bytes .../images/LoginPressed@2x.png | Bin 0 -> 6352 bytes .../images/LoginWithFacebookNormal.png | Bin 0 -> 5889 bytes .../images/LoginWithFacebookNormal@2x.png | Bin 0 -> 9766 bytes .../images/LoginWithFacebookPressed.png | Bin 0 -> 5927 bytes .../images/LoginWithFacebookPressed@2x.png | Bin 0 -> 9773 bytes .../FBConnect.bundle/images/LogoutNormal.png | Bin 0 -> 4036 bytes .../images/LogoutNormal@2x.png | Bin 0 -> 5980 bytes .../FBConnect.bundle/images/LogoutPressed.png | Bin 0 -> 4117 bytes .../images/LogoutPressed@2x.png | Bin 0 -> 6049 bytes .../images/runaround_image.jpg | Bin 0 -> 2903 bytes Vendor/FacebookSDK/FBConnect.h | 22 + .../FBDialog.bundle/images/close.png | Bin 0 -> 4401 bytes .../FBDialog.bundle/images/close@2x.png | Bin 0 -> 5554 bytes .../FBDialog.bundle/images/fbicon.png | Bin 0 -> 226 bytes Vendor/FacebookSDK/FBDialog.h | 165 ++++ Vendor/FacebookSDK/FBDialog.m | 688 ++++++++++++++ .../FBFrictionlessRequestSettings.h | 74 ++ .../FBFrictionlessRequestSettings.m | 162 ++++ Vendor/FacebookSDK/FBLoginDialog.h | 48 + Vendor/FacebookSDK/FBLoginDialog.m | 94 ++ Vendor/FacebookSDK/FBRequest.h | 142 +++ Vendor/FacebookSDK/FBRequest.m | 381 ++++++++ Vendor/FacebookSDK/Facebook.h | 153 ++++ Vendor/FacebookSDK/Facebook.m | 848 ++++++++++++++++++ Vendor/FacebookSDK/JSON/JSON.h | 50 ++ Vendor/FacebookSDK/JSON/NSObject+SBJSON.h | 68 ++ Vendor/FacebookSDK/JSON/NSObject+SBJSON.m | 53 ++ Vendor/FacebookSDK/JSON/NSString+SBJSON.h | 58 ++ Vendor/FacebookSDK/JSON/NSString+SBJSON.m | 55 ++ Vendor/FacebookSDK/JSON/SBJSON.h | 75 ++ Vendor/FacebookSDK/JSON/SBJSON.m | 212 +++++ Vendor/FacebookSDK/JSON/SBJsonBase.h | 86 ++ Vendor/FacebookSDK/JSON/SBJsonBase.m | 78 ++ Vendor/FacebookSDK/JSON/SBJsonParser.h | 87 ++ Vendor/FacebookSDK/JSON/SBJsonParser.m | 475 ++++++++++ Vendor/FacebookSDK/JSON/SBJsonWriter.h | 129 +++ Vendor/FacebookSDK/JSON/SBJsonWriter.m | 237 +++++ 57 files changed, 5594 insertions(+), 1 deletion(-) create mode 100644 ASFBPost.xcodeproj/project.pbxproj create mode 100644 ASFBPost/ASFBPost-Info.plist create mode 100644 ASFBPost/ASFBPost-Prefix.pch create mode 100644 ASFBPost/ASFBPostController.h create mode 100644 ASFBPost/ASFBPostController.m create mode 100644 ASFBPost/AppDelegate.h create mode 100644 ASFBPost/AppDelegate.m create mode 100644 ASFBPost/MainController.h create mode 100644 ASFBPost/MainController.m create mode 100644 ASFBPost/main.m create mode 100644 Resources/en.lproj/Localizable.strings create mode 100644 Resources/ja.lproj/Localizable.strings create mode 100644 Resources/sample.jpg create mode 100644 Resources/sample_thumb.jpg create mode 100755 Vendor/AppStair/ASColor+Hex.h create mode 100755 Vendor/AppStair/ASColor+Hex.m create mode 100644 Vendor/FacebookSDK/FBConnect.bundle/images/LoginNormal.png create mode 100644 Vendor/FacebookSDK/FBConnect.bundle/images/LoginNormal@2x.png create mode 100644 Vendor/FacebookSDK/FBConnect.bundle/images/LoginPressed.png create mode 100644 Vendor/FacebookSDK/FBConnect.bundle/images/LoginPressed@2x.png create mode 100644 Vendor/FacebookSDK/FBConnect.bundle/images/LoginWithFacebookNormal.png create mode 100644 Vendor/FacebookSDK/FBConnect.bundle/images/LoginWithFacebookNormal@2x.png create mode 100644 Vendor/FacebookSDK/FBConnect.bundle/images/LoginWithFacebookPressed.png create mode 100644 Vendor/FacebookSDK/FBConnect.bundle/images/LoginWithFacebookPressed@2x.png create mode 100644 Vendor/FacebookSDK/FBConnect.bundle/images/LogoutNormal.png create mode 100644 Vendor/FacebookSDK/FBConnect.bundle/images/LogoutNormal@2x.png create mode 100644 Vendor/FacebookSDK/FBConnect.bundle/images/LogoutPressed.png create mode 100644 Vendor/FacebookSDK/FBConnect.bundle/images/LogoutPressed@2x.png create mode 100644 Vendor/FacebookSDK/FBConnect.bundle/images/runaround_image.jpg create mode 100644 Vendor/FacebookSDK/FBConnect.h create mode 100644 Vendor/FacebookSDK/FBDialog.bundle/images/close.png create mode 100644 Vendor/FacebookSDK/FBDialog.bundle/images/close@2x.png create mode 100644 Vendor/FacebookSDK/FBDialog.bundle/images/fbicon.png create mode 100644 Vendor/FacebookSDK/FBDialog.h create mode 100644 Vendor/FacebookSDK/FBDialog.m create mode 100644 Vendor/FacebookSDK/FBFrictionlessRequestSettings.h create mode 100644 Vendor/FacebookSDK/FBFrictionlessRequestSettings.m create mode 100644 Vendor/FacebookSDK/FBLoginDialog.h create mode 100644 Vendor/FacebookSDK/FBLoginDialog.m create mode 100644 Vendor/FacebookSDK/FBRequest.h create mode 100644 Vendor/FacebookSDK/FBRequest.m create mode 100644 Vendor/FacebookSDK/Facebook.h create mode 100644 Vendor/FacebookSDK/Facebook.m create mode 100644 Vendor/FacebookSDK/JSON/JSON.h create mode 100644 Vendor/FacebookSDK/JSON/NSObject+SBJSON.h create mode 100644 Vendor/FacebookSDK/JSON/NSObject+SBJSON.m create mode 100644 Vendor/FacebookSDK/JSON/NSString+SBJSON.h create mode 100644 Vendor/FacebookSDK/JSON/NSString+SBJSON.m create mode 100644 Vendor/FacebookSDK/JSON/SBJSON.h create mode 100644 Vendor/FacebookSDK/JSON/SBJSON.m create mode 100644 Vendor/FacebookSDK/JSON/SBJsonBase.h create mode 100644 Vendor/FacebookSDK/JSON/SBJsonBase.m create mode 100644 Vendor/FacebookSDK/JSON/SBJsonParser.h create mode 100644 Vendor/FacebookSDK/JSON/SBJsonParser.m create mode 100644 Vendor/FacebookSDK/JSON/SBJsonWriter.h create mode 100644 Vendor/FacebookSDK/JSON/SBJsonWriter.m diff --git a/ASFBPost.xcodeproj/project.pbxproj b/ASFBPost.xcodeproj/project.pbxproj new file mode 100644 index 0000000..dd1dd6a --- /dev/null +++ b/ASFBPost.xcodeproj/project.pbxproj @@ -0,0 +1,416 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 2B91CEEE15A1E220007993FD /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2B91CEED15A1E220007993FD /* UIKit.framework */; }; + 2B91CEF015A1E220007993FD /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2B91CEEF15A1E220007993FD /* Foundation.framework */; }; + 2B91CEF215A1E220007993FD /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2B91CEF115A1E220007993FD /* CoreGraphics.framework */; }; + 2B91CEFA15A1E220007993FD /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 2B91CEF915A1E220007993FD /* main.m */; }; + 2B91CEFE15A1E220007993FD /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 2B91CEFD15A1E220007993FD /* AppDelegate.m */; }; + 2B91CF2515A1E2EB007993FD /* MainController.m in Sources */ = {isa = PBXBuildFile; fileRef = 2B91CF2415A1E2EB007993FD /* MainController.m */; }; + 2B91CF6115A1F064007993FD /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 2B91CF6315A1F064007993FD /* Localizable.strings */; }; + 2B91CFDA15A1F291007993FD /* ASColor+Hex.m in Sources */ = {isa = PBXBuildFile; fileRef = 2B91CFAD15A1F291007993FD /* ASColor+Hex.m */; }; + 2B91CFF215A29127007993FD /* sample_thumb.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 2B91CFF015A29127007993FD /* sample_thumb.jpg */; }; + 2B91CFF315A29127007993FD /* sample.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 2B91CFF115A29127007993FD /* sample.jpg */; }; + 2B91CFFA15A29562007993FD /* ASFBPostController.m in Sources */ = {isa = PBXBuildFile; fileRef = 2B91CFF915A29561007993FD /* ASFBPostController.m */; }; + 2B91D01D15A29924007993FD /* Facebook.m in Sources */ = {isa = PBXBuildFile; fileRef = 2B91D00315A29924007993FD /* Facebook.m */; }; + 2B91D01E15A29924007993FD /* FBConnect.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 2B91D00415A29924007993FD /* FBConnect.bundle */; }; + 2B91D01F15A29924007993FD /* FBDialog.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 2B91D00615A29924007993FD /* FBDialog.bundle */; }; + 2B91D02015A29924007993FD /* FBDialog.m in Sources */ = {isa = PBXBuildFile; fileRef = 2B91D00815A29924007993FD /* FBDialog.m */; }; + 2B91D02115A29924007993FD /* FBFrictionlessRequestSettings.m in Sources */ = {isa = PBXBuildFile; fileRef = 2B91D00A15A29924007993FD /* FBFrictionlessRequestSettings.m */; }; + 2B91D02215A29924007993FD /* FBLoginDialog.m in Sources */ = {isa = PBXBuildFile; fileRef = 2B91D00C15A29924007993FD /* FBLoginDialog.m */; }; + 2B91D02315A29924007993FD /* FBRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = 2B91D00E15A29924007993FD /* FBRequest.m */; }; + 2B91D02415A29924007993FD /* NSObject+SBJSON.m in Sources */ = {isa = PBXBuildFile; fileRef = 2B91D01215A29924007993FD /* NSObject+SBJSON.m */; }; + 2B91D02515A29924007993FD /* NSString+SBJSON.m in Sources */ = {isa = PBXBuildFile; fileRef = 2B91D01415A29924007993FD /* NSString+SBJSON.m */; }; + 2B91D02615A29924007993FD /* SBJSON.m in Sources */ = {isa = PBXBuildFile; fileRef = 2B91D01615A29924007993FD /* SBJSON.m */; }; + 2B91D02715A29924007993FD /* SBJsonBase.m in Sources */ = {isa = PBXBuildFile; fileRef = 2B91D01815A29924007993FD /* SBJsonBase.m */; }; + 2B91D02815A29924007993FD /* SBJsonParser.m in Sources */ = {isa = PBXBuildFile; fileRef = 2B91D01A15A29924007993FD /* SBJsonParser.m */; }; + 2B91D02915A29924007993FD /* SBJsonWriter.m in Sources */ = {isa = PBXBuildFile; fileRef = 2B91D01C15A29924007993FD /* SBJsonWriter.m */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 2B91CEE915A1E220007993FD /* ASFBPost.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ASFBPost.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 2B91CEED15A1E220007993FD /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; + 2B91CEEF15A1E220007993FD /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; + 2B91CEF115A1E220007993FD /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; + 2B91CEF515A1E220007993FD /* ASFBPost-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = "ASFBPost-Info.plist"; path = "ASFBPost/ASFBPost-Info.plist"; sourceTree = ""; }; + 2B91CEF915A1E220007993FD /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; + 2B91CEFB15A1E220007993FD /* ASFBPost-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "ASFBPost-Prefix.pch"; sourceTree = ""; }; + 2B91CEFC15A1E220007993FD /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; + 2B91CEFD15A1E220007993FD /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; + 2B91CF2315A1E2EB007993FD /* MainController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MainController.h; sourceTree = ""; }; + 2B91CF2415A1E2EB007993FD /* MainController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MainController.m; sourceTree = ""; }; + 2B91CF6215A1F064007993FD /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = ""; }; + 2B91CF6415A1F070007993FD /* ja */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ja; path = ja.lproj/Localizable.strings; sourceTree = ""; }; + 2B91CFAC15A1F291007993FD /* ASColor+Hex.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "ASColor+Hex.h"; sourceTree = ""; }; + 2B91CFAD15A1F291007993FD /* ASColor+Hex.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "ASColor+Hex.m"; sourceTree = ""; }; + 2B91CFF015A29127007993FD /* sample_thumb.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; name = sample_thumb.jpg; path = Resources/sample_thumb.jpg; sourceTree = ""; }; + 2B91CFF115A29127007993FD /* sample.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; name = sample.jpg; path = Resources/sample.jpg; sourceTree = ""; }; + 2B91CFF815A29561007993FD /* ASFBPostController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ASFBPostController.h; sourceTree = ""; }; + 2B91CFF915A29561007993FD /* ASFBPostController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ASFBPostController.m; sourceTree = ""; }; + 2B91D00215A29924007993FD /* Facebook.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Facebook.h; sourceTree = ""; }; + 2B91D00315A29924007993FD /* Facebook.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Facebook.m; sourceTree = ""; }; + 2B91D00415A29924007993FD /* FBConnect.bundle */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.plug-in"; path = FBConnect.bundle; sourceTree = ""; }; + 2B91D00515A29924007993FD /* FBConnect.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FBConnect.h; sourceTree = ""; }; + 2B91D00615A29924007993FD /* FBDialog.bundle */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.plug-in"; path = FBDialog.bundle; sourceTree = ""; }; + 2B91D00715A29924007993FD /* FBDialog.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FBDialog.h; sourceTree = ""; }; + 2B91D00815A29924007993FD /* FBDialog.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FBDialog.m; sourceTree = ""; }; + 2B91D00915A29924007993FD /* FBFrictionlessRequestSettings.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FBFrictionlessRequestSettings.h; sourceTree = ""; }; + 2B91D00A15A29924007993FD /* FBFrictionlessRequestSettings.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FBFrictionlessRequestSettings.m; sourceTree = ""; }; + 2B91D00B15A29924007993FD /* FBLoginDialog.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FBLoginDialog.h; sourceTree = ""; }; + 2B91D00C15A29924007993FD /* FBLoginDialog.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FBLoginDialog.m; sourceTree = ""; }; + 2B91D00D15A29924007993FD /* FBRequest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FBRequest.h; sourceTree = ""; }; + 2B91D00E15A29924007993FD /* FBRequest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FBRequest.m; sourceTree = ""; }; + 2B91D01015A29924007993FD /* JSON.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSON.h; sourceTree = ""; }; + 2B91D01115A29924007993FD /* NSObject+SBJSON.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSObject+SBJSON.h"; sourceTree = ""; }; + 2B91D01215A29924007993FD /* NSObject+SBJSON.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSObject+SBJSON.m"; sourceTree = ""; }; + 2B91D01315A29924007993FD /* NSString+SBJSON.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSString+SBJSON.h"; sourceTree = ""; }; + 2B91D01415A29924007993FD /* NSString+SBJSON.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSString+SBJSON.m"; sourceTree = ""; }; + 2B91D01515A29924007993FD /* SBJSON.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SBJSON.h; sourceTree = ""; }; + 2B91D01615A29924007993FD /* SBJSON.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SBJSON.m; sourceTree = ""; }; + 2B91D01715A29924007993FD /* SBJsonBase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SBJsonBase.h; sourceTree = ""; }; + 2B91D01815A29924007993FD /* SBJsonBase.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SBJsonBase.m; sourceTree = ""; }; + 2B91D01915A29924007993FD /* SBJsonParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SBJsonParser.h; sourceTree = ""; }; + 2B91D01A15A29924007993FD /* SBJsonParser.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SBJsonParser.m; sourceTree = ""; }; + 2B91D01B15A29924007993FD /* SBJsonWriter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SBJsonWriter.h; sourceTree = ""; }; + 2B91D01C15A29924007993FD /* SBJsonWriter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SBJsonWriter.m; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 2B91CEE615A1E220007993FD /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 2B91CEEE15A1E220007993FD /* UIKit.framework in Frameworks */, + 2B91CEF015A1E220007993FD /* Foundation.framework in Frameworks */, + 2B91CEF215A1E220007993FD /* CoreGraphics.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 2B91CEDE15A1E220007993FD = { + isa = PBXGroup; + children = ( + 2B91CEF315A1E220007993FD /* App */, + 2B91CFAA15A1F291007993FD /* Vendor */, + 2B91CF0D15A1E27D007993FD /* Resources */, + 2B91CEEC15A1E220007993FD /* Frameworks */, + 2B91CEEA15A1E220007993FD /* Products */, + ); + sourceTree = ""; + }; + 2B91CEEA15A1E220007993FD /* Products */ = { + isa = PBXGroup; + children = ( + 2B91CEE915A1E220007993FD /* ASFBPost.app */, + ); + name = Products; + sourceTree = ""; + }; + 2B91CEEC15A1E220007993FD /* Frameworks */ = { + isa = PBXGroup; + children = ( + 2B91CEED15A1E220007993FD /* UIKit.framework */, + 2B91CEEF15A1E220007993FD /* Foundation.framework */, + 2B91CEF115A1E220007993FD /* CoreGraphics.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + 2B91CEF315A1E220007993FD /* App */ = { + isa = PBXGroup; + children = ( + 2B91CFFB15A2956A007993FD /* supporting files */, + 2B91CFF815A29561007993FD /* ASFBPostController.h */, + 2B91CFF915A29561007993FD /* ASFBPostController.m */, + ); + name = App; + path = ASFBPost; + sourceTree = ""; + }; + 2B91CF0D15A1E27D007993FD /* Resources */ = { + isa = PBXGroup; + children = ( + 2B91CFF015A29127007993FD /* sample_thumb.jpg */, + 2B91CFF115A29127007993FD /* sample.jpg */, + 2B91CF6315A1F064007993FD /* Localizable.strings */, + 2B91CEF515A1E220007993FD /* ASFBPost-Info.plist */, + ); + name = Resources; + sourceTree = ""; + }; + 2B91CFAA15A1F291007993FD /* Vendor */ = { + isa = PBXGroup; + children = ( + 2B91D00115A29924007993FD /* FacebookSDK */, + 2B91CFAB15A1F291007993FD /* AppStair */, + ); + path = Vendor; + sourceTree = ""; + }; + 2B91CFAB15A1F291007993FD /* AppStair */ = { + isa = PBXGroup; + children = ( + 2B91CFAC15A1F291007993FD /* ASColor+Hex.h */, + 2B91CFAD15A1F291007993FD /* ASColor+Hex.m */, + ); + path = AppStair; + sourceTree = ""; + }; + 2B91CFFB15A2956A007993FD /* supporting files */ = { + isa = PBXGroup; + children = ( + 2B91CEFB15A1E220007993FD /* ASFBPost-Prefix.pch */, + 2B91CEF915A1E220007993FD /* main.m */, + 2B91CEFC15A1E220007993FD /* AppDelegate.h */, + 2B91CEFD15A1E220007993FD /* AppDelegate.m */, + 2B91CF2315A1E2EB007993FD /* MainController.h */, + 2B91CF2415A1E2EB007993FD /* MainController.m */, + ); + name = "supporting files"; + sourceTree = ""; + }; + 2B91D00115A29924007993FD /* FacebookSDK */ = { + isa = PBXGroup; + children = ( + 2B91D00215A29924007993FD /* Facebook.h */, + 2B91D00315A29924007993FD /* Facebook.m */, + 2B91D00415A29924007993FD /* FBConnect.bundle */, + 2B91D00515A29924007993FD /* FBConnect.h */, + 2B91D00615A29924007993FD /* FBDialog.bundle */, + 2B91D00715A29924007993FD /* FBDialog.h */, + 2B91D00815A29924007993FD /* FBDialog.m */, + 2B91D00915A29924007993FD /* FBFrictionlessRequestSettings.h */, + 2B91D00A15A29924007993FD /* FBFrictionlessRequestSettings.m */, + 2B91D00B15A29924007993FD /* FBLoginDialog.h */, + 2B91D00C15A29924007993FD /* FBLoginDialog.m */, + 2B91D00D15A29924007993FD /* FBRequest.h */, + 2B91D00E15A29924007993FD /* FBRequest.m */, + 2B91D00F15A29924007993FD /* JSON */, + ); + path = FacebookSDK; + sourceTree = ""; + }; + 2B91D00F15A29924007993FD /* JSON */ = { + isa = PBXGroup; + children = ( + 2B91D01015A29924007993FD /* JSON.h */, + 2B91D01115A29924007993FD /* NSObject+SBJSON.h */, + 2B91D01215A29924007993FD /* NSObject+SBJSON.m */, + 2B91D01315A29924007993FD /* NSString+SBJSON.h */, + 2B91D01415A29924007993FD /* NSString+SBJSON.m */, + 2B91D01515A29924007993FD /* SBJSON.h */, + 2B91D01615A29924007993FD /* SBJSON.m */, + 2B91D01715A29924007993FD /* SBJsonBase.h */, + 2B91D01815A29924007993FD /* SBJsonBase.m */, + 2B91D01915A29924007993FD /* SBJsonParser.h */, + 2B91D01A15A29924007993FD /* SBJsonParser.m */, + 2B91D01B15A29924007993FD /* SBJsonWriter.h */, + 2B91D01C15A29924007993FD /* SBJsonWriter.m */, + ); + path = JSON; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 2B91CEE815A1E220007993FD /* ASFBPost */ = { + isa = PBXNativeTarget; + buildConfigurationList = 2B91CF0115A1E220007993FD /* Build configuration list for PBXNativeTarget "ASFBPost" */; + buildPhases = ( + 2B91CEE515A1E220007993FD /* Sources */, + 2B91CEE615A1E220007993FD /* Frameworks */, + 2B91CEE715A1E220007993FD /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = ASFBPost; + productName = ASFBPost; + productReference = 2B91CEE915A1E220007993FD /* ASFBPost.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 2B91CEE015A1E220007993FD /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 0430; + ORGANIZATIONNAME = AppStair; + }; + buildConfigurationList = 2B91CEE315A1E220007993FD /* Build configuration list for PBXProject "ASFBPost" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + ja, + ); + mainGroup = 2B91CEDE15A1E220007993FD; + productRefGroup = 2B91CEEA15A1E220007993FD /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 2B91CEE815A1E220007993FD /* ASFBPost */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 2B91CEE715A1E220007993FD /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 2B91CF6115A1F064007993FD /* Localizable.strings in Resources */, + 2B91CFF215A29127007993FD /* sample_thumb.jpg in Resources */, + 2B91CFF315A29127007993FD /* sample.jpg in Resources */, + 2B91D01E15A29924007993FD /* FBConnect.bundle in Resources */, + 2B91D01F15A29924007993FD /* FBDialog.bundle in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 2B91CEE515A1E220007993FD /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 2B91CEFA15A1E220007993FD /* main.m in Sources */, + 2B91CEFE15A1E220007993FD /* AppDelegate.m in Sources */, + 2B91CF2515A1E2EB007993FD /* MainController.m in Sources */, + 2B91CFDA15A1F291007993FD /* ASColor+Hex.m in Sources */, + 2B91CFFA15A29562007993FD /* ASFBPostController.m in Sources */, + 2B91D01D15A29924007993FD /* Facebook.m in Sources */, + 2B91D02015A29924007993FD /* FBDialog.m in Sources */, + 2B91D02115A29924007993FD /* FBFrictionlessRequestSettings.m in Sources */, + 2B91D02215A29924007993FD /* FBLoginDialog.m in Sources */, + 2B91D02315A29924007993FD /* FBRequest.m in Sources */, + 2B91D02415A29924007993FD /* NSObject+SBJSON.m in Sources */, + 2B91D02515A29924007993FD /* NSString+SBJSON.m in Sources */, + 2B91D02615A29924007993FD /* SBJSON.m in Sources */, + 2B91D02715A29924007993FD /* SBJsonBase.m in Sources */, + 2B91D02815A29924007993FD /* SBJsonParser.m in Sources */, + 2B91D02915A29924007993FD /* SBJsonWriter.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + 2B91CF6315A1F064007993FD /* Localizable.strings */ = { + isa = PBXVariantGroup; + children = ( + 2B91CF6215A1F064007993FD /* en */, + 2B91CF6415A1F070007993FD /* ja */, + ); + name = Localizable.strings; + path = Resources; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 2B91CEFF15A1E220007993FD /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ARCHS = "$(ARCHS_STANDARD_32_BIT)"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_VERSION = com.apple.compilers.llvm.clang.1_0; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 5.1; + SDKROOT = iphoneos; + }; + name = Debug; + }; + 2B91CF0015A1E220007993FD /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ARCHS = "$(ARCHS_STANDARD_32_BIT)"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_VERSION = com.apple.compilers.llvm.clang.1_0; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 5.1; + OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1"; + SDKROOT = iphoneos; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 2B91CF0215A1E220007993FD /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "ASFBPost/ASFBPost-Prefix.pch"; + INFOPLIST_FILE = "ASFBPost/ASFBPost-Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 5.1; + PRODUCT_NAME = "$(TARGET_NAME)"; + TARGETED_DEVICE_FAMILY = "1,2"; + WRAPPER_EXTENSION = app; + }; + name = Debug; + }; + 2B91CF0315A1E220007993FD /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "ASFBPost/ASFBPost-Prefix.pch"; + INFOPLIST_FILE = "ASFBPost/ASFBPost-Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 5.1; + PRODUCT_NAME = "$(TARGET_NAME)"; + TARGETED_DEVICE_FAMILY = "1,2"; + WRAPPER_EXTENSION = app; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 2B91CEE315A1E220007993FD /* Build configuration list for PBXProject "ASFBPost" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 2B91CEFF15A1E220007993FD /* Debug */, + 2B91CF0015A1E220007993FD /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 2B91CF0115A1E220007993FD /* Build configuration list for PBXNativeTarget "ASFBPost" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 2B91CF0215A1E220007993FD /* Debug */, + 2B91CF0315A1E220007993FD /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 2B91CEE015A1E220007993FD /* Project object */; +} diff --git a/ASFBPost/ASFBPost-Info.plist b/ASFBPost/ASFBPost-Info.plist new file mode 100644 index 0000000..85c6738 --- /dev/null +++ b/ASFBPost/ASFBPost-Info.plist @@ -0,0 +1,49 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleDisplayName + ${PRODUCT_NAME} + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + com.appstair.${PRODUCT_NAME:rfc1034identifier} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleURLTypes + + + CFBundleTypeRole + Editor + CFBundleURLSchemes + + fb1234567 + + + + CFBundleVersion + 1.0 + LSRequiresIPhoneOS + + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + + diff --git a/ASFBPost/ASFBPost-Prefix.pch b/ASFBPost/ASFBPost-Prefix.pch new file mode 100644 index 0000000..ae89000 --- /dev/null +++ b/ASFBPost/ASFBPost-Prefix.pch @@ -0,0 +1,30 @@ +// +// Copyright (c) 2012 AppStair LLC. All rights reserved. +// http://appstair.com +// + +#import +#import + + +// Shortcut + +#define LOG(...) NSLog(__VA_ARGS__) +#define UIAppDelegate (AppDelegate *)[[UIApplication sharedApplication] delegate] +#define IPAD (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) +#define LS(name) NSLocalizedString(name, @"") +#define RELEASE(x) [_ ## x release], _ ## x = nil + + +// Facebook + +#define FB_APP_ID @"1234567" +#define FB_PERMISSIONS @"publish_stream" + + +// UserDefault for Facebook + +#define FB_ACCESS_TOKEN @"FBAccessTokenKey" +#define FB_EXPIRATION_DATE @"FBExpirationDateKey" +#define FB_LOGINNAME @"FBLoginName" + diff --git a/ASFBPost/ASFBPostController.h b/ASFBPost/ASFBPostController.h new file mode 100644 index 0000000..27211fb --- /dev/null +++ b/ASFBPost/ASFBPostController.h @@ -0,0 +1,13 @@ +// +// Copyright (c) 2012 AppStair LLC. All rights reserved. +// http://appstair.com +// + +#import + +@interface ASFBPostController : UITableViewController + +@property (nonatomic, retain) UIImage *originalImage; +@property (nonatomic, retain) UIImage *thumbnailImage; + +@end diff --git a/ASFBPost/ASFBPostController.m b/ASFBPost/ASFBPostController.m new file mode 100644 index 0000000..b6dd0f0 --- /dev/null +++ b/ASFBPost/ASFBPostController.m @@ -0,0 +1,430 @@ +// +// Copyright (c) 2012 AppStair LLC. All rights reserved. +// http://appstair.com +// + +#import "ASFBPostController.h" +#import "FBConnect.h" +#import "AppDelegate.h" +#import "ASColor+Hex.h" + +@interface ASFBPostController () + +@property (nonatomic, retain) Facebook *facebook; +@property (nonatomic, retain) NSString *loginName; +@property (nonatomic, retain) UITextView *textView; +@property (nonatomic, retain) UIAlertView *loadingAlert; + +- (void)createFbInstance; +- (void)setViewStyle; +- (void)loading:(BOOL)isLoading; + +@end + + +@implementation ASFBPostController + +@synthesize facebook = _facebook; +@synthesize loginName = _loginName; +@synthesize textView = _textView; +@synthesize loadingAlert = _loadingAlert; +@synthesize originalImage = _originalImage; +@synthesize thumbnailImage = _thumbnailImage; + + +- (void)viewDidUnload{ + [super viewDidUnload]; +} + +- (void)dealloc{ + [UIAppDelegate setFacebook:nil]; + + RELEASE(facebook); + RELEASE(loginName); + RELEASE(textView); + RELEASE(loadingAlert); + RELEASE(thumbnailImage); + RELEASE(originalImage); + [super dealloc]; +} + +- (id)init{ + if(self = [super initWithStyle:UITableViewStyleGrouped]){ + self.title = @"Facebook"; + } + return self; +} + + +/////////////////////////////////////////////////////////////////////////////////////////////////// +#pragma mark - +#pragma mark View LifeCycle +/////////////////////////////////////////////////////////////////////////////////////////////////// + + +- (void)viewDidLoad{ + [super viewDidLoad]; + [self createFbInstance]; + + self.tableView.backgroundColor = [UIColor colorWithHex:0xE1E6EF]; + self.tableView.scrollEnabled = NO; + + // navi buttons + UIBarButtonItem *btn; + btn = [[UIBarButtonItem alloc] + initWithTitle:LS(@"FB_POST") + style:UIBarButtonItemStyleBordered + target:self + action:@selector(actionSave)]; + self.navigationItem.rightBarButtonItem = btn; + [btn release]; + + btn = [[UIBarButtonItem alloc] + initWithTitle:LS(@"FB_CANCEL") + style:UIBarButtonItemStyleBordered + target:self + action:@selector(actionCancel)]; + self.navigationItem.leftBarButtonItem = btn; + [btn release]; +} + +- (void)viewWillAppear:(BOOL)animated{ + [super viewWillAppear:animated]; + [self setViewStyle]; +} + +- (void)viewDidAppear:(BOOL)animated{ + [super viewDidAppear:animated]; + [self setViewStyle]; + [self.textView becomeFirstResponder]; +} + +- (void)setViewStyle{ + self.navigationController.navigationBar.translucent = NO; + self.navigationController.navigationBar.tintColor = [UIColor colorWithHex:0x2C4287]; +} + +- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation{ + return (interfaceOrientation == UIInterfaceOrientationPortrait); +} + + +/////////////////////////////////////////////////////////////////////////////////////////////////// +#pragma mark - +#pragma mark Delegate (UITableView) +/////////////////////////////////////////////////////////////////////////////////////////////////// + + +- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{ + return 1; +} + +- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{ + return 2; +} + +- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{ + if(indexPath.row == 0){ + return 45; + } + return IPAD ? 120 : 80; +} + +- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ + + UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"indexCell"]; + if (cell == nil) { + cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:@"indexCell"] autorelease]; + cell.textLabel.font = [UIFont systemFontOfSize:14]; + cell.selectionStyle = UITableViewCellSelectionStyleNone; + } + + // accout + if(indexPath.row == 0){ + UIButton *_btn = [UIButton buttonWithType:UIButtonTypeCustom]; + UIImage *image; + + if(self.loginName){ + image = [UIImage imageNamed:@"FBConnect.bundle/images/LogoutNormal.png"]; + [_btn addTarget:self action:@selector(fbLogout) forControlEvents:UIControlEventTouchUpInside]; + cell.textLabel.text = self.loginName; + }else{ + image = [UIImage imageNamed:@"FBConnect.bundle/images/LoginNormal.png"]; + [_btn addTarget:self action:@selector(fbLogin) forControlEvents:UIControlEventTouchUpInside]; + cell.textLabel.text = LS(@"FB_NEED_LOGIN"); + } + + [_btn setBackgroundImage:image forState:UIControlStateNormal]; + [_btn setFrame:CGRectMake(0, 0, image.size.width, image.size.height)]; + cell.accessoryView = _btn; + + // message + }else{ + CGFloat thumbSize = IPAD ? 100 : 60; + CGFloat textSzie = IPAD ? 348 : 210; + + UIImageView *_back = [[UIImageView alloc] initWithFrame:CGRectMake(10, 10, thumbSize, thumbSize)]; + _back.image = self.thumbnailImage; + [cell.contentView addSubview:_back]; + [_back release]; + + if(!self.textView){ + UITextView *tv = [[UITextView alloc] initWithFrame:CGRectMake(thumbSize + 20, 10, textSzie, thumbSize)]; + tv.font = [UIFont systemFontOfSize:16]; + tv.backgroundColor = [UIColor colorWithHex:0xefefef]; + self.textView = tv; + [tv release]; + }else{ + [self.textView removeFromSuperview]; + } + [cell.contentView addSubview:self.textView]; + } + return cell; +} + + +/////////////////////////////////////////////////////////////////////////////////////////////////// +#pragma mark - +#pragma mark Action +/////////////////////////////////////////////////////////////////////////////////////////////////// + + +- (void)actionSave{ + NSMutableDictionary *params = [NSMutableDictionary dictionaryWithObjectsAndKeys: + self.originalImage, @"source", + self.textView.text, @"message", + nil]; + + [self.facebook requestWithGraphPath:@"me/photos" + andParams:params + andHttpMethod:@"POST" + andDelegate:self]; +} + +- (void)actionCancel{ + [self dismissModalViewControllerAnimated:YES]; +} + + +/////////////////////////////////////////////////////////////////////////////////////////////////// +#pragma mark - +#pragma mark Facebook Login/Logout +/////////////////////////////////////////////////////////////////////////////////////////////////// + + +- (void)createFbInstance{ + if(self.facebook){ + return; + } + Facebook *fb = [[Facebook alloc] initWithAppId:FB_APP_ID andDelegate:self]; + self.facebook = fb; + [fb release]; + + NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; + if([defaults objectForKey:FB_ACCESS_TOKEN] && [defaults objectForKey:FB_EXPIRATION_DATE]){ + self.facebook.accessToken = [defaults objectForKey:FB_ACCESS_TOKEN]; + self.facebook.expirationDate = [defaults objectForKey:FB_EXPIRATION_DATE]; + } + if([defaults objectForKey:FB_LOGINNAME]){ + self.loginName = [defaults objectForKey:FB_LOGINNAME]; + } +} + +- (void)fbLogin{ + if(!self.facebook){ + [self createFbInstance]; + } + if([self.facebook isSessionValid]){ + LOG(@"facebook: valid session"); + } + NSArray *permissions = [[NSArray alloc] initWithObjects:FB_PERMISSIONS, nil]; + [UIAppDelegate setFacebook:self.facebook]; + [self.facebook authorize:permissions]; + [permissions release]; +} + +- (void)fbLogout{ + [self createFbInstance]; + [self.facebook logout]; + RELEASE(facebook); +} + + +/////////////////////////////////////////////////////////////////////////////////////////////////// +#pragma mark - +#pragma mark Delegate (FBSessionDelegate) +/////////////////////////////////////////////////////////////////////////////////////////////////// + + +// get user info and check requried permission +// API explorer +// http://developers.facebook.com/tools/explorer/?method=GET&path=me%2Fpermissions + +- (void)fbDidLogin { + LOG(@"facebook: did login"); + [self saveFbSession:self.facebook.accessToken expiresAt:self.facebook.expirationDate]; + + [self.facebook requestWithGraphPath:@"me" andDelegate:self]; + [self.facebook requestWithGraphPath:@"me/permissions" andDelegate:self]; +} + +- (void)fbDidExtendToken:(NSString*)accessToken expiresAt:(NSDate*)expiresAt{ + LOG(@"facebook: token extended"); + [self saveFbSession:accessToken expiresAt:expiresAt]; +} + +- (void)fbDidLogout{ + LOG(@"facebook: did logout"); + [self clearFbSession]; + [self.tableView reloadData]; +} + +- (void)fbDidNotLogin:(BOOL)cancelled{ + // nothing todo +} + +- (void)fbSessionInvalidated{ + [self clearFbSession]; + [self fbLogout]; +} + +- (void)saveFbSession:(NSString*)accessToken expiresAt:(NSDate*)expiresAt{ + NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; + if(accessToken && expiresAt){ + [defaults setObject:accessToken forKey:FB_ACCESS_TOKEN]; + [defaults setObject:expiresAt forKey:FB_EXPIRATION_DATE]; + [defaults synchronize]; + } +} + +- (void)clearFbSession{ + NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; + if ([defaults objectForKey:FB_ACCESS_TOKEN]) { + [defaults removeObjectForKey:FB_ACCESS_TOKEN]; + [defaults removeObjectForKey:FB_EXPIRATION_DATE]; + [defaults removeObjectForKey:FB_LOGINNAME]; + [defaults synchronize]; + } + RELEASE(facebook); + self.loginName = nil; +} + + +/////////////////////////////////////////////////////////////////////////////////////////////////// +#pragma mark - +#pragma mark Delegate (FBRequestDelegate) +/////////////////////////////////////////////////////////////////////////////////////////////////// + + +- (void)requestLoading:(FBRequest *)request{ + if([request.url isEqual:@"https://graph.facebook.com/me/photos"]){ + [self loading:YES]; + } +} + +- (void)request:(FBRequest *)request didFailWithError:(NSError *)error{ + LOG(@"%@", [error description]); + [self loading:NO]; + + UIAlertView *alert = [[UIAlertView alloc] + initWithTitle:@"" + message:LS(@"FB_ERROR") + delegate:self + cancelButtonTitle:nil + otherButtonTitles:@"OK", nil]; + [alert show]; + [alert release]; +} + +- (void)request:(FBRequest *)request didLoad:(id)result{ + LOG(@"%@ : %@", request.url, [result description]); + [self loading:NO]; + + if(!result){ + return; + } + + // permission check + if([request.url isEqual:@"https://graph.facebook.com/me/permissions"]){ + NSArray *data = [((NSDictionary *)result) objectForKey:@"data"]; + if(data.count > 0){ + int isPermitted = [[(NSDictionary *)[data objectAtIndex:0] objectForKey:@"publish_stream"] intValue]; + if(!isPermitted){ + UIAlertView *alert = [[UIAlertView alloc] + initWithTitle:@"" + message:LS(@"FB_NO_PERMISSION") + delegate:self + cancelButtonTitle:nil + otherButtonTitles:@"OK", nil]; + [alert show]; + [alert release]; + [self fbLogout]; + } + } + + // user info + }else if([request.url isEqual:@"https://graph.facebook.com/me"]){ + self.loginName = [((NSDictionary *)result) objectForKey:@"name"]; + + NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; + [defaults setObject:self.loginName forKey:FB_LOGINNAME]; + [defaults synchronize]; + [self.tableView reloadData]; + + // post + }else if([request.url isEqual:@"https://graph.facebook.com/me/photos"]){ + NSString *postId = [((NSDictionary *)result) objectForKey:@"post_id"]; + if(postId){ + [self actionCancel]; + }else{ + UIAlertView *alert = [[UIAlertView alloc] + initWithTitle:@"" + message:LS(@"FB_NO_PERMISSION2") + delegate:self + cancelButtonTitle:nil + otherButtonTitles:@"OK", nil]; + [alert show]; + [alert release]; + } + } +} + + +/////////////////////////////////////////////////////////////////////////////////////////////////// +#pragma mark - +#pragma mark Util +/////////////////////////////////////////////////////////////////////////////////////////////////// + + +- (void)loading:(BOOL)isLoading{ + // start loading + if(isLoading){ + [UIApplication sharedApplication].networkActivityIndicatorVisible = YES; + if(self.loadingAlert){ + return; + } + UIAlertView *_alert = [[UIAlertView alloc] initWithTitle: @"Loading" + message: @"" + delegate: nil + cancelButtonTitle: nil + otherButtonTitles: nil]; + self.loadingAlert = _alert; + [_alert release]; + + UIActivityIndicatorView *activityView = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge]; + activityView.frame = CGRectMake(139.0f-18.0f, 51.0f, 37.0f, 37.0f); + [self.loadingAlert addSubview:activityView]; + [activityView startAnimating]; + [activityView release]; + + [self.loadingAlert show]; + + // stop loading + }else{ + [UIApplication sharedApplication].networkActivityIndicatorVisible = NO; + [self.loadingAlert dismissWithClickedButtonIndex:0 animated:NO]; + RELEASE(loadingAlert); + } +} + +@end diff --git a/ASFBPost/AppDelegate.h b/ASFBPost/AppDelegate.h new file mode 100644 index 0000000..48b49ff --- /dev/null +++ b/ASFBPost/AppDelegate.h @@ -0,0 +1,14 @@ +// +// Copyright (c) 2012 AppStair LLC. All rights reserved. +// http://appstair.com +// + +#import +#import "FBConnect.h" + +@interface AppDelegate : UIResponder + +@property (strong, nonatomic) UIWindow *window; +@property (nonatomic, assign) Facebook *facebook; + +@end diff --git a/ASFBPost/AppDelegate.m b/ASFBPost/AppDelegate.m new file mode 100644 index 0000000..4541238 --- /dev/null +++ b/ASFBPost/AppDelegate.m @@ -0,0 +1,60 @@ +// +// Copyright (c) 2012 AppStair LLC. All rights reserved. +// http://appstair.com +// + +#import "AppDelegate.h" +#import "MainController.h" + +@interface AppDelegate() + +@property (nonatomic, retain) MainController *mainCtrl; + +@end + + +@implementation AppDelegate + +@synthesize window = _window; +@synthesize facebook = _facebook; +@synthesize mainCtrl = _mainCtrl; + +- (void)dealloc{ + _facebook = nil; + RELEASE(mainCtrl); + RELEASE(window); + [super dealloc]; +} + +- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{ + self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease]; + self.window.backgroundColor = [UIColor whiteColor]; + + MainController *c = [[MainController alloc] init]; + self.mainCtrl = c; + [c release]; + + [self.window addSubview:self.mainCtrl.view]; + [self.window makeKeyAndVisible]; + return YES; +} + +// for after iOS 4.2 +- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation { + if(self.facebook){ + return [self.facebook handleOpenURL:url]; + } + return YES; +} + +- (void)applicationWillResignActive:(UIApplication *)application{} + +- (void)applicationDidEnterBackground:(UIApplication *)application{} + +- (void)applicationWillEnterForeground:(UIApplication *)application{} + +- (void)applicationDidBecomeActive:(UIApplication *)application{} + +- (void)applicationWillTerminate:(UIApplication *)application{} + +@end diff --git a/ASFBPost/MainController.h b/ASFBPost/MainController.h new file mode 100644 index 0000000..153b5c7 --- /dev/null +++ b/ASFBPost/MainController.h @@ -0,0 +1,10 @@ +// +// Copyright (c) 2012 AppStair LLC. All rights reserved. +// http://appstair.com +// + +#import + +@interface MainController : UIViewController + +@end diff --git a/ASFBPost/MainController.m b/ASFBPost/MainController.m new file mode 100644 index 0000000..7699e12 --- /dev/null +++ b/ASFBPost/MainController.m @@ -0,0 +1,42 @@ +// +// Copyright (c) 2012 AppStair LLC. All rights reserved. +// http://appstair.com +// + +#import "MainController.h" +#import "ASFBPostController.h" + + +@implementation MainController + +- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil{ + self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; + if (self) { + + } + return self; +} + +- (void)viewDidLoad{ + [super viewDidLoad]; + + UIButton *_btn = [UIButton buttonWithType:UIButtonTypeRoundedRect]; + [_btn setTitle:@"Open" forState:UIControlStateNormal]; + [_btn addTarget:self action:@selector(showFBPost) forControlEvents:UIControlEventTouchUpInside]; + [_btn setFrame:CGRectMake(10, 10, 140, 40)]; + [self.view addSubview:_btn]; +} + +- (void)showFBPost{ + ASFBPostController *c = [[ASFBPostController alloc] init]; + c.thumbnailImage = [UIImage imageNamed:@"sample_thumb.jpg"]; + c.originalImage = [UIImage imageNamed:@"sample.jpg"]; + + UINavigationController *n = [[UINavigationController alloc] initWithRootViewController:c]; + n.modalPresentationStyle = UIModalPresentationFormSheet; + [c release]; + [self presentModalViewController:n animated:YES]; + [n release]; +} + +@end diff --git a/ASFBPost/main.m b/ASFBPost/main.m new file mode 100644 index 0000000..522b48f --- /dev/null +++ b/ASFBPost/main.m @@ -0,0 +1,14 @@ +// +// Copyright (c) 2012 AppStair LLC. All rights reserved. +// http://appstair.com +// + +#import +#import "AppDelegate.h" + +int main(int argc, char *argv[]) +{ + @autoreleasepool { + return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); + } +} diff --git a/README.md b/README.md index 7334366..7e61cdf 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,28 @@ ASFBPostController ================== -ASFBPostController provides photo posting function to Facebook. You can easily integrate Facebook post function to you iOS app. \ No newline at end of file +ASFBPostController provides photo posting function to Facebook. You can easily integrate Facebook post function to you iOS app. + +The ASFBPostController is licensed under the Apache License, Version 2.0 as same as the Facebook SDK. + +http://www.apache.org/licenses/LICENSE-2.0.html +https://github.com/facebook/facebook-ios-sdk/ + + +Setup +================== + +1. Create your iOS facebook App. +2. Replace sample ID with your Facebook App ID. + +* ASFBPost-Prefix.pch +#define FB_APP_ID @"1234567" + +* ASFBPost-Infor.plist +URL types > Item 0 > URL Schemes > Item 0 > fb1234567 + + +Screens +================== +![Screenshot1](https://dl.dropbox.com/u/339699/github/ASFBPostController_iphone.png) +![Screenshot1](https://dl.dropbox.com/u/339699/github/ASFBPostController_ipad.png) diff --git a/Resources/en.lproj/Localizable.strings b/Resources/en.lproj/Localizable.strings new file mode 100644 index 0000000..2c9a3dd --- /dev/null +++ b/Resources/en.lproj/Localizable.strings @@ -0,0 +1,9 @@ + +/* Facebook */ +"FACEBOOK" = "Facebook"; +"FB_POST" = "Post"; +"FB_CANCEL" = "Cancel"; +"FB_NEED_LOGIN" = "Not logged in"; +"FB_ERROR" = "Error has occured. Please login again."; +"FB_NO_PERMISSION" = "You have to permit to post your timeline. Please login again to fix it."; +"FB_NO_PERMISSION2" = "Post failed. Please check whether post to timeline is permitted. You can add that by re-login."; diff --git a/Resources/ja.lproj/Localizable.strings b/Resources/ja.lproj/Localizable.strings new file mode 100644 index 0000000..a86ae7d --- /dev/null +++ b/Resources/ja.lproj/Localizable.strings @@ -0,0 +1,9 @@ + +/* Facebook */ +"FACEBOOK" = "Facebook"; +"FB_POST" = "投稿する"; +"FB_CANCEL" = "キャンセル"; +"FB_NEED_LOGIN" = "ログインしていません"; +"FB_ERROR" = "エラーが発生しました。再度ログインしてください。"; +"FB_NO_PERMISSION" = "タイムラインへの投稿が許可されていません。再度ログインし、投稿を許可してください。"; +"FB_NO_PERMISSION2" = "投稿できませんでした。タイムラインへの投稿が許可されているか確認してください。再度ログインで権限を追加できます。"; diff --git a/Resources/sample.jpg b/Resources/sample.jpg new file mode 100644 index 0000000000000000000000000000000000000000..72900b4e9b55f39c150bf9d555c3975ef2d814df GIT binary patch literal 182197 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

-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�*Oy}c&cY&E3q=vP4pfI=tXZ7^VV*O4#MgTC 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 literal 0 HcmV?d00001 diff --git a/Resources/sample_thumb.jpg b/Resources/sample_thumb.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f8f386812e80b093dc6ed8d769ff6ddd4e274ac6 GIT binary patch literal 39071 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 WQZfl@f!vZwJNx8FvuwnxXaCtGFeKps literal 0 HcmV?d00001 diff --git a/Vendor/AppStair/ASColor+Hex.h b/Vendor/AppStair/ASColor+Hex.h new file mode 100755 index 0000000..80da5fd --- /dev/null +++ b/Vendor/AppStair/ASColor+Hex.h @@ -0,0 +1,12 @@ +// +// Copyright (c) 2012 AppStair LLC. All rights reserved. +// http://appstair.com +// + +#import + +@interface UIColor (Hex) + ++ (UIColor *)colorWithHex:(UInt32)hex; + +@end diff --git a/Vendor/AppStair/ASColor+Hex.m b/Vendor/AppStair/ASColor+Hex.m new file mode 100755 index 0000000..4d5709a --- /dev/null +++ b/Vendor/AppStair/ASColor+Hex.m @@ -0,0 +1,21 @@ +// +// Copyright (c) 2012 AppStair LLC. All rights reserved. +// http://appstair.com +// + +#import "ASColor+Hex.h" + +@implementation UIColor (Hex) + ++ (UIColor *)colorWithHex:(UInt32)hex { + int r = (hex >> 16) & 0xFF; + int g = (hex >> 8) & 0xFF; + int b = (hex) & 0xFF; + + return [UIColor colorWithRed:r / 255.0f + green:g / 255.0f + blue:b / 255.0f + alpha:1.0f]; +} + +@end diff --git a/Vendor/FacebookSDK/FBConnect.bundle/images/LoginNormal.png b/Vendor/FacebookSDK/FBConnect.bundle/images/LoginNormal.png new file mode 100644 index 0000000000000000000000000000000000000000..59a6fde0cc3863929f2a6eca5cd632318c874049 GIT binary patch literal 4271 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 literal 0 HcmV?d00001 diff --git a/Vendor/FacebookSDK/FBConnect.bundle/images/LoginPressed.png b/Vendor/FacebookSDK/FBConnect.bundle/images/LoginPressed.png new file mode 100644 index 0000000000000000000000000000000000000000..3945e5e58dceba9d69b8dd518c34d07a5c89555c GIT binary patch literal 4304 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 literal 0 HcmV?d00001 diff --git a/Vendor/FacebookSDK/FBConnect.bundle/images/LoginWithFacebookNormal@2x.png b/Vendor/FacebookSDK/FBConnect.bundle/images/LoginWithFacebookNormal@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..7a26bfe2cecb172ee3c0995b1f6a8dba47c883ac GIT binary patch literal 9766 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 literal 0 HcmV?d00001 diff --git a/Vendor/FacebookSDK/FBConnect.bundle/images/LoginWithFacebookPressed.png b/Vendor/FacebookSDK/FBConnect.bundle/images/LoginWithFacebookPressed.png new file mode 100644 index 0000000000000000000000000000000000000000..599b73816eef31cc2fdfbb02f8c2be587b89fb96 GIT binary patch literal 5927 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 literal 0 HcmV?d00001 diff --git a/Vendor/FacebookSDK/FBConnect.bundle/images/LogoutNormal.png b/Vendor/FacebookSDK/FBConnect.bundle/images/LogoutNormal.png new file mode 100644 index 0000000000000000000000000000000000000000..a4e09bf239b563f3bca3704350118ee05521331a GIT binary patch literal 4036 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 literal 0 HcmV?d00001 diff --git a/Vendor/FacebookSDK/FBConnect.bundle/images/LogoutNormal@2x.png b/Vendor/FacebookSDK/FBConnect.bundle/images/LogoutNormal@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..c4a72d696144fb79818d646d8be9f89b77baadfe GIT binary patch literal 5980 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 literal 0 HcmV?d00001 diff --git a/Vendor/FacebookSDK/FBConnect.bundle/images/LogoutPressed.png b/Vendor/FacebookSDK/FBConnect.bundle/images/LogoutPressed.png new file mode 100644 index 0000000000000000000000000000000000000000..15dbad469f5cab88f8e9382ec11cc8df91986ba5 GIT binary patch literal 4117 zcmZXWWmME#)W-h^S2_ggxO7QKUm9kpp@tY_NXZ#OBqap~>5z~HNu@(_XdD`eK{|#| zQs4qg2#UZv_kBOUd;QLN&f0sOv(DM;`EcTm47DlASjYeXpoHjXnBdhIKiEkK@$=5O z7ad+my>u*m0e~F8CZ{6+^4>B502$O33^p=y@$~cbb@BA#gn+@EUOt`(*JsWE5V%rc ziiDZ&GbmrKpM&(`P#JojCiEnnCZI&r!!&+jE>arZIIfaqdgHzanwmtcqs4KA$;qfB zdSela1hOUKZLZSf$airGW7l6p-nlPyU+zxcwl1pd)t(hJPZ48CD6({}n*b6D;IVOB zv=BfP0@#i6@B{);xxhoMQ*)&skLqdmgz=rqZBpvsmDh~0A`$f_Ha8dJ5X3?lA3c<{ zzh|GPCe|O6%PbioP5tF;0sxBB=<%;Ty9vZn)nl=;$!Mylq6Z)E-*G!QY~Aim)p)4^ zz*oPp>01%;W)_s=Xi!FKai_1hr6SZ0^P`tlle&+RGZ!}9%JC>Jswzrpb z2SHZ$W9Ff^$o{7o^P6YC!j%48UVQ1@T@?m>t{2VD5!mNBh&vPNFgnPeGvJm`(k5Z}z5)8>ZAHKEFe4A9`FLJ*QBT501* z_)|}S2JVO1yaa&LF3-L>K@vigOXSz7fV&gb8|`8~0EK|O@df}}4PG(WShMN~2>@sm zM+i5lv!3@ciD2%t_5HQlNB+l7HVVW$*bkxskvXB*eC&j3Ux5T;CL7p=?ZoHQ*rhSX zE-~p|RAT*R?NrKM)W7XX3i|}RBS?wVM@i`HxmMx`91`F>$s~-q(N|o3Iz+UIyqurn z9vXA&rOD_>m?XeB&2-pLm3{8X$69N3rYVjBlCS>6bZbjwL^K&I&r!63J1XT^qO?lM zKRfwJXyjQPeyEH(J-vDokcsPP{W(sal1M($dQ znqiiPC$)rK@fVI$jR8co5t}Cvg6c}pCLfGrE9sPjnGd|&%p_BX=w01C<&`pA(uq#$!X6EPE#Ie_Uyj($1wY$Edr?6I80Va{GI zb*`rwTo^6oE%D?MSV@53x^;_q7w=np`_?~RKapKf&zbCNqUHwTJvxl`7}yoit) zoAHaW{cs1k4GcwfEsGbG&;tjInKOIUw+BD5*Q zS}v{MA>nN8UY(Vl1+USmF|N@*?2)ZMswgP$(d@Fgj-XN>(G{>3&_usT{c~- zAgf?7P*%987przJV=d{@2>AHC;y99)~YM0<6G#e>#BHA(P5ZwSW~!w9BBA~{)Db-V{X`4 zx{s?zd!R$@kq(T=wxRlgEG{u#@71_iwu)Fj>+srW&$h1Lg}2Su z;F*hp{O0`rqe|R|W7%WZS`qKV{QRSzKPtlgjmXh4Mxn)aF%I_Y?*-RRj}`d#&3-*jrDw_ z1XTWmsIH8#O0}4q(u!QCbf@aD7{X#=9$o;4Jkw*77Za|Reg3R>}J6x`Bn&H zj`*mJS5OJI|2(>ap-PNaL?KH}KhE%9{4Z zwJ?X_sgAHg@SA_rx@CfRhos6xb~>U2s#3f4DfQR#6$%;h{5d@&l@)p9L215v+2W^1XlxhSYtiMKIX1wv{cm$b~sHTW)S!O8LR9V&8yV+FFDVJATC^w$8 z99{g>#EEB53gWsV(cq4EAC=m>ohv?JClys;?_uY#-!R$ZnYC8?#jEGj$E+dUKc)Yj z$60k>-l%-)#hDS98O$T*ov$I+&6le6@zwiRS=Symb%q|^M( zWtd6I!lOfNs*%5YZwpQWL@8w{&0fD9-sJJp2-@DiB;B~=pj24#PYS91N<90wKRc3L z+zpg>nx~a-ns;sGVATnoP?=shSP%ZAjr*JWt+bLwknS1mlk3XvB9tw<|A-} z9q(EW5IC;uhIT(aS36Q)2Cv1=t6JTzE}g7~yI}%~&!$(kFYiZ3PTi(mq)>zZO36(b zkD-h?Ec{1BUVc;6=Vt#;1$fG7iocNYw)A$qo{>R3>}vjS5j&kTU6Os8o&M3|W!cRE z=8*XVZn%G#qxVywl!Wd1lk20tfYku@lXn}`(CwF;;evNAzZx%0KUZ9*GpDED5fSE` z{c)5M#o_;(oQ^ss1^^Ju2LPx@0Qhx>*L?tZ@fZLO>;OO^2LKp7-#i`C0)TrEBYl`A zEiD~03#%d2*br)R_rJl-!;4pZ{{I&E>i^{%8k_3sKXi6>;Y+WRQ>CP3@pyWABam*+ z2p4?P9BwJEplk|zVr*iD--|yGpHxy-QwM2+z}jF<9ZfBWmbR{zj-EC|Uk73U(KUeR z8S3KEhw9-mFw!?L!r#Qw$|f8YSy@%{p`khNZBbQCT|;9_XIF3kz;IJb`{2;%@W|Nw z!s5v2xUlLoVYTOvRNW->P}0y?8KZbvh_@WXM^4vA5uUARkpqGSfnmWKW+8gk;riC$ zhPDyVr>|fR5pZOz#ec+ExWrky##`ZW!;@g`o@nctVHa3~h;Bv1v?62B$XK+Cf4U2P zj%{=GPk$bq=^2vc6`JiEp7#Qk8yx*MIJzJNPfTHWLMbYtDDrh_bn^S?l=m@sQp;k~ z%H!VPsYpmKPspfB%B)VxtVzzUO3tZG$*E4wsmUn#komSQr?@G%xFNr^skpqkv=aTk zx~;6Hy}Y)gqOP+NPkmQ?3#Os9zp)k5h{iN`47IlRb@YyQ_6~LT_IH0A>BfxpU`BiT zMn4Wt4v$WL8vi^tjvb$vn!wIZVyCfFGoPntr}50p&HTsw%hFit6zPh@;w!X2x@%77> z&F!7t!{c+jLw4=rZ}A3H^)oRv#VY{NaQw~5DW;?Z($F%ouysOsczOE-hrA383rGFG zC@R8VY;NxR_tUeht6%5M;<AowJ2|Zirge0DZsW_}+ow(I`^CpKS9cV)g{wQ*L&wBg5fRtZ z!*TeUa7+Ko^e(~cs`_T@+!cw#Qb^}$kTJ8hd(Fgko*OJ-{5N_eN8me;sHU>& zB%|hK-`P9IHVi9E(3@2oC%E*{vq~}l-Y5oq zV=Ccy4ZSxHGp{1Djd(Fg;*pC4jYCn0E9zMKf(qofRV(wklA)cuK^leiJ}dw9%kKxo zKQ;teC8P2TWXsHC>7}A0HNFk|j=zXASxaUXP}Oy+@2!NqbeDZ@NEh#3ZyG4dpOut< pq_J6cD9t9}HYCbLd!VRtchA#U&|jsn3-O=ZA)1C7^&q=f{{wo-;i~`u literal 0 HcmV?d00001 diff --git a/Vendor/FacebookSDK/FBConnect.bundle/images/LogoutPressed@2x.png b/Vendor/FacebookSDK/FBConnect.bundle/images/LogoutPressed@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..ff298c371ed9237897873d94ab546a82a6e948ba GIT binary patch literal 6049 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 TW~ZKaAVB$zhI|d!GW`Dl%o1ua literal 0 HcmV?d00001 diff --git a/Vendor/FacebookSDK/FBConnect.bundle/images/runaround_image.jpg b/Vendor/FacebookSDK/FBConnect.bundle/images/runaround_image.jpg new file mode 100644 index 0000000000000000000000000000000000000000..01b46c60170e1c68fab432cd7178967a16f9737f GIT binary patch literal 2903 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 Ay#N3J literal 0 HcmV?d00001 diff --git a/Vendor/FacebookSDK/FBDialog.bundle/images/fbicon.png b/Vendor/FacebookSDK/FBDialog.bundle/images/fbicon.png new file mode 100644 index 0000000000000000000000000000000000000000..413396be6b5baaaf363d4aa1111e4935c234a1b9 GIT binary patch literal 226 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh1SBVD?P>#3k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*D5XT0C7GLn>}1`K*a4etl4y&B?*nv87X@)PW)7Sd+J3Xxxt7 zXM$ZONT1l&Ig3+eW`Snw>SpFS%amrbGy3qjFzYOni=5VXtZhcG>&w~S;~(-hY$%*1 zHDNDHo?MIXrfAQPV&dwv+a^iqWh&=Nay&k^H+;zqE#-6N?_LS}a6UQEt|H#Rz|0U9 Wr}l!o#w8Z$9tKZWKbLh*2~7ZwZcbkS literal 0 HcmV?d00001 diff --git a/Vendor/FacebookSDK/FBDialog.h b/Vendor/FacebookSDK/FBDialog.h new file mode 100644 index 0000000..1c0218a --- /dev/null +++ b/Vendor/FacebookSDK/FBDialog.h @@ -0,0 +1,165 @@ +/* + * Copyright 2010 Facebook + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import +#import + +@protocol FBDialogDelegate; +@class FBFrictionlessRequestSettings; + +/** + * Do not use this interface directly, instead, use dialog in Facebook.h + * + * Facebook dialog interface for start the facebook webView UIServer Dialog. + */ + +@interface FBDialog : UIView { + id _delegate; + NSMutableDictionary *_params; + NSString * _serverURL; + NSURL* _loadingURL; + UIWebView* _webView; + UIActivityIndicatorView* _spinner; + UIButton* _closeButton; + UIInterfaceOrientation _orientation; + BOOL _showingKeyboard; + BOOL _isViewInvisible; + FBFrictionlessRequestSettings* _frictionlessSettings; + + // Ensures that UI elements behind the dialog are disabled. + UIView* _modalBackgroundView; +} + +/** + * The delegate. + */ +@property(nonatomic,assign) id delegate; + +/** + * The parameters. + */ +@property(nonatomic, retain) NSMutableDictionary* params; + +- (NSString *) getStringFromUrl: (NSString*) url needle:(NSString *) needle; + +- (id)initWithURL: (NSString *) loadingURL + params: (NSMutableDictionary *) params + isViewInvisible: (BOOL) isViewInvisible + frictionlessSettings: (FBFrictionlessRequestSettings *) frictionlessSettings + delegate: (id ) delegate; + +/** + * Displays the view with an animation. + * + * The view will be added to the top of the current key window. + */ +- (void)show; + +/** + * Displays the first page of the dialog. + * + * Do not ever call this directly. It is intended to be overriden by subclasses. + */ +- (void)load; + +/** + * Displays a URL in the dialog. + */ +- (void)loadURL:(NSString*)url + get:(NSDictionary*)getParams; + +/** + * Hides the view and notifies delegates of success or cancellation. + */ +- (void)dismissWithSuccess:(BOOL)success animated:(BOOL)animated; + +/** + * Hides the view and notifies delegates of an error. + */ +- (void)dismissWithError:(NSError*)error animated:(BOOL)animated; + +/** + * Subclasses may override to perform actions just prior to showing the dialog. + */ +- (void)dialogWillAppear; + +/** + * Subclasses may override to perform actions just after the dialog is hidden. + */ +- (void)dialogWillDisappear; + +/** + * Subclasses should override to process data returned from the server in a 'fbconnect' url. + * + * Implementations must call dismissWithSuccess:YES at some point to hide the dialog. + */ +- (void)dialogDidSucceed:(NSURL *)url; + +/** + * Subclasses should override to process data returned from the server in a 'fbconnect' url. + * + * Implementations must call dismissWithSuccess:YES at some point to hide the dialog. + */ +- (void)dialogDidCancel:(NSURL *)url; +@end + +/////////////////////////////////////////////////////////////////////////////////////////////////// + +/* + *Your application should implement this delegate + */ +@protocol FBDialogDelegate + +@optional + +/** + * Called when the dialog succeeds and is about to be dismissed. + */ +- (void)dialogDidComplete:(FBDialog *)dialog; + +/** + * Called when the dialog succeeds with a returning url. + */ +- (void)dialogCompleteWithUrl:(NSURL *)url; + +/** + * Called when the dialog get canceled by the user. + */ +- (void)dialogDidNotCompleteWithUrl:(NSURL *)url; + +/** + * Called when the dialog is cancelled and is about to be dismissed. + */ +- (void)dialogDidNotComplete:(FBDialog *)dialog; + +/** + * Called when dialog failed to load due to an error. + */ +- (void)dialog:(FBDialog*)dialog didFailWithError:(NSError *)error; + +/** + * Asks if a link touched by a user should be opened in an external browser. + * + * If a user touches a link, the default behavior is to open the link in the Safari browser, + * which will cause your app to quit. You may want to prevent this from happening, open the link + * in your own internal browser, or perhaps warn the user that they are about to leave your app. + * If so, implement this method on your delegate and return NO. If you warn the user, you + * should hold onto the URL and once you have received their acknowledgement open the URL yourself + * using [[UIApplication sharedApplication] openURL:]. + */ +- (BOOL)dialog:(FBDialog*)dialog shouldOpenURLInExternalBrowser:(NSURL *)url; + +@end diff --git a/Vendor/FacebookSDK/FBDialog.m b/Vendor/FacebookSDK/FBDialog.m new file mode 100644 index 0000000..75f0883 --- /dev/null +++ b/Vendor/FacebookSDK/FBDialog.m @@ -0,0 +1,688 @@ +/* + * Copyright 2010 Facebook + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#import "FBDialog.h" +#import "Facebook.h" +#import "FBFrictionlessRequestSettings.h" +#import "JSON.h" + +/////////////////////////////////////////////////////////////////////////////////////////////////// +// global + +static CGFloat kBorderGray[4] = {0.3, 0.3, 0.3, 0.8}; +static CGFloat kBorderBlack[4] = {0.3, 0.3, 0.3, 1}; + +static CGFloat kTransitionDuration = 0.3; + +static CGFloat kPadding = 0; +static CGFloat kBorderWidth = 10; + +/////////////////////////////////////////////////////////////////////////////////////////////////// + +static BOOL FBIsDeviceIPad() { +#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 30200 + if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) { + return YES; + } +#endif + return NO; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////// + +@implementation FBDialog + +@synthesize delegate = _delegate, +params = _params; + +/////////////////////////////////////////////////////////////////////////////////////////////////// +// private + +- (void)addRoundedRectToPath:(CGContextRef)context rect:(CGRect)rect radius:(float)radius { + CGContextBeginPath(context); + CGContextSaveGState(context); + + if (radius == 0) { + CGContextTranslateCTM(context, CGRectGetMinX(rect), CGRectGetMinY(rect)); + CGContextAddRect(context, rect); + } else { + rect = CGRectOffset(CGRectInset(rect, 0.5, 0.5), 0.5, 0.5); + CGContextTranslateCTM(context, CGRectGetMinX(rect)-0.5, CGRectGetMinY(rect)-0.5); + CGContextScaleCTM(context, radius, radius); + float fw = CGRectGetWidth(rect) / radius; + float fh = CGRectGetHeight(rect) / radius; + + CGContextMoveToPoint(context, fw, fh/2); + CGContextAddArcToPoint(context, fw, fh, fw/2, fh, 1); + CGContextAddArcToPoint(context, 0, fh, 0, fh/2, 1); + CGContextAddArcToPoint(context, 0, 0, fw/2, 0, 1); + CGContextAddArcToPoint(context, fw, 0, fw, fh/2, 1); + } + + CGContextClosePath(context); + CGContextRestoreGState(context); +} + +- (void)drawRect:(CGRect)rect fill:(const CGFloat*)fillColors radius:(CGFloat)radius { + CGContextRef context = UIGraphicsGetCurrentContext(); + CGColorSpaceRef space = CGColorSpaceCreateDeviceRGB(); + + if (fillColors) { + CGContextSaveGState(context); + CGContextSetFillColor(context, fillColors); + if (radius) { + [self addRoundedRectToPath:context rect:rect radius:radius]; + CGContextFillPath(context); + } else { + CGContextFillRect(context, rect); + } + CGContextRestoreGState(context); + } + + CGColorSpaceRelease(space); +} + +- (void)strokeLines:(CGRect)rect stroke:(const CGFloat*)strokeColor { + CGContextRef context = UIGraphicsGetCurrentContext(); + CGColorSpaceRef space = CGColorSpaceCreateDeviceRGB(); + + CGContextSaveGState(context); + CGContextSetStrokeColorSpace(context, space); + CGContextSetStrokeColor(context, strokeColor); + CGContextSetLineWidth(context, 1.0); + + { + CGPoint points[] = {{rect.origin.x+0.5, rect.origin.y-0.5}, + {rect.origin.x+rect.size.width, rect.origin.y-0.5}}; + CGContextStrokeLineSegments(context, points, 2); + } + { + CGPoint points[] = {{rect.origin.x+0.5, rect.origin.y+rect.size.height-0.5}, + {rect.origin.x+rect.size.width-0.5, rect.origin.y+rect.size.height-0.5}}; + CGContextStrokeLineSegments(context, points, 2); + } + { + CGPoint points[] = {{rect.origin.x+rect.size.width-0.5, rect.origin.y}, + {rect.origin.x+rect.size.width-0.5, rect.origin.y+rect.size.height}}; + CGContextStrokeLineSegments(context, points, 2); + } + { + CGPoint points[] = {{rect.origin.x+0.5, rect.origin.y}, + {rect.origin.x+0.5, rect.origin.y+rect.size.height}}; + CGContextStrokeLineSegments(context, points, 2); + } + + CGContextRestoreGState(context); + + CGColorSpaceRelease(space); +} + +- (BOOL)shouldRotateToOrientation:(UIInterfaceOrientation)orientation { + if (orientation == _orientation) { + return NO; + } else { + return orientation == UIInterfaceOrientationPortrait + || orientation == UIInterfaceOrientationPortraitUpsideDown + || orientation == UIInterfaceOrientationLandscapeLeft + || orientation == UIInterfaceOrientationLandscapeRight; + } +} + +- (CGAffineTransform)transformForOrientation { + UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation; + if (orientation == UIInterfaceOrientationLandscapeLeft) { + return CGAffineTransformMakeRotation(M_PI*1.5); + } else if (orientation == UIInterfaceOrientationLandscapeRight) { + return CGAffineTransformMakeRotation(M_PI/2); + } else if (orientation == UIInterfaceOrientationPortraitUpsideDown) { + return CGAffineTransformMakeRotation(-M_PI); + } else { + return CGAffineTransformIdentity; + } +} + +- (void)sizeToFitOrientation:(BOOL)transform { + if (transform) { + self.transform = CGAffineTransformIdentity; + } + + CGRect frame = [UIScreen mainScreen].applicationFrame; + CGPoint center = CGPointMake( + frame.origin.x + ceil(frame.size.width/2), + frame.origin.y + ceil(frame.size.height/2)); + + CGFloat scale_factor = 1.0f; + if (FBIsDeviceIPad()) { + // On the iPad the dialog's dimensions should only be 60% of the screen's + scale_factor = 0.6f; + } + + CGFloat width = floor(scale_factor * frame.size.width) - kPadding * 2; + CGFloat height = floor(scale_factor * frame.size.height) - kPadding * 2; + + _orientation = [UIApplication sharedApplication].statusBarOrientation; + if (UIInterfaceOrientationIsLandscape(_orientation)) { + self.frame = CGRectMake(kPadding, kPadding, height, width); + } else { + self.frame = CGRectMake(kPadding, kPadding, width, height); + } + self.center = center; + + if (transform) { + self.transform = [self transformForOrientation]; + } +} + +- (void)updateWebOrientation { + UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation; + if (UIInterfaceOrientationIsLandscape(orientation)) { + [_webView stringByEvaluatingJavaScriptFromString: + @"document.body.setAttribute('orientation', 90);"]; + } else { + [_webView stringByEvaluatingJavaScriptFromString: + @"document.body.removeAttribute('orientation');"]; + } +} + +- (void)bounce1AnimationStopped { + [UIView beginAnimations:nil context:nil]; + [UIView setAnimationDuration:kTransitionDuration/2]; + [UIView setAnimationDelegate:self]; + [UIView setAnimationDidStopSelector:@selector(bounce2AnimationStopped)]; + self.transform = CGAffineTransformScale([self transformForOrientation], 0.9, 0.9); + [UIView commitAnimations]; +} + +- (void)bounce2AnimationStopped { + [UIView beginAnimations:nil context:nil]; + [UIView setAnimationDuration:kTransitionDuration/2]; + self.transform = [self transformForOrientation]; + [UIView commitAnimations]; +} + +- (NSURL*)generateURL:(NSString*)baseURL params:(NSDictionary*)params { + if (params) { + NSMutableArray* pairs = [NSMutableArray array]; + for (NSString* key in params.keyEnumerator) { + NSString* value = [params objectForKey:key]; + NSString* escaped_value = (NSString *)CFURLCreateStringByAddingPercentEscapes( + NULL, /* allocator */ + (CFStringRef)value, + NULL, /* charactersToLeaveUnescaped */ + (CFStringRef)@"!*'();:@&=+$,/?%#[]", + kCFStringEncodingUTF8); + + [pairs addObject:[NSString stringWithFormat:@"%@=%@", key, escaped_value]]; + [escaped_value release]; + } + + NSString* query = [pairs componentsJoinedByString:@"&"]; + NSString* url = [NSString stringWithFormat:@"%@?%@", baseURL, query]; + return [NSURL URLWithString:url]; + } else { + return [NSURL URLWithString:baseURL]; + } +} + +- (void)addObservers { + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(deviceOrientationDidChange:) + name:@"UIDeviceOrientationDidChangeNotification" object:nil]; + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(keyboardWillShow:) name:@"UIKeyboardWillShowNotification" object:nil]; + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(keyboardWillHide:) name:@"UIKeyboardWillHideNotification" object:nil]; +} + +- (void)removeObservers { + [[NSNotificationCenter defaultCenter] removeObserver:self + name:@"UIDeviceOrientationDidChangeNotification" object:nil]; + [[NSNotificationCenter defaultCenter] removeObserver:self + name:@"UIKeyboardWillShowNotification" object:nil]; + [[NSNotificationCenter defaultCenter] removeObserver:self + name:@"UIKeyboardWillHideNotification" object:nil]; +} + +- (void)postDismissCleanup { + [self removeObservers]; + [self removeFromSuperview]; + [_modalBackgroundView removeFromSuperview]; +} + +- (void)dismiss:(BOOL)animated { + [self dialogWillDisappear]; + + // If the dialog has been closed, then we need to cancel the order to open it. + // This happens in the case of a frictionless request, see webViewDidFinishLoad for details + [NSObject cancelPreviousPerformRequestsWithTarget:self + selector:@selector(showWebView) + object:nil]; + + [_loadingURL release]; + _loadingURL = nil; + + if (animated) { + [UIView beginAnimations:nil context:nil]; + [UIView setAnimationDuration:kTransitionDuration]; + [UIView setAnimationDelegate:self]; + [UIView setAnimationDidStopSelector:@selector(postDismissCleanup)]; + self.alpha = 0; + [UIView commitAnimations]; + } else { + [self postDismissCleanup]; + } +} + +- (void)cancel { + [self dialogDidCancel:nil]; +} + +- (BOOL)testBoolUrlParam:(NSURL *)url param:(NSString *)param { + NSString *paramVal = [self getStringFromUrl: [url absoluteString] + needle: param]; + return [paramVal boolValue]; +} + +- (void)dialogSuccessHandleFrictionlessResponses:(NSURL *)url { + // did we receive a recipient list? + NSString *recipientJson = [self getStringFromUrl:[url absoluteString] + needle:@"frictionless_recipients="]; + if (recipientJson) { + // if value parses as an array, treat as set of fbids + SBJsonParser *parser = [[[SBJsonParser alloc] + init] + autorelease]; + id recipients = [parser objectWithString:recipientJson]; + + // if we got something usable, copy the ids out and update the cache + if ([recipients isKindOfClass:[NSArray class]]) { + NSMutableArray *ids = [[[NSMutableArray alloc] + initWithCapacity:[recipients count]] + autorelease]; + for (id recipient in recipients) { + NSString *fbid = [NSString stringWithFormat:@"%@", recipient]; + [ids addObject:fbid]; + } + // we may be tempted to terminate outstanding requests before this + // point, but that would cause problems if the user cancelled a dialog + [_frictionlessSettings updateRecipientCacheWithRecipients:ids]; + } + } +} + +/////////////////////////////////////////////////////////////////////////////////////////////////// +// NSObject + +- (id)init { + if ((self = [super initWithFrame:CGRectZero])) { + _delegate = nil; + _loadingURL = nil; + _showingKeyboard = NO; + + self.backgroundColor = [UIColor clearColor]; + self.autoresizesSubviews = YES; + self.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; + self.contentMode = UIViewContentModeRedraw; + + _webView = [[UIWebView alloc] initWithFrame:CGRectMake(kPadding, kPadding, 480, 480)]; + _webView.delegate = self; + _webView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; + [self addSubview:_webView]; + + UIImage* closeImage = [UIImage imageNamed:@"FBDialog.bundle/images/close.png"]; + + UIColor* color = [UIColor colorWithRed:167.0/255 green:184.0/255 blue:216.0/255 alpha:1]; + _closeButton = [[UIButton buttonWithType:UIButtonTypeCustom] retain]; + [_closeButton setImage:closeImage forState:UIControlStateNormal]; + [_closeButton setTitleColor:color forState:UIControlStateNormal]; + [_closeButton setTitleColor:[UIColor whiteColor] forState:UIControlStateHighlighted]; + [_closeButton addTarget:self action:@selector(cancel) + forControlEvents:UIControlEventTouchUpInside]; + + // To be compatible with OS 2.x +#if __IPHONE_OS_VERSION_MAX_ALLOWED <= __IPHONE_2_2 + _closeButton.font = [UIFont boldSystemFontOfSize:12]; +#else + _closeButton.titleLabel.font = [UIFont boldSystemFontOfSize:12]; +#endif + + _closeButton.showsTouchWhenHighlighted = YES; + _closeButton.autoresizingMask = UIViewAutoresizingFlexibleRightMargin + | UIViewAutoresizingFlexibleBottomMargin; + [self addSubview:_closeButton]; + + _spinner = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle: + UIActivityIndicatorViewStyleWhiteLarge]; + if ([_spinner respondsToSelector:@selector(setColor:)]) { + [_spinner setColor:[UIColor grayColor]]; + } else { + [_spinner setActivityIndicatorViewStyle:UIActivityIndicatorViewStyleGray]; + } + _spinner.autoresizingMask = + UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleBottomMargin + | UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin; + [self addSubview:_spinner]; + _modalBackgroundView = [[UIView alloc] init]; + } + return self; +} + +- (void)dealloc { + _webView.delegate = nil; + [_webView release]; + [_params release]; + [_serverURL release]; + [_spinner release]; + [_closeButton release]; + [_loadingURL release]; + [_modalBackgroundView release]; + [_frictionlessSettings release]; + [super dealloc]; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////// +// UIView + +- (void)drawRect:(CGRect)rect { + [self drawRect:rect fill:kBorderGray radius:0]; + + CGRect webRect = CGRectMake( + ceil(rect.origin.x + kBorderWidth), ceil(rect.origin.y + kBorderWidth)+1, + rect.size.width - kBorderWidth*2, _webView.frame.size.height+1); + + [self strokeLines:webRect stroke:kBorderBlack]; +} + +// Display the dialog's WebView with a slick pop-up animation +- (void)showWebView { + UIWindow* window = [UIApplication sharedApplication].keyWindow; + if (!window) { + window = [[UIApplication sharedApplication].windows objectAtIndex:0]; + } + _modalBackgroundView.frame = window.frame; + [_modalBackgroundView addSubview:self]; + [window addSubview:_modalBackgroundView]; + + self.transform = CGAffineTransformScale([self transformForOrientation], 0.001, 0.001); + [UIView beginAnimations:nil context:nil]; + [UIView setAnimationDuration:kTransitionDuration/1.5]; + [UIView setAnimationDelegate:self]; + [UIView setAnimationDidStopSelector:@selector(bounce1AnimationStopped)]; + self.transform = CGAffineTransformScale([self transformForOrientation], 1.1, 1.1); + [UIView commitAnimations]; + + [self dialogWillAppear]; + [self addObservers]; +} + +// Show a spinner during the loading time for the dialog. This is designed to show +// on top of the webview but before the contents have loaded. +- (void)showSpinner { + [_spinner sizeToFit]; + [_spinner startAnimating]; + _spinner.center = _webView.center; +} + +- (void)hideSpinner { + [_spinner stopAnimating]; + _spinner.hidden = YES; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////// +// UIWebViewDelegate + +- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request + navigationType:(UIWebViewNavigationType)navigationType { + NSURL* url = request.URL; + + if ([url.scheme isEqualToString:@"fbconnect"]) { + if ([[url.resourceSpecifier substringToIndex:8] isEqualToString:@"//cancel"]) { + NSString * errorCode = [self getStringFromUrl:[url absoluteString] needle:@"error_code="]; + NSString * errorStr = [self getStringFromUrl:[url absoluteString] needle:@"error_msg="]; + if (errorCode) { + NSDictionary * errorData = [NSDictionary dictionaryWithObject:errorStr forKey:@"error_msg"]; + NSError * error = [NSError errorWithDomain:@"facebookErrDomain" + code:[errorCode intValue] + userInfo:errorData]; + [self dismissWithError:error animated:YES]; + } else { + [self dialogDidCancel:url]; + } + } else { + if (_frictionlessSettings.enabled) { + [self dialogSuccessHandleFrictionlessResponses:url]; + } + [self dialogDidSucceed:url]; + } + return NO; + } else if ([_loadingURL isEqual:url]) { + return YES; + } else if (navigationType == UIWebViewNavigationTypeLinkClicked) { + if ([_delegate respondsToSelector:@selector(dialog:shouldOpenURLInExternalBrowser:)]) { + if (![_delegate dialog:self shouldOpenURLInExternalBrowser:url]) { + return NO; + } + } + + [[UIApplication sharedApplication] openURL:request.URL]; + return NO; + } else { + return YES; + } +} + +- (void)webViewDidFinishLoad:(UIWebView *)webView { + if (_isViewInvisible) { + // if our cache asks us to hide the view, then we do, but + // in case of a stale cache, we will display the view in a moment + // note that showing the view now would cause a visible white + // flash in the common case where the cache is up to date + [self performSelector:@selector(showWebView) withObject:nil afterDelay:.05]; + } else { + [self hideSpinner]; + } + [self updateWebOrientation]; +} + +- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error { + // 102 == WebKitErrorFrameLoadInterruptedByPolicyChange + // -999 == "Operation could not be completed", note -999 occurs when the user clicks away before + // the page has completely loaded, if we find cases where we want this to result in dialog failure + // (usually this just means quick-user), then we should add something more robust here to account + // for differences in application needs + if (!(([error.domain isEqualToString:@"NSURLErrorDomain"] && error.code == -999) || + ([error.domain isEqualToString:@"WebKitErrorDomain"] && error.code == 102))) { + [self dismissWithError:error animated:YES]; + } +} + +/////////////////////////////////////////////////////////////////////////////////////////////////// +// UIDeviceOrientationDidChangeNotification + +- (void)deviceOrientationDidChange:(void*)object { + UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation; + if (!_showingKeyboard && [self shouldRotateToOrientation:orientation]) { + [self updateWebOrientation]; + + CGFloat duration = [UIApplication sharedApplication].statusBarOrientationAnimationDuration; + [UIView beginAnimations:nil context:nil]; + [UIView setAnimationDuration:duration]; + [self sizeToFitOrientation:YES]; + [UIView commitAnimations]; + } +} + +/////////////////////////////////////////////////////////////////////////////////////////////////// +// UIKeyboardNotifications + +- (void)keyboardWillShow:(NSNotification*)notification { + + _showingKeyboard = YES; + + if (FBIsDeviceIPad()) { + // On the iPad the screen is large enough that we don't need to + // resize the dialog to accomodate the keyboard popping up + return; + } + + UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation; + if (UIInterfaceOrientationIsLandscape(orientation)) { + _webView.frame = CGRectInset(_webView.frame, + -(kPadding + kBorderWidth), + -(kPadding + kBorderWidth)); + } +} + +- (void)keyboardWillHide:(NSNotification*)notification { + _showingKeyboard = NO; + + if (FBIsDeviceIPad()) { + return; + } + UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation; + if (UIInterfaceOrientationIsLandscape(orientation)) { + _webView.frame = CGRectInset(_webView.frame, + kPadding + kBorderWidth, + kPadding + kBorderWidth); + } +} + +////////////////////////////////////////////////////////////////////////////////////////////////// +// public + +/** + * Find a specific parameter from the url + */ +- (NSString *) getStringFromUrl: (NSString*) url needle:(NSString *) needle { + NSString * str = nil; + NSRange start = [url rangeOfString:needle]; + if (start.location != NSNotFound) { + // confirm that the parameter is not a partial name match + unichar c = '?'; + if (start.location != 0) { + c = [url characterAtIndex:start.location - 1]; + } + if (c == '?' || c == '&' || c == '#') { + NSRange end = [[url substringFromIndex:start.location+start.length] rangeOfString:@"&"]; + NSUInteger offset = start.location+start.length; + str = end.location == NSNotFound ? + [url substringFromIndex:offset] : + [url substringWithRange:NSMakeRange(offset, end.location)]; + str = [str stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; + } + } + return str; +} + +- (id)initWithURL: (NSString *) serverURL + params: (NSMutableDictionary *) params + isViewInvisible: (BOOL)isViewInvisible + frictionlessSettings: (FBFrictionlessRequestSettings*) frictionlessSettings + delegate: (id ) delegate { + + self = [self init]; + _serverURL = [serverURL retain]; + _params = [params retain]; + _delegate = delegate; + _isViewInvisible = isViewInvisible; + _frictionlessSettings = [frictionlessSettings retain]; + + return self; +} + +- (void)load { + [self loadURL:_serverURL get:_params]; +} + +- (void)loadURL:(NSString*)url get:(NSDictionary*)getParams { + + [_loadingURL release]; + _loadingURL = [[self generateURL:url params:getParams] retain]; + NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:_loadingURL]; + + [_webView loadRequest:request]; +} + +- (void)show { + [self load]; + [self sizeToFitOrientation:NO]; + + CGFloat innerWidth = self.frame.size.width - (kBorderWidth+1)*2; + [_closeButton sizeToFit]; + + _closeButton.frame = CGRectMake( + 2, + 2, + 29, + 29); + + _webView.frame = CGRectMake( + kBorderWidth+1, + kBorderWidth+1, + innerWidth, + self.frame.size.height - (1 + kBorderWidth*2)); + + if (!_isViewInvisible) { + [self showSpinner]; + [self showWebView]; + } +} + +- (void)dismissWithSuccess:(BOOL)success animated:(BOOL)animated { + if (success) { + if ([_delegate respondsToSelector:@selector(dialogDidComplete:)]) { + [_delegate dialogDidComplete:self]; + } + } else { + if ([_delegate respondsToSelector:@selector(dialogDidNotComplete:)]) { + [_delegate dialogDidNotComplete:self]; + } + } + + [self dismiss:animated]; +} + +- (void)dismissWithError:(NSError*)error animated:(BOOL)animated { + if ([_delegate respondsToSelector:@selector(dialog:didFailWithError:)]) { + [_delegate dialog:self didFailWithError:error]; + } + + [self dismiss:animated]; +} + +- (void)dialogWillAppear { +} + +- (void)dialogWillDisappear { +} + +- (void)dialogDidSucceed:(NSURL *)url { + + if ([_delegate respondsToSelector:@selector(dialogCompleteWithUrl:)]) { + [_delegate dialogCompleteWithUrl:url]; + } + [self dismissWithSuccess:YES animated:YES]; +} + +- (void)dialogDidCancel:(NSURL *)url { + if ([_delegate respondsToSelector:@selector(dialogDidNotCompleteWithUrl:)]) { + [_delegate dialogDidNotCompleteWithUrl:url]; + } + [self dismissWithSuccess:NO animated:YES]; +} + +@end \ No newline at end of file diff --git a/Vendor/FacebookSDK/FBFrictionlessRequestSettings.h b/Vendor/FacebookSDK/FBFrictionlessRequestSettings.h new file mode 100644 index 0000000..a45c10a --- /dev/null +++ b/Vendor/FacebookSDK/FBFrictionlessRequestSettings.h @@ -0,0 +1,74 @@ +/* + * Copyright 2012 Facebook + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +@class Facebook; + +/** + * Do not use this interface directly, instead, use methods in Facebook.h + * + * Handles frictionless interaction and recipient-caching by the SDK, + * see https://developers.facebook.com/docs/reference/dialogs/requests/ + */ +@interface FBFrictionlessRequestSettings : NSObject { +@private + NSArray* _allowedRecipients; + FBRequest* _activeRequest; + BOOL _enabled; +} + +/** + * BOOL indicating whether frictionless request sending has been enabled + */ +@property(nonatomic, readonly) BOOL enabled; + +/** + * Enable frictionless request sending by the sdk; this means: + * 1. query and cache the current set of frictionless recipients + * 2. flag other facets of the sdk to behave in a frictionless way + */ +- (void)enableWithFacebook:(Facebook*)facebook; + +/** + * Reload recipient cache; called by the sdk to keep the cache fresh; + * method makes graph request: me/apprequestformerrecipients + */ +- (void)reloadRecipientCacheWithFacebook:(Facebook*)facebook; + +/** + * Update the recipient cache; called by the sdk to keep the cache fresh; + */ +- (void)updateRecipientCacheWithRecipients:(NSArray*)ids; + +/** + * Given an fbID for a user, indicates whether user is enabled for + * frictionless calls + */ +- (BOOL)isFrictionlessEnabledForRecipient:(id)fbid; + +/** + * Given an array of user fbIDs, indicates whether they are enabled for + * frictionless calls + */ +- (BOOL)isFrictionlessEnabledForRecipients:(NSArray*)fbids; + +/** + * init the frictionless cache object + */ +- (id)init; + +@end diff --git a/Vendor/FacebookSDK/FBFrictionlessRequestSettings.m b/Vendor/FacebookSDK/FBFrictionlessRequestSettings.m new file mode 100644 index 0000000..19d647d --- /dev/null +++ b/Vendor/FacebookSDK/FBFrictionlessRequestSettings.m @@ -0,0 +1,162 @@ +/* + * Copyright 2012 Facebook + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "Facebook.h" +#import "FBFrictionlessRequestSettings.h" + +/////////////////////////////////////////////////////////////////////////////////////////////////// +// private interface +// +@interface FBFrictionlessRequestSettings () + +@property (readwrite, retain) NSArray * allowedRecipients; +@property (readwrite, retain) FBRequest* activeRequest; + +@end + +/////////////////////////////////////////////////////////////////////////////////////////////////// + +@implementation FBFrictionlessRequestSettings + +/////////////////////////////////////////////////////////////////////////////////////////////////// +// public + +@synthesize enabled = _enabled; + +- (id)init { + if (self = [super init]) { + // start life with an empty frictionless cache + self.allowedRecipients = [[[NSArray alloc] init] autorelease]; + } + return self; +} + +- (void)enableWithFacebook:(Facebook*)facebook { + if (!_enabled) { + _enabled = true; + [self reloadRecipientCacheWithFacebook:facebook]; + } +} + +- (void)reloadRecipientCacheWithFacebook:(Facebook *)facebook { + // request the list of frictionless recipients from the server + id request = [facebook requestWithGraphPath:@"me/apprequestformerrecipients" + andDelegate:self]; + if (request) { + self.activeRequest = request; + } +} + +- (void)updateRecipientCacheWithRecipients:(NSArray*)ids { + // if setting recipients directly, no need to complete pending request + self.activeRequest = nil; + + if (ids == nil) { + self.allowedRecipients = [[[NSArray alloc] init] autorelease]; + } else { + self.allowedRecipients = [[[NSArray alloc] initWithArray:ids] autorelease]; + } +} + +- (BOOL)isFrictionlessEnabledForRecipient:(NSString *)fbid { + // trim whitespace from edges + fbid = [fbid stringByTrimmingCharactersInSet: + [NSCharacterSet whitespaceCharacterSet]]; + + // linear search through cache for a match + for (NSString *entry in self.allowedRecipients) { + if ([entry isEqualToString:fbid]) { + return YES; + } + } + return NO; +} + +- (BOOL)isFrictionlessEnabledForRecipients:(NSArray*)fbids { + // we handle arrays of NSString and NSNumber, and throw on anything else + for (id fbid in fbids) { + NSString* fbidstr; + // give us a number, and we convert it to a string + if ([fbid isKindOfClass:[NSNumber class]]) { + fbidstr = [(NSNumber*)fbid stringValue]; + } else if ([fbid isKindOfClass:[NSString class]]) { + // or give us a string, and we just use it as is + fbidstr = (NSString*)fbid; + } else { + // unexpected type found in the array of fbids + @throw [NSException exceptionWithName:NSInvalidArgumentException + reason:@"items in fbids must be NSString or NSNumber" + userInfo:[NSDictionary dictionaryWithObjectsAndKeys: + [fbid class], @"invalid class", + nil]]; + } + + // if we miss our cache once, we fail the set + if (![self isFrictionlessEnabledForRecipient:fbidstr]) { + return NO; + } + } + return YES; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////// +// FBRequestDelegate + +- (void)request:(FBRequest *)request + didLoad:(id)result { + + // a little request bookkeeping + self.activeRequest = nil; + + int items = [[result objectForKey: @"data"] count]; + NSMutableArray* recipients = [[[NSMutableArray alloc] initWithCapacity: items] autorelease]; + + for (int i = 0; i < items; i++) { + [recipients addObject: [[[result objectForKey: @"data"] + objectAtIndex: i] + objectForKey: @"recipient_id"]] ; + } + + self.allowedRecipients = recipients; +} + +- (void)request:(FBRequest *)request didFailWithError:(NSError *)error { + // if the request to load the frictionless recipients fails, proceed without updating + // the recipients cache; the cache may become invalid due to a failed update or other reasons + // (e.g. simultaneous use of the same app from multiple devices), in the case of an invalid + // cache, a request dialog may either appear a moment later than it usually would, or appear + // briefly when it should not appear at all; in either case the correct request behavior + // occurs, and the cache is updated + self.activeRequest = nil; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////// +// NSObject + +- (void)dealloc { + self.activeRequest = nil; + self.allowedRecipients = nil; + [super dealloc]; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////// +// private helpers +// + +@synthesize allowedRecipients = _allowedRecipients; +@synthesize activeRequest = _activeRequest; + +@end diff --git a/Vendor/FacebookSDK/FBLoginDialog.h b/Vendor/FacebookSDK/FBLoginDialog.h new file mode 100644 index 0000000..cd364a4 --- /dev/null +++ b/Vendor/FacebookSDK/FBLoginDialog.h @@ -0,0 +1,48 @@ +/* + * Copyright 2010 Facebook + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#import "FBDialog.h" + +@protocol FBLoginDialogDelegate; + +/** + * Do not use this interface directly, instead, use authorize in Facebook.h + * + * Facebook Login Dialog interface for start the facebook webView login dialog. + * It start pop-ups prompting for credentials and permissions. + */ + +@interface FBLoginDialog : FBDialog { + id _loginDelegate; +} + +-(id) initWithURL:(NSString *) loginURL + loginParams:(NSMutableDictionary *) params + delegate:(id ) delegate; +@end + +/////////////////////////////////////////////////////////////////////////////////////////////////// + +@protocol FBLoginDialogDelegate + +- (void)fbDialogLogin:(NSString*)token expirationDate:(NSDate*)expirationDate; + +- (void)fbDialogNotLogin:(BOOL)cancelled; + +@end + + diff --git a/Vendor/FacebookSDK/FBLoginDialog.m b/Vendor/FacebookSDK/FBLoginDialog.m new file mode 100644 index 0000000..5c70a3f --- /dev/null +++ b/Vendor/FacebookSDK/FBLoginDialog.m @@ -0,0 +1,94 @@ +/* + * Copyright 2010 Facebook + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FBDialog.h" +#import "FBLoginDialog.h" + +/////////////////////////////////////////////////////////////////////////////////////////////////// + +@implementation FBLoginDialog + +/////////////////////////////////////////////////////////////////////////////////////////////////// +// public + +/* + * initialize the FBLoginDialog with url and parameters + */ +- (id)initWithURL:(NSString*) loginURL + loginParams:(NSMutableDictionary*) params + delegate:(id ) delegate{ + + self = [super init]; + _serverURL = [loginURL retain]; + _params = [params retain]; + _loginDelegate = delegate; + return self; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////// +// FBDialog + +/** + * Override FBDialog : to call when the webView Dialog did succeed + */ +- (void) dialogDidSucceed:(NSURL*)url { + NSString *q = [url absoluteString]; + NSString *token = [self getStringFromUrl:q needle:@"access_token="]; + NSString *expTime = [self getStringFromUrl:q needle:@"expires_in="]; + NSDate *expirationDate =nil; + + if (expTime != nil) { + int expVal = [expTime intValue]; + if (expVal == 0) { + expirationDate = [NSDate distantFuture]; + } else { + expirationDate = [NSDate dateWithTimeIntervalSinceNow:expVal]; + } + } + + if ((token == (NSString *) [NSNull null]) || (token.length == 0)) { + [self dialogDidCancel:url]; + [self dismissWithSuccess:NO animated:YES]; + } else { + if ([_loginDelegate respondsToSelector:@selector(fbDialogLogin:expirationDate:)]) { + [_loginDelegate fbDialogLogin:token expirationDate:expirationDate]; + } + [self dismissWithSuccess:YES animated:YES]; + } + +} + +/** + * Override FBDialog : to call with the login dialog get canceled + */ +- (void)dialogDidCancel:(NSURL *)url { + [self dismissWithSuccess:NO animated:YES]; + if ([_loginDelegate respondsToSelector:@selector(fbDialogNotLogin:)]) { + [_loginDelegate fbDialogNotLogin:YES]; + } +} + +- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error { + if (!(([error.domain isEqualToString:@"NSURLErrorDomain"] && error.code == -999) || + ([error.domain isEqualToString:@"WebKitErrorDomain"] && error.code == 102))) { + [super webView:webView didFailLoadWithError:error]; + if ([_loginDelegate respondsToSelector:@selector(fbDialogNotLogin:)]) { + [_loginDelegate fbDialogNotLogin:NO]; + } + } +} + +@end diff --git a/Vendor/FacebookSDK/FBRequest.h b/Vendor/FacebookSDK/FBRequest.h new file mode 100644 index 0000000..7c6ee5e --- /dev/null +++ b/Vendor/FacebookSDK/FBRequest.h @@ -0,0 +1,142 @@ +/* + * Copyright 2010 Facebook + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import +#import + +@protocol FBRequestDelegate; + +enum { + kFBRequestStateReady, + kFBRequestStateLoading, + kFBRequestStateComplete, + kFBRequestStateError +}; +typedef NSUInteger FBRequestState; + +/** + * Do not use this interface directly, instead, use method in Facebook.h + */ +@interface FBRequest : NSObject { + id _delegate; + NSString* _url; + NSString* _httpMethod; + NSMutableDictionary* _params; + NSURLConnection* _connection; + NSMutableData* _responseText; + FBRequestState _state; + NSError* _error; + BOOL _sessionDidExpire; +} + + +@property(nonatomic,assign) id delegate; + +/** + * The URL which will be contacted to execute the request. + */ +@property(nonatomic,copy) NSString* url; + +/** + * The API method which will be called. + */ +@property(nonatomic,copy) NSString* httpMethod; + +/** + * The dictionary of parameters to pass to the method. + * + * These values in the dictionary will be converted to strings using the + * standard Objective-C object-to-string conversion facilities. + */ +@property(nonatomic,retain) NSMutableDictionary* params; +@property(nonatomic,retain) NSURLConnection* connection; +@property(nonatomic,retain) NSMutableData* responseText; +@property(nonatomic,readonly) FBRequestState state; +@property(nonatomic,readonly) BOOL sessionDidExpire; + +/** + * Error returned by the server in case of request's failure (or nil otherwise). + */ +@property(nonatomic,retain) NSError* error; + + ++ (NSString*)serializeURL:(NSString *)baseUrl + params:(NSDictionary *)params; + ++ (NSString*)serializeURL:(NSString *)baseUrl + params:(NSDictionary *)params + httpMethod:(NSString *)httpMethod; + ++ (FBRequest*)getRequestWithParams:(NSMutableDictionary *) params + httpMethod:(NSString *) httpMethod + delegate:(id)delegate + requestURL:(NSString *) url; +- (BOOL) loading; + +- (void) connect; + +@end + +//////////////////////////////////////////////////////////////////////////////// + +/* + *Your application should implement this delegate + */ +@protocol FBRequestDelegate + +@optional + +/** + * Called just before the request is sent to the server. + */ +- (void)requestLoading:(FBRequest *)request; + +/** + * Called when the Facebook API request has returned a response. + * + * This callback gives you access to the raw response. It's called before + * (void)request:(FBRequest *)request didLoad:(id)result, + * which is passed the parsed response object. + */ +- (void)request:(FBRequest *)request didReceiveResponse:(NSURLResponse *)response; + +/** + * Called when an error prevents the request from completing successfully. + */ +- (void)request:(FBRequest *)request didFailWithError:(NSError *)error; + +/** + * Called when a request returns and its response has been parsed into + * an object. + * + * The resulting object may be a dictionary, an array or a string, depending + * on the format of the API response. If you need access to the raw response, + * use: + * + * (void)request:(FBRequest *)request + * didReceiveResponse:(NSURLResponse *)response + */ +- (void)request:(FBRequest *)request didLoad:(id)result; + +/** + * Called when a request returns a response. + * + * The result object is the raw response from the server of type NSData + */ +- (void)request:(FBRequest *)request didLoadRawResponse:(NSData *)data; + +@end + diff --git a/Vendor/FacebookSDK/FBRequest.m b/Vendor/FacebookSDK/FBRequest.m new file mode 100644 index 0000000..dab988b --- /dev/null +++ b/Vendor/FacebookSDK/FBRequest.m @@ -0,0 +1,381 @@ +/* + * Copyright 2010 Facebook + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FBRequest.h" +#import "JSON.h" + +/////////////////////////////////////////////////////////////////////////////////////////////////// +// global + +static NSString* kUserAgent = @"FacebookConnect"; +static NSString* kStringBoundary = @"3i2ndDfv2rTHiSisAbouNdArYfORhtTPEefj3q2f"; +static const int kGeneralErrorCode = 10000; +static const int kRESTAPIAccessTokenErrorCode = 190; + +static const NSTimeInterval kTimeoutInterval = 180.0; + +/////////////////////////////////////////////////////////////////////////////////////////////////// + +@interface FBRequest () +@property (nonatomic,readwrite) FBRequestState state; +@property (nonatomic,readwrite) BOOL sessionDidExpire; +@end + +@implementation FBRequest + +@synthesize delegate = _delegate, + url = _url, + httpMethod = _httpMethod, + params = _params, + connection = _connection, + responseText = _responseText, + state = _state, + sessionDidExpire = _sessionDidExpire, + error = _error; + +////////////////////////////////////////////////////////////////////////////////////////////////// +// class public + ++ (FBRequest *)getRequestWithParams:(NSMutableDictionary *) params + httpMethod:(NSString *) httpMethod + delegate:(id) delegate + requestURL:(NSString *) url { + + FBRequest* request = [[[FBRequest alloc] init] autorelease]; + request.delegate = delegate; + request.url = url; + request.httpMethod = httpMethod; + request.params = params; + request.connection = nil; + request.responseText = nil; + + return request; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////// +// private + ++ (NSString *)serializeURL:(NSString *)baseUrl + params:(NSDictionary *)params { + return [self serializeURL:baseUrl params:params httpMethod:@"GET"]; +} + +/** + * Generate get URL + */ ++ (NSString*)serializeURL:(NSString *)baseUrl + params:(NSDictionary *)params + httpMethod:(NSString *)httpMethod { + + NSURL* parsedURL = [NSURL URLWithString:baseUrl]; + NSString* queryPrefix = parsedURL.query ? @"&" : @"?"; + + NSMutableArray* pairs = [NSMutableArray array]; + for (NSString* key in [params keyEnumerator]) { + if (([[params objectForKey:key] isKindOfClass:[UIImage class]]) + ||([[params objectForKey:key] isKindOfClass:[NSData class]])) { + if ([httpMethod isEqualToString:@"GET"]) { + NSLog(@"can not use GET to upload a file"); + } + continue; + } + + NSString* escaped_value = (NSString *)CFURLCreateStringByAddingPercentEscapes( + NULL, /* allocator */ + (CFStringRef)[params objectForKey:key], + NULL, /* charactersToLeaveUnescaped */ + (CFStringRef)@"!*'();:@&=+$,/?%#[]", + kCFStringEncodingUTF8); + + [pairs addObject:[NSString stringWithFormat:@"%@=%@", key, escaped_value]]; + [escaped_value release]; + } + NSString* query = [pairs componentsJoinedByString:@"&"]; + + return [NSString stringWithFormat:@"%@%@%@", baseUrl, queryPrefix, query]; +} + +/** + * Body append for POST method + */ +- (void)utfAppendBody:(NSMutableData *)body data:(NSString *)data { + [body appendData:[data dataUsingEncoding:NSUTF8StringEncoding]]; +} + +/** + * Generate body for POST method + */ +- (NSMutableData *)generatePostBody { + NSMutableData *body = [NSMutableData data]; + NSString *endLine = [NSString stringWithFormat:@"\r\n--%@\r\n", kStringBoundary]; + NSMutableDictionary *dataDictionary = [NSMutableDictionary dictionary]; + + [self utfAppendBody:body data:[NSString stringWithFormat:@"--%@\r\n", kStringBoundary]]; + + for (id key in [_params keyEnumerator]) { + + if (([[_params objectForKey:key] isKindOfClass:[UIImage class]]) + ||([[_params objectForKey:key] isKindOfClass:[NSData class]])) { + + [dataDictionary setObject:[_params objectForKey:key] forKey:key]; + continue; + + } + + [self utfAppendBody:body + data:[NSString + stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"\r\n\r\n", + key]]; + [self utfAppendBody:body data:[_params objectForKey:key]]; + + [self utfAppendBody:body data:endLine]; + } + + if ([dataDictionary count] > 0) { + for (id key in dataDictionary) { + NSObject *dataParam = [dataDictionary objectForKey:key]; + if ([dataParam isKindOfClass:[UIImage class]]) { + NSData* imageData = UIImagePNGRepresentation((UIImage*)dataParam); + [self utfAppendBody:body + data:[NSString stringWithFormat: + @"Content-Disposition: form-data; filename=\"%@\"\r\n", key]]; + [self utfAppendBody:body + data:[NSString stringWithString:@"Content-Type: image/png\r\n\r\n"]]; + [body appendData:imageData]; + } else { + NSAssert([dataParam isKindOfClass:[NSData class]], + @"dataParam must be a UIImage or NSData"); + [self utfAppendBody:body + data:[NSString stringWithFormat: + @"Content-Disposition: form-data; filename=\"%@\"\r\n", key]]; + [self utfAppendBody:body + data:[NSString stringWithString:@"Content-Type: content/unknown\r\n\r\n"]]; + [body appendData:(NSData*)dataParam]; + } + [self utfAppendBody:body data:endLine]; + + } + } + + return body; +} + +/** + * Formulate the NSError + */ +- (id)formError:(NSInteger)code userInfo:(NSDictionary *) errorData { + return [NSError errorWithDomain:@"facebookErrDomain" code:code userInfo:errorData]; + +} + +/** + * parse the response data + */ +- (id)parseJsonResponse:(NSData *)data error:(NSError **)error { + + NSString* responseString = [[[NSString alloc] initWithData:data + encoding:NSUTF8StringEncoding] + autorelease]; + if ([responseString isEqualToString:@"true"]) { + return [NSDictionary dictionaryWithObject:@"true" forKey:@"result"]; + } else if ([responseString isEqualToString:@"false"]) { + if (error != nil) { + *error = [self formError:kGeneralErrorCode + userInfo:[NSDictionary + dictionaryWithObject:@"This operation can not be completed" + forKey:@"error_msg"]]; + } + return nil; + } + + + SBJSON *jsonParser = [[SBJSON alloc] init]; + id result = [jsonParser objectWithString:responseString]; + [jsonParser release]; + + if (result == nil) { + return responseString; + } + + if ([result isKindOfClass:[NSDictionary class]]) { + if ([result objectForKey:@"error"] != nil) { + if (error != nil) { + *error = [self formError:kGeneralErrorCode + userInfo:result]; + } + return nil; + } + + if ([result objectForKey:@"error_code"] != nil) { + if (error != nil) { + *error = [self formError:[[result objectForKey:@"error_code"] intValue] userInfo:result]; + } + return nil; + } + + if ([result objectForKey:@"error_msg"] != nil) { + if (error != nil) { + *error = [self formError:kGeneralErrorCode userInfo:result]; + } + } + + if ([result objectForKey:@"error_reason"] != nil) { + if (error != nil) { + *error = [self formError:kGeneralErrorCode userInfo:result]; + } + } + } + + return result; + +} + +/* + * private helper function: call the delegate function when the request + * fails with error + */ +- (void)failWithError:(NSError *)error { + if ([error code] == kRESTAPIAccessTokenErrorCode) { + self.sessionDidExpire = YES; + } + if ([_delegate respondsToSelector:@selector(request:didFailWithError:)]) { + [_delegate request:self didFailWithError:error]; + } +} + +/* + * private helper function: handle the response data + */ +- (void)handleResponseData:(NSData *)data { + if ([_delegate respondsToSelector: + @selector(request:didLoadRawResponse:)]) { + [_delegate request:self didLoadRawResponse:data]; + } + + NSError* error = nil; + id result = [self parseJsonResponse:data error:&error]; + self.error = error; + + if ([_delegate respondsToSelector:@selector(request:didLoad:)] || + [_delegate respondsToSelector: + @selector(request:didFailWithError:)]) { + + if (error) { + [self failWithError:error]; + } else if ([_delegate respondsToSelector: + @selector(request:didLoad:)]) { + [_delegate request:self didLoad:result]; + } + + } + +} + + + +////////////////////////////////////////////////////////////////////////////////////////////////// +// public + +/** + * @return boolean - whether this request is processing + */ +- (BOOL)loading { + return !!_connection; +} + +/** + * make the Facebook request + */ +- (void)connect { + + if ([_delegate respondsToSelector:@selector(requestLoading:)]) { + [_delegate requestLoading:self]; + } + + NSString* url = [[self class] serializeURL:_url params:_params httpMethod:_httpMethod]; + NSMutableURLRequest* request = + [NSMutableURLRequest requestWithURL:[NSURL URLWithString:url] + cachePolicy:NSURLRequestReloadIgnoringLocalCacheData + timeoutInterval:kTimeoutInterval]; + [request setValue:kUserAgent forHTTPHeaderField:@"User-Agent"]; + + + [request setHTTPMethod:self.httpMethod]; + if ([self.httpMethod isEqualToString: @"POST"]) { + NSString* contentType = [NSString + stringWithFormat:@"multipart/form-data; boundary=%@", kStringBoundary]; + [request setValue:contentType forHTTPHeaderField:@"Content-Type"]; + + [request setHTTPBody:[self generatePostBody]]; + } + + _connection = [[NSURLConnection alloc] initWithRequest:request delegate:self]; + self.state = kFBRequestStateLoading; + self.sessionDidExpire = NO; +} + +/** + * Free internal structure + */ +- (void)dealloc { + [_connection cancel]; + [_connection release]; + [_responseText release]; + [_url release]; + [_httpMethod release]; + [_params release]; + [super dealloc]; +} + +////////////////////////////////////////////////////////////////////////////////////////////////// +// NSURLConnectionDelegate + +- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response { + _responseText = [[NSMutableData alloc] init]; + + NSHTTPURLResponse* httpResponse = (NSHTTPURLResponse*)response; + if ([_delegate respondsToSelector: + @selector(request:didReceiveResponse:)]) { + [_delegate request:self didReceiveResponse:httpResponse]; + } +} + +- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { + [_responseText appendData:data]; +} + +- (NSCachedURLResponse *)connection:(NSURLConnection *)connection + willCacheResponse:(NSCachedURLResponse*)cachedResponse { + return nil; +} + +- (void)connectionDidFinishLoading:(NSURLConnection *)connection { + [self handleResponseData:_responseText]; + + self.responseText = nil; + self.connection = nil; + self.state = kFBRequestStateComplete; +} + +- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error { + [self failWithError:error]; + + self.responseText = nil; + self.connection = nil; + self.state = kFBRequestStateComplete; +} + +@end diff --git a/Vendor/FacebookSDK/Facebook.h b/Vendor/FacebookSDK/Facebook.h new file mode 100644 index 0000000..e1f4f6e --- /dev/null +++ b/Vendor/FacebookSDK/Facebook.h @@ -0,0 +1,153 @@ +/* + * Copyright 2010 Facebook + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "FBLoginDialog.h" +#import "FBRequest.h" + +@class FBFrictionlessRequestSettings; +@protocol FBSessionDelegate; + +/** + * Main Facebook interface for interacting with the Facebook developer API. + * Provides methods to log in and log out a user, make requests using the REST + * and Graph APIs, and start user interface interactions (such as + * pop-ups promoting for credentials, permissions, stream posts, etc.) + */ +@interface Facebook : NSObject{ + NSString* _accessToken; + NSDate* _expirationDate; + id _sessionDelegate; + NSMutableSet* _requests; + FBDialog* _loginDialog; + FBDialog* _fbDialog; + NSString* _appId; + NSString* _urlSchemeSuffix; + NSArray* _permissions; + BOOL _isExtendingAccessToken; + FBRequest *_requestExtendingAccessToken; + NSDate* _lastAccessTokenUpdate; + FBFrictionlessRequestSettings* _frictionlessRequestSettings; +} + +@property(nonatomic, copy) NSString* accessToken; +@property(nonatomic, copy) NSDate* expirationDate; +@property(nonatomic, assign) id sessionDelegate; +@property(nonatomic, copy) NSString* urlSchemeSuffix; +@property(nonatomic, readonly, getter=isFrictionlessRequestsEnabled) + BOOL isFrictionlessRequestsEnabled; + +- (id)initWithAppId:(NSString *)appId + andDelegate:(id)delegate; + +- (id)initWithAppId:(NSString *)appId + urlSchemeSuffix:(NSString *)urlSchemeSuffix + andDelegate:(id)delegate; + +- (void)authorize:(NSArray *)permissions; + +- (void)extendAccessToken; + +- (void)extendAccessTokenIfNeeded; + +- (BOOL)shouldExtendAccessToken; + +- (BOOL)handleOpenURL:(NSURL *)url; + +- (void)logout; + +- (void)logout:(id)delegate; + +- (FBRequest*)requestWithParams:(NSMutableDictionary *)params + andDelegate:(id )delegate; + +- (FBRequest*)requestWithMethodName:(NSString *)methodName + andParams:(NSMutableDictionary *)params + andHttpMethod:(NSString *)httpMethod + andDelegate:(id )delegate; + +- (FBRequest*)requestWithGraphPath:(NSString *)graphPath + andDelegate:(id )delegate; + +- (FBRequest*)requestWithGraphPath:(NSString *)graphPath + andParams:(NSMutableDictionary *)params + andDelegate:(id )delegate; + +- (FBRequest*)requestWithGraphPath:(NSString *)graphPath + andParams:(NSMutableDictionary *)params + andHttpMethod:(NSString *)httpMethod + andDelegate:(id )delegate; + +- (void)dialog:(NSString *)action + andDelegate:(id)delegate; + +- (void)dialog:(NSString *)action + andParams:(NSMutableDictionary *)params + andDelegate:(id )delegate; + +- (BOOL)isSessionValid; + +- (void)enableFrictionlessRequests; + +- (void)reloadFrictionlessRecipientCache; + +- (BOOL)isFrictionlessEnabledForRecipient:(id)fbid; + +- (BOOL)isFrictionlessEnabledForRecipients:(NSArray*)fbids; + +@end + +//////////////////////////////////////////////////////////////////////////////// + +/** + * Your application should implement this delegate to receive session callbacks. + */ +@protocol FBSessionDelegate + +/** + * Called when the user successfully logged in. + */ +- (void)fbDidLogin; + +/** + * Called when the user dismissed the dialog without logging in. + */ +- (void)fbDidNotLogin:(BOOL)cancelled; + +/** + * Called after the access token was extended. If your application has any + * references to the previous access token (for example, if your application + * stores the previous access token in persistent storage), your application + * should overwrite the old access token with the new one in this method. + * See extendAccessToken for more details. + */ +- (void)fbDidExtendToken:(NSString*)accessToken + expiresAt:(NSDate*)expiresAt; + +/** + * Called when the user logged out. + */ +- (void)fbDidLogout; + +/** + * Called when the current session has expired. This might happen when: + * - the access token expired + * - the app has been disabled + * - the user revoked the app's permissions + * - the user changed his or her password + */ +- (void)fbSessionInvalidated; + +@end diff --git a/Vendor/FacebookSDK/Facebook.m b/Vendor/FacebookSDK/Facebook.m new file mode 100644 index 0000000..914cdfe --- /dev/null +++ b/Vendor/FacebookSDK/Facebook.m @@ -0,0 +1,848 @@ +/* + * Copyright 2010 Facebook + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "Facebook.h" +#import "FBFrictionlessRequestSettings.h" +#import "FBLoginDialog.h" +#import "FBRequest.h" +#import "JSON.h" + +static NSString* kDialogBaseURL = @"https://m.facebook.com/dialog/"; +static NSString* kGraphBaseURL = @"https://graph.facebook.com/"; +static NSString* kRestserverBaseURL = @"https://api.facebook.com/method/"; + +static NSString* kFBAppAuthURLScheme = @"fbauth"; +static NSString* kFBAppAuthURLPath = @"authorize"; +static NSString* kRedirectURL = @"fbconnect://success"; + +static NSString* kLogin = @"oauth"; +static NSString* kApprequests = @"apprequests"; +static NSString* kSDK = @"ios"; +static NSString* kSDKVersion = @"2"; + +// If the last time we extended the access token was more than 24 hours ago +// we try to refresh the access token again. +static const int kTokenExtendThreshold = 24; + +static NSString *requestFinishedKeyPath = @"state"; +static void *finishedContext = @"finishedContext"; + +/////////////////////////////////////////////////////////////////////////////////////////////////// + +@interface Facebook () + +// private properties +@property(nonatomic, retain) NSArray* permissions; +@property(nonatomic, copy) NSString* appId; + +@end + +/////////////////////////////////////////////////////////////////////////////////////////////////// + +@implementation Facebook + +@synthesize accessToken = _accessToken, + expirationDate = _expirationDate, + sessionDelegate = _sessionDelegate, + permissions = _permissions, + urlSchemeSuffix = _urlSchemeSuffix, + appId = _appId; + + +/////////////////////////////////////////////////////////////////////////////////////////////////// +// private + + +- (id)initWithAppId:(NSString *)appId + andDelegate:(id)delegate { + self = [self initWithAppId:appId urlSchemeSuffix:nil andDelegate:delegate]; + return self; +} + +/** + * Initialize the Facebook object with application ID. + * + * @param appId the facebook app id + * @param urlSchemeSuffix + * urlSchemeSuffix is a string of lowercase letters that is + * appended to the base URL scheme used for SSO. For example, + * if your facebook ID is "350685531728" and you set urlSchemeSuffix to + * "abcd", the Facebook app will expect your application to bind to + * the following URL scheme: "fb350685531728abcd". + * This is useful if your have multiple iOS applications that + * share a single Facebook application id (for example, if you + * have a free and a paid version on the same app) and you want + * to use SSO with both apps. Giving both apps different + * urlSchemeSuffix values will allow the Facebook app to disambiguate + * their URL schemes and always redirect the user back to the + * correct app, even if both the free and the app is installed + * on the device. + * urlSchemeSuffix is supported on version 3.4.1 and above of the Facebook + * app. If the user has an older version of the Facebook app + * installed and your app uses urlSchemeSuffix parameter, the SDK will + * proceed as if the Facebook app isn't installed on the device + * and redirect the user to Safari. + * @param delegate the FBSessionDelegate + */ +- (id)initWithAppId:(NSString *)appId + urlSchemeSuffix:(NSString *)urlSchemeSuffix + andDelegate:(id)delegate { + + self = [super init]; + if (self) { + _requests = [[NSMutableSet alloc] init]; + _lastAccessTokenUpdate = [[NSDate distantPast] retain]; + _frictionlessRequestSettings = [[FBFrictionlessRequestSettings alloc] init]; + self.appId = appId; + self.sessionDelegate = delegate; + self.urlSchemeSuffix = urlSchemeSuffix; + } + return self; +} + +/** + * Override NSObject : free the space + */ +- (void)dealloc { + // this is the one case where the delegate is this object + _requestExtendingAccessToken.delegate = nil; + for (FBRequest* _request in _requests) { + [_request removeObserver:self forKeyPath:requestFinishedKeyPath]; + } + [_lastAccessTokenUpdate release]; + [_accessToken release]; + [_expirationDate release]; + [_requests release]; + [_loginDialog release]; + [_fbDialog release]; + [_appId release]; + [_permissions release]; + [_urlSchemeSuffix release]; + [_frictionlessRequestSettings release]; + [super dealloc]; +} + +- (void)invalidateSession { + self.accessToken = nil; + self.expirationDate = nil; + + NSHTTPCookieStorage* cookies = [NSHTTPCookieStorage sharedHTTPCookieStorage]; + NSArray* facebookCookies = [cookies cookiesForURL: + [NSURL URLWithString:@"http://login.facebook.com"]]; + + for (NSHTTPCookie* cookie in facebookCookies) { + [cookies deleteCookie:cookie]; + } + + // setting to nil also terminates any active request for whitelist + [_frictionlessRequestSettings updateRecipientCacheWithRecipients:nil]; +} + +/** + * A private helper function for sending HTTP requests. + * + * @param url + * url to send http request + * @param params + * parameters to append to the url + * @param httpMethod + * http method @"GET" or @"POST" + * @param delegate + * Callback interface for notifying the calling application when + * the request has received response + */ +- (FBRequest*)openUrl:(NSString *)url + params:(NSMutableDictionary *)params + httpMethod:(NSString *)httpMethod + delegate:(id)delegate { + + [params setValue:@"json" forKey:@"format"]; + [params setValue:kSDK forKey:@"sdk"]; + [params setValue:kSDKVersion forKey:@"sdk_version"]; + if ([self isSessionValid]) { + [params setValue:self.accessToken forKey:@"access_token"]; + } + + [self extendAccessTokenIfNeeded]; + + FBRequest* _request = [FBRequest getRequestWithParams:params + httpMethod:httpMethod + delegate:delegate + requestURL:url]; + [_requests addObject:_request]; + [_request addObserver:self forKeyPath:requestFinishedKeyPath options:0 context:finishedContext]; + [_request connect]; + return _request; +} + +- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { + if (context == finishedContext) { + FBRequest* _request = (FBRequest*)object; + FBRequestState requestState = [_request state]; + if (requestState == kFBRequestStateComplete) { + if ([_request sessionDidExpire]) { + [self invalidateSession]; + if ([self.sessionDelegate respondsToSelector:@selector(fbSessionInvalidated)]) { + [self.sessionDelegate fbSessionInvalidated]; + } + } + [_request removeObserver:self forKeyPath:requestFinishedKeyPath]; + [_requests removeObject:_request]; + } + } +} + +/** + * A private function for getting the app's base url. + */ +- (NSString *)getOwnBaseUrl { + return [NSString stringWithFormat:@"fb%@%@://authorize", + _appId, + _urlSchemeSuffix ? _urlSchemeSuffix : @""]; +} + +/** + * A private function for opening the authorization dialog. + */ +- (void)authorizeWithFBAppAuth:(BOOL)tryFBAppAuth + safariAuth:(BOOL)trySafariAuth { + NSMutableDictionary* params = [NSMutableDictionary dictionaryWithObjectsAndKeys: + _appId, @"client_id", + @"user_agent", @"type", + kRedirectURL, @"redirect_uri", + @"touch", @"display", + kSDK, @"sdk", + nil]; + + NSString *loginDialogURL = [kDialogBaseURL stringByAppendingString:kLogin]; + + if (_permissions != nil) { + NSString* scope = [_permissions componentsJoinedByString:@","]; + [params setValue:scope forKey:@"scope"]; + } + + if (_urlSchemeSuffix) { + [params setValue:_urlSchemeSuffix forKey:@"local_client_id"]; + } + + // If the device is running a version of iOS that supports multitasking, + // try to obtain the access token from the Facebook app installed + // on the device. + // If the Facebook app isn't installed or it doesn't support + // the fbauth:// URL scheme, fall back on Safari for obtaining the access token. + // This minimizes the chance that the user will have to enter his or + // her credentials in order to authorize the application. + BOOL didOpenOtherApp = NO; + UIDevice *device = [UIDevice currentDevice]; + if ([device respondsToSelector:@selector(isMultitaskingSupported)] && [device isMultitaskingSupported]) { + if (tryFBAppAuth) { + NSString *scheme = kFBAppAuthURLScheme; + if (_urlSchemeSuffix) { + scheme = [scheme stringByAppendingString:@"2"]; + } + NSString *urlPrefix = [NSString stringWithFormat:@"%@://%@", scheme, kFBAppAuthURLPath]; + NSString *fbAppUrl = [FBRequest serializeURL:urlPrefix params:params]; + didOpenOtherApp = [[UIApplication sharedApplication] openURL:[NSURL URLWithString:fbAppUrl]]; + } + + if (trySafariAuth && !didOpenOtherApp) { + NSString *nextUrl = [self getOwnBaseUrl]; + [params setValue:nextUrl forKey:@"redirect_uri"]; + + NSString *fbAppUrl = [FBRequest serializeURL:loginDialogURL params:params]; + didOpenOtherApp = [[UIApplication sharedApplication] openURL:[NSURL URLWithString:fbAppUrl]]; + } + } + + // If single sign-on failed, open an inline login dialog. This will require the user to + // enter his or her credentials. + if (!didOpenOtherApp) { + [_loginDialog release]; + _loginDialog = [[FBLoginDialog alloc] initWithURL:loginDialogURL + loginParams:params + delegate:self]; + [_loginDialog show]; + } +} + +/** + * A function for parsing URL parameters. + */ +- (NSDictionary*)parseURLParams:(NSString *)query { + NSArray *pairs = [query componentsSeparatedByString:@"&"]; + NSMutableDictionary *params = [[[NSMutableDictionary alloc] init] autorelease]; + for (NSString *pair in pairs) { + NSArray *kv = [pair componentsSeparatedByString:@"="]; + NSString *val = + [[kv objectAtIndex:1] + stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; + + [params setObject:val forKey:[kv objectAtIndex:0]]; + } + return params; +} + + +/////////////////////////////////////////////////////////////////////////////////////////////////// +//public + +/** + * Starts a dialog which prompts the user to log in to Facebook and grant + * the requested permissions to the application. + * + * If the device supports multitasking, we use fast app switching to show + * the dialog in the Facebook app or, if the Facebook app isn't installed, + * in Safari (this enables single sign-on by allowing multiple apps on + * the device to share the same user session). + * When the user grants or denies the permissions, the app that + * showed the dialog (the Facebook app or Safari) redirects back to + * the calling application, passing in the URL the access token + * and/or any other parameters the Facebook backend includes in + * the result (such as an error code if an error occurs). + * + * See http://developers.facebook.com/docs/authentication/ for more details. + * + * Also note that requests may be made to the API without calling + * authorize() first, in which case only public information is returned. + * + * @param permissions + * A list of permission required for this application: e.g. + * "read_stream", "publish_stream", or "offline_access". see + * http://developers.facebook.com/docs/authentication/permissions + * This parameter should not be null -- if you do not require any + * permissions, then pass in an empty String array. + * @param delegate + * Callback interface for notifying the calling application when + * the user has logged in. + */ +- (void)authorize:(NSArray *)permissions { + self.permissions = permissions; + + [self authorizeWithFBAppAuth:YES safariAuth:YES]; +} + +/** + * Attempt to extend the access token. + * + * Access tokens typically expire within 30-60 days. When the user uses the + * app, the app should periodically try to obtain a new access token. Once an + * access token has expired, the app can no longer renew it. The app then has + * to ask the user to re-authorize it to obtain a new access token. + * + * To ensure your app always has a fresh access token for active users, it's + * recommended that you call extendAccessTokenIfNeeded in your application's + * applicationDidBecomeActive: UIApplicationDelegate method. + */ +- (void)extendAccessToken { + if (_isExtendingAccessToken) { + return; + } + _isExtendingAccessToken = YES; + NSMutableDictionary* params = [NSMutableDictionary dictionaryWithObjectsAndKeys: + @"auth.extendSSOAccessToken", @"method", + nil]; + _requestExtendingAccessToken = [self requestWithParams:params andDelegate:self]; +} + +/** + * Calls extendAccessToken if shouldExtendAccessToken returns YES. + */ +- (void)extendAccessTokenIfNeeded { + if ([self shouldExtendAccessToken]) { + [self extendAccessToken]; + } +} + +/** + * Returns YES if the last time a new token was obtained was over 24 hours ago. + */ +- (BOOL)shouldExtendAccessToken { + if ([self isSessionValid]){ + NSCalendar *calendar = [[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] autorelease]; + NSDateComponents *components = [calendar components:NSHourCalendarUnit + fromDate:_lastAccessTokenUpdate + toDate:[NSDate date] + options:0]; + + if (components.hour >= kTokenExtendThreshold) { + return YES; + } + } + return NO; +} + +/** + * This function processes the URL the Facebook application or Safari used to + * open your application during a single sign-on flow. + * + * You MUST call this function in your UIApplicationDelegate's handleOpenURL + * method (see + * http://developer.apple.com/library/ios/#documentation/uikit/reference/UIApplicationDelegate_Protocol/Reference/Reference.html + * for more info). + * + * This will ensure that the authorization process will proceed smoothly once the + * Facebook application or Safari redirects back to your application. + * + * @param URL the URL that was passed to the application delegate's handleOpenURL method. + * + * @return YES if the URL starts with 'fb[app_id]://authorize and hence was handled + * by SDK, NO otherwise. + */ +- (BOOL)handleOpenURL:(NSURL *)url { + // If the URL's structure doesn't match the structure used for Facebook authorization, abort. + if (![[url absoluteString] hasPrefix:[self getOwnBaseUrl]]) { + return NO; + } + + NSString *query = [url fragment]; + + // Version 3.2.3 of the Facebook app encodes the parameters in the query but + // version 3.3 and above encode the parameters in the fragment. To support + // both versions of the Facebook app, we try to parse the query if + // the fragment is missing. + if (!query) { + query = [url query]; + } + + NSDictionary *params = [self parseURLParams:query]; + NSString *accessToken = [params objectForKey:@"access_token"]; + + // If the URL doesn't contain the access token, an error has occurred. + if (!accessToken) { + NSString *errorReason = [params objectForKey:@"error"]; + + // If the error response indicates that we should try again using Safari, open + // the authorization dialog in Safari. + if (errorReason && [errorReason isEqualToString:@"service_disabled_use_browser"]) { + [self authorizeWithFBAppAuth:NO safariAuth:YES]; + return YES; + } + + // If the error response indicates that we should try the authorization flow + // in an inline dialog, do that. + if (errorReason && [errorReason isEqualToString:@"service_disabled"]) { + [self authorizeWithFBAppAuth:NO safariAuth:NO]; + return YES; + } + + // The facebook app may return an error_code parameter in case it + // encounters a UIWebViewDelegate error. This should not be treated + // as a cancel. + NSString *errorCode = [params objectForKey:@"error_code"]; + + BOOL userDidCancel = + !errorCode && (!errorReason || [errorReason isEqualToString:@"access_denied"]); + [self fbDialogNotLogin:userDidCancel]; + return YES; + } + + // We have an access token, so parse the expiration date. + NSString *expTime = [params objectForKey:@"expires_in"]; + NSDate *expirationDate = [NSDate distantFuture]; + if (expTime != nil) { + int expVal = [expTime intValue]; + if (expVal != 0) { + expirationDate = [NSDate dateWithTimeIntervalSinceNow:expVal]; + } + } + + [self fbDialogLogin:accessToken expirationDate:expirationDate]; + return YES; +} + +/** + * Invalidate the current user session by removing the access token in + * memory and clearing the browser cookie. + * + * Note that this method dosen't unauthorize the application -- + * it just removes the access token. To unauthorize the application, + * the user must remove the app in the app settings page under the privacy + * settings screen on facebook.com. + */ +- (void)logout { + [self invalidateSession]; + + if ([self.sessionDelegate respondsToSelector:@selector(fbDidLogout)]) { + [self.sessionDelegate fbDidLogout]; + } +} + +/** + * Invalidate the current user session by removing the access token in + * memory and clearing the browser cookie. + * + * @deprecated Use of a single session delegate, set at app init, is preferred + */ +- (void)logout:(id)delegate { + [self logout]; + // preserve deprecated callback behavior, but leave cached delegate intact + // avoid calling twice if the passed and cached delegates are the same + if (delegate != self.sessionDelegate && + [delegate respondsToSelector:@selector(fbDidLogout)]) { + [delegate fbDidLogout]; + } +} + +/** + * Make a request to Facebook's REST API with the given + * parameters. One of the parameter keys must be "method" and its value + * should be a valid REST server API method. + * + * See http://developers.facebook.com/docs/reference/rest/ + * + * @param parameters + * Key-value pairs of parameters to the request. Refer to the + * documentation: one of the parameters must be "method". + * @param delegate + * Callback interface for notifying the calling application when + * the request has received response + * @return FBRequest* + * Returns a pointer to the FBRequest object. + */ +- (FBRequest*)requestWithParams:(NSMutableDictionary *)params + andDelegate:(id )delegate { + if ([params objectForKey:@"method"] == nil) { + NSLog(@"API Method must be specified"); + return nil; + } + + NSString * methodName = [params objectForKey:@"method"]; + [params removeObjectForKey:@"method"]; + + return [self requestWithMethodName:methodName + andParams:params + andHttpMethod:@"GET" + andDelegate:delegate]; +} + +/** + * Make a request to Facebook's REST API with the given method name and + * parameters. + * + * See http://developers.facebook.com/docs/reference/rest/ + * + * + * @param methodName + * a valid REST server API method. + * @param parameters + * Key-value pairs of parameters to the request. Refer to the + * documentation: one of the parameters must be "method". To upload + * a file, you should specify the httpMethod to be "POST" and the + * “params” you passed in should contain a value of the type + * (UIImage *) or (NSData *) which contains the content that you + * want to upload + * @param delegate + * Callback interface for notifying the calling application when + * the request has received response + * @return FBRequest* + * Returns a pointer to the FBRequest object. + */ +- (FBRequest*)requestWithMethodName:(NSString *)methodName + andParams:(NSMutableDictionary *)params + andHttpMethod:(NSString *)httpMethod + andDelegate:(id )delegate { + NSString * fullURL = [kRestserverBaseURL stringByAppendingString:methodName]; + return [self openUrl:fullURL + params:params + httpMethod:httpMethod + delegate:delegate]; +} + +/** + * Make a request to the Facebook Graph API without any parameters. + * + * See http://developers.facebook.com/docs/api + * + * @param graphPath + * Path to resource in the Facebook graph, e.g., to fetch data + * about the currently logged authenticated user, provide "me", + * which will fetch http://graph.facebook.com/me + * @param delegate + * Callback interface for notifying the calling application when + * the request has received response + * @return FBRequest* + * Returns a pointer to the FBRequest object. + */ +- (FBRequest*)requestWithGraphPath:(NSString *)graphPath + andDelegate:(id )delegate { + + return [self requestWithGraphPath:graphPath + andParams:[NSMutableDictionary dictionary] + andHttpMethod:@"GET" + andDelegate:delegate]; +} + +/** + * Make a request to the Facebook Graph API with the given string + * parameters using an HTTP GET (default method). + * + * See http://developers.facebook.com/docs/api + * + * + * @param graphPath + * Path to resource in the Facebook graph, e.g., to fetch data + * about the currently logged authenticated user, provide "me", + * which will fetch http://graph.facebook.com/me + * @param parameters + * key-value string parameters, e.g. the path "search" with + * parameters "q" : "facebook" would produce a query for the + * following graph resource: + * https://graph.facebook.com/search?q=facebook + * @param delegate + * Callback interface for notifying the calling application when + * the request has received response + * @return FBRequest* + * Returns a pointer to the FBRequest object. + */ +- (FBRequest*)requestWithGraphPath:(NSString *)graphPath + andParams:(NSMutableDictionary *)params + andDelegate:(id )delegate { + + return [self requestWithGraphPath:graphPath + andParams:params + andHttpMethod:@"GET" + andDelegate:delegate]; +} + +/** + * Make a request to the Facebook Graph API with the given + * HTTP method and string parameters. Note that binary data parameters + * (e.g. pictures) are not yet supported by this helper function. + * + * See http://developers.facebook.com/docs/api + * + * + * @param graphPath + * Path to resource in the Facebook graph, e.g., to fetch data + * about the currently logged authenticated user, provide "me", + * which will fetch http://graph.facebook.com/me + * @param parameters + * key-value string parameters, e.g. the path "search" with + * parameters {"q" : "facebook"} would produce a query for the + * following graph resource: + * https://graph.facebook.com/search?q=facebook + * To upload a file, you should specify the httpMethod to be + * "POST" and the “params” you passed in should contain a value + * of the type (UIImage *) or (NSData *) which contains the + * content that you want to upload + * @param httpMethod + * http verb, e.g. "GET", "POST", "DELETE" + * @param delegate + * Callback interface for notifying the calling application when + * the request has received response + * @return FBRequest* + * Returns a pointer to the FBRequest object. + */ +- (FBRequest*)requestWithGraphPath:(NSString *)graphPath + andParams:(NSMutableDictionary *)params + andHttpMethod:(NSString *)httpMethod + andDelegate:(id )delegate { + + NSString * fullURL = [kGraphBaseURL stringByAppendingString:graphPath]; + return [self openUrl:fullURL + params:params + httpMethod:httpMethod + delegate:delegate]; +} + +/** + * Generate a UI dialog for the request action. + * + * @param action + * String representation of the desired method: e.g. "login", + * "feed", ... + * @param delegate + * Callback interface to notify the calling application when the + * dialog has completed. + */ +- (void)dialog:(NSString *)action + andDelegate:(id)delegate { + NSMutableDictionary * params = [NSMutableDictionary dictionary]; + [self dialog:action andParams:params andDelegate:delegate]; +} + +/** + * Generate a UI dialog for the request action with the provided parameters. + * + * @param action + * String representation of the desired method: e.g. "login", + * "feed", ... + * @param parameters + * key-value string parameters + * @param delegate + * Callback interface to notify the calling application when the + * dialog has completed. + */ +- (void)dialog:(NSString *)action + andParams:(NSMutableDictionary *)params + andDelegate:(id )delegate { + + [_fbDialog release]; + + NSString *dialogURL = [kDialogBaseURL stringByAppendingString:action]; + [params setObject:@"touch" forKey:@"display"]; + [params setObject:kSDKVersion forKey:@"sdk"]; + [params setObject:kRedirectURL forKey:@"redirect_uri"]; + + if ([action isEqualToString:kLogin]) { + [params setObject:@"user_agent" forKey:@"type"]; + _fbDialog = [[FBLoginDialog alloc] initWithURL:dialogURL loginParams:params delegate:self]; + } else { + [params setObject:_appId forKey:@"app_id"]; + if ([self isSessionValid]) { + [params setValue:[self.accessToken stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding] + forKey:@"access_token"]; + [self extendAccessTokenIfNeeded]; + } + + // by default we show dialogs, frictionless cases may have a hidden view + BOOL invisible = NO; + + // frictionless handling for application requests + if ([action isEqualToString:kApprequests]) { + // if frictionless requests are enabled + if (self.isFrictionlessRequestsEnabled) { + // 1. show the "Don't show this again for these friends" checkbox + // 2. if the developer is sending a targeted request, then skip the loading screen + [params setValue:@"1" forKey:@"frictionless"]; + // 3. request the frictionless recipient list encoded in the success url + [params setValue:@"1" forKey:@"get_frictionless_recipients"]; + } + + // set invisible if all recipients are enabled for frictionless requests + id fbid = [params objectForKey:@"to"]; + if (fbid != nil) { + // if value parses as a json array expression get the list that way + SBJsonParser *parser = [[[SBJsonParser alloc] init] autorelease]; + id fbids = [parser objectWithString:fbid]; + if (![fbids isKindOfClass:[NSArray class]]) { + // otherwise seperate by commas (handles the singleton case too) + fbids = [fbid componentsSeparatedByString:@","]; + } + invisible = [self isFrictionlessEnabledForRecipients:fbids]; + } + } + + _fbDialog = [[FBDialog alloc] initWithURL:dialogURL + params:params + isViewInvisible:invisible + frictionlessSettings:_frictionlessRequestSettings + delegate:delegate]; + } + + [_fbDialog show]; +} + +- (BOOL)isFrictionlessRequestsEnabled { + return _frictionlessRequestSettings.enabled; +} + +- (void)enableFrictionlessRequests { + [_frictionlessRequestSettings enableWithFacebook:self]; +} + +- (void)reloadFrictionlessRecipientCache { + [_frictionlessRequestSettings reloadRecipientCacheWithFacebook:self]; +} + +- (BOOL)isFrictionlessEnabledForRecipient:(NSString*)fbid { + return [_frictionlessRequestSettings isFrictionlessEnabledForRecipient:fbid]; +} + +- (BOOL)isFrictionlessEnabledForRecipients:(NSArray*)fbids { + return [_frictionlessRequestSettings isFrictionlessEnabledForRecipients:fbids]; +} + +/** + * @return boolean - whether this object has an non-expired session token + */ +- (BOOL)isSessionValid { + return (self.accessToken != nil && self.expirationDate != nil + && NSOrderedDescending == [self.expirationDate compare:[NSDate date]]); + +} + +/////////////////////////////////////////////////////////////////////////////////////////////////// +//FBLoginDialogDelegate + +/** + * Set the authToken and expirationDate after login succeed + */ +- (void)fbDialogLogin:(NSString *)token expirationDate:(NSDate *)expirationDate { + self.accessToken = token; + self.expirationDate = expirationDate; + [_lastAccessTokenUpdate release]; + _lastAccessTokenUpdate = [[NSDate date] retain]; + [self reloadFrictionlessRecipientCache]; + if ([self.sessionDelegate respondsToSelector:@selector(fbDidLogin)]) { + [self.sessionDelegate fbDidLogin]; + } + +} + +/** + * Did not login call the not login delegate + */ +- (void)fbDialogNotLogin:(BOOL)cancelled { + if ([self.sessionDelegate respondsToSelector:@selector(fbDidNotLogin:)]) { + [self.sessionDelegate fbDidNotLogin:cancelled]; + } +} + +#pragma mark - FBRequestDelegate Methods +// These delegate methods are only called for requests that extendAccessToken initiated + +- (void)request:(FBRequest *)request didFailWithError:(NSError *)error { + _isExtendingAccessToken = NO; + _requestExtendingAccessToken = nil; +} + +- (void)request:(FBRequest *)request didLoad:(id)result { + _isExtendingAccessToken = NO; + _requestExtendingAccessToken = nil; + NSString* accessToken = [result objectForKey:@"access_token"]; + NSString* expTime = [result objectForKey:@"expires_at"]; + + if (accessToken == nil || expTime == nil) { + return; + } + + self.accessToken = accessToken; + + NSTimeInterval timeInterval = [expTime doubleValue]; + NSDate *expirationDate = [NSDate distantFuture]; + if (timeInterval != 0) { + expirationDate = [NSDate dateWithTimeIntervalSince1970:timeInterval]; + } + self.expirationDate = expirationDate; + [_lastAccessTokenUpdate release]; + _lastAccessTokenUpdate = [[NSDate date] retain]; + + if ([self.sessionDelegate respondsToSelector:@selector(fbDidExtendToken:expiresAt:)]) { + [self.sessionDelegate fbDidExtendToken:accessToken expiresAt:expirationDate]; + } +} + +- (void)request:(FBRequest *)request didLoadRawResponse:(NSData *)data { +} + +- (void)request:(FBRequest *)request didReceiveResponse:(NSURLResponse *)response{ +} + +- (void)requestLoading:(FBRequest *)request{ +} + +@end diff --git a/Vendor/FacebookSDK/JSON/JSON.h b/Vendor/FacebookSDK/JSON/JSON.h new file mode 100644 index 0000000..1e58c9a --- /dev/null +++ b/Vendor/FacebookSDK/JSON/JSON.h @@ -0,0 +1,50 @@ +/* + Copyright (C) 2009 Stig Brautaset. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + * Neither the name of the author nor the names of its contributors may be used + to endorse or promote products derived from this software without specific + prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + @mainpage A strict JSON parser and generator for Objective-C + + JSON (JavaScript Object Notation) is a lightweight data-interchange + format. This framework provides two apis for parsing and generating + JSON. One standard object-based and a higher level api consisting of + categories added to existing Objective-C classes. + + Learn more on the http://code.google.com/p/json-framework project site. + + This framework does its best to be as strict as possible, both in what it + accepts and what it generates. For example, it does not support trailing commas + in arrays or objects. Nor does it support embedded comments, or + anything else not in the JSON specification. This is considered a feature. + +*/ + +#import "SBJSON.h" +#import "NSObject+SBJSON.h" +#import "NSString+SBJSON.h" + diff --git a/Vendor/FacebookSDK/JSON/NSObject+SBJSON.h b/Vendor/FacebookSDK/JSON/NSObject+SBJSON.h new file mode 100644 index 0000000..ecf0ee4 --- /dev/null +++ b/Vendor/FacebookSDK/JSON/NSObject+SBJSON.h @@ -0,0 +1,68 @@ +/* + Copyright (C) 2009 Stig Brautaset. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + * Neither the name of the author nor the names of its contributors may be used + to endorse or promote products derived from this software without specific + prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#import + + +/** + @brief Adds JSON generation to Foundation classes + + This is a category on NSObject that adds methods for returning JSON representations + of standard objects to the objects themselves. This means you can call the + -JSONRepresentation method on an NSArray object and it'll do what you want. + */ +@interface NSObject (NSObject_SBJSON) + +/** + @brief Returns a string containing the receiver encoded as a JSON fragment. + + This method is added as a category on NSObject but is only actually + supported for the following objects: + @li NSDictionary + @li NSArray + @li NSString + @li NSNumber (also used for booleans) + @li NSNull + + @deprecated Given we bill ourselves as a "strict" JSON library, this method should be removed. + */ +- (NSString *)JSONFragment; + +/** + @brief Returns a string containing the receiver encoded in JSON. + + This method is added as a category on NSObject but is only actually + supported for the following objects: + @li NSDictionary + @li NSArray + */ +- (NSString *)JSONRepresentation; + +@end + diff --git a/Vendor/FacebookSDK/JSON/NSObject+SBJSON.m b/Vendor/FacebookSDK/JSON/NSObject+SBJSON.m new file mode 100644 index 0000000..20b084b --- /dev/null +++ b/Vendor/FacebookSDK/JSON/NSObject+SBJSON.m @@ -0,0 +1,53 @@ +/* + Copyright (C) 2009 Stig Brautaset. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + * Neither the name of the author nor the names of its contributors may be used + to endorse or promote products derived from this software without specific + prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#import "NSObject+SBJSON.h" +#import "SBJsonWriter.h" + +@implementation NSObject (NSObject_SBJSON) + +- (NSString *)JSONFragment { + SBJsonWriter *jsonWriter = [SBJsonWriter new]; + NSString *json = [jsonWriter stringWithFragment:self]; + if (!json) + NSLog(@"-JSONFragment failed. Error trace is: %@", [jsonWriter errorTrace]); + [jsonWriter release]; + return json; +} + +- (NSString *)JSONRepresentation { + SBJsonWriter *jsonWriter = [SBJsonWriter new]; + NSString *json = [jsonWriter stringWithObject:self]; + if (!json) + NSLog(@"-JSONRepresentation failed. Error trace is: %@", [jsonWriter errorTrace]); + [jsonWriter release]; + return json; +} + +@end diff --git a/Vendor/FacebookSDK/JSON/NSString+SBJSON.h b/Vendor/FacebookSDK/JSON/NSString+SBJSON.h new file mode 100644 index 0000000..fad7179 --- /dev/null +++ b/Vendor/FacebookSDK/JSON/NSString+SBJSON.h @@ -0,0 +1,58 @@ +/* + Copyright (C) 2009 Stig Brautaset. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + * Neither the name of the author nor the names of its contributors may be used + to endorse or promote products derived from this software without specific + prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#import + +/** + @brief Adds JSON parsing methods to NSString + +This is a category on NSString that adds methods for parsing the target string. +*/ +@interface NSString (NSString_SBJSON) + + +/** + @brief Returns the object represented in the receiver, or nil on error. + + Returns a a scalar object represented by the string's JSON fragment representation. + + @deprecated Given we bill ourselves as a "strict" JSON library, this method should be removed. + */ +- (id)JSONFragmentValue; + +/** + @brief Returns the NSDictionary or NSArray represented by the current string's JSON representation. + + Returns the dictionary or array represented in the receiver, or nil on error. + + Returns the NSDictionary or NSArray represented by the current string's JSON representation. + */ +- (id)JSONValue; + +@end diff --git a/Vendor/FacebookSDK/JSON/NSString+SBJSON.m b/Vendor/FacebookSDK/JSON/NSString+SBJSON.m new file mode 100644 index 0000000..41a5a85 --- /dev/null +++ b/Vendor/FacebookSDK/JSON/NSString+SBJSON.m @@ -0,0 +1,55 @@ +/* + Copyright (C) 2007-2009 Stig Brautaset. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + * Neither the name of the author nor the names of its contributors may be used + to endorse or promote products derived from this software without specific + prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#import "NSString+SBJSON.h" +#import "SBJsonParser.h" + +@implementation NSString (NSString_SBJSON) + +- (id)JSONFragmentValue +{ + SBJsonParser *jsonParser = [SBJsonParser new]; + id repr = [jsonParser fragmentWithString:self]; + if (!repr) + NSLog(@"-JSONFragmentValue failed. Error trace is: %@", [jsonParser errorTrace]); + [jsonParser release]; + return repr; +} + +- (id)JSONValue +{ + SBJsonParser *jsonParser = [SBJsonParser new]; + id repr = [jsonParser objectWithString:self]; + if (!repr) + NSLog(@"-JSONValue failed. Error trace is: %@", [jsonParser errorTrace]); + [jsonParser release]; + return repr; +} + +@end diff --git a/Vendor/FacebookSDK/JSON/SBJSON.h b/Vendor/FacebookSDK/JSON/SBJSON.h new file mode 100644 index 0000000..43d63c3 --- /dev/null +++ b/Vendor/FacebookSDK/JSON/SBJSON.h @@ -0,0 +1,75 @@ +/* + Copyright (C) 2007-2009 Stig Brautaset. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + * Neither the name of the author nor the names of its contributors may be used + to endorse or promote products derived from this software without specific + prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#import +#import "SBJsonParser.h" +#import "SBJsonWriter.h" + +/** + @brief Facade for SBJsonWriter/SBJsonParser. + + Requests are forwarded to instances of SBJsonWriter and SBJsonParser. + */ +@interface SBJSON : SBJsonBase { + +@private + SBJsonParser *jsonParser; + SBJsonWriter *jsonWriter; +} + + +/// Return the fragment represented by the given string +- (id)fragmentWithString:(NSString*)jsonrep + error:(NSError**)error; + +/// Return the object represented by the given string +- (id)objectWithString:(NSString*)jsonrep + error:(NSError**)error; + +/// Parse the string and return the represented object (or scalar) +- (id)objectWithString:(id)value + allowScalar:(BOOL)x + error:(NSError**)error; + + +/// Return JSON representation of an array or dictionary +- (NSString*)stringWithObject:(id)value + error:(NSError**)error; + +/// Return JSON representation of any legal JSON value +- (NSString*)stringWithFragment:(id)value + error:(NSError**)error; + +/// Return JSON representation (or fragment) for the given object +- (NSString*)stringWithObject:(id)value + allowScalar:(BOOL)x + error:(NSError**)error; + + +@end diff --git a/Vendor/FacebookSDK/JSON/SBJSON.m b/Vendor/FacebookSDK/JSON/SBJSON.m new file mode 100644 index 0000000..2a30f1a --- /dev/null +++ b/Vendor/FacebookSDK/JSON/SBJSON.m @@ -0,0 +1,212 @@ +/* + Copyright (C) 2007-2009 Stig Brautaset. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + * Neither the name of the author nor the names of its contributors may be used + to endorse or promote products derived from this software without specific + prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#import "SBJSON.h" + +@implementation SBJSON + +- (id)init { + self = [super init]; + if (self) { + jsonWriter = [SBJsonWriter new]; + jsonParser = [SBJsonParser new]; + [self setMaxDepth:512]; + + } + return self; +} + +- (void)dealloc { + [jsonWriter release]; + [jsonParser release]; + [super dealloc]; +} + +#pragma mark Writer + + +- (NSString *)stringWithObject:(id)obj { + NSString *repr = [jsonWriter stringWithObject:obj]; + if (repr) + return repr; + + [errorTrace release]; + errorTrace = [[jsonWriter errorTrace] mutableCopy]; + return nil; +} + +/** + Returns a string containing JSON representation of the passed in value, or nil on error. + If nil is returned and @p error is not NULL, @p *error can be interrogated to find the cause of the error. + + @param value any instance that can be represented as a JSON fragment + @param allowScalar wether to return json fragments for scalar objects + @param error used to return an error by reference (pass NULL if this is not desired) + +@deprecated Given we bill ourselves as a "strict" JSON library, this method should be removed. + */ +- (NSString*)stringWithObject:(id)value allowScalar:(BOOL)allowScalar error:(NSError**)error { + + NSString *json = allowScalar ? [jsonWriter stringWithFragment:value] : [jsonWriter stringWithObject:value]; + if (json) + return json; + + [errorTrace release]; + errorTrace = [[jsonWriter errorTrace] mutableCopy]; + + if (error) + *error = [errorTrace lastObject]; + return nil; +} + +/** + Returns a string containing JSON representation of the passed in value, or nil on error. + If nil is returned and @p error is not NULL, @p error can be interrogated to find the cause of the error. + + @param value any instance that can be represented as a JSON fragment + @param error used to return an error by reference (pass NULL if this is not desired) + + @deprecated Given we bill ourselves as a "strict" JSON library, this method should be removed. + */ +- (NSString*)stringWithFragment:(id)value error:(NSError**)error { + return [self stringWithObject:value + allowScalar:YES + error:error]; +} + +/** + Returns a string containing JSON representation of the passed in value, or nil on error. + If nil is returned and @p error is not NULL, @p error can be interrogated to find the cause of the error. + + @param value a NSDictionary or NSArray instance + @param error used to return an error by reference (pass NULL if this is not desired) + */ +- (NSString*)stringWithObject:(id)value error:(NSError**)error { + return [self stringWithObject:value + allowScalar:NO + error:error]; +} + +#pragma mark Parsing + +- (id)objectWithString:(NSString *)repr { + id obj = [jsonParser objectWithString:repr]; + if (obj) + return obj; + + [errorTrace release]; + errorTrace = [[jsonParser errorTrace] mutableCopy]; + + return nil; +} + +/** + Returns the object represented by the passed-in string or nil on error. The returned object can be + a string, number, boolean, null, array or dictionary. + + @param value the json string to parse + @param allowScalar whether to return objects for JSON fragments + @param error used to return an error by reference (pass NULL if this is not desired) + + @deprecated Given we bill ourselves as a "strict" JSON library, this method should be removed. + */ +- (id)objectWithString:(id)value allowScalar:(BOOL)allowScalar error:(NSError**)error { + + id obj = allowScalar ? [jsonParser fragmentWithString:value] : [jsonParser objectWithString:value]; + if (obj) + return obj; + + [errorTrace release]; + errorTrace = [[jsonParser errorTrace] mutableCopy]; + + if (error) + *error = [errorTrace lastObject]; + return nil; +} + +/** + Returns the object represented by the passed-in string or nil on error. The returned object can be + a string, number, boolean, null, array or dictionary. + + @param repr the json string to parse + @param error used to return an error by reference (pass NULL if this is not desired) + + @deprecated Given we bill ourselves as a "strict" JSON library, this method should be removed. + */ +- (id)fragmentWithString:(NSString*)repr error:(NSError**)error { + return [self objectWithString:repr + allowScalar:YES + error:error]; +} + +/** + Returns the object represented by the passed-in string or nil on error. The returned object + will be either a dictionary or an array. + + @param repr the json string to parse + @param error used to return an error by reference (pass NULL if this is not desired) + */ +- (id)objectWithString:(NSString*)repr error:(NSError**)error { + return [self objectWithString:repr + allowScalar:NO + error:error]; +} + + + +#pragma mark Properties - parsing + +- (NSUInteger)maxDepth { + return jsonParser.maxDepth; +} + +- (void)setMaxDepth:(NSUInteger)d { + jsonWriter.maxDepth = jsonParser.maxDepth = d; +} + + +#pragma mark Properties - writing + +- (BOOL)humanReadable { + return jsonWriter.humanReadable; +} + +- (void)setHumanReadable:(BOOL)x { + jsonWriter.humanReadable = x; +} + +- (BOOL)sortKeys { + return jsonWriter.sortKeys; +} + +- (void)setSortKeys:(BOOL)x { + jsonWriter.sortKeys = x; +} + +@end diff --git a/Vendor/FacebookSDK/JSON/SBJsonBase.h b/Vendor/FacebookSDK/JSON/SBJsonBase.h new file mode 100644 index 0000000..7b10844 --- /dev/null +++ b/Vendor/FacebookSDK/JSON/SBJsonBase.h @@ -0,0 +1,86 @@ +/* + Copyright (C) 2009 Stig Brautaset. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + * Neither the name of the author nor the names of its contributors may be used + to endorse or promote products derived from this software without specific + prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#import + +extern NSString * SBJSONErrorDomain; + + +enum { + EUNSUPPORTED = 1, + EPARSENUM, + EPARSE, + EFRAGMENT, + ECTRL, + EUNICODE, + EDEPTH, + EESCAPE, + ETRAILCOMMA, + ETRAILGARBAGE, + EEOF, + EINPUT +}; + +/** + @brief Common base class for parsing & writing. + + This class contains the common error-handling code and option between the parser/writer. + */ +@interface SBJsonBase : NSObject { + NSMutableArray *errorTrace; + +@protected + NSUInteger depth, maxDepth; +} + +/** + @brief The maximum recursing depth. + + Defaults to 512. If the input is nested deeper than this the input will be deemed to be + malicious and the parser returns nil, signalling an error. ("Nested too deep".) You can + turn off this security feature by setting the maxDepth value to 0. + */ +@property NSUInteger maxDepth; + +/** + @brief Return an error trace, or nil if there was no errors. + + Note that this method returns the trace of the last method that failed. + You need to check the return value of the call you're making to figure out + if the call actually failed, before you know call this method. + */ + @property(copy,readonly) NSArray* errorTrace; + +/// @internal for use in subclasses to add errors to the stack trace +- (void)addErrorWithCode:(NSUInteger)code description:(NSString*)str; + +/// @internal for use in subclasess to clear the error before a new parsing attempt +- (void)clearErrorTrace; + +@end diff --git a/Vendor/FacebookSDK/JSON/SBJsonBase.m b/Vendor/FacebookSDK/JSON/SBJsonBase.m new file mode 100644 index 0000000..6684325 --- /dev/null +++ b/Vendor/FacebookSDK/JSON/SBJsonBase.m @@ -0,0 +1,78 @@ +/* + Copyright (C) 2009 Stig Brautaset. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + * Neither the name of the author nor the names of its contributors may be used + to endorse or promote products derived from this software without specific + prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#import "SBJsonBase.h" +NSString * SBJSONErrorDomain = @"org.brautaset.JSON.ErrorDomain"; + + +@implementation SBJsonBase + +@synthesize errorTrace; +@synthesize maxDepth; + +- (id)init { + self = [super init]; + if (self) + self.maxDepth = 512; + return self; +} + +- (void)dealloc { + [errorTrace release]; + [super dealloc]; +} + +- (void)addErrorWithCode:(NSUInteger)code description:(NSString*)str { + NSDictionary *userInfo; + if (!errorTrace) { + errorTrace = [NSMutableArray new]; + userInfo = [NSDictionary dictionaryWithObject:str forKey:NSLocalizedDescriptionKey]; + + } else { + userInfo = [NSDictionary dictionaryWithObjectsAndKeys: + str, NSLocalizedDescriptionKey, + [errorTrace lastObject], NSUnderlyingErrorKey, + nil]; + } + + NSError *error = [NSError errorWithDomain:SBJSONErrorDomain code:code userInfo:userInfo]; + + [self willChangeValueForKey:@"errorTrace"]; + [errorTrace addObject:error]; + [self didChangeValueForKey:@"errorTrace"]; +} + +- (void)clearErrorTrace { + [self willChangeValueForKey:@"errorTrace"]; + [errorTrace release]; + errorTrace = nil; + [self didChangeValueForKey:@"errorTrace"]; +} + +@end diff --git a/Vendor/FacebookSDK/JSON/SBJsonParser.h b/Vendor/FacebookSDK/JSON/SBJsonParser.h new file mode 100644 index 0000000..e95304d --- /dev/null +++ b/Vendor/FacebookSDK/JSON/SBJsonParser.h @@ -0,0 +1,87 @@ +/* + Copyright (C) 2009 Stig Brautaset. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + * Neither the name of the author nor the names of its contributors may be used + to endorse or promote products derived from this software without specific + prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#import +#import "SBJsonBase.h" + +/** + @brief Options for the parser class. + + This exists so the SBJSON facade can implement the options in the parser without having to re-declare them. + */ +@protocol SBJsonParser + +/** + @brief Return the object represented by the given string. + + Returns the object represented by the passed-in string or nil on error. The returned object can be + a string, number, boolean, null, array or dictionary. + + @param repr the json string to parse + */ +- (id)objectWithString:(NSString *)repr; + +@end + + +/** + @brief The JSON parser class. + + JSON is mapped to Objective-C types in the following way: + + @li Null -> NSNull + @li String -> NSMutableString + @li Array -> NSMutableArray + @li Object -> NSMutableDictionary + @li Boolean -> NSNumber (initialised with -initWithBool:) + @li Number -> NSDecimalNumber + + Since Objective-C doesn't have a dedicated class for boolean values, these turns into NSNumber + instances. These are initialised with the -initWithBool: method, and + round-trip back to JSON properly. (They won't silently suddenly become 0 or 1; they'll be + represented as 'true' and 'false' again.) + + JSON numbers turn into NSDecimalNumber instances, + as we can thus avoid any loss of precision. (JSON allows ridiculously large numbers.) + + */ +@interface SBJsonParser : SBJsonBase { + +@private + const char *c; +} + +@end + +// don't use - exists for backwards compatibility with 2.1.x only. Will be removed in 2.3. +@interface SBJsonParser (Private) +- (id)fragmentWithString:(id)repr; +@end + + diff --git a/Vendor/FacebookSDK/JSON/SBJsonParser.m b/Vendor/FacebookSDK/JSON/SBJsonParser.m new file mode 100644 index 0000000..eda051a --- /dev/null +++ b/Vendor/FacebookSDK/JSON/SBJsonParser.m @@ -0,0 +1,475 @@ +/* + Copyright (C) 2009 Stig Brautaset. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + * Neither the name of the author nor the names of its contributors may be used + to endorse or promote products derived from this software without specific + prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#import "SBJsonParser.h" + +@interface SBJsonParser () + +- (BOOL)scanValue:(NSObject **)o; + +- (BOOL)scanRestOfArray:(NSMutableArray **)o; +- (BOOL)scanRestOfDictionary:(NSMutableDictionary **)o; +- (BOOL)scanRestOfNull:(NSNull **)o; +- (BOOL)scanRestOfFalse:(NSNumber **)o; +- (BOOL)scanRestOfTrue:(NSNumber **)o; +- (BOOL)scanRestOfString:(NSMutableString **)o; + +// Cannot manage without looking at the first digit +- (BOOL)scanNumber:(NSNumber **)o; + +- (BOOL)scanHexQuad:(unichar *)x; +- (BOOL)scanUnicodeChar:(unichar *)x; + +- (BOOL)scanIsAtEnd; + +@end + +#define skipWhitespace(c) while (isspace(*c)) c++ +#define skipDigits(c) while (isdigit(*c)) c++ + + +@implementation SBJsonParser + +static char ctrl[0x22]; + + ++ (void)initialize { + ctrl[0] = '\"'; + ctrl[1] = '\\'; + for (int i = 1; i < 0x20; i++) + ctrl[i+1] = i; + ctrl[0x21] = 0; +} + +/** + @deprecated This exists in order to provide fragment support in older APIs in one more version. + It should be removed in the next major version. + */ +- (id)fragmentWithString:(id)repr { + [self clearErrorTrace]; + + if (!repr) { + [self addErrorWithCode:EINPUT description:@"Input was 'nil'"]; + return nil; + } + + depth = 0; + c = [repr UTF8String]; + + id o; + if (![self scanValue:&o]) { + return nil; + } + + // We found some valid JSON. But did it also contain something else? + if (![self scanIsAtEnd]) { + [self addErrorWithCode:ETRAILGARBAGE description:@"Garbage after JSON"]; + return nil; + } + + NSAssert1(o, @"Should have a valid object from %@", repr); + return o; +} + +- (id)objectWithString:(NSString *)repr { + + id o = [self fragmentWithString:repr]; + if (!o) + return nil; + + // Check that the object we've found is a valid JSON container. + if (![o isKindOfClass:[NSDictionary class]] && ![o isKindOfClass:[NSArray class]]) { + [self addErrorWithCode:EFRAGMENT description:@"Valid fragment, but not JSON"]; + return nil; + } + + return o; +} + +/* + In contrast to the public methods, it is an error to omit the error parameter here. + */ +- (BOOL)scanValue:(NSObject **)o +{ + skipWhitespace(c); + + switch (*c++) { + case '{': + return [self scanRestOfDictionary:(NSMutableDictionary **)o]; + break; + case '[': + return [self scanRestOfArray:(NSMutableArray **)o]; + break; + case '"': + return [self scanRestOfString:(NSMutableString **)o]; + break; + case 'f': + return [self scanRestOfFalse:(NSNumber **)o]; + break; + case 't': + return [self scanRestOfTrue:(NSNumber **)o]; + break; + case 'n': + return [self scanRestOfNull:(NSNull **)o]; + break; + case '-': + case '0'...'9': + c--; // cannot verify number correctly without the first character + return [self scanNumber:(NSNumber **)o]; + break; + case '+': + [self addErrorWithCode:EPARSENUM description: @"Leading + disallowed in number"]; + return NO; + break; + case 0x0: + [self addErrorWithCode:EEOF description:@"Unexpected end of string"]; + return NO; + break; + default: + [self addErrorWithCode:EPARSE description: @"Unrecognised leading character"]; + return NO; + break; + } + + NSAssert(0, @"Should never get here"); + return NO; +} + +- (BOOL)scanRestOfTrue:(NSNumber **)o +{ + if (!strncmp(c, "rue", 3)) { + c += 3; + *o = [NSNumber numberWithBool:YES]; + return YES; + } + [self addErrorWithCode:EPARSE description:@"Expected 'true'"]; + return NO; +} + +- (BOOL)scanRestOfFalse:(NSNumber **)o +{ + if (!strncmp(c, "alse", 4)) { + c += 4; + *o = [NSNumber numberWithBool:NO]; + return YES; + } + [self addErrorWithCode:EPARSE description: @"Expected 'false'"]; + return NO; +} + +- (BOOL)scanRestOfNull:(NSNull **)o { + if (!strncmp(c, "ull", 3)) { + c += 3; + *o = [NSNull null]; + return YES; + } + [self addErrorWithCode:EPARSE description: @"Expected 'null'"]; + return NO; +} + +- (BOOL)scanRestOfArray:(NSMutableArray **)o { + if (maxDepth && ++depth > maxDepth) { + [self addErrorWithCode:EDEPTH description: @"Nested too deep"]; + return NO; + } + + *o = [NSMutableArray arrayWithCapacity:8]; + + for (; *c ;) { + id v; + + skipWhitespace(c); + if (*c == ']' && c++) { + depth--; + return YES; + } + + if (![self scanValue:&v]) { + [self addErrorWithCode:EPARSE description:@"Expected value while parsing array"]; + return NO; + } + + [*o addObject:v]; + + skipWhitespace(c); + if (*c == ',' && c++) { + skipWhitespace(c); + if (*c == ']') { + [self addErrorWithCode:ETRAILCOMMA description: @"Trailing comma disallowed in array"]; + return NO; + } + } + } + + [self addErrorWithCode:EEOF description: @"End of input while parsing array"]; + return NO; +} + +- (BOOL)scanRestOfDictionary:(NSMutableDictionary **)o +{ + if (maxDepth && ++depth > maxDepth) { + [self addErrorWithCode:EDEPTH description: @"Nested too deep"]; + return NO; + } + + *o = [NSMutableDictionary dictionaryWithCapacity:7]; + + for (; *c ;) { + id k, v; + + skipWhitespace(c); + if (*c == '}' && c++) { + depth--; + return YES; + } + + if (!(*c == '\"' && c++ && [self scanRestOfString:&k])) { + [self addErrorWithCode:EPARSE description: @"Object key string expected"]; + return NO; + } + + skipWhitespace(c); + if (*c != ':') { + [self addErrorWithCode:EPARSE description: @"Expected ':' separating key and value"]; + return NO; + } + + c++; + if (![self scanValue:&v]) { + NSString *string = [NSString stringWithFormat:@"Object value expected for key: %@", k]; + [self addErrorWithCode:EPARSE description: string]; + return NO; + } + + [*o setObject:v forKey:k]; + + skipWhitespace(c); + if (*c == ',' && c++) { + skipWhitespace(c); + if (*c == '}') { + [self addErrorWithCode:ETRAILCOMMA description: @"Trailing comma disallowed in object"]; + return NO; + } + } + } + + [self addErrorWithCode:EEOF description: @"End of input while parsing object"]; + return NO; +} + +- (BOOL)scanRestOfString:(NSMutableString **)o +{ + *o = [NSMutableString stringWithCapacity:16]; + do { + // First see if there's a portion we can grab in one go. + // Doing this caused a massive speedup on the long string. + size_t len = strcspn(c, ctrl); + if (len) { + // check for + id t = [[NSString alloc] initWithBytesNoCopy:(char*)c + length:len + encoding:NSUTF8StringEncoding + freeWhenDone:NO]; + if (t) { + [*o appendString:t]; + [t release]; + c += len; + } + } + + if (*c == '"') { + c++; + return YES; + + } else if (*c == '\\') { + unichar uc = *++c; + switch (uc) { + case '\\': + case '/': + case '"': + break; + + case 'b': uc = '\b'; break; + case 'n': uc = '\n'; break; + case 'r': uc = '\r'; break; + case 't': uc = '\t'; break; + case 'f': uc = '\f'; break; + + case 'u': + c++; + if (![self scanUnicodeChar:&uc]) { + [self addErrorWithCode:EUNICODE description: @"Broken unicode character"]; + return NO; + } + c--; // hack. + break; + default: + [self addErrorWithCode:EESCAPE description: [NSString stringWithFormat:@"Illegal escape sequence '0x%x'", uc]]; + return NO; + break; + } + CFStringAppendCharacters((CFMutableStringRef)*o, &uc, 1); + c++; + + } else if (*c < 0x20) { + [self addErrorWithCode:ECTRL description: [NSString stringWithFormat:@"Unescaped control character '0x%x'", *c]]; + return NO; + + } else { + NSLog(@"should not be able to get here"); + } + } while (*c); + + [self addErrorWithCode:EEOF description:@"Unexpected EOF while parsing string"]; + return NO; +} + +- (BOOL)scanUnicodeChar:(unichar *)x +{ + unichar hi, lo; + + if (![self scanHexQuad:&hi]) { + [self addErrorWithCode:EUNICODE description: @"Missing hex quad"]; + return NO; + } + + if (hi >= 0xd800) { // high surrogate char? + if (hi < 0xdc00) { // yes - expect a low char + + if (!(*c == '\\' && ++c && *c == 'u' && ++c && [self scanHexQuad:&lo])) { + [self addErrorWithCode:EUNICODE description: @"Missing low character in surrogate pair"]; + return NO; + } + + if (lo < 0xdc00 || lo >= 0xdfff) { + [self addErrorWithCode:EUNICODE description:@"Invalid low surrogate char"]; + return NO; + } + + hi = (hi - 0xd800) * 0x400 + (lo - 0xdc00) + 0x10000; + + } else if (hi < 0xe000) { + [self addErrorWithCode:EUNICODE description:@"Invalid high character in surrogate pair"]; + return NO; + } + } + + *x = hi; + return YES; +} + +- (BOOL)scanHexQuad:(unichar *)x +{ + *x = 0; + for (int i = 0; i < 4; i++) { + unichar uc = *c; + c++; + int d = (uc >= '0' && uc <= '9') + ? uc - '0' : (uc >= 'a' && uc <= 'f') + ? (uc - 'a' + 10) : (uc >= 'A' && uc <= 'F') + ? (uc - 'A' + 10) : -1; + if (d == -1) { + [self addErrorWithCode:EUNICODE description:@"Missing hex digit in quad"]; + return NO; + } + *x *= 16; + *x += d; + } + return YES; +} + +- (BOOL)scanNumber:(NSNumber **)o +{ + const char *ns = c; + + // The logic to test for validity of the number formatting is relicensed + // from JSON::XS with permission from its author Marc Lehmann. + // (Available at the CPAN: http://search.cpan.org/dist/JSON-XS/ .) + + if ('-' == *c) + c++; + + if ('0' == *c && c++) { + if (isdigit(*c)) { + [self addErrorWithCode:EPARSENUM description: @"Leading 0 disallowed in number"]; + return NO; + } + + } else if (!isdigit(*c) && c != ns) { + [self addErrorWithCode:EPARSENUM description: @"No digits after initial minus"]; + return NO; + + } else { + skipDigits(c); + } + + // Fractional part + if ('.' == *c && c++) { + + if (!isdigit(*c)) { + [self addErrorWithCode:EPARSENUM description: @"No digits after decimal point"]; + return NO; + } + skipDigits(c); + } + + // Exponential part + if ('e' == *c || 'E' == *c) { + c++; + + if ('-' == *c || '+' == *c) + c++; + + if (!isdigit(*c)) { + [self addErrorWithCode:EPARSENUM description: @"No digits after exponent"]; + return NO; + } + skipDigits(c); + } + + id str = [[NSString alloc] initWithBytesNoCopy:(char*)ns + length:c - ns + encoding:NSUTF8StringEncoding + freeWhenDone:NO]; + [str autorelease]; + if (str && (*o = [NSDecimalNumber decimalNumberWithString:str])) + return YES; + + [self addErrorWithCode:EPARSENUM description: @"Failed creating decimal instance"]; + return NO; +} + +- (BOOL)scanIsAtEnd +{ + skipWhitespace(c); + return !*c; +} + + +@end diff --git a/Vendor/FacebookSDK/JSON/SBJsonWriter.h b/Vendor/FacebookSDK/JSON/SBJsonWriter.h new file mode 100644 index 0000000..f6f5e17 --- /dev/null +++ b/Vendor/FacebookSDK/JSON/SBJsonWriter.h @@ -0,0 +1,129 @@ +/* + Copyright (C) 2009 Stig Brautaset. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + * Neither the name of the author nor the names of its contributors may be used + to endorse or promote products derived from this software without specific + prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#import +#import "SBJsonBase.h" + +/** + @brief Options for the writer class. + + This exists so the SBJSON facade can implement the options in the writer without having to re-declare them. + */ +@protocol SBJsonWriter + +/** + @brief Whether we are generating human-readable (multiline) JSON. + + Set whether or not to generate human-readable JSON. The default is NO, which produces + JSON without any whitespace. (Except inside strings.) If set to YES, generates human-readable + JSON with linebreaks after each array value and dictionary key/value pair, indented two + spaces per nesting level. + */ +@property BOOL humanReadable; + +/** + @brief Whether or not to sort the dictionary keys in the output. + + If this is set to YES, the dictionary keys in the JSON output will be in sorted order. + (This is useful if you need to compare two structures, for example.) The default is NO. + */ +@property BOOL sortKeys; + +/** + @brief Return JSON representation (or fragment) for the given object. + + Returns a string containing JSON representation of the passed in value, or nil on error. + If nil is returned and @p error is not NULL, @p *error can be interrogated to find the cause of the error. + + @param value any instance that can be represented as a JSON fragment + + */ +- (NSString*)stringWithObject:(id)value; + +@end + + +/** + @brief The JSON writer class. + + Objective-C types are mapped to JSON types in the following way: + + @li NSNull -> Null + @li NSString -> String + @li NSArray -> Array + @li NSDictionary -> Object + @li NSNumber (-initWithBool:) -> Boolean + @li NSNumber -> Number + + In JSON the keys of an object must be strings. NSDictionary keys need + not be, but attempting to convert an NSDictionary with non-string keys + into JSON will throw an exception. + + NSNumber instances created with the +initWithBool: method are + converted into the JSON boolean "true" and "false" values, and vice + versa. Any other NSNumber instances are converted to a JSON number the + way you would expect. + + */ +@interface SBJsonWriter : SBJsonBase { + +@private + BOOL sortKeys, humanReadable; +} + +@end + +// don't use - exists for backwards compatibility. Will be removed in 2.3. +@interface SBJsonWriter (Private) +- (NSString*)stringWithFragment:(id)value; +@end + +/** + @brief Allows generation of JSON for otherwise unsupported classes. + + If you have a custom class that you want to create a JSON representation for you can implement + this method in your class. It should return a representation of your object defined + in terms of objects that can be translated into JSON. For example, a Person + object might implement it like this: + + @code + - (id)jsonProxyObject { + return [NSDictionary dictionaryWithObjectsAndKeys: + name, @"name", + phone, @"phone", + email, @"email", + nil]; + } + @endcode + + */ +@interface NSObject (SBProxyForJson) +- (id)proxyForJson; +@end + diff --git a/Vendor/FacebookSDK/JSON/SBJsonWriter.m b/Vendor/FacebookSDK/JSON/SBJsonWriter.m new file mode 100644 index 0000000..0f32904 --- /dev/null +++ b/Vendor/FacebookSDK/JSON/SBJsonWriter.m @@ -0,0 +1,237 @@ +/* + Copyright (C) 2009 Stig Brautaset. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + * Neither the name of the author nor the names of its contributors may be used + to endorse or promote products derived from this software without specific + prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#import "SBJsonWriter.h" + +@interface SBJsonWriter () + +- (BOOL)appendValue:(id)fragment into:(NSMutableString*)json; +- (BOOL)appendArray:(NSArray*)fragment into:(NSMutableString*)json; +- (BOOL)appendDictionary:(NSDictionary*)fragment into:(NSMutableString*)json; +- (BOOL)appendString:(NSString*)fragment into:(NSMutableString*)json; + +- (NSString*)indent; + +@end + +@implementation SBJsonWriter + +static NSMutableCharacterSet *kEscapeChars; + ++ (void)initialize { + kEscapeChars = [[NSMutableCharacterSet characterSetWithRange: NSMakeRange(0,32)] retain]; + [kEscapeChars addCharactersInString: @"\"\\"]; +} + + +@synthesize sortKeys; +@synthesize humanReadable; + +/** + @deprecated This exists in order to provide fragment support in older APIs in one more version. + It should be removed in the next major version. + */ +- (NSString*)stringWithFragment:(id)value { + [self clearErrorTrace]; + depth = 0; + NSMutableString *json = [NSMutableString stringWithCapacity:128]; + + if ([self appendValue:value into:json]) + return json; + + return nil; +} + + +- (NSString*)stringWithObject:(id)value { + + if ([value isKindOfClass:[NSDictionary class]] || [value isKindOfClass:[NSArray class]]) { + return [self stringWithFragment:value]; + } + + if ([value respondsToSelector:@selector(proxyForJson)]) { + NSString *tmp = [self stringWithObject:[value proxyForJson]]; + if (tmp) + return tmp; + } + + + [self clearErrorTrace]; + [self addErrorWithCode:EFRAGMENT description:@"Not valid type for JSON"]; + return nil; +} + + +- (NSString*)indent { + return [@"\n" stringByPaddingToLength:1 + 2 * depth withString:@" " startingAtIndex:0]; +} + +- (BOOL)appendValue:(id)fragment into:(NSMutableString*)json { + if ([fragment isKindOfClass:[NSDictionary class]]) { + if (![self appendDictionary:fragment into:json]) + return NO; + + } else if ([fragment isKindOfClass:[NSArray class]]) { + if (![self appendArray:fragment into:json]) + return NO; + + } else if ([fragment isKindOfClass:[NSString class]]) { + if (![self appendString:fragment into:json]) + return NO; + + } else if ([fragment isKindOfClass:[NSNumber class]]) { + if ('c' == *[fragment objCType]) + [json appendString:[fragment boolValue] ? @"true" : @"false"]; + else + [json appendString:[fragment stringValue]]; + + } else if ([fragment isKindOfClass:[NSNull class]]) { + [json appendString:@"null"]; + } else if ([fragment respondsToSelector:@selector(proxyForJson)]) { + [self appendValue:[fragment proxyForJson] into:json]; + + } else { + [self addErrorWithCode:EUNSUPPORTED description:[NSString stringWithFormat:@"JSON serialisation not supported for %@", [fragment class]]]; + return NO; + } + return YES; +} + +- (BOOL)appendArray:(NSArray*)fragment into:(NSMutableString*)json { + if (maxDepth && ++depth > maxDepth) { + [self addErrorWithCode:EDEPTH description: @"Nested too deep"]; + return NO; + } + [json appendString:@"["]; + + BOOL addComma = NO; + for (id value in fragment) { + if (addComma) + [json appendString:@","]; + else + addComma = YES; + + if ([self humanReadable]) + [json appendString:[self indent]]; + + if (![self appendValue:value into:json]) { + return NO; + } + } + + depth--; + if ([self humanReadable] && [fragment count]) + [json appendString:[self indent]]; + [json appendString:@"]"]; + return YES; +} + +- (BOOL)appendDictionary:(NSDictionary*)fragment into:(NSMutableString*)json { + if (maxDepth && ++depth > maxDepth) { + [self addErrorWithCode:EDEPTH description: @"Nested too deep"]; + return NO; + } + [json appendString:@"{"]; + + NSString *colon = [self humanReadable] ? @" : " : @":"; + BOOL addComma = NO; + NSArray *keys = [fragment allKeys]; + if (self.sortKeys) + keys = [keys sortedArrayUsingSelector:@selector(compare:)]; + + for (id value in keys) { + if (addComma) + [json appendString:@","]; + else + addComma = YES; + + if ([self humanReadable]) + [json appendString:[self indent]]; + + if (![value isKindOfClass:[NSString class]]) { + [self addErrorWithCode:EUNSUPPORTED description: @"JSON object key must be string"]; + return NO; + } + + if (![self appendString:value into:json]) + return NO; + + [json appendString:colon]; + if (![self appendValue:[fragment objectForKey:value] into:json]) { + [self addErrorWithCode:EUNSUPPORTED description:[NSString stringWithFormat:@"Unsupported value for key %@ in object", value]]; + return NO; + } + } + + depth--; + if ([self humanReadable] && [fragment count]) + [json appendString:[self indent]]; + [json appendString:@"}"]; + return YES; +} + +- (BOOL)appendString:(NSString*)fragment into:(NSMutableString*)json { + + [json appendString:@"\""]; + + NSRange esc = [fragment rangeOfCharacterFromSet:kEscapeChars]; + if ( !esc.length ) { + // No special chars -- can just add the raw string: + [json appendString:fragment]; + + } else { + NSUInteger length = [fragment length]; + for (NSUInteger i = 0; i < length; i++) { + unichar uc = [fragment characterAtIndex:i]; + switch (uc) { + case '"': [json appendString:@"\\\""]; break; + case '\\': [json appendString:@"\\\\"]; break; + case '\t': [json appendString:@"\\t"]; break; + case '\n': [json appendString:@"\\n"]; break; + case '\r': [json appendString:@"\\r"]; break; + case '\b': [json appendString:@"\\b"]; break; + case '\f': [json appendString:@"\\f"]; break; + default: + if (uc < 0x20) { + [json appendFormat:@"\\u%04x", uc]; + } else { + CFStringAppendCharacters((CFMutableStringRef)json, &uc, 1); + } + break; + + } + } + } + + [json appendString:@"\""]; + return YES; +} + + +@end