Procházet zdrojové kódy

More WIP on httprequest...

Mark Sibly před 8 roky
rodič
revize
642aa9cc05

+ 4 - 0
modules/httprequest/httprequest.monkey2

@@ -5,4 +5,8 @@ Namespace httprequest
 
 
 #Import "httprequest_android"
 #Import "httprequest_android"
 
 
+#Else If __TARGET__="macos" Or  __TARGET__="ios"
+
+#Import "httprequest_ios"
+
 #Endif
 #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>
 #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>
 #include <jni.h>
 
 
 namespace bbHttpRequest{
 namespace bbHttpRequest{
@@ -10,3 +49,5 @@ namespace bbHttpRequest{
 	extern bbFunction<void( jobject,bbString,bbInt,bbInt )> onResponseReceived;
 	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 ); 
+}
+