01: /*
02: * Copyright 1999-2002 Sun Microsystems, Inc. All Rights Reserved.
03: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
04: *
05: * This code is free software; you can redistribute it and/or modify it
06: * under the terms of the GNU General Public License version 2 only, as
07: * published by the Free Software Foundation. Sun designates this
08: * particular file as subject to the "Classpath" exception as provided
09: * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
22: * CA 95054 USA or visit www.sun.com if you need additional information or
23: * have any questions.
24: */
25:
26: package com.sun.jndi.ldap;
27:
28: import java.io.IOException;
29: import java.util.Vector;
30: import javax.naming.CommunicationException;
31:
32: final class LdapRequest {
33:
34: LdapRequest next; // Set/read in synchronized Connection methods
35: int msgId; // read-only
36:
37: private int gotten = 0;
38: private Vector replies = new Vector(3);
39: private boolean cancelled = false;
40: private boolean pauseAfterReceipt = false;
41: private boolean completed = false;
42:
43: LdapRequest(int msgId, boolean pause) {
44: this .msgId = msgId;
45: this .pauseAfterReceipt = pause;
46: }
47:
48: synchronized void cancel() {
49: cancelled = true;
50:
51: // Unblock reader of pending request
52: // Should only ever have atmost one waiter
53: notify();
54: }
55:
56: synchronized boolean addReplyBer(BerDecoder ber) {
57: if (cancelled) {
58: return false;
59: }
60: replies.addElement(ber);
61:
62: // peek at the BER buffer to check if it is a SearchResultDone PDU
63: try {
64: ber.parseSeq(null);
65: ber.parseInt();
66: completed = (ber.peekByte() == LdapClient.LDAP_REP_RESULT);
67: } catch (IOException e) {
68: // ignore
69: }
70: ber.reset();
71:
72: notify(); // notify anyone waiting for reply
73: return pauseAfterReceipt;
74: }
75:
76: synchronized BerDecoder getReplyBer() throws CommunicationException {
77: if (cancelled) {
78: throw new CommunicationException("Request: " + msgId
79: + " cancelled");
80: }
81:
82: if (gotten < replies.size()) {
83: BerDecoder answer = (BerDecoder) replies.elementAt(gotten);
84: replies.setElementAt(null, gotten); // remove reference
85: ++gotten; // skip to next
86: return answer;
87: } else {
88: return null;
89: }
90: }
91:
92: synchronized boolean hasSearchCompleted() {
93: return completed;
94: }
95: }
|