Andreas Raab uploaded a new version of Collections to project The Trunk:
http://source.squeak.org/trunk/Collections-ar.334.mcz ==================== Summary ==================== Name: Collections-ar.334 Author: ar Time: 9 March 2010, 10:24:00.841 pm UUID: 689affd2-3259-b84c-993f-7e2053244cf5 Ancestors: Collections-ar.333 Give Base64MimeConverter the ability to not break lines longer than 70 characters. Useful (for example) when using long base64 encodings in urls. =============== Diff against Collections-ar.333 =============== Item was changed: ----- Method: Base64MimeConverter class>>mimeEncode: (in category 'as yet unclassified') ----- mimeEncode: aStream "Return a ReadWriteStream of characters. The data of aStream is encoded as 65 innocuous characters. (See class comment). 3 bytes in aStream goes to 4 bytes in output." + ^self mimeEncode: aStream multiLine: true atStart: true! - - | me | - me := self new dataStream: aStream. - me mimeStream: (ReadWriteStream on: (String new: aStream size + 20 * 4 // 3)). - me mimeEncode. - me mimeStream position: 0. - ^ me mimeStream! Item was added: + ----- Method: Base64MimeConverter class>>mimeEncode:multiLine: (in category 'as yet unclassified') ----- + mimeEncode: aStream multiLine: aBool + "Return a ReadWriteStream of characters. The data of aStream is encoded as 65 innocuous characters. (See class comment). 3 bytes in aStream goes to 4 bytes in output." + + ^self mimeEncode: aStream multiLine: aBool atStart: true! Item was changed: ----- Method: Base64MimeConverter>>mimeEncode (in category 'conversion') ----- mimeEncode "Convert from data to 6 bit characters." | phase1 phase2 raw nib lineLength | phase1 := phase2 := false. lineLength := 0. [dataStream atEnd] whileFalse: [ + (multiLine and:[lineLength >= 70]) ifTrue: [ mimeStream cr. lineLength := 0. ]. - lineLength >= 70 ifTrue: [ mimeStream cr. lineLength := 0. ]. data := raw := dataStream next asInteger. nib := (data bitAnd: 16rFC) bitShift: -2. mimeStream nextPut: (ToCharTable at: nib+1). (raw := dataStream next) ifNil: [raw := 0. phase1 := true]. data := ((data bitAnd: 3) bitShift: 8) + raw asInteger. nib := (data bitAnd: 16r3F0) bitShift: -4. mimeStream nextPut: (ToCharTable at: nib+1). (raw := dataStream next) ifNil: [raw := 0. phase2 := true]. data := ((data bitAnd: 16rF) bitShift: 8) + (raw asInteger). nib := (data bitAnd: 16rFC0) bitShift: -6. mimeStream nextPut: (ToCharTable at: nib+1). nib := (data bitAnd: 16r3F). mimeStream nextPut: (ToCharTable at: nib+1). lineLength := lineLength + 4.]. phase1 ifTrue: [mimeStream skip: -2; nextPut: $=; nextPut: $=. ^ mimeStream]. phase2 ifTrue: [mimeStream skip: -1; nextPut: $=. ^ mimeStream]. ! Item was changed: MimeConverter subclass: #Base64MimeConverter + instanceVariableNames: 'data multiLine' - instanceVariableNames: 'data' classVariableNames: 'FromCharTable ToCharTable' poolDictionaries: '' category: 'Collections-Streams'! !Base64MimeConverter commentStamp: '<historical>' prior: 0! This class encodes and decodes data in Base64 format. This is MIME encoding. We translate a whole stream at once, taking a Stream as input and giving one as output. Returns a whole stream for the caller to use. 0 A 17 R 34 i 51 z 1 B 18 S 35 j 52 0 2 C 19 T 36 k 53 1 3 D 20 U 37 l 54 2 4 E 21 V 38 m 55 3 5 F 22 W 39 n 56 4 6 G 23 X 40 o 57 5 7 H 24 Y 41 p 58 6 8 I 25 Z 42 q 59 7 9 J 26 a 43 r 60 8 10 K 27 b 44 s 61 9 11 L 28 c 45 t 62 + 12 M 29 d 46 u 63 / 13 N 30 e 47 v 14 O 31 f 48 w (pad) = 15 P 32 g 49 x 16 Q 33 h 50 y Outbound: bytes are broken into 6 bit chunks, and the 0-63 value is converted to a character. 3 data bytes go into 4 characters. Inbound: Characters are translated in to 0-63 values and shifted into 8 bit bytes. (See: N. Borenstein, Bellcore, N. Freed, Innosoft, Network Working Group, Request for Comments: RFC 1521, September 1993, MIME (Multipurpose Internet Mail Extensions) Part One: Mechanisms for Specifying and Describing the Format of Internet Message Bodies. Sec 6.2) By Ted Kaehler, based on Tim Olson's Base64Filter.! Item was added: + ----- Method: Base64MimeConverter class>>mimeEncode:multiLine:atStart: (in category 'as yet unclassified') ----- + mimeEncode: aStream multiLine: aBool atStart: resetInput + "Return a ReadWriteStream of characters. The data of aStream is encoded as 65 innocuous characters. (See class comment). 3 bytes in aStream goes to 4 bytes in output." + + | me | + resetInput ifTrue:[aStream position: 0]. + me := self new dataStream: aStream. + me multiLine: aBool. + me mimeStream: (ReadWriteStream on: (String new: aStream size + 20 * 4 // 3)). + me mimeEncode. + me mimeStream position: 0. + ^ me mimeStream! Item was added: + ----- Method: Base64MimeConverter>>multiLine (in category 'accessing') ----- + multiLine + "Determines whether we allow multi-line encodings (the default) or force everything into a single line (for use with URLs etc. where the continuation marker and the line break cause problems)" + ^multiLine! Item was added: + ----- Method: Base64MimeConverter>>multiLine: (in category 'accessing') ----- + multiLine: aBool + "Determines whether we allow multi-line encodings (the default) or force everything into a single line (for use with URLs etc. where the continuation marker and the line break cause problems)" + multiLine := aBool! Item was added: + ----- Method: Base64MimeConverter class>>mimeEncodeContinue: (in category 'as yet unclassified') ----- + mimeEncodeContinue: aStream + "Return a ReadWriteStream of characters. The data of aStream is encoded as 65 innocuous characters. (See class comment). 3 bytes in aStream goes to 4 bytes in output." + ^self mimeEncode: aStream multiLine: true atStart: false! |
Free forum by Nabble | Edit this page |