view dstep/foundation/NSStream.d @ 14:89f3c3ef1fd2

Added the Foundation framework
author Jacob Carlborg <doob@me.com>
date Mon, 03 Aug 2009 15:23:15 +0200
parents
children 19885b43130e
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.NSInputStream;
import dstep.foundation.NSObject;
import dstep.foundation.NSOutputStream;
import dstep.foundation.NSRunLoop;
import dstep.foundation.NSString;
import dstep.objc.bridge.Bridge;
import dstep.objc.objc : id;

import bindings = dstep.foundation.NSStream_bindings;

alias NSUInteger NSStreamStatus;
alias NSUInteger NSStreamEvent;

const NSString NSStreamSocketSecurityLevelKey;
const NSString NSStreamSocketSecurityLevelNone;
const NSString NSStreamSocketSecurityLevelSSLv2;
const NSString NSStreamSocketSecurityLevelSSLv3;
const NSString NSStreamSocketSecurityLevelTLSv1;
const NSString NSStreamSocketSecurityLevelNegotiatedSSL;
const NSString NSStreamSOCKSProxyConfigurationKey;
const NSString NSStreamSOCKSProxyHostKey;
const NSString NSStreamSOCKSProxyPortKey;
const NSString NSStreamSOCKSProxyVersionKey;
const NSString NSStreamSOCKSProxyUserKey;
const NSString NSStreamSOCKSProxyPasswordKey;
const NSString NSStreamSOCKSProxyVersion4;
const NSString NSStreamSOCKSProxyVersion5;
const NSString NSStreamDataWrittenToMemoryStreamKey;
const NSString NSStreamFileCurrentOffsetKey;
const NSString NSStreamSocketSSLErrorDomain;
const NSString 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
}

static this ()
{
	NSStreamSocketSecurityLevelKey = new NSString(bindings.NSStreamSocketSecurityLevelKey);
	NSStreamSocketSecurityLevelNone = new NSString(bindings.NSStreamSocketSecurityLevelNone);
	NSStreamSocketSecurityLevelSSLv2 = new NSString(bindings.NSStreamSocketSecurityLevelSSLv2);
	NSStreamSocketSecurityLevelSSLv3 = new NSString(bindings.NSStreamSocketSecurityLevelSSLv3);
	NSStreamSocketSecurityLevelTLSv1 = new NSString(bindings.NSStreamSocketSecurityLevelTLSv1);
	NSStreamSocketSecurityLevelNegotiatedSSL = new NSString(bindings.NSStreamSocketSecurityLevelNegotiatedSSL);
	NSStreamSOCKSProxyConfigurationKey = new NSString(bindings.NSStreamSOCKSProxyConfigurationKey);
	NSStreamSOCKSProxyHostKey = new NSString(bindings.NSStreamSOCKSProxyHostKey);
	NSStreamSOCKSProxyPortKey = new NSString(bindings.NSStreamSOCKSProxyPortKey);
	NSStreamSOCKSProxyVersionKey = new NSString(bindings.NSStreamSOCKSProxyVersionKey);
	NSStreamSOCKSProxyUserKey = new NSString(bindings.NSStreamSOCKSProxyUserKey);
	NSStreamSOCKSProxyPasswordKey = new NSString(bindings.NSStreamSOCKSProxyPasswordKey);
	NSStreamSOCKSProxyVersion4 = new NSString(bindings.NSStreamSOCKSProxyVersion4);
	NSStreamSOCKSProxyVersion5 = new NSString(bindings.NSStreamSOCKSProxyVersion5);
	NSStreamDataWrittenToMemoryStreamKey = new NSString(bindings.NSStreamDataWrittenToMemoryStreamKey);
	NSStreamFileCurrentOffsetKey = new NSString(bindings.NSStreamFileCurrentOffsetKey);
	NSStreamSocketSSLErrorDomain = new NSString(bindings.NSStreamSocketSSLErrorDomain);
	NSStreamSOCKSErrorDomain = new NSString(bindings.NSStreamSOCKSErrorDomain);
}

class NSStream : NSObject
{
	mixin ObjcWrap;
	mixin TNSSocketStreamCreationExtensions;

	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");
	}
}

class NSOutputStream : NSStream
{
	mixin ObjcWrap;
	mixin TNSOutputStreamExtensions;

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

	bool hasSpaceAvailable ()
	{
		return invokeObjcSelf!(bool, "hasSpaceAvailable");
	}
}

class NSInputStream : NSStream
{
	mixin ObjcWrap;
	mixin TNSInputStreamExtensions;

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

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

	bool hasBytesAvailable ()
	{
		return invokeObjcSelf!(bool, "hasBytesAvailable");
	}
}

template TNSStreamDelegateEventExtensions ()
{
	void stream (NSStream aStream, uint eventCode);
}

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

	this ()
	{
		objcObject = Bridge.invokeObjcClassMethod!(id, "alloc")(objcClass);
		id result = Bridge.invokeObjcMethod!(id, "initToMemory")(objcObject);

		if (result)
			objcObject = ret;

		dObject = this;
	}

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

	this (char* buffer, NSUInteger capacity)
	{
		objcObject = Bridge.invokeObjcClassMethod!(id, "alloc")(objcClass);
		id result = Bridge.invokeObjcMethod!(id, "initToBuffer:capacity:", char*, NSUInteger)(objcObject, buffer, capacity);

		if (result)
			objcObject = ret;

		dObject = this;
	}

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

	this (NSString path, bool shouldAppend)
	{
		objcObject = Bridge.invokeObjcClassMethod!(id, "alloc")(objcClass);
		id result = Bridge.invokeObjcMethod!(id, "initToFileAtPath:append:", NSString, bool)(objcObject, path, shouldAppend);

		if (result)
			objcObject = ret;

		dObject = this;
	}

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

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

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

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

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

	this (NSData data)
	{
		objcObject = Bridge.invokeObjcClassMethod!(id, "alloc")(objcClass);
		id result = Bridge.invokeObjcMethod!(id, "initWithData:", NSData)(objcObject, data);

		if (result)
			objcObject = ret;

		dObject = this;
	}

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

	this (NSString path)
	{
		objcObject = Bridge.invokeObjcClassMethod!(id, "alloc")(objcClass);
		id result = Bridge.invokeObjcMethod!(id, "initWithFileAtPath:", NSString)(objcObject, path);

		if (result)
			objcObject = ret;

		dObject = this;
	}

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

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