package com.jds.jn.gui.panels.viewpane.packetlist;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ResourceBundle;
import javax.swing.AbstractButton;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextPane;
import javax.swing.ListSelectionModel;
import com.intellij.uiDesigner.core.GridConstraints;
import com.intellij.uiDesigner.core.GridLayoutManager;
import com.intellij.uiDesigner.core.Spacer;
import com.jds.jn.gui.listeners.panels.packetlist.DecodeAllActionListener;
import com.jds.jn.gui.models.packetlist.CryptedPacketListModel;
import com.jds.jn.gui.models.packetlist.DecryptedPacketListModel;
import com.jds.jn.gui.panels.ViewPane;
import com.jds.jn.gui.renders.CryptedPacketTableRender;
import com.jds.jn.util.PacketStructureParser;
import com.jds.jn.network.listener.ListenerSystem;
import com.jds.jn.network.listener.types.ListenerType;
import com.jds.jn.network.listener.types.ReceiveType;
import com.jds.jn.network.methods.proxy.Proxy;
import com.jds.jn.network.packets.CryptedPacket;
import com.jds.jn.network.packets.DecryptedPacket;
import com.jds.jn.network.packets.PacketType;
import com.jds.jn.network.profiles.NetworkProfile;
import com.jds.jn.network.profiles.NetworkProfilePart;
import com.jds.jn.network.profiles.NetworkProfiles;
import com.jds.jn.session.Session;
import com.jds.jn.util.Util;
import com.jds.nio.buffer.NioBuffer;
/**
* Author: VISTALL
* Company: J Develop Station
* Date: 25.09.2009
* Time: 17:42:01
*/
public class CryptedPacketListPane extends PacketListPanel<CryptedPacket>
{
/**
* Method generated by IntelliJ IDEA GUI Designer
* >>> IMPORTANT!! <<<
* DO NOT edit this method OR call it in your code!
*
* @noinspection ALL
*/
private void $$$setupUI$$$()
{
createUIComponents();
final JPanel panel1 = new JPanel();
panel1.setLayout(new GridLayoutManager(1, 1, new Insets(0, 0, 0, 0), -1, -1));
_rootPane.setLayout(new GridLayoutManager(2, 1, new Insets(0, 0, 0, 0), -1, -1));
_rootPane.setEnabled(true);
panel1.add(_rootPane, new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_BOTH, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_WANT_GROW, null, null, null, 0, false));
_packetScrollPane = new JScrollPane();
_packetScrollPane.setEnabled(true);
_packetScrollPane.setHorizontalScrollBarPolicy(31);
_packetScrollPane.setVerticalScrollBarPolicy(22);
_rootPane.add(_packetScrollPane, new GridConstraints(1, 0, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_BOTH, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_WANT_GROW, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_WANT_GROW, null, null, null, 0, false));
_packetList.setPreferredScrollableViewportSize(new Dimension(-1, -1));
_packetScrollPane.setViewportView(_packetList);
final JPanel panel2 = new JPanel();
panel2.setLayout(new GridLayoutManager(1, 4, new Insets(0, 0, 0, 0), -1, -1));
_rootPane.add(panel2, new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_BOTH, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, null, null, null, 0, false));
_decodeButton = new JButton();
this.$$$loadButtonText$$$(_decodeButton, ResourceBundle.getBundle("com/jds/jn/resources/bundle/LanguageBundle").getString("Decode"));
panel2.add(_decodeButton, new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
final Spacer spacer1 = new Spacer();
panel2.add(spacer1, new GridConstraints(0, 3, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_WANT_GROW, 1, null, null, null, 0, false));
_decodeAllButton = new JButton();
_decodeAllButton.setEnabled(true);
this.$$$loadButtonText$$$(_decodeAllButton, ResourceBundle.getBundle("com/jds/jn/resources/bundle/LanguageBundle").getString("DecodeAll"));
panel2.add(_decodeAllButton, new GridConstraints(0, 1, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
_sendServerListButton = new JButton();
_sendServerListButton.setFocusPainted(false);
_sendServerListButton.setIcon(new ImageIcon(getClass().getResource("/com/jds/jn/resources/images/serverlist.png")));
_sendServerListButton.setText("");
_sendServerListButton.setVisible(false);
panel2.add(_sendServerListButton, new GridConstraints(0, 2, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
}
/**
* @noinspection ALL
*/
private void $$$loadButtonText$$$(AbstractButton component, String text)
{
StringBuffer result = new StringBuffer();
boolean haveMnemonic = false;
char mnemonic = '\0';
int mnemonicIndex = -1;
for(int i = 0; i < text.length(); i++)
{
if(text.charAt(i) == '&')
{
i++;
if(i == text.length())
{
break;
}
if(!haveMnemonic && text.charAt(i) != '&')
{
haveMnemonic = true;
mnemonic = text.charAt(i);
mnemonicIndex = result.length();
}
}
result.append(text.charAt(i));
}
component.setText(result.toString());
if(haveMnemonic)
{
component.setMnemonic(mnemonic);
component.setDisplayedMnemonicIndex(mnemonicIndex);
}
}
private class MouseListenerImpl extends MouseAdapter
{
@Override
public void mouseClicked(MouseEvent e)
{
if(e.getClickCount() == 2 && e.getButton() == MouseEvent.BUTTON1)
{
int row = _packetList.getSelectedRow();
CryptedPacket packet = _model.getPacket(row);
if(packet == null)
{
return;
}
JTextPane pane = new JTextPane();
pane.setText(Util.printData(packet.getAllData()));
JPopupMenu m = new JPopupMenu();
m.add(pane);
m.show(_packetList, e.getX(), e.getY());
}
}
}
private CryptedPacketListModel _model = new CryptedPacketListModel();
private JScrollPane _packetScrollPane;
private JTable _packetList;
private JPanel _rootPane;
private JButton _decodeButton;
private JButton _decodeAllButton;
private JButton _sendServerListButton;
private ViewPane _pane;
public CryptedPacketListPane(ViewPane pane)
{
_pane = pane;
$$$setupUI$$$();
_decodeAllButton.addActionListener(new DecodeAllActionListener(this));
_sendServerListButton.addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent e)
{
NetworkProfile prof = NetworkProfiles.getInstance().active();
if(prof == null)
{
return;
}
NetworkProfilePart p = prof.getPart(ListenerType.Auth_Server);
if(p.getServerList() == null)
{
return;
}
PacketStructureParser parser = new PacketStructureParser(p.getServerList());
parser.parse();
NioBuffer buf = parser.getBuffer();
Session session = getViewPane().getSession();
DecryptedPacketListModel model = getViewPane().getDecryptedPacketListPane().getModel();
byte[] bytes = session.getCrypt().encrypt(buf.array(), PacketType.SERVER, session);
if(bytes == null)
{
return;
}
final DecryptedPacketListPane pane = getViewPane().getDecryptedPacketListPane();
DecryptedPacket datapacket = session.decode(new CryptedPacket(PacketType.SERVER, bytes, System.currentTimeMillis()));
model.addRow(-1, datapacket, true);
session.receiveQuitPacket(datapacket, true, true);
try
{
Proxy proxy = (Proxy) ListenerSystem.getInstance().getMethod(ReceiveType.PROXY, ListenerType.Auth_Server);
proxy.getClientSession().put(NioBuffer.wrap(bytes));
}
catch(Exception e1)
{
e1.printStackTrace();
}
getViewPane().updateInfo(session);
}
});
_decodeButton.addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent e)
{
Session session = getViewPane().getSession();
NetworkProfile profile = NetworkProfiles.getInstance().active();
if(session.getProtocol() == null || profile == null)
{
return;
}
final DecryptedPacketListPane pane = getViewPane().getDecryptedPacketListPane();
DecryptedPacketListModel model = getViewPane().getDecryptedPacketListPane().getModel();
if(_packetList.getSelectedRow() == -1)
{
return;
}
CryptedPacket packet = _model.getPacket(_packetList.getSelectedRow());
if(packet.isDecrypted())
{
return;
}
DecryptedPacket datapacket = session.decode(packet);
if(datapacket.getName() != null && datapacket.getPacketInfo().isServerList() && session.getMethod() != null && session.getListenerType() == ListenerType.Auth_Server)
{
setEnableServerListButton(true);
}
if(datapacket.getPacketInfo() != null)
{
NetworkProfilePart part = profile.getPart(session.getListenerType());
if(part.isFiltredOpcode(datapacket.getPacketInfo().getOpcodeStr()))
{
return;
}
}
session.receiveQuitPacket(datapacket, true, true);
model.addRow(-1, datapacket, true);
getViewPane().updateInfo(session);
}
});
}
private void createUIComponents()
{
_rootPane = this;
setLayout(new GridLayoutManager(1, 1, new Insets(0, 0, 0, 0), -1, -1));
_packetList = new JTable(_model);
_packetList.getSelectionModel().setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
_packetList.setDefaultRenderer(Object.class, new CryptedPacketTableRender());
_packetList.getColumnModel().getColumn(0).setMaxWidth(50); //type
_packetList.getColumnModel().getColumn(1).setMaxWidth(115); //time
_packetList.getColumnModel().getColumn(2).setMaxWidth(300); //
_packetList.addMouseListener(new MouseListenerImpl());
}
@Override
public CryptedPacketListModel getModel()
{
return _model;
}
@Override
public void setEnabled(boolean b)
{
for(Component c : getComponents())
{
if(c != null)
{
c.setEnabled(b);
}
}
super.setEnabled(b);
}
public void setEnableServerListButton(boolean b)
{
_sendServerListButton.setEnabled(b);
_sendServerListButton.setVisible(b);
}
public JTable getPacketTable()
{
return _packetList;
}
public JScrollPane getScroll()
{
return _packetScrollPane;
}
public ViewPane getViewPane()
{
return _pane;
}
}