changed the compiler to allow a character literal within a byte array literal
This commit is contained in:
@ -3,11 +3,16 @@
|
||||
class Socket(Object) from 'sck'
|
||||
{
|
||||
var handle := -1.
|
||||
var insem, outsem.
|
||||
var(#get,#set) inputAction, outputAction.
|
||||
|
||||
method(#primitive) open(domain, type, proto).
|
||||
method(#primitive) _close.
|
||||
method(#primitive) connect(a,b,c).
|
||||
method(#primitive) endConnect: xxx.
|
||||
method(#primitive) endConnect.
|
||||
|
||||
method(#primitive) readBytes: bytes.
|
||||
method(#primitive) writeBytes: bytes.
|
||||
}
|
||||
|
||||
(* TODO: generate these domain and type from the C header *)
|
||||
@ -39,6 +44,19 @@ extend Socket
|
||||
{
|
||||
## this primitive method may return failure.
|
||||
## but ignore it here.
|
||||
if (self.insem)
|
||||
{
|
||||
System unsignal: self.insem.
|
||||
System removeAsyncSemaphore: self.insem.
|
||||
self.insem := nil.
|
||||
}.
|
||||
if (self.outsem)
|
||||
{
|
||||
System unsignal: self.outsem.
|
||||
System removeAsyncSemaphore: self.outsem.
|
||||
self.outsem := nil.
|
||||
}.
|
||||
|
||||
self _close.
|
||||
self.handle := -1.
|
||||
}
|
||||
@ -54,9 +72,13 @@ extend Socket
|
||||
sa := [:sem |
|
||||
System unsignal: s1.
|
||||
System unsignal: s2.
|
||||
'UNSIGNALLLING ...........' dump.
|
||||
System removeAsyncSemaphore: s1.
|
||||
System removeAsyncSemaphore: s2.
|
||||
connectBlock value: (sem == s1)
|
||||
|
||||
'FINALIZING CONNECT' dump.
|
||||
self endConnect.
|
||||
connectBlock value: self value: (sem == s1)
|
||||
].
|
||||
|
||||
s1 signalAction: sa.
|
||||
@ -74,34 +96,51 @@ extend Socket
|
||||
]
|
||||
}
|
||||
|
||||
method asyncRead: readBlock
|
||||
method watchInput
|
||||
{
|
||||
| s1 s2 |
|
||||
s1 := Semaphore new.
|
||||
s2 := Semaphore new.
|
||||
if (self.insem isNil)
|
||||
{
|
||||
self.insem := Semaphore new.
|
||||
self.insem signalAction: [:sem | self.inputAction value: self value: true].
|
||||
System signal: self.insem onInput: self.handle.
|
||||
System addAsyncSemaphore: self.insem.
|
||||
}
|
||||
else
|
||||
{
|
||||
self.insem signalAction: [:sem | self.inputAction value: self value: true].
|
||||
}
|
||||
|
||||
s1 signalAction: [:sem | readBlock value: true].
|
||||
s2 signalAction: [:sem | readBlock value: false].
|
||||
|
||||
System signal: s1 onInput: self.handle.
|
||||
System signal: s2 afterSecs: 10.
|
||||
###s2 := Semaphore new.
|
||||
###s2 signalAction: [:sem | inputActionBlock value: self value: false].
|
||||
###System signal: s2 afterSecs: 10.
|
||||
}
|
||||
|
||||
(*
|
||||
method asyncWrite:
|
||||
method unwatchInput
|
||||
{
|
||||
| s1 s2 |
|
||||
s1 := Semaphore new.
|
||||
s2 := Semaphore new.
|
||||
|
||||
s1 signalAction: [:sem | writeBlock value: true].
|
||||
s2 signalAction: [:sem | writeBlock value: false].
|
||||
|
||||
System signal: s1 onOutput: self.handle.
|
||||
System signal: s2 afterSecs: 10.
|
||||
System unsignal: self.insem.
|
||||
System removeAsyncSemaphore: self.insem.
|
||||
}
|
||||
*)
|
||||
|
||||
method watchOutput
|
||||
{
|
||||
if (self.outsem isNil)
|
||||
{
|
||||
self.outsem := Semaphore new.
|
||||
self.outsem signalAction: [:sem | self.outputAction value: self value: true].
|
||||
System signal: self.outsem onOutput: self.handle.
|
||||
System addAsyncSemaphore: self.outsem.
|
||||
}
|
||||
else
|
||||
{
|
||||
self.outsem signalAction: [:sem | self.outputAction value: self value: true].
|
||||
}
|
||||
}
|
||||
|
||||
method unwatchOutput
|
||||
{
|
||||
System unsignal: self.outsem.
|
||||
System removeAsyncSemaphore: self.outsem.
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -109,32 +148,60 @@ class MyObject(Object)
|
||||
{
|
||||
method(#class) main
|
||||
{
|
||||
| s |
|
||||
| s conact inact outact |
|
||||
|
||||
inact := [:sck :state |
|
||||
| data n |
|
||||
|
||||
data := ByteArray new: 100.
|
||||
n := sck readBytes: data.
|
||||
if (n == 0)
|
||||
{
|
||||
sck close.
|
||||
}.
|
||||
(n asString & ' bytes read') dump.
|
||||
data dump.
|
||||
].
|
||||
|
||||
outact := [:sck :state |
|
||||
if (state)
|
||||
{
|
||||
sck writeBytes: #[ $h $e $l $l $o ].
|
||||
}
|
||||
else
|
||||
{
|
||||
}
|
||||
].
|
||||
|
||||
conact := [:sck :state |
|
||||
|
||||
|
||||
if (state)
|
||||
{
|
||||
'CONNECTED NOW.............' dump.
|
||||
##s onOutputDo: outact.
|
||||
s writeBytes: #[ $h $e $l $l $o ].
|
||||
s watchInput.
|
||||
}
|
||||
else
|
||||
{
|
||||
'UNABLE TO CONNECT............' dump.
|
||||
}
|
||||
].
|
||||
|
||||
## ------------------------------------------------------
|
||||
|
||||
[
|
||||
s := Socket domain: Socket.Domain.INET type: Socket.Type.STREAM.
|
||||
|
||||
s asyncConnect: [:result |
|
||||
##s endConnect: result.
|
||||
##s beginRead: xxx.
|
||||
if (result)
|
||||
{
|
||||
s endConnect: result.
|
||||
'CONNECTED NOW.............' dump.
|
||||
s asyncRead: [:data |
|
||||
data dump.
|
||||
]
|
||||
}
|
||||
else
|
||||
{
|
||||
'UNABLE TO CONNECT............' dump.
|
||||
}
|
||||
].
|
||||
s inputAction: inact; outputAction: outact.
|
||||
s asyncConnect: conact.
|
||||
|
||||
while (true)
|
||||
{
|
||||
System handleAsyncEvent.
|
||||
}.
|
||||
s close dump.
|
||||
|
||||
] on: Exception do: [:ex | ('Exception - ' & ex messageText) dump ].
|
||||
|
||||
'----- END OF MAIN ------' dump.
|
||||
|
Reference in New Issue
Block a user