"{ Package: 'stx:goodies/xtreams/transforms' }"
"{ NameSpace: Xtreams }"
WriteStream subclass:#EncodeWriteStream
instanceVariableNames:'encoder buffer bufferReading bufferWriting decodedLineEnd
encodedLineEnd'
classVariableNames:''
poolDictionaries:'Xtreams::XtreamsPool'
category:'Xtreams-Transforms'
!
EncodeWriteStream comment:'Accepts characters, converts them to bytes (0..255) using pre-configured encoding and writes the bytes into destination. Unless set to lineEndTransparent, converts any CRs into configured line-end convention (LF or CRLF).
Instance Variables
encoder <Encoder> converts characters to bytes
buffer <Buffer on: ByteArray> batch writing buffer
bufferReading <ReadStream> read stream on buffer
bufferWriting <WriteStream> write stream on buffer
decodedLineEnd <Character> CR or nil if transparent
encodedLineEnd <ByteArray> encoded bytes of CR in the configured convention (LF or CRLF), or nil if transparent
'
!
!EncodeWriteStream class methodsFor:'instance creation'!
on: aDestination encoding: anEncoding
^self new on: aDestination encoding: anEncoding
! !
!EncodeWriteStream methodsFor:'accessing'!
encoder
^encoder
!
write: anInteger from: aSequenceableCollection at: startIndex
| character |
startIndex to: startIndex + anInteger - 1 do: [:index |
buffer writeSize < 10 ifTrue: [destination write: buffer readSize from: bufferReading].
character := aSequenceableCollection at: index.
character == decodedLineEnd
ifTrue: [bufferWriting write: encodedLineEnd]
ifFalse: [encoder encode: character on: bufferWriting]].
destination write: buffer readSize from: bufferReading.
^anInteger
! !
!EncodeWriteStream methodsFor:'initialize-release'!
close
super close.
buffer recycle.
buffer := nil
!
contentsSpecies
^String
!
on: aSource encoding: anEncoding
super on: aSource.
encoder := Encoder for: anEncoding.
buffer := RingBuffer new: DefaultBufferSize class: ByteArray.
bufferReading := buffer reading.
bufferWriting := buffer writing.
self setLineEndAuto
! !
!EncodeWriteStream methodsFor:'line-end'!
setLineEndAuto
OperatingSystem isMSWINDOWSlike
ifTrue: [self setLineEndCRLF]
ifFalse: [self setLineEndLF]
!
setLineEndCRLF
| stream |
decodedLineEnd := Character cr.
stream := ByteArray new writing.
encoder encode: Character cr on: stream; encode: Character lf on: stream.
encodedLineEnd := stream contents
!
setLineEndLF
| stream |
decodedLineEnd := Character cr.
stream := ByteArray new writing.
encoder encode: Character lf on: stream.
encodedLineEnd := stream contents
!
setLineEndTransparent
decodedLineEnd := nil.
encodedLineEnd := nil
! !
!EncodeWriteStream class methodsFor:'documentation'!
version_SVN
^ '$Id$'
! !