mirror of
https://github.com/oxen-io/session-ios.git
synced 2023-12-13 21:30:14 +01:00
ced4fc8947
Still need to: - Fix indentation - Check for any FutureSource being returned instead of FutureSource.future - Check for then: vs thenTry: mixups - Check for main thread related issues - Check for other exception catching issues - Adjust directory layout - Manual end-to-end testing
95 lines
3 KiB
Objective-C
95 lines
3 KiB
Objective-C
#import "IpEndPoint.h"
|
|
|
|
#import "DnsManager.h"
|
|
#import "Util.h"
|
|
|
|
@implementation IpEndPoint
|
|
|
|
+(IpEndPoint*) ipEndPointAtAddress:(IpAddress*)address
|
|
onPort:(in_port_t)port {
|
|
require(address != nil);
|
|
IpEndPoint* p = [IpEndPoint new];
|
|
p->address = address;
|
|
p->port = port;
|
|
return p;
|
|
}
|
|
|
|
+(IpEndPoint*) ipEndPointAtUnspecifiedAddressOnPort:(in_port_t)port {
|
|
struct sockaddr_in s;
|
|
memset(&s, 0, sizeof(struct sockaddr_in));
|
|
s.sin_len = sizeof(struct sockaddr_in);
|
|
s.sin_family = AF_INET;
|
|
s.sin_port = htons(port);
|
|
|
|
IpEndPoint* a = [IpEndPoint new];
|
|
a->address = [IpAddress ipv4AddressFromString:@"0.0.0.0"];
|
|
a->port = port;
|
|
return a;
|
|
}
|
|
|
|
+(IpEndPoint*) ipEndPointFromSockaddrData:(NSData*)sockaddrData {
|
|
require(sockaddrData != nil);
|
|
require(sockaddrData.length >= sizeof(struct sockaddr));
|
|
|
|
struct sockaddr s;
|
|
memcpy(&s, [sockaddrData bytes], sizeof(struct sockaddr));
|
|
|
|
if (s.sa_family == AF_INET) return [IpEndPoint ipv4EndPointFromSockaddrData:sockaddrData];
|
|
if (s.sa_family == AF_INET6) return [IpEndPoint ipv6EndPointFromSockaddrData:sockaddrData];
|
|
|
|
[BadArgument raise:[NSString stringWithFormat:@"Unrecognized sockaddr family: %d", s.sa_family]];
|
|
return nil;
|
|
}
|
|
+(IpEndPoint*) ipv4EndPointFromSockaddrData:(NSData*)sockaddrData {
|
|
require(sockaddrData != nil);
|
|
require(sockaddrData.length >= sizeof(struct sockaddr_in));
|
|
|
|
struct sockaddr_in s;
|
|
memcpy(&s, [sockaddrData bytes], sizeof(struct sockaddr_in));
|
|
|
|
return [[IpAddress ipv4AddressFromSockaddr:s] withPort:ntohs(s.sin_port)];
|
|
}
|
|
+(IpEndPoint*) ipv6EndPointFromSockaddrData:(NSData*)sockaddrData {
|
|
require(sockaddrData != nil);
|
|
require(sockaddrData.length >= sizeof(struct sockaddr_in6));
|
|
|
|
struct sockaddr_in6 s;
|
|
memcpy(&s, [sockaddrData bytes], sizeof(struct sockaddr_in6));
|
|
|
|
return [[IpAddress ipv6AddressFromSockaddr:s] withPort:ntohs(s.sin6_port)];
|
|
}
|
|
|
|
-(IpAddress*) address {
|
|
return address;
|
|
}
|
|
-(in_port_t) port {
|
|
return port;
|
|
}
|
|
-(NSData*) sockaddrData {
|
|
return [address sockaddrDataWithPort:port];
|
|
}
|
|
|
|
-(NSString*) description {
|
|
return [NSString stringWithFormat:@"Address: %@, port: %d", address, port];
|
|
}
|
|
|
|
-(void) handleStreamsOpened:(StreamPair *)streamPair {
|
|
// no work needed
|
|
}
|
|
-(TOCFuture*) asyncHandleStreamsConnected:(StreamPair *)streamPair {
|
|
return [TOCFuture futureWithResult:@YES];
|
|
}
|
|
|
|
-(StreamPair*)createStreamPair {
|
|
CFReadStreamRef readStream;
|
|
CFWriteStreamRef writeStream;
|
|
CFStreamCreatePairWithSocketToHost(NULL, (__bridge CFStringRef)[address description], port, &readStream, &writeStream);
|
|
return [StreamPair streamPairWithInput:(__bridge_transfer NSInputStream*)readStream
|
|
andOutput:(__bridge_transfer NSOutputStream*)writeStream];
|
|
}
|
|
|
|
-(TOCFuture*) asyncResolveToSpecificEndPointsUnlessCancelled:(TOCCancelToken*)unlessCancelledToken {
|
|
return [TOCFuture futureWithResult:@[self]];
|
|
}
|
|
|
|
@end
|