summaryrefslogtreecommitdiffstats
blob: 3171ec0c0b5055e38f862eb9ffa6712ced6fb97d (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
/*
 * Copyright (c) 2010-2014 Remko Tronçon
 * All rights reserved.
 */
/*
 * Copyright (c) 2010-2014, Isode Limited, London, England.
 * All rights reserved.
 */
package com.isode.stroke.session;

import java.util.List;

import com.isode.stroke.base.SafeByteArray;
import com.isode.stroke.base.ByteArray;
import com.isode.stroke.elements.Element;
import com.isode.stroke.elements.ProtocolHeader;
import com.isode.stroke.signals.Signal;
import com.isode.stroke.signals.Signal1;
import com.isode.stroke.tls.Certificate;
import com.isode.stroke.tls.CertificateVerificationError;
import com.isode.stroke.tls.CertificateWithKey;

public abstract class SessionStream {

    public static class Error implements com.isode.stroke.base.Error {

        public enum Type {

            ParseError,
            TLSError,
            InvalidTLSCertificateError,
            ConnectionReadError,
            ConnectionWriteError
        }

        public Error(Type type) {
            this.type = type;
        }
        public final Type type;
    }

    public abstract void close();

    public abstract boolean isOpen();

    public abstract void writeHeader(ProtocolHeader header);

    public abstract void writeFooter();

    public abstract void writeElement(Element element);

    public abstract void writeData(String data);

    public abstract boolean supportsZLibCompression();

    public abstract void addZLibCompression();

    public abstract boolean supportsTLSEncryption();

    public abstract void addTLSEncryption();

    public abstract boolean isTLSEncrypted();

    public abstract void setWhitespacePingEnabled(boolean enabled);

    public abstract void resetXMPPParser();
    
    public void setTLSCertificate(CertificateWithKey cert) {
        certificate = cert;
    }

    public boolean hasTLSCertificate() {
        return certificate != null && !certificate.isNull();
    }

    public abstract List<Certificate> getPeerCertificateChain();
    public abstract Certificate getPeerCertificate();

    public abstract CertificateVerificationError getPeerCertificateVerificationError();

    public abstract ByteArray getTLSFinishMessage();

    public final Signal1<ProtocolHeader> onStreamStartReceived = new Signal1<ProtocolHeader>();
    public final Signal1<Element> onElementReceived = new Signal1<Element>();
    public final Signal1<Error> onClosed = new Signal1<Error>();
    public final Signal onTLSEncrypted = new Signal();
    public final Signal1<SafeByteArray> onDataRead = new Signal1<SafeByteArray>();
    public final Signal1<SafeByteArray> onDataWritten = new Signal1<SafeByteArray>();
    protected CertificateWithKey getTLSCertificate() {
        return certificate;
    }
    
    @Override
    public String toString() {
        String className = this.getClass().getSimpleName();

        // Include actual type based on class name of the object
        return className + 
        "; supportsTLSEncryption:" + supportsTLSEncryption() +
        "; " + (hasTLSCertificate() ? "has" : "no") +
        " certificate";            
    }
    private CertificateWithKey certificate;
}