[squeak-dev] The Trunk: Collections-pre.747.mcz
Levente Uzonyi
leves at caesar.elte.hu
Thu Apr 20 13:18:25 UTC 2017
On Thu, 20 Apr 2017, commits at source.squeak.org wrote:
> Patrick Rein uploaded a new version of Collections to project The Trunk:
> http://source.squeak.org/trunk/Collections-pre.747.mcz
>
> ==================== Summary ====================
>
> Name: Collections-pre.747
> Author: pre
> Time: 20 April 2017, 11:37:10.168994 am
> UUID: 6fe02314-e789-064a-b678-0caec3506aac
> Ancestors: Collections-eem.746
>
> changes decoding of mime headers to decode directly to squeak encoding
>
> =============== Diff against Collections-eem.746 ===============
>
> Item was changed:
> ----- Method: String>>decodeMimeHeader (in category 'internet') -----
> decodeMimeHeader
> "See RFC 2047, MIME Part Three: Message Header Extension for Non-ASCII
> + Text and RFC 1342. Text containing non-ASCII characters is encoded by the sequence
> - Text. Text containing non-ASCII characters is encoded by the sequence
> =?character-set?encoding?encoded-text?=
> Encoding is Q (quoted printable) or B (Base64), handled by
> Base64MimeConverter / RFC2047MimeConverter.
>
> Thanks to Yokokawa-san, it works in m17n package. Try the following:
>
> '=?ISO-2022-JP?B?U1dJS0lQT1AvGyRCPUJDKyVpJXMlQRsoQi8=?= =?ISO-2022-JP?B?GyRCJVElRiUjJSobKEIoUGF0aW8p?=' decodeMimeHeader.
> "
> | input output temp charset decoder encodedStream encoding pos |
> input := ReadStream on: self.
> output := WriteStream on: String new.
> [output
> nextPutAll: (input upTo: $=).
> "ASCII Text"
> input atEnd]
> whileFalse: [(temp := input next) = $?
> ifTrue: [charset := input upTo: $?.
> encoding := (input upTo: $?) asUppercase.
> temp := input upTo: $?.
> input next.
> "Skip final ="
> (charset isNil or: [charset size = 0]) ifTrue: [charset := 'LATIN-1'].
> + encodedStream := WriteStream on: String new.
Creating a WriteStream on an empty string is just a waste, since it'll
have to allocate another string on the first write. #on: will always
create an empty stream, the argument will be the initial buffer.
> - encodedStream := MultiByteBinaryOrTextStream on: String new encoding: charset.
> decoder := encoding = 'B'
> ifTrue: [Base64MimeConverter new]
> ifFalse: [RFC2047MimeConverter new].
> decoder
> mimeStream: (ReadStream on: temp);
> dataStream: encodedStream;
> mimeDecode.
> +
> + output nextPutAll: (MultiByteBinaryOrTextStream with: encodedStream contents encoding: charset) contents.
The above conversion should be done without creating a
MultiByteBinaryOrTextStream.
Levente
P.S.: The whole method could use some refactoring.
> - output nextPutAll: encodedStream reset contents.
> pos := input position.
> input skipSeparators.
> "Delete spaces if followed by ="
> input peek = $=
> ifFalse: [input position: pos]]
> ifFalse: [output nextPut: $=;
> nextPut: temp]].
> ^ output contents!
More information about the Squeak-dev
mailing list
|