History

My first initial commit with all of mine experimental changes.

Dmitry Kabak (userdima committed 13 years ago

Commit d37b88d1 parent 3f5b46618352 files · +2598093 −-8690Browse files

Showing the changes to java/pkg/sun/security/ssl/AppOutputStream.java (1 of 18352 files). Show all

Unified · Split

java/pkg/sun/security/ssl/AppOutputStream.java+110−0
@@ -0,0 +1,110 @@
1/*
2 * Copyright (c) 1996, 2009, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26
27package sun.security.ssl;
28
29import java.io.OutputStream;
30import java.io.IOException;
31
32/*
33 * Output stream for application data. This is the kind of stream
34 * that's handed out via SSLSocket.getOutputStream(). It's all the application
35 * ever sees.
36 *
37 * Once the initial handshake has completed, application data may be
38 * interleaved with handshake data. That is handled internally and remains
39 * transparent to the application.
40 *
41 * @author David Brownell
42 */
43class AppOutputStream extends OutputStream {
44
45 private SSLSocketImpl c;
46 OutputRecord r;
47
48 // One element array used to implement the write(byte) method
49 private final byte[] oneByte = new byte[1];
50
51 AppOutputStream(SSLSocketImpl conn) {
52 r = new OutputRecord(Record.ct_application_data);
53 c = conn;
54 }
55
56 /**
57 * Write the data out, NOW.
58 */
59 synchronized public void write(byte b[], int off, int len)
60 throws IOException {
61 if (b == null) {
62 throw new NullPointerException();
63 } else if (off < 0 || len < 0 || len > b.length - off) {
64 throw new IndexOutOfBoundsException();
65 } else if (len == 0) {
66 return;
67 }
68
69 // check if the Socket is invalid (error or closed)
70 c.checkWrite();
71
72 // Always flush at the end of each application level record.
73 // This lets application synchronize read and write streams
74 // however they like; if we buffered here, they couldn't.
75 try {
76 do {
77 int howmuch = Math.min(len, r.availableDataBytes());
78
79 // NOTE: *must* call c.writeRecord() even for howmuch == 0
80 if (howmuch > 0) {
81 r.write(b, off, howmuch);
82 off += howmuch;
83 len -= howmuch;
84 }
85 c.writeRecord(r);
86 c.checkWrite();
87 } while (len > 0);
88 } catch (Exception e) {
89 // shutdown and rethrow (wrapped) exception as appropriate
90 c.handleException(e);
91 }
92 }
93
94 /**
95 * Write one byte now.
96 */
97 synchronized public void write(int i) throws IOException {
98 oneByte[0] = (byte)i;
99 write(oneByte, 0, 1);
100 }
101
102 /*
103 * Socket close is already synchronized, no need to block here.
104 */
105 public void close() throws IOException {
106 c.close();
107 }
108
109 // inherit no-op flush()
110}