view dstep/foundation/NSStream.d @ 16:19885b43130e

Huge update, the bridge actually works now
author Jacob Carlborg <doob@me.com>
date Sun, 03 Jan 2010 22:06:11 +0100
parents 89f3c3ef1fd2
children b9de51448c6b
line wrap: on
line source

/**
 * Copyright: Copyright (c) 2009 Jacob Carlborg.
 * Authors: Jacob Carlborg
 * Version: Initial created: Aug 3, 2009 
 * License: $(LINK2 http://www.boost.org/LICENSE_1_0.txt, Boost Software License 1.0)
 */
module dstep.foundation.NSStream;

import dstep.foundation.NSData;
import dstep.foundation.NSDictionary;
import dstep.foundation.NSError;
import dstep.foundation.NSHost;
import dstep.foundation.NSObjCRuntime;
import dstep.foundation.NSObject;
import dstep.foundation.NSRunLoop;
import dstep.foundation.NSString;
import dstep.objc.bridge.Bridge;
import dstep.objc.objc;



import bindings = dstep.foundation.NSStream_bindings;

alias NSUInteger NSStreamStatus;
alias NSUInteger NSStreamEvent;

private
{
	NSString NSStreamSocketSecurityLevelKey_;
	NSString NSStreamSocketSecurityLevelNone_;
	NSString NSStreamSocketSecurityLevelSSLv2_;
	NSString NSStreamSocketSecurityLevelSSLv3_;
	NSString NSStreamSocketSecurityLevelTLSv1_;
	NSString NSStreamSocketSecurityLevelNegotiatedSSL_;
	NSString NSStreamSOCKSProxyConfigurationKey_;
	NSString NSStreamSOCKSProxyHostKey_;
	NSString NSStreamSOCKSProxyPortKey_;
	NSString NSStreamSOCKSProxyVersionKey_;
	NSString NSStreamSOCKSProxyUserKey_;
	NSString NSStreamSOCKSProxyPasswordKey_;
	NSString NSStreamSOCKSProxyVersion4_;
	NSString NSStreamSOCKSProxyVersion5_;
	NSString NSStreamDataWrittenToMemoryStreamKey_;
	NSString NSStreamFileCurrentOffsetKey_;
	NSString NSStreamSocketSSLErrorDomain_;
	NSString NSStreamSOCKSErrorDomain_;
}

NSString NSStreamSocketSecurityLevelKey ()
{
	if (NSStreamSocketSecurityLevelKey_)
		return NSStreamSocketSecurityLevelKey_;
		
	return NSStreamSocketSecurityLevelKey_ = new NSString(bindings.NSStreamSocketSecurityLevelKey);
}

NSString NSStreamSocketSecurityLevelNone ()
{
	if (NSStreamSocketSecurityLevelNone_)
		return NSStreamSocketSecurityLevelNone_;
		
	return NSStreamSocketSecurityLevelNone_ = new NSString(bindings.NSStreamSocketSecurityLevelNone);
}

NSString NSStreamSocketSecurityLevelSSLv2 ()
{
	if (NSStreamSocketSecurityLevelSSLv2_)
		return NSStreamSocketSecurityLevelSSLv2_;
		
	return NSStreamSocketSecurityLevelSSLv2_ = new NSString(bindings.NSStreamSocketSecurityLevelSSLv2);
}

NSString NSStreamSocketSecurityLevelSSLv3 ()
{
	if (NSStreamSocketSecurityLevelSSLv3_)
		return NSStreamSocketSecurityLevelSSLv3_;
		
	return NSStreamSocketSecurityLevelSSLv3_ = new NSString(bindings.NSStreamSocketSecurityLevelSSLv3);
}

NSString NSStreamSocketSecurityLevelTLSv1 ()
{
	if (NSStreamSocketSecurityLevelTLSv1_)
		return NSStreamSocketSecurityLevelTLSv1_;
		
	return NSStreamSocketSecurityLevelTLSv1_ = new NSString(bindings.NSStreamSocketSecurityLevelTLSv1);
}

NSString NSStreamSocketSecurityLevelNegotiatedSSL ()
{
	if (NSStreamSocketSecurityLevelNegotiatedSSL_)
		return NSStreamSocketSecurityLevelNegotiatedSSL_;
		
	return NSStreamSocketSecurityLevelNegotiatedSSL_ = new NSString(bindings.NSStreamSocketSecurityLevelNegotiatedSSL);
}

NSString NSStreamSOCKSProxyConfigurationKey ()
{
	if (NSStreamSOCKSProxyConfigurationKey_)
		return NSStreamSOCKSProxyConfigurationKey_;
		
	return NSStreamSOCKSProxyConfigurationKey_ = new NSString(bindings.NSStreamSOCKSProxyConfigurationKey);
}

NSString NSStreamSOCKSProxyHostKey ()
{
	if (NSStreamSOCKSProxyHostKey_)
		return NSStreamSOCKSProxyHostKey_;
		
	return NSStreamSOCKSProxyHostKey_ = new NSString(bindings.NSStreamSOCKSProxyHostKey);
}

NSString NSStreamSOCKSProxyPortKey ()
{
	if (NSStreamSOCKSProxyPortKey_)
		return NSStreamSOCKSProxyPortKey_;
		
	return NSStreamSOCKSProxyPortKey_ = new NSString(bindings.NSStreamSOCKSProxyPortKey);
}

NSString NSStreamSOCKSProxyVersionKey ()
{
	if (NSStreamSOCKSProxyVersionKey_)
		return NSStreamSOCKSProxyVersionKey_;
		
	return NSStreamSOCKSProxyVersionKey_ = new NSString(bindings.NSStreamSOCKSProxyVersionKey);
}

NSString NSStreamSOCKSProxyUserKey ()
{
	if (NSStreamSOCKSProxyUserKey_)
		return NSStreamSOCKSProxyUserKey_;
		
	return NSStreamSOCKSProxyUserKey_ = new NSString(bindings.NSStreamSOCKSProxyUserKey);
}

NSString NSStreamSOCKSProxyPasswordKey ()
{
	if (NSStreamSOCKSProxyPasswordKey_)
		return NSStreamSOCKSProxyPasswordKey_;
		
	return NSStreamSOCKSProxyPasswordKey_ = new NSString(bindings.NSStreamSOCKSProxyPasswordKey);
}

NSString NSStreamSOCKSProxyVersion4 ()
{
	if (NSStreamSOCKSProxyVersion4_)
		return NSStreamSOCKSProxyVersion4_;
		
	return NSStreamSOCKSProxyVersion4_ = new NSString(bindings.NSStreamSOCKSProxyVersion4);
}

NSString NSStreamSOCKSProxyVersion5 ()
{
	if (NSStreamSOCKSProxyVersion5_)
		return NSStreamSOCKSProxyVersion5_;
		
	return NSStreamSOCKSProxyVersion5_ = new NSString(bindings.NSStreamSOCKSProxyVersion5);
}

NSString NSStreamDataWrittenToMemoryStreamKey ()
{
	if (NSStreamDataWrittenToMemoryStreamKey_)
		return NSStreamDataWrittenToMemoryStreamKey_;
		
	return NSStreamDataWrittenToMemoryStreamKey_ = new NSString(bindings.NSStreamDataWrittenToMemoryStreamKey);
}

NSString NSStreamFileCurrentOffsetKey ()
{
	if (NSStreamFileCurrentOffsetKey_)
		return NSStreamFileCurrentOffsetKey_;
		
	return NSStreamFileCurrentOffsetKey_ = new NSString(bindings.NSStreamFileCurrentOffsetKey);
}

NSString NSStreamSocketSSLErrorDomain ()
{
	if (NSStreamSocketSSLErrorDomain_)
		return NSStreamSocketSSLErrorDomain_;
		
	return NSStreamSocketSSLErrorDomain_ = new NSString(bindings.NSStreamSocketSSLErrorDomain);
}

NSString NSStreamSOCKSErrorDomain ()
{
	if (NSStreamSOCKSErrorDomain_)
		return NSStreamSOCKSErrorDomain_;
		
	return NSStreamSOCKSErrorDomain_ = new NSString(bindings.NSStreamSOCKSErrorDomain);
}

enum
{
	NSStreamStatusNotOpen = 0,
	NSStreamStatusOpening = 1,
	NSStreamStatusOpen = 2,
	NSStreamStatusReading = 3,
	NSStreamStatusWriting = 4,
	NSStreamStatusAtEnd = 5,
	NSStreamStatusClosed = 6,
	NSStreamStatusError = 7
}

enum
{
	NSStreamEventNone = 0,
	NSStreamEventOpenCompleted = 1 << 0,
	NSStreamEventHasBytesAvailable = 1 << 1,
	NSStreamEventHasSpaceAvailable = 1 << 2,
	NSStreamEventErrorOccurred = 1 << 3,
	NSStreamEventEndEncountered = 1 << 4
}

const TNSStreamDelegateEventExtensions = `

	void stream (NSStream aStream, NSStreamEvent eventCode)
	{
		return invokeObjcSelf!(void, "stream:handleEvent:", NSStream, NSStreamEvent)(aStream, eventCode);
	}
	
	//mixin ObjcBindMethod!(stream, "stream:handleEvent:");
`;

const TNSOutputStreamExtensions = `

	Object initToMemory ()
	{
		return invokeObjcSelf!(Object, "initToMemory");
	}

	this ()
	{
		typeof(this).alloc.initToMemory();
	}

	Object initToBuffer (char* buffer, NSUInteger capacity)
	{
		return invokeObjcSelf!(Object, "initToBuffer:capacity:", char*, NSUInteger)(buffer, capacity);
	}

	this (char* buffer, NSUInteger capacity)
	{
		typeof(this).alloc.initToBuffer(buffer, capacity);
	}

	Object initToFileAtPath (NSString path, bool shouldAppend)
	{
		return invokeObjcSelf!(Object, "initToFileAtPath:append:", NSString, bool)(path, shouldAppend);
	}

	this (NSString path, bool shouldAppend)
	{
		typeof(this).alloc.initToFileAtPath(path, shouldAppend);
	}

	static Object outputStreamToMemory ()
	{
		return invokeObjcSuperClass!(Object, "outputStreamToMemory");
	}

	static Object outputStreamToBuffer (char* buffer, NSUInteger capacity)
	{
		return invokeObjcSuperClass!(Object, "outputStreamToBuffer:capacity:", char*, NSUInteger)(buffer, capacity);
	}

	static Object outputStreamToFileAtPath (NSString path, bool shouldAppend)
	{
		return invokeObjcSuperClass!(Object, "outputStreamToFileAtPath:append:", NSString, bool)(path, shouldAppend);
	}
`;

const TNSSocketStreamCreationExtensions = `

	static void getStreamsToHost (NSHost host, NSInteger port, NSInputStream** inputStream, NSOutputStream** outputStream)
	{
		return invokeObjcSuperClass!(void, "getStreamsToHost:port:inputStream:outputStream:", NSHost, NSInteger, NSInputStream**, NSOutputStream**)(host, port, inputStream, outputStream);
	}
`;

const TNSInputStreamExtensions = `

	Object initWithData (NSData data)
	{
		return invokeObjcSelf!(Object, "initWithData:", NSData)(data);
	}

	this (NSData data)
	{
		typeof(this).alloc.initWithData(data);
	}

	Object initWithFileAtPath (NSString path)
	{
		return invokeObjcSelf!(Object, "initWithFileAtPath:", NSString)(path);
	}

	this (NSString path)
	{
		typeof(this).alloc.initWithFileAtPath(path);
	}

	static Object inputStreamWithData (NSData data)
	{
		return invokeObjcSuperClass!(Object, "inputStreamWithData:", NSData)(data);
	}

	static Object inputStreamWithFileAtPath (NSString path)
	{
		return invokeObjcSuperClass!(Object, "inputStreamWithFileAtPath:", NSString)(path);
	}
`;

class NSStream : NSObject
{
	mixin (ObjcWrap);
	
	this ()
	{
		super(typeof(this).alloc.init.objcObject);
	}
	
	typeof(this) init ()
	{
		return invokeObjcSelf!(typeof(this), "init");
	}

	void open ()
	{
		return invokeObjcSelf!(void, "open");
	}

	void close ()
	{
		return invokeObjcSelf!(void, "close");
	}

	Object delegate_ ()
	{
		return invokeObjcSelf!(Object, "delegate");
	}

	void setDelegate (Object delegate_)
	{
		return invokeObjcSelf!(void, "setDelegate:", Object)(delegate_);
	}

	Object propertyForKey (NSString key)
	{
		return invokeObjcSelf!(Object, "propertyForKey:", NSString)(key);
	}

	bool setProperty (Object property, NSString key)
	{
		return invokeObjcSelf!(bool, "setProperty:forKey:", Object, NSString)(property, key);
	}

	void scheduleInRunLoop (NSRunLoop aRunLoop, NSString mode)
	{
		return invokeObjcSelf!(void, "scheduleInRunLoop:forMode:", NSRunLoop, NSString)(aRunLoop, mode);
	}

	void removeFromRunLoop (NSRunLoop aRunLoop, NSString mode)
	{
		return invokeObjcSelf!(void, "removeFromRunLoop:forMode:", NSRunLoop, NSString)(aRunLoop, mode);
	}

	uint streamStatus ()
	{
		return invokeObjcSelf!(uint, "streamStatus");
	}

	NSError streamError ()
	{
		return invokeObjcSelf!(NSError, "streamError");
	}
	
	// TNSSocketStreamCreationExtensions
	static void getStreamsToHost (NSHost host, NSInteger port, NSInputStream** inputStream, NSOutputStream** outputStream)
	{
		return invokeObjcSuperClass!(void, "getStreamsToHost:port:inputStream:outputStream:", NSHost, NSInteger, NSInputStream**, NSOutputStream**)(host, port, inputStream, outputStream);
	}
}

class NSOutputStream : NSStream
{
	mixin (ObjcWrap);
	
	this ()
	{
		super(typeof(this).alloc.init.objcObject);
	}
	
	typeof(this) init ()
	{
		return invokeObjcSelf!(typeof(this), "init");
	}

	NSInteger write (char* buffer, NSUInteger len)
	{
		return invokeObjcSelf!(NSInteger, "write:maxLength:", char*, NSUInteger)(buffer, len);
	}

	bool hasSpaceAvailable ()
	{
		return invokeObjcSelf!(bool, "hasSpaceAvailable");
	}
	
	// TNSOutputStreamExtensions
	Object initToMemory ()
	{
		return invokeObjcSelf!(Object, "initToMemory");
	}
	
	Object initToBuffer (char* buffer, NSUInteger capacity)
	{
		return invokeObjcSelf!(Object, "initToBuffer:capacity:", char*, NSUInteger)(buffer, capacity);
	}
	
	this (char* buffer, NSUInteger capacity)
	{
		typeof(this).alloc.initToBuffer(buffer, capacity);
	}
	
	Object initToFileAtPath (NSString path, bool shouldAppend)
	{
		return invokeObjcSelf!(Object, "initToFileAtPath:append:", NSString, bool)(path, shouldAppend);
	}
	
	this (NSString path, bool shouldAppend)
	{
		typeof(this).alloc.initToFileAtPath(path, shouldAppend);
	}
	
	static Object outputStreamToMemory ()
	{
		return invokeObjcSuperClass!(Object, "outputStreamToMemory");
	}
	
	static Object outputStreamToBuffer (char* buffer, NSUInteger capacity)
	{
		return invokeObjcSuperClass!(Object, "outputStreamToBuffer:capacity:", char*, NSUInteger)(buffer, capacity);
	}
	
	static Object outputStreamToFileAtPath (NSString path, bool shouldAppend)
	{
		return invokeObjcSuperClass!(Object, "outputStreamToFileAtPath:append:", NSString, bool)(path, shouldAppend);
	}
}

class NSInputStream : NSStream
{
	mixin (ObjcWrap);
	
	this ()
	{
		super(typeof(this).alloc.init.objcObject);
	}
	
	typeof(this) init ()
	{
		return invokeObjcSelf!(typeof(this), "init");
	}

	NSInteger read (char* buffer, NSUInteger len)
	{
		return invokeObjcSelf!(NSInteger, "read:maxLength:", char*, NSUInteger)(buffer, len);
	}

	bool getBuffer (ubyte** buffer, NSUInteger* len)
	{
		return invokeObjcSelf!(bool, "getBuffer:length:", ubyte**, NSUInteger*)(buffer, len);
	}

	bool hasBytesAvailable ()
	{
		return invokeObjcSelf!(bool, "hasBytesAvailable");
	}
	
	// TNSInputStreamExtensions
	Object initWithData (NSData data)
	{
		return invokeObjcSelf!(Object, "initWithData:", NSData)(data);
	}
	
	this (NSData data)
	{
		typeof(this).alloc.initWithData(data);
	}
	
	Object initWithFileAtPath (NSString path)
	{
		return invokeObjcSelf!(Object, "initWithFileAtPath:", NSString)(path);
	}
	
	this (NSString path)
	{
		typeof(this).alloc.initWithFileAtPath(path);
	}
	
	static Object inputStreamWithData (NSData data)
	{
		return invokeObjcSuperClass!(Object, "inputStreamWithData:", NSData)(data);
	}
	
	static Object inputStreamWithFileAtPath (NSString path)
	{
		return invokeObjcSuperClass!(Object, "inputStreamWithFileAtPath:", NSString)(path);
	}
}