Explorar el Código

Merged branch develop into develop

Mark Sibly hace 8 años
padre
commit
044454e72d

+ 4 - 0
modules/httprequest/httprequest.monkey2

@@ -5,4 +5,8 @@ Namespace httprequest
 
 #Import "httprequest_android"
 
+#Else If __TARGET__="macos" Or  __TARGET__="ios"
+
+#Import "httprequest_ios"
+
 #Endif

+ 38 - 0
modules/httprequest/httprequest_ios.monkey2

@@ -0,0 +1,38 @@
+
+Namespace httprequest
+
+#Import "native/httprequest.mm"
+
+#Import "native/httprequest.h"
+
+Extern
+
+Enum ReadyState="bbReadyState"
+	Unsent
+	Done
+	Error
+End
+
+Class HttpRequest="bbHttpRequest"
+	
+	Field ReadyStateChanged:Void()="readyStateChanged"
+	
+	Property ReadyState:ReadyState()="readyState"
+		
+	Property ResponseText:String()="responseText"
+		
+	Property Status:Int()="status"
+
+	Method New()
+		
+	Method New( req:String,url:String,readyStateChanged:Void()=Null )
+		
+	Method Open( req:String,url:String )="open"
+		
+	Method SetHeader( name:String,value:String )="setHeader"
+		
+	Method Send()="send"
+		
+	Method Send( text:String )="send"
+		
+End

+ 41 - 0
modules/httprequest/native/httprequest.h

@@ -1,6 +1,45 @@
 
 #include <bbmonkey.h>
 
+#if __APPLE__
+
+enum class bbReadyState{
+	Unsent=0,
+	Done=4,
+	Error=5
+};
+
+struct bbHttpRequest : public bbObject{
+
+	struct Rep;	//NS stuff...
+		
+	Rep *_rep;
+	
+	bbString _response;
+	int _readyState=0;
+	int _status=-1;
+	int _recv=-1;
+	
+	bbFunction<void()> readyStateChanged;
+	
+	bbHttpRequest();
+	
+	bbHttpRequest( bbString req,bbString url,bbFunction<void()> readyStateChanged );
+	
+	bbReadyState readyState();
+	bbString responseText();
+	int status();
+	
+	void open( bbString req,bbString url );
+	void setHeader( bbString name,bbString value );
+	void send();
+	void send( bbString text );
+
+	void gcMark();
+};
+	
+#else
+
 #include <jni.h>
 
 namespace bbHttpRequest{
@@ -10,3 +49,5 @@ namespace bbHttpRequest{
 	extern bbFunction<void( jobject,bbString,bbInt,bbInt )> onResponseReceived;
 
 }
+
+#endif

+ 136 - 0
modules/httprequest/native/httprequest.mm

@@ -0,0 +1,136 @@
+
+#include "httprequest.h"
+
+#include "../../std/async/native/async.h"
+
+struct bbHttpRequest::Rep{
+	NSMutableURLRequest *_req;
+	NSString *_response;
+	int _status;	
+};
+
+namespace{
+
+	struct ReadyStateChangedEvent : public bbAsync::Event{
+
+		bbHttpRequest *req;
+		int state;
+
+		ReadyStateChangedEvent( bbHttpRequest *req,int state ):req( req ),state( state ){
+		}
+		
+		void dispatch(){
+		
+			if( state==req->_readyState ){
+		
+				if( req->_readyState==4 ){
+					req->_response=bbString( req->_rep->_response );
+					req->_status=req->_rep->_status;
+				}
+			
+				req->readyStateChanged();
+			}
+			
+			bbGC::release( req );
+			
+			delete this;
+		}
+	};
+
+}
+
+bbHttpRequest::bbHttpRequest(){
+
+	_rep=new Rep;
+}
+
+bbHttpRequest::bbHttpRequest( bbString req,bbString url,bbFunction<void()> readyStateChanged ):bbHttpRequest(){
+
+	this->readyStateChanged=readyStateChanged;
+
+	open( req,url );
+}
+	
+bbReadyState bbHttpRequest::readyState(){
+	
+	return (bbReadyState)_readyState;
+}
+	
+bbString bbHttpRequest::responseText(){
+
+	return _response;
+}
+	
+int bbHttpRequest::status(){
+	
+	return _status;
+}
+	
+void bbHttpRequest::open( bbString req,bbString url ){
+	
+	if( _readyState!=0 ) return;
+	
+	NSMutableURLRequest *nsreq=[[NSMutableURLRequest alloc] init];
+		
+	[nsreq setHTTPMethod:req.ToNSString()];
+	
+	[nsreq setURL:[NSURL URLWithString:url.ToNSString()]];
+	
+	if( [nsreq respondsToSelector:@selector(setAllowsCellularAccess:)] ){
+		[nsreq setAllowsCellularAccess:YES];
+	}
+	
+	_rep->_req=nsreq;
+		
+	_readyState=1;
+}
+	
+void bbHttpRequest::setHeader( bbString name,bbString value ){
+	
+	if( _readyState!=1 ) return;
+		
+	[_rep->_req setValue:value.ToNSString() forHTTPHeaderField:name.ToNSString()];
+}
+	
+void bbHttpRequest::send(){
+	
+	send( "" );
+}
+	
+void bbHttpRequest::send( bbString text ){
+	
+	if( _readyState!=1 ) return;
+		
+	bbGC::retain( this );
+
+	_readyState=3;	//loading
+	
+    std::thread( [=](){
+
+		NSURLResponse *response=0;
+			
+		NSData *data=[NSURLConnection sendSynchronousRequest:_rep->_req returningResponse:&response error:0];
+		
+		if( data && response ){
+			
+		  	_rep->_response=[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
+		
+		    _rep->_status=[(NSHTTPURLResponse*)response statusCode];
+			    
+		    //_recv=[data length];
+		}
+		
+		_readyState=4;	//loaded
+		
+		ReadyStateChangedEvent *ev=new ReadyStateChangedEvent( this,_readyState );
+		
+		ev->post();
+			
+	} ).detach();
+}
+
+void bbHttpRequest::gcMark(){
+
+	bbGCMark( readyStateChanged ); 
+}
+

+ 44 - 0
modules/monkey/native/bbgc.cpp

@@ -42,6 +42,11 @@
 	
 #endif
 
+struct bbGCRetained{
+	bbGCRetained *succ;
+	bbGCNode *node;
+};
+
 namespace bbGC{
 
 	int markedBit;
@@ -65,6 +70,9 @@ namespace bbGC{
 	size_t unmarkedBytes;
 	size_t allocedBytes;
 	
+	bbGCRetained *retained;
+	bbGCRetained *retained_free;
+	
 	void init(){
 		static bool done;
 		if( done ) return;
@@ -137,6 +145,14 @@ namespace bbGC{
 		}
 	}
 	
+	void markRetained(){
+	
+		for( bbGCRetained *r=retained;r;r=r->succ ){
+			if( r->node ) r->node->gcMark();
+				r=r->succ;
+		}
+	}
+	
 	void markFibers(){
 	
 		bbGCFiber *fiber=fibers;
@@ -186,6 +202,8 @@ namespace bbGC{
 	
 //		puts( "bbGC::sweep()" );fflush( stdout );
 	
+		markRetained();
+		
 		markFibers();
 	
 		markQueued();
@@ -263,4 +281,30 @@ namespace bbGC{
 		
 //		printf( "GCCollect: in use=%i\n",(int)unmarkedBytes );fflush( stdout );
 	}
+	
+	void retain( bbGCNode *node ){
+		bbGCRetained *r=retained_free;
+		if( !r ){
+			//should alloc buf-worth...
+			r=new bbGCRetained;
+		}
+		r->node=node;
+		r->succ=retained;
+		retained=r;
+	}
+	
+	void release( bbGCNode *node ){
+		bbGCRetained **p=&retained;
+		while( bbGCRetained *r=*p ){
+			if( r->node==node ){
+				*p=r->succ;
+				r->succ=retained_free;
+				retained_free=r;
+				return;
+			}
+			p=&r->succ;
+			r=r->succ;
+		}
+		printf( "Wanting! bbGC::release() node not found!\n" );
+	}
 }

+ 4 - 0
modules/monkey/native/bbgc.h

@@ -143,6 +143,10 @@ struct bbGCTmp{
 };
 
 namespace bbGC{
+
+	void retain( bbGCNode *p );
+	
+	void release( bbGCNode *p );
 	
 	inline void insert( bbGCNode *p,bbGCNode *succ ){
 		p->succ=succ;

+ 4 - 0
modules/monkey/native/bbstd.h

@@ -2,6 +2,10 @@
 #ifndef BB_STD_H
 #define BB_STD_H
 
+#if __OBJC__
+#import <Foundation/Foundation.h>
+#endif
+
 #include <new>
 #include <initializer_list>
 

+ 12 - 0
modules/monkey/native/bbstring.h

@@ -86,6 +86,11 @@ class bbString{
 	
 	bbString( const wchar_t *data,int length ):_rep( Rep::create( data,length ) ){
 	}
+	
+#if __OBJC__
+	bbString( NSString *str ):_rep( Rep::create( str.UTF8String ) ){
+	}
+#endif
 
 	explicit bbString( int n ){
 		char data[64];
@@ -464,6 +469,12 @@ class bbString{
 
 	void toWString( void *buf,int size )const;
 	
+#if __OBJC__	
+	NSString *ToNSString()const{
+		return [NSString stringWithUTF8String:c_str()];
+	}
+#endif
+	
 	static bbString fromChar( int chr );
 	
 	static bbString fromChars( bbArray<int> chrs );
@@ -534,3 +545,4 @@ inline bbString BB_T( const char *p ){
 }
 
 #endif
+