[Beepcore-java-commits] CVS: beepcore-java/src/org/beepcore/beep/core PiggybackedMSG.java,NONE,1.1.2
Status: Beta
Brought to you by:
huston
From: Huston F. <hu...@us...> - 2003-07-13 14:27:49
|
Update of /cvsroot/beepcore-java/beepcore-java/src/org/beepcore/beep/core In directory sc8-pr-cvs1:/tmp/cvs-serv2246/src/org/beepcore/beep/core Modified Files: Tag: PIGGYBACKED ChannelImpl.java TuningProfile.java SessionImpl.java Added Files: Tag: PIGGYBACKED PiggybackedMSG.java Log Message: Initial piggybacked changes --- NEW FILE: PiggybackedMSG.java --- /* * RequestHandler.java $Revision: 1.1.2.1 $ $Date: 2003/07/13 14:27:46 $ * * Copyright (c) 2003 Huston Franklin. All rights reserved. * * The contents of this file are subject to the Blocks Public License (the * "License"); You may not use this file except in compliance with the License. * * You may obtain a copy of the License at http://www.beepcore.org/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * */ package org.beepcore.beep.core; import java.io.ByteArrayOutputStream; import java.io.UnsupportedEncodingException; import org.beepcore.beep.util.BufferSegment; /** * This class is used to wrap piggybacked data from the start channel request. * * @author Huston Franklin * @version $Revision: 1.1.2.1 $, $Date: 2003/07/13 14:27:46 $ */ class PiggybackedMSG extends MessageMSGImpl implements MessageMSG { PiggybackedMSG(ChannelImpl channel, byte[] data, boolean base64encoding) { super(channel, -1, new InputDataStream()); try { this.getDataStream().add(new BufferSegment("\r\n".getBytes("UTF-8"))); } catch (UnsupportedEncodingException e) { this.channel.getSession().terminate("UTF-8 not supported"); return; } this.getDataStream().add(new BufferSegment(data)); this.getDataStream().setComplete(); } public MessageStatus sendANS(OutputDataStream stream) throws BEEPException { throw new BEEPException("ANS reply not valid for piggybacked requests"); } public MessageStatus sendERR(BEEPError error) throws BEEPException { throw new BEEPException("ERR reply not valid for piggybacked requests"); } public MessageStatus sendERR(int code, String diagnostic) throws BEEPException { throw new BEEPException("ERR reply not valid for piggybacked requests"); } public MessageStatus sendERR(int code, String diagnostic, String xmlLang) throws BEEPException { throw new BEEPException("ERR reply not valid for piggybacked requests"); } public MessageStatus sendNUL() throws BEEPException { throw new BEEPException("ANS reply not valid for piggybacked requests"); } public MessageStatus sendRPY(OutputDataStream stream) throws BEEPException { SessionImpl s = (SessionImpl)this.channel.getSession(); ByteArrayOutputStream tmp = new ByteArrayOutputStream(SessionImpl.MAX_PCDATA_SIZE); String data; while (stream.availableSegment()) { BufferSegment b = stream.getNextSegment(SessionImpl.MAX_PCDATA_SIZE); tmp.write(b.getData(), 0, b.getLength()); } try { data = tmp.toString("UTF-8"); int crlf = data.indexOf("\r\n"); if (crlf != -1) { data = data.substring(crlf + "\r\n".length()); } } catch (UnsupportedEncodingException e) { throw new RuntimeException("UTF-8 not supported"); } try { s.sendProfile(this.channel.getProfile(), data, this.channel); } catch (BEEPException e) { s.terminate("Error sending profile. " + e.getMessage()); throw e; } s.fireChannelStarted(this.channel); return new MessageStatus(this.channel, Message.MESSAGE_TYPE_RPY, -1, stream); } } Index: ChannelImpl.java =================================================================== RCS file: /cvsroot/beepcore-java/beepcore-java/src/org/beepcore/beep/core/ChannelImpl.java,v retrieving revision 1.7 retrieving revision 1.7.2.1 diff -C2 -r1.7 -r1.7.2.1 *** ChannelImpl.java 10 Jun 2003 18:59:17 -0000 1.7 --- ChannelImpl.java 13 Jul 2003 14:27:46 -0000 1.7.2.1 *************** *** 419,422 **** --- 419,438 ---- } + void abort() + { + setState(ChannelImpl.STATE_ABORTED); + } + + void addPiggybackedMSG(PiggybackedMSG msg) throws BEEPException + { + recvMSGQueue.add(msg); + try { + callbackQueue.execute(this); + } catch (InterruptedException e) { + /** @TODO handle this better */ + throw new BEEPException(e); + } + } + /** * get the number of this <code>Channel</code> as a <code>String</code> Index: TuningProfile.java =================================================================== RCS file: /cvsroot/beepcore-java/beepcore-java/src/org/beepcore/beep/core/TuningProfile.java,v retrieving revision 1.10 retrieving revision 1.10.2.1 diff -C2 -r1.10 -r1.10.2.1 *** TuningProfile.java 27 May 2003 21:37:41 -0000 1.10 --- TuningProfile.java 13 Jul 2003 14:27:46 -0000 1.10.2.1 *************** *** 75,79 **** * */ ! public void abort(BEEPError error, Channel channel) throws BEEPException { tuningChannels.remove(channel); --- 75,79 ---- * */ ! public void abort(BEEPError error, Channel channel) { tuningChannels.remove(channel); *************** *** 120,123 **** --- 120,132 ---- } } + + protected void begin(Channel channel) + { + log.debug("TuningProfile.begin"); + + SessionImpl session = (SessionImpl)channel.getSession(); + + ((ChannelImpl)channel).setState(ChannelImpl.STATE_TUNING); + } /** *************** *** 134,142 **** */ public void complete(Channel channel, ! SessionCredential localCred, ! SessionCredential peerCred, ! SessionTuningProperties tuning, ! ProfileRegistry registry, ! Object argument) throws BEEPException { --- 143,151 ---- */ public void complete(Channel channel, ! SessionCredential localCred, ! SessionCredential peerCred, ! SessionTuningProperties tuning, ! ProfileRegistry registry, ! Object argument) throws BEEPException { Index: SessionImpl.java =================================================================== RCS file: /cvsroot/beepcore-java/beepcore-java/src/org/beepcore/beep/core/SessionImpl.java,v retrieving revision 1.8 retrieving revision 1.8.2.1 diff -C2 -r1.8 -r1.8.2.1 *** SessionImpl.java 10 Jun 2003 18:59:19 -0000 1.8 --- SessionImpl.java 13 Jul 2003 14:27:46 -0000 1.8.2.1 *************** *** 21,24 **** --- 21,25 ---- import java.io.IOException; + import java.io.UnsupportedEncodingException; import java.util.Hashtable; *************** *** 38,41 **** --- 39,44 ---- import org.xml.sax.SAXException; + import sun.misc.BASE64Decoder; + import org.beepcore.beep.core.event.ChannelEvent; import org.beepcore.beep.core.event.ChannelListener; *************** *** 86,90 **** /** @todo check this */ ! private static final int MAX_PCDATA_SIZE = 4096; private static final int MAX_START_CHANNEL_WAIT = 60000; private static final int MAX_START_CHANNEL_INTERVAL = 100; --- 89,93 ---- /** @todo check this */ ! static final int MAX_PCDATA_SIZE = 4096; private static final int MAX_START_CHANNEL_WAIT = 60000; private static final int MAX_START_CHANNEL_INTERVAL = 100; *************** *** 977,981 **** } ! private void fireChannelStarted(Channel c) { ChannelListener[] l = this.channelListeners; --- 980,984 ---- } ! void fireChannelStarted(Channel c) { ChannelListener[] l = this.channelListeners; *************** *** 1244,1247 **** --- 1247,1252 ---- return; } catch (StartChannelException e) { + this.enableIO(); + try { ((MessageMSG)zero.getAppData()).sendERR(e); *************** *** 1253,1265 **** } ! try { ! sendProfile(p.uri, ch.getStartData(), ch); ! } catch (BEEPException e) { ! terminate("Error sending profile. " + e.getMessage()); ! return; ! } ! fireChannelStarted(ch); if (p.data == null || ch.getState() != ChannelImpl.STATE_TUNING) { --- 1258,1304 ---- } ! if (p.data != null && ch.getStartData() == null) { ! byte[] data; ! if (p.base64Encoding) { ! try { ! data = new BASE64Decoder().decodeBuffer(p.data); ! } catch (IOException e) { ! ch.abort(); ! this.enableIO(); ! throw new BEEPError(BEEPError.CODE_REQUESTED_ACTION_ABORTED, ! "Error parsing piggybacked data."); ! } ! } else { ! try { ! data = p.data.getBytes("UTF-8"); ! } catch (UnsupportedEncodingException e) { ! terminate("UTF-8 not supported"); ! return; ! } ! } ! ! PiggybackedMSG msg = new PiggybackedMSG(ch, data, ! p.base64Encoding); ! ch.setState(ChannelImpl.STATE_STARTING); ! try { ! ch.addPiggybackedMSG(msg); ! } catch (BEEPException e) { ! terminate("Error sending profile. " + e.getMessage()); ! ! return; ! } ! } else { ! try { ! sendProfile(p.uri, ch.getStartData(), ch); ! } catch (BEEPException e) { ! terminate("Error sending profile. " + e.getMessage()); ! ! return; ! } ! ! fireChannelStarted(ch); ! } if (p.data == null || ch.getState() != ChannelImpl.STATE_TUNING) { *************** *** 1269,1272 **** --- 1308,1313 ---- return; } + + this.enableIO(); try { |