summaryrefslogtreecommitdiffstats
path: root/pharo-porting/changes_for_pharo.st
blob: 9c44fe020036775c2e40dd684ba2ec5bf1dbf77d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
SIPURandom class extend [
    nextByte [
        <category: 'random'>
        ^(RAND rand: 1) first.
    ]

    nextInt [
        <category: 'random'>
        ^(RAND rand: 4) asInteger
    ]
]

SIPUserAgentBase class extend [
    generateCSeq [
        <category: 'helper'>
        "For pharo just use the random we have"
        ^(RAND rand: 4) asInteger abs
    ]
]

SIPQuotedStringParser extend [
    skipWhitespace: aStream [
        [aStream atEnd] whileFalse:  [
            | c |
            c := aStream uncheckedPeek.
            c = Character tab ifTrue: [aStream next].
            c = Character space ifTrue: [aStream next].
            ^self
        ]
    ]


    parseOn: aContext [
        | memento startPosition result |
        startPosition := aContext position.
        memento := aContext remember.

        "Skip whitespace"
        self skipWhitespace: aContext.

        "Check for the opening space"
        aContext atEnd ifTrue: [
            result := PPFailure message: 'No space for opening quote' context: aContext.
            aContext restore: memento.
            ^result].

        aContext uncheckedPeek = $" ifFalse: [
            result := PPFailure message: 'No opening quote' context: aContext.
            aContext restore: memento.
            ^result].

        aContext skip: 1.
        result := self parseToClosingQuote: aContext.
        result isPetitFailure ifTrue: [
            aContext restore: memento].
        ^result
    ]

    parseToClosingQuote: aStream [
        | text inQuote finish parsed |
        text := WriteStream on: String new.
        inQuote := false.
        parsed := false.
        finish := aStream atEnd.
        [finish] whileFalse: ["Did we have an escape?"

            inQuote
                ifTrue: [
                    "TODO: Check if that is a valid sequence"

                    text nextPut: aStream next.
                    inQuote := false.
                    finish := aStream atEnd]
                ifFalse: [
                    | c |
                    c := aStream uncheckedPeek.
                    c = $"
                        ifTrue: [
                            aStream skip: 1.
                            parsed := true.
                            ^text contents]
                        ifFalse: [
                            c = $\ ifTrue: [inQuote := true].
                    text nextPut: c.
                    aStream skip: 1.
                    finish := aStream atEnd]]].
        ^PPFailure message: 'Expected closing quote' context: aStream
    ]
]

Base64LikeConverter class extend [

    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."

	| 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
    ]
]