Mercurial > projects > dwt2
annotate org.eclipse.swt.gtk.linux.x86/src/org/eclipse/swt/internal/image/LEDataInputStream.d @ 120:536e43f63c81
Comprehensive update for Win32/Linux32 dmd-2.053/dmd-1.068+Tango-r5661
===D2===
* added [Try]Immutable/Const/Shared templates to work with differenses in D1/D2 instead of version statements
used these templates to work with strict type storage rules of dmd-2.053
* com.ibm.icu now also compilable with D2, but not tested yet
* small fixes
Snippet288 - shared data is in TLS
===Phobos===
* fixed critical bugs in Phobos implemention
completely incorrect segfault prone fromStringz (Linux's port ruthless killer)
terrible, incorrect StringBuffer realization (StyledText killer)
* fixed small bugs as well
Snippet72 - misprint in the snippet
* implemented missed functionality for Phobos
ByteArrayOutputStream implemented (image loading available)
formatting correctly works for all DWT's cases
As a result, folowing snippets now works with Phobos (Snippet### - what is fixed):
Snippet24, 42, 111, 115, 130, 235, 276 - bad string formatting
Snippet48, 282 - crash on image loading
Snippet163, 189, 211, 213, 217, 218, 222 - crash on copy/cut in StyledText
Snippet244 - hang-up
===Tango===
* few changes for the latest Tango trunc-r5661
* few small performance improvments
===General===
* implMissing-s for only one version changed to implMissingInTango/InPhobos
* incorrect calls to Format in toString-s fixed
* fixed loading \uXXXX characters in ResourceBundle
* added good UTF-8 support for StyledText, TextLayout (Win32) and friends
UTF functions revised and tested. It is now in java.nonstandard.*Utf modules
StyledText and TextLayout (Win32) modules revised for UTF-8 support
* removed small diferences in most identical files in *.swt.* folders
*.swt.internal.image, *.swt.events and *.swt.custom are identical in Win32/Linux32
now 179 of 576 (~31%) files in *.swt.* folders are fully identical
* Win32: snippets now have right subsystem, pretty icons and native system style controls
* small fixes in snippets
Snippet44 - it's not Snippet44
Snippet212 - functions work with different images and offsets arrays
Win32: Snippet282 - crash on close if the button has an image
Snippet293 - setGrayed is commented
and others
Win32: As a result, folowing snippets now works
Snippet68 - color doesn't change
Snippet163, 189, 211, 213, 217, 218, 222 - UTF-8 issues (see above)
Snippet193 - no tabel headers
author | Denis Shelomovskij <verylonglogin.reg@gmail.com> |
---|---|
date | Sat, 09 Jul 2011 15:50:20 +0300 |
parents | 7a2dd761a8b2 |
children |
rev | line source |
---|---|
25 | 1 /******************************************************************************* |
2 * Copyright (c) 2000, 2007 IBM Corporation and others. | |
3 * All rights reserved. This program and the accompanying materials | |
4 * are made available under the terms of the Eclipse Public License v1.0 | |
5 * which accompanies this distribution, and is available at | |
6 * http://www.eclipse.org/legal/epl-v10.html | |
7 * | |
8 * Contributors: | |
9 * IBM Corporation - initial API and implementation | |
10 * Port to the D programming language: | |
11 * Frank Benoit <benoit@tionex.de> | |
12 *******************************************************************************/ | |
13 module org.eclipse.swt.internal.image.LEDataInputStream; | |
14 | |
15 | |
16 import java.io.InputStream; | |
120
536e43f63c81
Comprehensive update for Win32/Linux32 dmd-2.053/dmd-1.068+Tango-r5661
Denis Shelomovskij <verylonglogin.reg@gmail.com>
parents:
49
diff
changeset
|
17 import java.lang.all; |
25 | 18 |
19 final class LEDataInputStream : InputStream{ | |
20 | |
21 alias InputStream.read read; | |
22 | |
23 InputStream host; | |
24 | |
25 int position; | |
26 | |
27 /** | |
28 * The byte array containing the bytes to read. | |
29 */ | |
30 protected byte[] buf; | |
31 | |
32 /** | |
33 * The current position within the byte array <code>buf</code>. A value | |
34 * equal to buf.length indicates no bytes available. A value of | |
35 * 0 indicates the buffer is full. | |
36 */ | |
37 protected int pos; | |
38 | |
39 | |
40 public this(InputStream input) { | |
41 this(input, 512); | |
42 } | |
43 | |
44 public this(InputStream input, int bufferSize) { | |
45 host = input; | |
46 if (bufferSize > 0) { | |
47 buf = new byte[bufferSize]; | |
48 pos = bufferSize; | |
49 } | |
50 else throw new IllegalArgumentException("bufferSize must be greater zero" ); | |
51 } | |
52 | |
53 public void close() { | |
54 buf = null; | |
55 if (host !is null) { | |
56 host.close(); | |
57 host = null; | |
58 } | |
59 } | |
60 | |
61 /** | |
62 * Answer how many bytes were read. | |
63 */ | |
64 public int getPosition() { | |
65 return position; | |
66 } | |
67 | |
68 /** | |
69 * Answers how many bytes are available for reading without blocking | |
70 */ | |
71 public override int available() { | |
72 if (buf is null) throw new IOException("buf is null"); | |
73 return (buf.length - pos) + host.available(); | |
74 } | |
75 | |
76 /** | |
77 * Answer the next byte of the input stream. | |
78 */ | |
79 public override int read() { | |
80 if (buf is null) throw new IOException("buf is null"); | |
81 if (pos < buf.length) { | |
82 position++; | |
83 return (buf[pos++] & 0xFF); | |
84 } | |
85 int c = host.read(); | |
86 if (c !is -1 ) position++; | |
87 return c; | |
88 } | |
89 | |
90 /** | |
91 * Don't imitate the JDK behaviour of reading a random number | |
92 * of bytes when you can actually read them all. | |
93 */ | |
94 public override int read(byte b[], int off, int len) { | |
95 int read = 0, count; | |
96 while (read !is len && (count = readData(b, off, len - read)) !is -1) { | |
97 off += count; | |
98 read += count; | |
99 } | |
100 position += read; | |
101 if (read is 0 && read !is len) return -1; | |
102 return read; | |
103 } | |
104 | |
105 /** | |
106 * Reads at most <code>length</code> bytes from this LEDataInputStream and | |
107 * stores them in byte array <code>buffer</code> starting at <code>offset</code>. | |
108 * <p> | |
109 * Answer the number of bytes actually read or -1 if no bytes were read and | |
110 * end of stream was encountered. This implementation reads bytes from | |
111 * the pushback buffer first, then the target stream if more bytes are required | |
112 * to satisfy <code>count</code>. | |
113 * </p> | |
114 * @param buffer the byte array in which to store the read bytes. | |
115 * @param offset the offset in <code>buffer</code> to store the read bytes. | |
116 * @param length the maximum number of bytes to store in <code>buffer</code>. | |
117 * | |
118 * @return int the number of bytes actually read or -1 if end of stream. | |
119 * | |
120 * @exception java.io.IOException if an IOException occurs. | |
121 */ | |
122 private int readData(byte[] buffer, int offset, int len) { | |
123 if (buf is null) throw new IOException("buf is null"); | |
124 if (offset < 0 || offset > buffer.length || | |
125 len < 0 || (len > buffer.length - offset)) { | |
49
7a2dd761a8b2
more work until dmd 2.026 linux segfaults.
Frank Benoit <benoit@tionex.de>
parents:
48
diff
changeset
|
126 throw new ArrayIndexOutOfBoundsException(__FILE__,__LINE__); |
120
536e43f63c81
Comprehensive update for Win32/Linux32 dmd-2.053/dmd-1.068+Tango-r5661
Denis Shelomovskij <verylonglogin.reg@gmail.com>
parents:
49
diff
changeset
|
127 } |
25 | 128 |
129 int cacheCopied = 0; | |
130 int newOffset = offset; | |
131 | |
132 // Are there pushback bytes available? | |
133 int available = buf.length - pos; | |
134 if (available > 0) { | |
135 cacheCopied = (available >= len) ? len : available; | |
136 System.arraycopy(buf, pos, buffer, newOffset, cacheCopied); | |
137 newOffset += cacheCopied; | |
138 pos += cacheCopied; | |
139 } | |
140 | |
141 // Have we copied enough? | |
142 if (cacheCopied is len) return len; | |
143 | |
144 int inCopied = host.read( buffer, newOffset, len - cacheCopied ); | |
145 if( inCopied is -1 ) inCopied = -1; | |
146 if (inCopied > 0 ) return inCopied + cacheCopied; | |
147 if (cacheCopied is 0) return inCopied; | |
148 return cacheCopied; | |
149 } | |
150 | |
151 /** | |
152 * Answer an integer comprised of the next | |
153 * four bytes of the input stream. | |
154 */ | |
155 public int readInt() { | |
156 byte[4] buf = void; | |
157 read(buf); | |
158 return ((buf[3] & 0xFF) << 24) | | |
159 ((buf[2] & 0xFF) << 16) | | |
160 ((buf[1] & 0xFF) << 8) | | |
161 (buf[0] & 0xFF); | |
162 } | |
163 | |
164 /** | |
165 * Answer a short comprised of the next | |
166 * two bytes of the input stream. | |
167 */ | |
168 public short readShort() { | |
169 byte[2] buf = void; | |
170 read(buf); | |
171 return cast(short)(((buf[1] & 0xFF) << 8) | (buf[0] & 0xFF)); | |
172 } | |
173 | |
174 /** | |
175 * Push back the entire content of the given buffer <code>b</code>. | |
176 * <p> | |
177 * The bytes are pushed so that they would be read back b[0], b[1], etc. | |
178 * If the push back buffer cannot handle the bytes copied from <code>b</code>, | |
179 * an IOException will be thrown and no byte will be pushed back. | |
180 * </p> | |
181 * | |
182 * @param b the byte array containing bytes to push back into the stream | |
183 * | |
184 * @exception java.io.IOException if the pushback buffer is too small | |
185 */ | |
186 public void unread(byte[] b) { | |
187 int l = b.length; | |
188 if (l > pos) throw new IOException("cannot unread"); | |
189 position -= l; | |
190 pos -= l; | |
191 System.arraycopy(b, 0, buf, pos, l); | |
192 } | |
193 } |