01: /*
02: * @(#)WinCEDatagramSocketImpl.java 1.6 06/10/10
03: *
04: * Copyright 1990-2006 Sun Microsystems, Inc. All Rights Reserved.
05: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
06: *
07: * This program is free software; you can redistribute it and/or
08: * modify it under the terms of the GNU General Public License version
09: * 2 only, as published by the Free Software Foundation.
10: *
11: * This program is distributed in the hope that it will be useful, but
12: * WITHOUT ANY WARRANTY; without even the implied warranty of
13: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14: * General Public License version 2 for more details (a copy is
15: * included at /legal/license.txt).
16: *
17: * You should have received a copy of the GNU General Public License
18: * version 2 along with this work; if not, write to the Free Software
19: * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
20: * 02110-1301 USA
21: *
22: * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
23: * Clara, CA 95054 or visit www.sun.com if you need additional
24: * information or have any questions.
25: *
26: */
27:
28: package java.net;
29:
30: import java.io.FileDescriptor;
31: import java.io.IOException;
32: import java.io.InterruptedIOException;
33:
34: class WinCEDatagramSocketImpl extends PlainDatagramSocketImpl {
35: private DatagramPacket peekPacket = null;
36: private int bufLength = 0;
37:
38: protected synchronized void create() throws SocketException {
39: super .create();
40: bufLength = ((Integer) getOption(SO_RCVBUF)).intValue();
41: }
42:
43: protected synchronized int peek(InetAddress i) throws IOException {
44: if (peekPacket == null) {
45: int len = bufLength;
46: DatagramPacket p = new DatagramPacket(new byte[len], len);
47: receive(p);
48: peekPacket = p;
49: }
50: copyInetAddress(i, peekPacket.getAddress());
51: return peekPacket.getPort();
52: }
53:
54: private static native void copyInetAddress(InetAddress dest,
55: InetAddress src);
56:
57: protected synchronized void receive(DatagramPacket p)
58: throws IOException {
59: if (peekPacket == null) {
60: super .receive(p);
61: } else {
62: p.setPort(peekPacket.getPort());
63: p.setAddress(peekPacket.getAddress());
64: int len = Math.min(peekPacket.getLength(), p.getLength());
65: System.arraycopy(peekPacket.getData(), peekPacket
66: .getOffset(), p.getData(), p.getOffset(), len);
67: p.setLength(len);
68: peekPacket = null;
69: }
70: }
71:
72: public void setOption(int optID, Object o) throws SocketException {
73: super .setOption(optID, o);
74: if (optID == SO_RCVBUF) {
75: bufLength = ((Integer) getOption(SO_RCVBUF)).intValue();
76: }
77: }
78:
79: }
|