transforms/Xtreams__EncodeWriteStream.st
author Jan Vrany <jan.vrany@fit.cvut.cz>
Wed, 01 Feb 2012 00:34:28 +0000
changeset 97 2a7827f4dce2
parent 72 d16c7d84d4a8
child 111 44ac233b2f83
permissions -rw-r--r--
pool name fixes

"{ 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$'
! !