terminals/Xtreams__FileReadStream.st
author mkobetic
Sun, 15 Jan 2012 22:50:34 +0000
changeset 52 a1363827b596
parent 43 b9a077d6ce14
child 78 a9dd8b69b39f
permissions -rw-r--r--
packaging
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
52
a1363827b596 packaging
mkobetic
parents: 43
diff changeset
     1
'From Smalltalk/X, Version:6.2.1 on 15-01-2012 at 05:49:32 PM'                  !
39
80fdc4602b14 sockets and files
mkobetic
parents: 25
diff changeset
     2
9
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
     3
"{ Package: 'stx:goodies/xtreams/terminals' }"
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
     4
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
     5
"{ NameSpace: Xtreams }"
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
     6
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
     7
ExternalReadStream subclass:#FileReadStream
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
     8
	instanceVariableNames:'position'
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
     9
	classVariableNames:''
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    10
	poolDictionaries:''
25
02e7c3b6f63c added XtreamsPool to fix DefaultBufferSize; set proper category names
mkobetic
parents: 9
diff changeset
    11
	category:'Xtreams-Terminals'
9
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    12
!
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    13
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    14
FileReadStream comment:'Reads from a file. The stream is usually created by sending #reading to a Filename. However the actual terminal is an IOAccessor. The original filename is accessible through the IOAccessor. The stream is binary and is naturally positionable.
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    15
{{{
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    16
	| file |
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    17
	file := ObjectMemory imageName asFilename reading.
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    18
	[ file read: 13 ] ensure: [ file close ]
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    19
}}}
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    20
As a convenience, sending #reading to a Filename of a directory will create a stream of all filenames in that directory.
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    21
{{{
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    22
	''/tmp'' asFilename reading rest
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    23
}}}
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    24
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    25
Instance Variables
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    26
	position	<Integer> current position of the stream
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
!
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    30
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    31
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    32
!FileReadStream methodsFor:'accessing'!
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    33
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    34
get
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    35
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    36
	| object |
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    37
	object := super get.
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    38
	position := position + 1.
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    39
	^object
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    40
!
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    41
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    42
read: anInteger into: aSequenceableCollection at: startIndex
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    43
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    44
	super read: anInteger into: aSequenceableCollection at: startIndex.
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    45
	position := position + anInteger.
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    46
	^anInteger
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
!FileReadStream methodsFor:'initialize-release'!
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    50
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    51
on: anAccessor
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    52
	super on: anAccessor.
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    53
	position := 0
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    54
! !
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    55
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    56
!FileReadStream methodsFor:'private'!
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    57
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    58
bytesForRead
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    59
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    60
	"Ideally we'd ask for the fileSize and subtract that from our position, but calling #fileSize is a slow primitive"
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    61
	^cache size
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    62
!
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    63
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    64
incompleteRead: incomplete
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    65
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    66
	position := position + incomplete count.
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    67
	super incompleteRead: incomplete.
39
80fdc4602b14 sockets and files
mkobetic
parents: 25
diff changeset
    68
!
80fdc4602b14 sockets and files
mkobetic
parents: 25
diff changeset
    69
80fdc4602b14 sockets and files
mkobetic
parents: 25
diff changeset
    70
readBytes:count into:aByteBuffer startingAt:firstIndex
80fdc4602b14 sockets and files
mkobetic
parents: 25
diff changeset
    71
80fdc4602b14 sockets and files
mkobetic
parents: 25
diff changeset
    72
    ^source readBytes:count into:aByteBuffer startingAt:firstIndex
9
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    73
! !
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    74
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    75
!FileReadStream methodsFor:'seeking'!
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    76
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    77
++ anInteger
39
80fdc4602b14 sockets and files
mkobetic
parents: 25
diff changeset
    78
        | count |
80fdc4602b14 sockets and files
mkobetic
parents: 25
diff changeset
    79
        anInteger < 0 ifTrue: [ ^self -- anInteger negated ].
80fdc4602b14 sockets and files
mkobetic
parents: 25
diff changeset
    80
        count := self available min: anInteger.
80fdc4602b14 sockets and files
mkobetic
parents: 25
diff changeset
    81
        position := position + count.
80fdc4602b14 sockets and files
mkobetic
parents: 25
diff changeset
    82
        source seekTo: position from: #begin.
80fdc4602b14 sockets and files
mkobetic
parents: 25
diff changeset
    83
        cacheDataSize := cachePosition := 0.
80fdc4602b14 sockets and files
mkobetic
parents: 25
diff changeset
    84
        count < anInteger ifTrue: [(Incomplete count: count) raise].
80fdc4602b14 sockets and files
mkobetic
parents: 25
diff changeset
    85
        ^anInteger
9
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    86
!
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    87
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
    88
-- anInteger
39
80fdc4602b14 sockets and files
mkobetic
parents: 25
diff changeset
    89
        | count |
80fdc4602b14 sockets and files
mkobetic
parents: 25
diff changeset
    90
        anInteger < 0 ifTrue: [ ^self ++ anInteger negated ].
80fdc4602b14 sockets and files
mkobetic
parents: 25
diff changeset
    91
        count := position min: anInteger.
80fdc4602b14 sockets and files
mkobetic
parents: 25
diff changeset
    92
        position := position - count.
80fdc4602b14 sockets and files
mkobetic
parents: 25
diff changeset
    93
        source seekTo: position from: #begin.
80fdc4602b14 sockets and files
mkobetic
parents: 25
diff changeset
    94
        cacheDataSize := cachePosition := 0.
80fdc4602b14 sockets and files
mkobetic
parents: 25
diff changeset
    95
        anInteger = count ifTrue: [^anInteger].
80fdc4602b14 sockets and files
mkobetic
parents: 25
diff changeset
    96
        (Incomplete count: count) raise
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
length
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   100
	^source fileSize
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   101
!
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   102
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   103
position
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   104
	^position
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   105
!
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   106
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   107
position: aPosition
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   108
39
80fdc4602b14 sockets and files
mkobetic
parents: 25
diff changeset
   109
        | available |
80fdc4602b14 sockets and files
mkobetic
parents: 25
diff changeset
   110
        aPosition < 0 ifTrue: [ Incomplete zero raise ].
80fdc4602b14 sockets and files
mkobetic
parents: 25
diff changeset
   111
        available := aPosition min: self length.
80fdc4602b14 sockets and files
mkobetic
parents: 25
diff changeset
   112
        source seekTo: available from: #begin.
80fdc4602b14 sockets and files
mkobetic
parents: 25
diff changeset
   113
        position := available.
80fdc4602b14 sockets and files
mkobetic
parents: 25
diff changeset
   114
        cacheDataSize := cachePosition := 0.
80fdc4602b14 sockets and files
mkobetic
parents: 25
diff changeset
   115
        available = aPosition ifTrue: [^aPosition].
80fdc4602b14 sockets and files
mkobetic
parents: 25
diff changeset
   116
        (Incomplete count: available) raise
9
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   117
! !
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   118
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   119
!FileReadStream methodsFor:'testing'!
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   120
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   121
isPositionable
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   122
	^true
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   123
! !
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   124
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   125
!FileReadStream class methodsFor:'documentation'!
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   126
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   127
version_SVN
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   128
    ^ '$Id$'
6c90659cf105 first cut
Martin Kobetic <mkobetic@gmail.com>
parents:
diff changeset
   129
! !