📄 slidewindow.java
字号:
// Decompiled by Jad v1.5.7g. Copyright 2000 Pavel Kouznetsov.
// Jad home page: http://www.geocities.com/SiliconValley/Bridge/8617/jad.html
// Decompiler options: packimports(3) fieldsfirst ansi
// Source File Name: SlideWindow.java
package com.SGIP12.sgiputil;
import com.SGIP12.sgipdata.*;
import com.log.CTime;
import java.io.*;
import java.util.Vector;
import javax.swing.JTextArea;
// Referenced classes of package com.SGIP12.sgiputil:
// SlideWindowData, SGIPPacket, SGIPConfig, SGIPLog,
// SGIPQueue
public class SlideWindow
{
private long SPNum;
public static final int SUCCESS = 0;
private int freePosBegin;
private int freePosEnd;
private int haveSendPosBegin;
private int haveSendPosEnd;
private String logFile;
private String loginName;
private String loginPwd;
private int maxReSendTime;
private int maxSendCounts;
private int notSendPosBegin;
private int notSendPosEnd;
private JTextArea packetArea;
private SGIPQueue recvQueue;
private SGIPQueue sendQueue;
private int size;
private Vector slideWindow;
private JTextArea stateArea;
public SlideWindow(SGIPConfig con, SGIPQueue sendQ, SGIPQueue recvQ)
{
size = 100;
stateArea = null;
packetArea = null;
slideWindow = new Vector();
size = con.getSlideWindowSize() + 1;
freePosBegin = 0;
freePosEnd = 0;
SPNum = con.getNodeID();
loginName = con.getGateWayUser();
loginPwd = con.getGateWayPwd();
maxSendCounts = con.getPacketsMaxSendCounts();
maxReSendTime = con.getPacketsReSendTime();
haveSendPosBegin = haveSendPosEnd = 0;
notSendPosBegin = notSendPosEnd = 0;
for(int i = 0; i < size; i++)
slideWindow.addElement(null);
sendQueue = sendQ;
recvQueue = recvQ;
logFile = "Send";
}
public void SetTextArea(JTextArea sa, JTextArea pa)
{
stateArea = sa;
packetArea = pa;
}
public synchronized long deSlideWindow(long seq_1, int seq_2, int seq_3)
{
if(haveSendPosEnd - haveSendPosBegin == 0)
{
SGIPLog.WriteLog(-1, "SLIDEWINDOW WARNING:滑动窗口中没有已经发送的包!", logFile);
return -1L;
}
int startPos = ((haveSendPosEnd - 1) + size) % size;
int endPos = ((haveSendPosBegin - 1) + size) % size;
int i = startPos;
long localId = -1L;
for(; i != endPos; i = ((i - 1) + size) % size)
{
long iival_1 = ((SlideWindowData)slideWindow.elementAt(i)).getPacket().sequence_1;
int iival_2 = ((SlideWindowData)slideWindow.elementAt(i)).getPacket().sequence_2;
int iival_3 = ((SlideWindowData)slideWindow.elementAt(i)).getPacket().sequence_3;
if(iival_1 != seq_1 || iival_2 != seq_2 || iival_3 != seq_3)
continue;
localId = ((SlideWindowData)slideWindow.elementAt(i)).getPacket().localId;
SlideWindowData swd = (SlideWindowData)slideWindow.elementAt(startPos);
slideWindow.setElementAt(swd, i);
slideWindow.setElementAt(null, startPos);
break;
}
if(i != endPos)
{
haveSendPosEnd = ((haveSendPosEnd + size) - 1) % size;
freePosBegin = haveSendPosEnd;
return localId;
} else
{
SGIPLog.WriteLog(-1, "SLIDEWINDOW WARNING: 回复包的序列号(seqId)与已发送的所有包的序列号均不同!可能此包已被抛弃。", logFile);
System.out.println("SLIDEWINDOW WARNING: 回复包的序列号(seqId)与已发送的所有包的序列号均不同!");
localId = -1L;
return localId;
}
}
public synchronized void enSlideWindow(SlideWindowData slideWindowData)
{
if((((freePosEnd - freePosBegin) + size) - 1) % size == 0)
{
SGIPLog.WriteLog(-1, "SLIDEWINDOW WARNING:滑动窗口中已满,没有位置给新包!", logFile);
return;
} else
{
slideWindow.setElementAt(slideWindowData, ((freePosEnd - 1) + size) % size);
notSendPosBegin = ((notSendPosBegin + size) - 1) % size;
freePosEnd = ((freePosEnd + size) - 1) % size;
return;
}
}
public int getFreeWindowSize()
{
return (((freePosEnd - freePosBegin) + size) - 1) % size;
}
public Vector getPacketsHaveSend()
{
Vector v = new Vector();
for(int i = haveSendPosBegin; i < haveSendPosEnd; i++)
{
SlideWindowData swd = (SlideWindowData)slideWindow.elementAt(i);
v.add(swd.getPacket());
}
return v;
}
public int getPacketsNumToSend()
{
return ((notSendPosEnd - notSendPosBegin) + size) % size;
}
public int getPacketsNumWaitForResp()
{
return ((haveSendPosEnd - haveSendPosBegin) + size) % size;
}
public Vector getPacketsToSend()
{
Vector v = new Vector();
for(int i = notSendPosBegin; i < notSendPosEnd; i++)
{
SlideWindowData swd = (SlideWindowData)slideWindow.elementAt(i);
v.add(swd.getPacket());
}
return v;
}
public static String getSendPacketInfo(SGIPPacket pkt)
{
if(pkt == null)
return "包体为空";
String info;
switch(pkt.CommandId)
{
case 1: // '\001'
info = "BIND 连接包:";
break;
case -2147483647:
info = "BIND_RESP 连接应答包:";
break;
case 2: // '\002'
info = "UNBIND 链路断开包:";
break;
case -2147483646:
info = "UNBIND_RESP 链路断开回复包:";
break;
case 3: // '\003'
info = "SUBMIT 提交短信包:";
break;
case -2147483644:
info = "DELIVER_RESP 接收短信回复包:";
break;
case 4096:
info = "TRACE 查询短信包:";
break;
case -2147483643:
info = "REPORT_RESP Report命令回复包:";
break;
case -2147483631:
info = "USERRPT_RESP Userrpt命令回复包:";
break;
default:
info = "错误的CommandId号: " + pkt.CommandId;
break;
}
return info;
}
public boolean havePacketToSend()
{
return notSendPosEnd != notSendPosBegin;
}
public boolean haveSpaceForNewPacket()
{
return (((freePosEnd - freePosBegin) + size) - 1) % size > 0;
}
public synchronized int increWaitedTime(int increWaitedTime)
{
if(((haveSendPosEnd - haveSendPosBegin) + size) % size == 0)
return 0;
int startPos = ((haveSendPosEnd - 1) + size) % size;
int endPos = ((haveSendPosBegin - 1) + size) % size;
for(int i = startPos; i != endPos; i = ((i - 1) + size) % size)
{
SlideWindowData swd = (SlideWindowData)slideWindow.elementAt(i);
if(swd == null)
{
SGIPLog.WriteLog(-2, "在试图为正在等待回应的包增加等待时间时,碰到了空包体!!", logFile);
} else
{
swd.increWaitedTime(increWaitedTime);
if(swd.getHaveWaitedTime() >= maxReSendTime)
{
SGIPLog.WriteLog(-1, "超时重发 -- " + getSendPacketInfo(swd.getPacket()) + " 在规定的最大时间(" + maxReSendTime + "ms)内未能接收到回应包,将重新发送!", logFile);
System.out.println("超时重发 -- " + getSendPacketInfo(swd.getPacket()) + " 在规定的最大时间(" + maxReSendTime + "ms)内未能接收到回应包,将重新发送!");
deSlideWindow(swd.getPacket().sequence_1, swd.getPacket().sequence_2, swd.getPacket().sequence_3);
if(swd.getHaveSendCounts() >= maxSendCounts)
{
if(swd.getPacket().CommandId == 3)
{
SGIPPacket packet = new SGIPPacket();
packet.CommandId = 100;
packet.localId = swd.getPacket().localId;
if(packet.localId == -1L)
{
SGIPLog.WriteLog(-2, "系统提供的短信包没有提供系统内部消息流水号(localId)!", logFile);
System.out.println("系统提供的短信包没有提供系统内部消息流水号(localId)!");
}
SubmitResult submitResult = new SubmitResult();
submitResult.localId = packet.localId;
SubmitResult _tmp = submitResult;
submitResult.result = 2;
packet.submitResult = submitResult;
recvQueue.EnQueue(packet);
}
SGIPLog.WriteLog(-2, "SEND FAILURE: " + getSendPacketInfo(swd.getPacket()) + " 超时重发次数已经达到最大次数,且在规定最大时间内仍未能接收到回应包,此包将被抛弃!!!", logFile);
System.out.println("SEND FAILURE: " + getSendPacketInfo(swd.getPacket()) + " 超时重发次数已经达到最大次数,且在规定最大时间内仍未能接收到回应包,此包将被抛弃!!!");
} else
{
swd.increSendCountsByOne();
enSlideWindow(swd);
}
}
}
}
return 0;
}
public synchronized int sendPacket(InputStream input, OutputStream out)
throws Exception
{
if(notSendPosEnd - notSendPosBegin == 0)
{
SGIPLog.WriteLog(-1, "SLIDEWINDOW WARNING:滑动窗口中没有需要发送的包!", logFile);
return 0;
}
SlideWindowData slideWindowData = (SlideWindowData)slideWindow.elementAt(((notSendPosEnd - 1) + size) % size);
slideWindowData.setWaitedTimeZero();
SGIP_Command sgip = new SGIP_Command();
try
{
switch(slideWindowData.getPacket().CommandId)
{
case 1: // '\001'
System.out.println("--Bind--");
Bind command = slideWindowData.getPacket().bindPacket;
int err = command.write(out);
if(packetArea != null)
{
packetArea.append(CTime.getStringDate() + "--SGIP12--Bind: (SP->SMG)\n");
packetArea.append("TotalLength: " + command.getTotalLength() + "\n");
packetArea.append("CommandID: " + command.getCommandID() + "\n");
packetArea.append("SequenceID_1: " + command.getSeqno_1() + "\n");
packetArea.append("SequenceID_2: " + command.getSeqno_2() + "\n");
packetArea.append("SequenceID_3: " + command.getSeqno_3() + "\n");
packetArea.append("LoginType: " + command.GetLoginType() + "\n");
packetArea.append("LoginName: " + command.GetLoginName() + "\n");
packetArea.append("LoginPassword: " + command.GetLoginPassword() + "\n\n");
}
if(err == 0)
{
slideWindowData.increSendCountsByOne();
slideWindowData.getPacket().sequence_1 = command.getSeqno_1();
slideWindowData.getPacket().sequence_2 = command.getSeqno_2();
slideWindowData.getPacket().sequence_3 = command.getSeqno_3();
haveSendPosBegin = ((haveSendPosBegin + size) - 1) % size;
notSendPosEnd = haveSendPosBegin;
} else
{
SGIPLog.WriteLog(-2, err + " 发送Bind出错", logFile);
System.out.println("err: " + err + " 发送Bind出错");
throw new Exception("err: " + err + " 发送Bind出错");
}
SGIP_Command tmp = sgip.read(input);
if(sgip.getCommandID() == 0x80000001)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -