httprequest_android.monkey2 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238
  1. Namespace httprequest
  2. #Import "<jni>"
  3. #Import "<std>"
  4. #Import "<mojo>"
  5. #Import "<sdl2>"
  6. #Import "native/Monkey2HttpRequest.java"
  7. #Import "native/httprequest.cpp"
  8. #Import "native/httprequest.h"
  9. Using jni..
  10. Using std..
  11. Using mojo..
  12. Using sdl2..
  13. Extern Private
  14. Global onReadyStateChanged:Void(jobject,Int)="bbHttpRequest::onReadyStateChanged"
  15. Global onResponseReceived:Void(jobject,String,Int,Int)="bbHttpRequest::onResponseReceived"
  16. private
  17. Function OnMainFiber( func:Void() )
  18. If Fiber.Current()=Fiber.Main() func() Else App.Idle+=func
  19. End
  20. Public
  21. Enum ReadyState
  22. Unsent=0
  23. Opened=1
  24. HeadersReceived=2
  25. Loading=3
  26. Done=4
  27. Error=5
  28. End
  29. Class HttpRequest
  30. Field ReadyStateChanged:Void()
  31. Method New()
  32. Local env:=Android_JNI_GetEnv()
  33. Init( env )
  34. Local obj:=env.AllocObject( _class )
  35. _obj=env.NewGlobalRef( obj )
  36. Insert()
  37. End
  38. Method New( req:String,url:String,readyStateChanged:Void()=Null )
  39. Self.New()
  40. ReadyStateChanged=readyStateChanged
  41. Open( req,url )
  42. End
  43. Property ReadyState:ReadyState()
  44. Return Cast<ReadyState>( _readyState )
  45. End
  46. Property ResponseText:String()
  47. Return _response
  48. End
  49. Property Status:Int()
  50. Return _status
  51. End
  52. Method Discard()
  53. Remove()
  54. Local env:=Android_JNI_GetEnv()
  55. env.DeleteGlobalRef( _obj )
  56. End
  57. Method Open( req:String,url:String )
  58. OnMainFiber( Lambda()
  59. Local env:=Android_JNI_GetEnv()
  60. env.CallVoidMethod( _obj,_open,New Variant[]( req,url ) )
  61. End )
  62. End
  63. Method SetHeader( header:String,value:String )
  64. OnMainFiber( Lambda()
  65. Local env:=Android_JNI_GetEnv()
  66. env.CallVoidMethod( _obj,_setHeader,New Variant[]( header,value ) )
  67. End )
  68. End
  69. Method Send()
  70. Send( "" )
  71. End
  72. Method Send( text:String )
  73. OnMainFiber( Lambda()
  74. Local env:=Android_JNI_GetEnv()
  75. env.CallVoidMethod( _obj,_send,New Variant[]( text ) )
  76. End )
  77. End
  78. Private
  79. Global _list:HttpRequest
  80. Field _succ:HttpRequest
  81. Field _obj:jobject
  82. Field _readyState:Int
  83. Field _response:String
  84. Field _status:int
  85. Method New( peer:jobject )
  86. _obj=peer
  87. End
  88. Method Insert()
  89. _succ=_list
  90. _list=Self
  91. End
  92. Method Remove()
  93. local inst:=_list,pred:HttpRequest=Null
  94. While inst
  95. If inst=Self
  96. If pred
  97. pred._succ=_succ
  98. Else
  99. _list=_succ
  100. Endif
  101. Return
  102. Endif
  103. pred=inst
  104. inst=inst._succ
  105. Wend
  106. End
  107. Global _class:jclass
  108. Global _open:jmethodID
  109. Global _setHeader:jmethodID
  110. Global _send:jmethodID
  111. Function OnReadyStateChanged( obj:jobject,state:Int )
  112. Local env:=Android_JNI_GetEnv()
  113. Local inst:=_list
  114. While inst
  115. If env.IsSameObject( obj,inst._obj )
  116. inst._readyState=state
  117. inst.ReadyStateChanged()
  118. Return
  119. Endif
  120. inst=inst._succ
  121. Wend
  122. End
  123. Function OnResponseReceived( obj:jobject,response:String,status:Int,state:Int )
  124. Local env:=Android_JNI_GetEnv()
  125. Local inst:=_list
  126. While inst
  127. If env.IsSameObject( obj,inst._obj )
  128. inst._response=response
  129. inst._status=status
  130. inst._readyState=state
  131. inst.ReadyStateChanged()
  132. Endif
  133. inst=inst._succ
  134. wend
  135. End
  136. Function Init( env:JNIEnv )
  137. If _class Return
  138. _class=env.FindClass( "com/monkey2/lib/Monkey2HttpRequest" )
  139. If Not _class RuntimeError( "Can't find com.monkey2.lib.Monkey2HttpRequest class" )
  140. _open=env.GetMethodID( _class,"open","(Ljava/lang/String;Ljava/lang/String;)V" )
  141. _setHeader=env.GetMethodID( _class,"setHeader","(Ljava/lang/String;Ljava/lang/String;)V" )
  142. _send=env.GetMethodID( _class,"send","(Ljava/lang/String;)V" )
  143. onReadyStateChanged=OnReadyStateChanged
  144. onResponseReceived=OnResponseReceived
  145. End
  146. End