From 2da504e1a0a71f4e83f53db31e8d8365d825fbd3 Mon Sep 17 00:00:00 2001 From: Justin Spahr-Summers Date: Wed, 8 Aug 2012 21:21:21 -0700 Subject: [PATCH] Implemented for NSData --- ObjectiveHaskell.xcodeproj/project.pbxproj | 8 +++++++ ObjectiveHaskell/NSData+OHExtensions.h | 13 +++++++++++ ObjectiveHaskell/NSData+OHExtensions.m | 22 +++++++++++++++++++ ObjectiveHaskell/NSData.hs | 10 +++++++++ ObjectiveHaskell/ObjectiveHaskell.h | 1 + ObjectiveHaskellTests/ObjectiveHaskellTests.m | 3 +++ 6 files changed, 57 insertions(+) create mode 100644 ObjectiveHaskell/NSData+OHExtensions.h create mode 100644 ObjectiveHaskell/NSData+OHExtensions.m diff --git a/ObjectiveHaskell.xcodeproj/project.pbxproj b/ObjectiveHaskell.xcodeproj/project.pbxproj index b093599..87dfe45 100644 --- a/ObjectiveHaskell.xcodeproj/project.pbxproj +++ b/ObjectiveHaskell.xcodeproj/project.pbxproj @@ -44,6 +44,8 @@ D0F3A31815D366730032B8D9 /* NSArray+OHExtensions.m in Sources */ = {isa = PBXBuildFile; fileRef = D0F3A31615D366730032B8D9 /* NSArray+OHExtensions.m */; }; D0F3A31B15D36F5D0032B8D9 /* NSDictionary+OHExtensions.h in Headers */ = {isa = PBXBuildFile; fileRef = D0F3A31915D36F5D0032B8D9 /* NSDictionary+OHExtensions.h */; settings = {ATTRIBUTES = (Public, ); }; }; D0F3A31C15D36F5D0032B8D9 /* NSDictionary+OHExtensions.m in Sources */ = {isa = PBXBuildFile; fileRef = D0F3A31A15D36F5D0032B8D9 /* NSDictionary+OHExtensions.m */; }; + D0F3A31F15D3717C0032B8D9 /* NSData+OHExtensions.h in Headers */ = {isa = PBXBuildFile; fileRef = D0F3A31D15D3717C0032B8D9 /* NSData+OHExtensions.h */; }; + D0F3A32015D3717C0032B8D9 /* NSData+OHExtensions.m in Sources */ = {isa = PBXBuildFile; fileRef = D0F3A31E15D3717C0032B8D9 /* NSData+OHExtensions.m */; }; /* End PBXBuildFile section */ /* Begin PBXBuildRule section */ @@ -171,6 +173,8 @@ D0F3A31615D366730032B8D9 /* NSArray+OHExtensions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSArray+OHExtensions.m"; sourceTree = ""; }; D0F3A31915D36F5D0032B8D9 /* NSDictionary+OHExtensions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSDictionary+OHExtensions.h"; sourceTree = ""; }; D0F3A31A15D36F5D0032B8D9 /* NSDictionary+OHExtensions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSDictionary+OHExtensions.m"; sourceTree = ""; }; + D0F3A31D15D3717C0032B8D9 /* NSData+OHExtensions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSData+OHExtensions.h"; sourceTree = ""; }; + D0F3A31E15D3717C0032B8D9 /* NSData+OHExtensions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSData+OHExtensions.m"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -201,6 +205,8 @@ children = ( D0F3A31515D366730032B8D9 /* NSArray+OHExtensions.h */, D0F3A31615D366730032B8D9 /* NSArray+OHExtensions.m */, + D0F3A31D15D3717C0032B8D9 /* NSData+OHExtensions.h */, + D0F3A31E15D3717C0032B8D9 /* NSData+OHExtensions.m */, D0F3A31915D36F5D0032B8D9 /* NSDictionary+OHExtensions.h */, D0F3A31A15D36F5D0032B8D9 /* NSDictionary+OHExtensions.m */, D0F3A2FF15D360B50032B8D9 /* NSNumber+OHExtensions.h */, @@ -438,6 +444,7 @@ D0F3A30115D360B50032B8D9 /* NSNumber+OHExtensions.h in Headers */, D0F3A31715D366730032B8D9 /* NSArray+OHExtensions.h in Headers */, D0F3A31B15D36F5D0032B8D9 /* NSDictionary+OHExtensions.h in Headers */, + D0F3A31F15D3717C0032B8D9 /* NSData+OHExtensions.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -584,6 +591,7 @@ D0F3A30215D360B50032B8D9 /* NSNumber+OHExtensions.m in Sources */, D0F3A31815D366730032B8D9 /* NSArray+OHExtensions.m in Sources */, D0F3A31C15D36F5D0032B8D9 /* NSDictionary+OHExtensions.m in Sources */, + D0F3A32015D3717C0032B8D9 /* NSData+OHExtensions.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/ObjectiveHaskell/NSData+OHExtensions.h b/ObjectiveHaskell/NSData+OHExtensions.h new file mode 100644 index 0000000..b7a6871 --- /dev/null +++ b/ObjectiveHaskell/NSData+OHExtensions.h @@ -0,0 +1,13 @@ +// +// NSData+OHExtensions.h +// ObjectiveHaskell +// +// Created by Justin Spahr-Summers on 08.08.12. +// Released into the public domain. +// + +#import +#import "OHBridged.h" + +@interface NSData (OHExtensions) +@end diff --git a/ObjectiveHaskell/NSData+OHExtensions.m b/ObjectiveHaskell/NSData+OHExtensions.m new file mode 100644 index 0000000..be816e7 --- /dev/null +++ b/ObjectiveHaskell/NSData+OHExtensions.m @@ -0,0 +1,22 @@ +// +// NSData+OHExtensions.m +// ObjectiveHaskell +// +// Created by Justin Spahr-Summers on 08.08.12. +// Released into the public domain. +// + +#import "NSData+OHExtensions.h" +#import "NSData_stub.h" + +@implementation NSData (OHExtensions) + ++ (instancetype)objectWithHaskellPointer:(OHHaskellPtr)haskellPointer { + return OHNSDataFromHaskellPtr(haskellPointer); +} + +- (OHHaskellPtr)haskellPointer { + return OHHaskellPtrFromNSData(self); +} + +@end diff --git a/ObjectiveHaskell/NSData.hs b/ObjectiveHaskell/NSData.hs index 395f6cd..0490403 100644 --- a/ObjectiveHaskell/NSData.hs +++ b/ObjectiveHaskell/NSData.hs @@ -11,6 +11,7 @@ import Data.Word import Foreign.C.Types import Foreign.Marshal.Array import Foreign.Ptr +import Foreign.StablePtr import ObjectiveHaskell.MsgSend import ObjectiveHaskell.ObjC @@ -38,3 +39,12 @@ toNSData str = instance Bridged ByteString where toObjC = toNSData fromObjC = fromNSData + +fromNSDataObjC :: Id -> IO (StablePtr ByteString) +fromNSDataObjC obj = fromNSData obj >>= newStablePtr + +toNSDataObjC :: StablePtr ByteString -> IO Id +toNSDataObjC ptr = deRefStablePtr ptr >>= toNSData + +exportFunc "OHHaskellPtrFromNSData" [t| UnsafeId -> IO (StablePtr ByteString) |] 'fromNSDataObjC +exportFunc "OHNSDataFromHaskellPtr" [t| StablePtr ByteString -> IO UnsafeId |] 'toNSDataObjC diff --git a/ObjectiveHaskell/ObjectiveHaskell.h b/ObjectiveHaskell/ObjectiveHaskell.h index b714e24..bfb38e9 100644 --- a/ObjectiveHaskell/ObjectiveHaskell.h +++ b/ObjectiveHaskell/ObjectiveHaskell.h @@ -7,6 +7,7 @@ // #import "NSArray+OHExtensions.h" +#import "NSData+OHExtensions.h" #import "NSDictionary+OHExtensions.h" #import "NSNumber+OHExtensions.h" #import "NSString+OHExtensions.h" diff --git a/ObjectiveHaskellTests/ObjectiveHaskellTests.m b/ObjectiveHaskellTests/ObjectiveHaskellTests.m index 808db94..bf93c3b 100644 --- a/ObjectiveHaskellTests/ObjectiveHaskellTests.m +++ b/ObjectiveHaskellTests/ObjectiveHaskellTests.m @@ -29,6 +29,9 @@ - (void)testNSDataBridging { unsigned char expectedBytes[] = { 1, 2, 3, 5 }; STAssertEquals([data length], sizeof(expectedBytes), @""); STAssertTrue(memcmp([data bytes], expectedBytes, sizeof(expectedBytes)) == 0, @""); + + NSData *passthroughData = [NSData objectWithHaskellPointer:data.haskellPointer]; + STAssertEqualObjects(data, passthroughData, @""); } - (void)testNSDictionaryBridging {