mirror of
https://github.com/gnustep/libs-base.git
synced 2025-04-25 17:51:01 +00:00
NSNetServiceListenForConnections option implemented for GSAvahiNetService
git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/base/trunk@37521 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
parent
dcb77e3632
commit
27e3e2f3f5
3 changed files with 104 additions and 16 deletions
|
@ -1,5 +1,10 @@
|
||||||
2013-12-26 Marcus Mueller <znek@mulle-kybernetik.com>
|
2013-12-26 Marcus Mueller <znek@mulle-kybernetik.com>
|
||||||
|
|
||||||
|
* Headers/Foundation/NSNetServices.h:
|
||||||
|
* Source/GSAvahiNetService.m:
|
||||||
|
added NSNetServiceListenForConnections option (introduced in
|
||||||
|
OSX 10.9) and accompanying delegate method, currently implemented in
|
||||||
|
GSAvahiNetService.m only.
|
||||||
* Headers/Foundation/NSStream.h: fixed typo (_clang_ -> __clang__)
|
* Headers/Foundation/NSStream.h: fixed typo (_clang_ -> __clang__)
|
||||||
|
|
||||||
2013-12-24 Richard Frith-Macdonald <rfm@gnu.org>
|
2013-12-24 Richard Frith-Macdonald <rfm@gnu.org>
|
||||||
|
|
|
@ -93,7 +93,10 @@ enum
|
||||||
typedef NSUInteger NSNetServicesError;
|
typedef NSUInteger NSNetServicesError;
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
NSNetServiceNoAutoRename = 1 << 0
|
NSNetServiceNoAutoRename = 1 << 0
|
||||||
|
#if OS_API_VERSION(MAC_OS_X_VERSION_10_9,GS_API_LATEST)
|
||||||
|
,NSNetServiceListenForConnections = 1 << 1
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
typedef NSUInteger NSNetServiceOptions;
|
typedef NSUInteger NSNetServiceOptions;
|
||||||
|
|
||||||
|
@ -202,6 +205,22 @@ GS_EXPORT NSString * const NSNetServicesErrorDomain;
|
||||||
- (void) netService: (NSNetService *) sender
|
- (void) netService: (NSNetService *) sender
|
||||||
didUpdateTXTRecordData: (NSData *) data;
|
didUpdateTXTRecordData: (NSData *) data;
|
||||||
|
|
||||||
|
#if OS_API_VERSION(MAC_OS_X_VERSION_10_9,GS_API_LATEST)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Notifies the delegate that the service, which must have been published with
|
||||||
|
* option NSNetServiceListenForConnections, received a new connection.
|
||||||
|
* In order to communicate with the connecting client, you must -open
|
||||||
|
* the streams and schedule them with a runloop.
|
||||||
|
* To reject a connection, just -open and immediately -close both streams.
|
||||||
|
*/
|
||||||
|
|
||||||
|
- (void) netService: (NSNetService *) sender
|
||||||
|
didAcceptConnectionWithInputStream: (NSInputStream *) inputStream
|
||||||
|
outputStream: (NSOutputStream *)outputStream;
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -33,6 +33,7 @@
|
||||||
#import "Foundation/NSLock.h"
|
#import "Foundation/NSLock.h"
|
||||||
#import "Foundation/NSException.h"
|
#import "Foundation/NSException.h"
|
||||||
#import "GNUstepBase/GSObjCRuntime.h"
|
#import "GNUstepBase/GSObjCRuntime.h"
|
||||||
|
#import <GNUstepBase/NSStream+GNUstepBase.h>
|
||||||
#include <avahi-common/error.h>
|
#include <avahi-common/error.h>
|
||||||
#include <avahi-common/malloc.h>
|
#include <avahi-common/malloc.h>
|
||||||
#include <avahi-common/strlst.h>
|
#include <avahi-common/strlst.h>
|
||||||
|
@ -990,6 +991,48 @@ didUpdateRecordData: (id)data
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (options & NSNetServiceListenForConnections)
|
||||||
|
{
|
||||||
|
/* setup server socket first, as port is required in
|
||||||
|
* -[self addServiceEntry] (see below)
|
||||||
|
*/
|
||||||
|
NSInteger port = [self port];
|
||||||
|
if (port < 0)
|
||||||
|
{
|
||||||
|
port = 0;
|
||||||
|
}
|
||||||
|
GSServerStream *serverStream = [GSServerStream serverStreamToAddr: @""
|
||||||
|
port: port];
|
||||||
|
if (serverStream != nil)
|
||||||
|
{
|
||||||
|
[serverStream setDelegate:self];
|
||||||
|
[serverStream open];
|
||||||
|
if ([serverStream streamStatus] != NSStreamStatusOpen)
|
||||||
|
{
|
||||||
|
ret = 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
[serverStream scheduleInRunLoop: [NSRunLoop currentRunLoop]
|
||||||
|
forMode: NSDefaultRunLoopMode];
|
||||||
|
[self setInfoObject: serverStream forKey: @"serverStream"];
|
||||||
|
NSNumber *portNumber = [serverStream propertyForKey: GSStreamLocalPortKey];
|
||||||
|
[self setInfoObject: portNumber forKey: @"port"];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ret = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ret != 0)
|
||||||
|
{
|
||||||
|
[self handleError:NSNetServicesBadArgumentError];
|
||||||
|
[_lock unlock];
|
||||||
|
return NO;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* Try adding the service to the entry group until we find an unused name
|
/* Try adding the service to the entry group until we find an unused name
|
||||||
* for it (but only if NSNetServiceNoAutoRename is not set).
|
* for it (but only if NSNetServiceNoAutoRename is not set).
|
||||||
*/
|
*/
|
||||||
|
@ -1011,14 +1054,8 @@ didUpdateRecordData: (id)data
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Handle any new error condition.
|
|
||||||
if (ret != 0)
|
|
||||||
{
|
|
||||||
[_lock unlock];
|
|
||||||
return NO;
|
|
||||||
}
|
|
||||||
[_lock unlock];
|
[_lock unlock];
|
||||||
return YES;
|
return ret == 0 ? YES : NO;
|
||||||
}
|
}
|
||||||
|
|
||||||
- (BOOL) addServiceRecord
|
- (BOOL) addServiceRecord
|
||||||
|
@ -1029,15 +1066,12 @@ didUpdateRecordData: (id)data
|
||||||
- (void) publishWithOptions: (NSNetServiceOptions)options
|
- (void) publishWithOptions: (NSNetServiceOptions)options
|
||||||
{
|
{
|
||||||
[_lock lock];
|
[_lock lock];
|
||||||
if (_entryGroup != NULL)
|
if (_entryGroup == NULL)
|
||||||
{
|
{
|
||||||
[self commitEntryGroup];
|
if (NO == [self addServiceRecordWithOptions: options])
|
||||||
return;
|
{
|
||||||
}
|
[self handleError: avahi_client_errno((AvahiClient*)_client)];
|
||||||
|
}
|
||||||
if (NO == [self addServiceRecordWithOptions: options])
|
|
||||||
{
|
|
||||||
[self handleError: avahi_client_errno((AvahiClient*)_client)];
|
|
||||||
}
|
}
|
||||||
[self commitEntryGroup];
|
[self commitEntryGroup];
|
||||||
[_lock unlock];
|
[_lock unlock];
|
||||||
|
@ -1204,6 +1238,7 @@ didUpdateRecordData: (id)data
|
||||||
}
|
}
|
||||||
if (!hadError)
|
if (!hadError)
|
||||||
{
|
{
|
||||||
|
[self removeInfoObjectForKey: @"serverStream"];
|
||||||
[self netServiceDidStop: self];
|
[self netServiceDidStop: self];
|
||||||
}
|
}
|
||||||
_serviceState = GSNetServiceIdle;
|
_serviceState = GSNetServiceIdle;
|
||||||
|
@ -1931,6 +1966,35 @@ didUpdateRecordData: (id)data
|
||||||
[_lock unlock];
|
[_lock unlock];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* GSServerStream delegate method, called only when this service has been
|
||||||
|
* published with the NSNetServiceListenForConnections option.
|
||||||
|
*/
|
||||||
|
- (void) stream:(NSStream*) stream handleEvent: (NSStreamEvent)anEvent
|
||||||
|
{
|
||||||
|
switch (anEvent)
|
||||||
|
{
|
||||||
|
case NSStreamEventHasBytesAvailable:
|
||||||
|
{
|
||||||
|
if ([[self delegate]
|
||||||
|
respondsToSelector:
|
||||||
|
@selector(netService:didAcceptConnectionWithInputStream:outputStream:)])
|
||||||
|
{
|
||||||
|
NSInputStream *is;
|
||||||
|
NSOutputStream *os;
|
||||||
|
GSServerStream *serverStream = [self infoObjectForKey: @"serverStream"];
|
||||||
|
[serverStream acceptWithInputStream: &is outputStream: &os];
|
||||||
|
[[self delegate] netService: self
|
||||||
|
didAcceptConnectionWithInputStream: is
|
||||||
|
outputStream: os];
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
- (void) dealloc
|
- (void) dealloc
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Reference in a new issue