author | Martin Kobetic |
Sun, 17 Nov 2013 00:23:18 -0500 | |
changeset 147 | bd6be28aa924 |
parent 116 | fa5b4c9f582d |
permissions | -rw-r--r-- |
10 | 1 |
"{ Package: 'stx:goodies/xtreams/transforms' }" |
2 |
||
3 |
"{ NameSpace: Xtreams }" |
|
4 |
||
5 |
WriteStream subclass:#EncodeWriteStream |
|
6 |
instanceVariableNames:'encoder buffer bufferReading bufferWriting decodedLineEnd |
|
7 |
encodedLineEnd' |
|
8 |
classVariableNames:'' |
|
111
44ac233b2f83
* removed namespace from pool references and stray extension methods
joe
parents:
97
diff
changeset
|
9 |
poolDictionaries:'XtreamsPool' |
27
2cc5a8a3ca14
added XtreamsPool to fix DefaultBufferSize; set proper category names
mkobetic
parents:
10
diff
changeset
|
10 |
category:'Xtreams-Transforms' |
10 | 11 |
! |
12 |
||
13 |
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). |
|
14 |
||
15 |
Instance Variables |
|
16 |
encoder <Encoder> converts characters to bytes |
|
17 |
buffer <Buffer on: ByteArray> batch writing buffer |
|
18 |
bufferReading <ReadStream> read stream on buffer |
|
19 |
bufferWriting <WriteStream> write stream on buffer |
|
20 |
decodedLineEnd <Character> CR or nil if transparent |
|
21 |
encodedLineEnd <ByteArray> encoded bytes of CR in the configured convention (LF or CRLF), or nil if transparent |
|
22 |
||
23 |
' |
|
24 |
! |
|
25 |
||
26 |
||
27 |
!EncodeWriteStream class methodsFor:'instance creation'! |
|
28 |
||
29 |
on: aDestination encoding: anEncoding |
|
30 |
^self new on: aDestination encoding: anEncoding |
|
31 |
! ! |
|
32 |
||
33 |
!EncodeWriteStream methodsFor:'accessing'! |
|
34 |
||
35 |
encoder |
|
36 |
||
37 |
^encoder |
|
38 |
! |
|
39 |
||
40 |
write: anInteger from: aSequenceableCollection at: startIndex |
|
41 |
||
42 |
| character | |
|
43 |
startIndex to: startIndex + anInteger - 1 do: [:index | |
|
44 |
buffer writeSize < 10 ifTrue: [destination write: buffer readSize from: bufferReading]. |
|
45 |
character := aSequenceableCollection at: index. |
|
46 |
character == decodedLineEnd |
|
47 |
ifTrue: [bufferWriting write: encodedLineEnd] |
|
48 |
ifFalse: [encoder encode: character on: bufferWriting]]. |
|
49 |
destination write: buffer readSize from: bufferReading. |
|
50 |
^anInteger |
|
51 |
! ! |
|
52 |
||
53 |
!EncodeWriteStream methodsFor:'initialize-release'! |
|
54 |
||
55 |
close |
|
56 |
super close. |
|
57 |
buffer recycle. |
|
58 |
buffer := nil |
|
59 |
! |
|
60 |
||
61 |
contentsSpecies |
|
62 |
||
63 |
^String |
|
64 |
! |
|
65 |
||
66 |
on: aSource encoding: anEncoding |
|
67 |
||
68 |
super on: aSource. |
|
69 |
encoder := Encoder for: anEncoding. |
|
70 |
buffer := RingBuffer new: DefaultBufferSize class: ByteArray. |
|
71 |
bufferReading := buffer reading. |
|
72 |
bufferWriting := buffer writing. |
|
73 |
self setLineEndAuto |
|
74 |
! ! |
|
75 |
||
76 |
!EncodeWriteStream methodsFor:'line-end'! |
|
77 |
||
78 |
setLineEndAuto |
|
79 |
||
80 |
OperatingSystem isMSWINDOWSlike |
|
81 |
ifTrue: [self setLineEndCRLF] |
|
82 |
ifFalse: [self setLineEndLF] |
|
83 |
! |
|
84 |
||
85 |
setLineEndCRLF |
|
86 |
||
116 | 87 |
| stream | |
88 |
decodedLineEnd := Character lf. |
|
89 |
stream := ByteArray new writing. |
|
90 |
encoder encode: Character cr on: stream; encode: Character lf on: stream. |
|
91 |
encodedLineEnd := stream contents |
|
10 | 92 |
! |
93 |
||
94 |
setLineEndLF |
|
95 |
||
116 | 96 |
| stream | |
97 |
decodedLineEnd := Character lf. |
|
98 |
stream := ByteArray new writing. |
|
99 |
encoder encode: Character lf on: stream. |
|
100 |
encodedLineEnd := stream contents |
|
10 | 101 |
! |
102 |
||
103 |
setLineEndTransparent |
|
104 |
||
105 |
decodedLineEnd := nil. |
|
106 |
encodedLineEnd := nil |
|
107 |
! ! |
|
108 |
||
109 |
!EncodeWriteStream class methodsFor:'documentation'! |
|
110 |
||
111
44ac233b2f83
* removed namespace from pool references and stray extension methods
joe
parents:
97
diff
changeset
|
111 |
version_HG |
44ac233b2f83
* removed namespace from pool references and stray extension methods
joe
parents:
97
diff
changeset
|
112 |
|
44ac233b2f83
* removed namespace from pool references and stray extension methods
joe
parents:
97
diff
changeset
|
113 |
^ '$Changeset: <not expanded> $' |
44ac233b2f83
* removed namespace from pool references and stray extension methods
joe
parents:
97
diff
changeset
|
114 |
! |
44ac233b2f83
* removed namespace from pool references and stray extension methods
joe
parents:
97
diff
changeset
|
115 |
|
10 | 116 |
version_SVN |
117 |
^ '$Id$' |
|
118 |
! ! |
|
111
44ac233b2f83
* removed namespace from pool references and stray extension methods
joe
parents:
97
diff
changeset
|
119 |