mirror of
https://github.com/gnustep/libs-base.git
synced 2025-05-29 16:01:38 +00:00
([TcpInPort -numberOfConnectedOutPorts]): New method.
([TcpInPort -_connectedOutPortInvalidated:]): Post an InPortClientBecameInvalidNotification. ([TcpInPort -portNumber]): New method. ([TcpInPort -description]): New method. ([TcpOutPort +newWithAcceptedSocket:inPort:]): Fill in the _address ivar. ([TcpOutPort -portNumber]): New method. ([TcpOutPort -description]): New method. git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/base/trunk@1039 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
parent
272ac50286
commit
7d8460ea0e
1 changed files with 67 additions and 1 deletions
|
@ -28,6 +28,7 @@
|
|||
#include <objects/stdobjects.h>
|
||||
#include <objects/TcpPort.h>
|
||||
#include <objects/Array.h>
|
||||
#include <objects/Notification.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
|
@ -188,6 +189,11 @@ static NSMapTable* port_number_2_port;
|
|||
autorelease];
|
||||
}
|
||||
|
||||
- (unsigned) numberOfConnectedOutPorts
|
||||
{
|
||||
return NSCountMapTable (client_sock_2_out_port);
|
||||
}
|
||||
|
||||
- receivePacketWithTimeout: (int)milliseconds
|
||||
{
|
||||
static int fd_index = 0;
|
||||
|
@ -311,6 +317,7 @@ static NSMapTable* port_number_2_port;
|
|||
NSMapInsert (client_sock_2_out_port, (void*)s, p);
|
||||
}
|
||||
|
||||
/* Called by an OutPort in its -invalidate method. */
|
||||
- (void) _connectedOutPortInvalidated: p
|
||||
{
|
||||
id packet;
|
||||
|
@ -324,6 +331,13 @@ static NSMapTable* port_number_2_port;
|
|||
}
|
||||
NSMapRemove (client_sock_2_out_port, (void*)s);
|
||||
FD_CLR(s, &active_fd_set);
|
||||
|
||||
/* xxx Should this be earlier, so that the notification recievers
|
||||
can still use client_sock_2_out_port before the out port P is removed? */
|
||||
[NotificationDispatcher
|
||||
postNotificationName: InPortClientBecameInvalidNotification
|
||||
object: self
|
||||
userInfo: p];
|
||||
}
|
||||
|
||||
- (int) _socket
|
||||
|
@ -331,6 +345,11 @@ static NSMapTable* port_number_2_port;
|
|||
return _socket;
|
||||
}
|
||||
|
||||
- (int) portNumber
|
||||
{
|
||||
return (int) ntohs (_address.sin_port);
|
||||
}
|
||||
|
||||
- (void) invalidate
|
||||
{
|
||||
if (is_valid)
|
||||
|
@ -341,6 +360,7 @@ static NSMapTable* port_number_2_port;
|
|||
int sock;
|
||||
id out_ports[count];
|
||||
int i;
|
||||
|
||||
for (i = 0;
|
||||
NSNextMapEnumeratorPair (&me, (void*)&sock, (void*)&out_port);
|
||||
i++)
|
||||
|
@ -351,7 +371,10 @@ static NSMapTable* port_number_2_port;
|
|||
[out_ports[i] invalidate];
|
||||
}
|
||||
assert (!NSCountMapTable (client_sock_2_out_port));
|
||||
|
||||
close (_socket);
|
||||
|
||||
/* This also posts a PortBecameInvalidNotification. */
|
||||
[super invalidate];
|
||||
}
|
||||
}
|
||||
|
@ -384,6 +407,15 @@ static NSMapTable* port_number_2_port;
|
|||
return [TcpPacket class];
|
||||
}
|
||||
|
||||
- description
|
||||
{
|
||||
return [NSString stringWithFormat: @"%s 0x%x port %hd socket %d",
|
||||
object_get_class_name (self),
|
||||
(unsigned)self,
|
||||
ntohs (_address.sin_port),
|
||||
_socket];
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
|
||||
|
@ -465,7 +497,19 @@ static NSMapTable* port_number_2_port;
|
|||
|
||||
+ newWithAcceptedSocket: (int)s inPort: p
|
||||
{
|
||||
return [[self alloc] _initWithSocket: s inPort: p];
|
||||
TcpOutPort *op;
|
||||
struct sockaddr_in addr;
|
||||
int size = sizeof (struct sockaddr_in);
|
||||
|
||||
/* Create the port object. */
|
||||
op = [[self alloc] _initWithSocket: s inPort: p];
|
||||
|
||||
/* Fill in its _address ivar. */
|
||||
getsockname (op->_socket, (struct sockaddr*)&addr, &size);
|
||||
assert (size == sizeof (struct sockaddr_in));
|
||||
memcpy (&(op->_address), &addr, sizeof (struct sockaddr_in));
|
||||
|
||||
return op;
|
||||
}
|
||||
|
||||
- (int) writeBytes: (const char*)b length: (int)len
|
||||
|
@ -497,6 +541,11 @@ static NSMapTable* port_number_2_port;
|
|||
return _socket;
|
||||
}
|
||||
|
||||
- (int) portNumber
|
||||
{
|
||||
return (int) ntohs (_address.sin_port);
|
||||
}
|
||||
|
||||
- (void) close
|
||||
{
|
||||
[self invalidate];
|
||||
|
@ -511,6 +560,7 @@ static NSMapTable* port_number_2_port;
|
|||
[connected_in_port _connectedOutPortInvalidated: self];
|
||||
[connected_in_port release];
|
||||
connected_in_port = nil;
|
||||
/* This also posts a PortBecameInvalidNotification. */
|
||||
[super invalidate];
|
||||
}
|
||||
}
|
||||
|
@ -534,6 +584,16 @@ static NSMapTable* port_number_2_port;
|
|||
return [TcpPacket class];
|
||||
}
|
||||
|
||||
- description
|
||||
{
|
||||
return [NSString stringWithFormat: @"%s 0x%x host %s port %hd socket %d",
|
||||
object_get_class_name (self),
|
||||
(unsigned)self,
|
||||
inet_ntoa (_address.sin_addr),
|
||||
ntohs (_address.sin_port),
|
||||
_socket];
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
|
||||
|
@ -630,3 +690,9 @@ static NSMapTable* port_number_2_port;
|
|||
|
||||
@end
|
||||
|
||||
|
||||
/* Notification Strings. */
|
||||
|
||||
NSString *
|
||||
InPortClientBecameInvalidNotification =
|
||||
@"InPortClientBecameInvalidNotification";
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue