terminals/Xtreams__ExternalReadStream.st
author mkobetic
Tue, 31 Jan 2012 03:47:19 +0000
changeset 90 59f68d289949
parent 78 a9dd8b69b39f
child 96 85e395d8e3d7
permissions -rw-r--r--
(none)
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
9
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
     1
"{ Package: 'stx:goodies/xtreams/terminals' }"
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
     2
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
     3
"{ NameSpace: Xtreams }"
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
     4
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
     5
ReadStream subclass:#ExternalReadStream
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
     6
	instanceVariableNames:'cache cachePosition cacheDataSize'
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
     7
	classVariableNames:''
39
80fdc4602b14 sockets and files
mkobetic
parents: 34
diff changeset
     8
	poolDictionaries:'XtreamsPool'
25
02e7c3b6f63c added XtreamsPool to fix DefaultBufferSize; set proper category names
mkobetic
parents: 9
diff changeset
     9
	category:'Xtreams-Terminals'
9
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    10
!
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    11
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    12
ExternalReadStream comment:'Used to read from BlockableIOAccessors (e.g sockets or pipes). Elements are read-ahead but only what''s available. This is a binary stream (produces bytes/ByteArrays).
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    13
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    14
{{{
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    15
	[ :in :out |
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    16
		[	out writing write: ''Hello''; close.
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    17
			in reading read: 5
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    18
		] ensure: [ in close. out close ]
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    19
	] valueWithArguments: SocketAccessor openPair
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    20
}}}
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    21
{{{
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    22
	[ :in :out |
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    23
		[	out writing write: ''Hello''; close.
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    24
			in reading read: 5
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    25
		] ensure: [ in close. out close ]
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    26
	] valueWithArguments: OSSystemSupport concreteClass pipeAccessorClass openPair
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    27
}}}
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    28
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    29
Instance Variables
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    30
	cache	<ByteArray | ByteString> read-ahead buffer
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    31
	cachePosition	<SmallInteger> position in the buffer
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    32
	cacheDataSize	<SmallInteger> size of valid data in the buffer
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    33
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    34
'
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    35
!
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    36
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    37
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    38
!ExternalReadStream methodsFor:'accessing'!
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    39
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    40
get
39
80fdc4602b14 sockets and files
mkobetic
parents: 34
diff changeset
    41
        cachePosition < cacheDataSize ifFalse: [
80fdc4602b14 sockets and files
mkobetic
parents: 34
diff changeset
    42
                cachePosition := 0.
80fdc4602b14 sockets and files
mkobetic
parents: 34
diff changeset
    43
                cacheDataSize := (1 max: self bytesForRead) min: cache size.
80fdc4602b14 sockets and files
mkobetic
parents: 34
diff changeset
    44
                cacheDataSize := self readBytes: cacheDataSize into: cache startingAt: 1.
80fdc4602b14 sockets and files
mkobetic
parents: 34
diff changeset
    45
                cacheDataSize isZero ifTrue: [ self incompleteRead: Incomplete zero ] ].
80fdc4602b14 sockets and files
mkobetic
parents: 34
diff changeset
    46
        ^cache at: (cachePosition := cachePosition + 1)
9
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    47
!
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    48
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    49
read: anInteger into: aSequenceableCollection at: startIndex
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    50
39
80fdc4602b14 sockets and files
mkobetic
parents: 34
diff changeset
    51
        | index toRead |
80fdc4602b14 sockets and files
mkobetic
parents: 34
diff changeset
    52
        anInteger isZero ifTrue: [^0].
80fdc4602b14 sockets and files
mkobetic
parents: 34
diff changeset
    53
        index := startIndex.
80fdc4602b14 sockets and files
mkobetic
parents: 34
diff changeset
    54
        toRead := anInteger.
80fdc4602b14 sockets and files
mkobetic
parents: 34
diff changeset
    55
        [toRead > 0] whileTrue: [ | amount |
80fdc4602b14 sockets and files
mkobetic
parents: 34
diff changeset
    56
                cachePosition < cacheDataSize ifFalse: [
80fdc4602b14 sockets and files
mkobetic
parents: 34
diff changeset
    57
                        cachePosition := 0.
80fdc4602b14 sockets and files
mkobetic
parents: 34
diff changeset
    58
                        cacheDataSize := (toRead max: self bytesForRead) min: cache size.
80fdc4602b14 sockets and files
mkobetic
parents: 34
diff changeset
    59
                        cacheDataSize := self readBytes: cacheDataSize into: cache startingAt: 1.
80fdc4602b14 sockets and files
mkobetic
parents: 34
diff changeset
    60
                        cacheDataSize isZero ifTrue: [ self incompleteRead: (Incomplete on: aSequenceableCollection count: anInteger - toRead at: startIndex) ] ].
80fdc4602b14 sockets and files
mkobetic
parents: 34
diff changeset
    61
                amount := (cacheDataSize - cachePosition) min: toRead.
80fdc4602b14 sockets and files
mkobetic
parents: 34
diff changeset
    62
                aSequenceableCollection replaceFrom: index to: index + amount - 1 with: cache startingAt: cachePosition + 1.
80fdc4602b14 sockets and files
mkobetic
parents: 34
diff changeset
    63
                cachePosition := cachePosition + amount.
80fdc4602b14 sockets and files
mkobetic
parents: 34
diff changeset
    64
                index := index + amount.
80fdc4602b14 sockets and files
mkobetic
parents: 34
diff changeset
    65
                toRead := toRead - amount ].
80fdc4602b14 sockets and files
mkobetic
parents: 34
diff changeset
    66
        ^anInteger
9
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    67
! !
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    68
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    69
!ExternalReadStream methodsFor:'initialize-release'!
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    70
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    71
close
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    72
	super close.
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    73
	cache recycle
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    74
!
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    75
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    76
contentsSpecies
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    77
	^cache class
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    78
!
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    79
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    80
contentsSpecies: aClass
31
mkobetic
parents: 25
diff changeset
    81
        cache ifNotNil: [ cache recycle ].
mkobetic
parents: 25
diff changeset
    82
        cache := aClass newRecycled: DefaultBufferSize.
mkobetic
parents: 25
diff changeset
    83
        cachePosition := 0.
mkobetic
parents: 25
diff changeset
    84
        cacheDataSize := 0.
9
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    85
!
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    86
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    87
on: anAccessor
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    88
	super on: anAccessor.
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    89
	self contentsSpecies: ByteArray
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    90
! !
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    91
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    92
!ExternalReadStream methodsFor:'private'!
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    93
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    94
bytesForRead
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    95
39
80fdc4602b14 sockets and files
mkobetic
parents: 34
diff changeset
    96
        ^source numAvailable
9
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    97
!
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    98
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    99
incompleteRead: incomplete
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   100
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   101
	incomplete raise
39
80fdc4602b14 sockets and files
mkobetic
parents: 34
diff changeset
   102
!
80fdc4602b14 sockets and files
mkobetic
parents: 34
diff changeset
   103
80fdc4602b14 sockets and files
mkobetic
parents: 34
diff changeset
   104
readBytes:count into:aByteBuffer startingAt:firstIndex
80fdc4602b14 sockets and files
mkobetic
parents: 34
diff changeset
   105
80fdc4602b14 sockets and files
mkobetic
parents: 34
diff changeset
   106
    ^source nextBytes:count into:aByteBuffer startingAt:firstIndex
9
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   107
! !
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   108
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   109
!ExternalReadStream class methodsFor:'documentation'!
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   110
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   111
version_SVN
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   112
    ^ '$Id$'
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   113
! !