001: package org.jacorb.orb.giop;
002:
003: /*
004: * JacORB - a free Java ORB
005: *
006: * Copyright (C) 1997-2004 Gerald Brose.
007: *
008: * This library is free software; you can redistribute it and/or
009: * modify it under the terms of the GNU Library General Public
010: * License as published by the Free Software Foundation; either
011: * version 2 of the License, or (at your option) any later version.
012: *
013: * This library is distributed in the hope that it will be useful,
014: * but WITHOUT ANY WARRANTY; without even the implied warranty of
015: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
016: * Library General Public License for more details.
017: *
018: * You should have received a copy of the GNU Library General Public
019: * License along with this library; if not, write to the Free
020: * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
021: */
022:
023: import org.omg.CORBA.MARSHAL;
024: import org.omg.GIOP.LocateRequestHeader_1_0;
025: import org.omg.GIOP.LocateRequestHeader_1_0Helper;
026: import org.omg.GIOP.LocateRequestHeader_1_2;
027: import org.omg.GIOP.LocateRequestHeader_1_2Helper;
028: import org.omg.GIOP.MsgType_1_1;
029: import org.omg.GIOP.RequestHeader_1_0;
030: import org.omg.GIOP.RequestHeader_1_0Helper;
031: import org.omg.GIOP.RequestHeader_1_1;
032: import org.omg.GIOP.RequestHeader_1_1Helper;
033: import org.omg.GIOP.RequestHeader_1_2;
034: import org.omg.GIOP.RequestHeader_1_2Helper;
035: import org.omg.GIOP.TargetAddress;
036: import org.omg.IOP.ServiceContext;
037:
038: /**
039: * @author Gerald Brose, FU Berlin
040: * @version $Id: RequestInputStream.java,v 1.20 2006/06/27 09:34:31 alphonse.bendt Exp $
041: */
042: public class RequestInputStream extends
043: ServiceContextTransportingInputStream {
044: private static final byte[] reserved = new byte[3];
045:
046: private final boolean is_locate_request;
047:
048: public final RequestHeader_1_2 req_hdr;
049:
050: public RequestInputStream(org.omg.CORBA.ORB orb, byte[] buf) {
051: super (orb, buf);
052:
053: if (Messages.getMsgType(buffer) == MsgType_1_1._Request) {
054: switch (giop_minor) {
055: case 0: {
056: //GIOP 1.0
057: RequestHeader_1_0 hdr = RequestHeader_1_0Helper
058: .read(this );
059:
060: TargetAddress addr = new TargetAddress();
061: addr.object_key(hdr.object_key);
062:
063: req_hdr = new RequestHeader_1_2(hdr.request_id,
064: Messages.responseFlags(hdr.response_expected),
065: reserved, addr, //target
066: hdr.operation, hdr.service_context);
067: break;
068: }
069: case 1: {
070: //GIOP 1.1
071: RequestHeader_1_1 hdr = RequestHeader_1_1Helper
072: .read(this );
073:
074: TargetAddress addr = new TargetAddress();
075: addr.object_key(hdr.object_key);
076:
077: req_hdr = new RequestHeader_1_2(hdr.request_id,
078: Messages.responseFlags(hdr.response_expected),
079: reserved, addr, //target
080: hdr.operation, hdr.service_context);
081: break;
082: }
083: case 2: {
084: //GIOP 1.2
085: req_hdr = RequestHeader_1_2Helper.read(this );
086:
087: skipHeaderPadding();
088:
089: break;
090: }
091: default: {
092: throw new MARSHAL("Unknown GIOP minor version: "
093: + giop_minor);
094: }
095: }
096:
097: is_locate_request = false;
098: } else if (Messages.getMsgType(buffer) == MsgType_1_1._LocateRequest) {
099: switch (giop_minor) {
100: case 0: {
101: //GIOP 1.0 = GIOP 1.1, fall through
102: }
103: case 1: {
104: //GIOP 1.1
105: LocateRequestHeader_1_0 locate_req_hdr = LocateRequestHeader_1_0Helper
106: .read(this );
107:
108: TargetAddress addr = new TargetAddress();
109: addr.object_key(locate_req_hdr.object_key);
110:
111: req_hdr = new RequestHeader_1_2(
112: locate_req_hdr.request_id,
113: (byte) 0x03,//response_expected
114: reserved, addr, "_non_existent",
115: Messages.service_context);
116: break;
117: }
118: case 2: {
119: //GIOP 1.2
120: LocateRequestHeader_1_2 locate_req_hdr = LocateRequestHeader_1_2Helper
121: .read(this );
122:
123: req_hdr = new RequestHeader_1_2(
124: locate_req_hdr.request_id,
125: (byte) 0x03,//response_expected
126: reserved, locate_req_hdr.target,
127: "_non_existent", Messages.service_context);
128: break;
129: }
130: default: {
131: throw new MARSHAL("Unknown GIOP minor version: "
132: + giop_minor);
133: }
134: }
135:
136: is_locate_request = true;
137: } else {
138: throw new MARSHAL("Error: not a request!");
139: }
140: }
141:
142: public ServiceContext getServiceContext(int id) {
143: for (int i = 0; i < req_hdr.service_context.length; i++) {
144: if (req_hdr.service_context[i].context_id == id) {
145: return req_hdr.service_context[i];
146: }
147: }
148:
149: return null;
150: }
151:
152: public boolean isLocateRequest() {
153: return is_locate_request;
154: }
155:
156: protected void finalize() throws Throwable {
157: try {
158: close();
159: } finally {
160: super.finalize();
161: }
162: }
163: }
|