导航菜单

页面标题

页面副标题

95爱播免登录版 v3.1.9 - PacketWriter.java 源代码

正在查看: 95爱播免登录版 v3.1.9 应用的 PacketWriter.java JAVA 源代码文件

本页面展示 JAVA 反编译生成的源代码文件,支持语法高亮显示。 仅供安全研究与技术分析使用,严禁用于任何非法用途。请遵守相关法律法规。


package org.jivesoftware.smack;

import java.io.IOException;
import java.io.Writer;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import org.jivesoftware.smack.packet.Packet;

class PacketWriter {
    private XMPPConnection connection;
    volatile boolean done;
    private Thread keepAliveThread;
    private final BlockingQueue<Packet> queue = new ArrayBlockingQueue(500, true);
    private Writer writer;
    private Thread writerThread;

    protected PacketWriter(XMPPConnection xMPPConnection) {
        this.connection = xMPPConnection;
        init();
    }

    private Packet nextPacket() {
        Packet packet = null;
        while (!this.done && (packet = this.queue.poll()) == null) {
            try {
                synchronized (this.queue) {
                    this.queue.wait();
                }
            } catch (InterruptedException unused) {
            }
        }
        return packet;
    }

    public void writePackets(Thread thread) {
        try {
            openStream();
            while (!this.done && this.writerThread == thread) {
                Packet nextPacket = nextPacket();
                if (nextPacket != null) {
                    this.writer.write(nextPacket.toXML());
                    if (this.queue.isEmpty()) {
                        this.writer.flush();
                    }
                }
            }
            while (!this.queue.isEmpty()) {
                try {
                    this.writer.write(this.queue.remove().toXML());
                } catch (Exception e2) {
                    e2.printStackTrace();
                }
            }
            this.writer.flush();
            this.queue.clear();
            try {
                this.writer.write("</stream:stream>");
                this.writer.flush();
            } catch (Exception unused) {
            } catch (Throwable th) {
                try {
                    this.writer.close();
                } catch (Exception unused2) {
                }
                throw th;
            }
            try {
                this.writer.close();
            } catch (Exception unused3) {
            }
        } catch (IOException e3) {
            if (this.done || this.connection.isSocketClosed()) {
                return;
            }
            this.done = true;
            XMPPConnection xMPPConnection = this.connection;
            if (xMPPConnection.packetReader != null) {
                xMPPConnection.notifyConnectionError(e3);
            }
        }
    }

    void cleanup() {
        this.connection.interceptors.clear();
        this.connection.sendListeners.clear();
    }

    protected void init() {
        this.writer = this.connection.writer;
        this.done = false;
        Thread thread = new Thread() {
            @Override
            public void run() {
                PacketWriter.this.writePackets(this);
            }
        };
        this.writerThread = thread;
        thread.setName("Smack Packet Writer (" + this.connection.connectionCounterValue + ")");
        this.writerThread.setDaemon(true);
    }

    void openStream() throws IOException {
        this.writer.write("<stream:stream to=\"" + this.connection.getServiceName() + "\" xmlns=\"jabber:client\" xmlns:stream=\"http://etherx.jabber.org/streams\" version=\"1.0\">");
        this.writer.flush();
    }

    public void sendPacket(Packet packet) {
        if (this.done) {
            return;
        }
        this.connection.firePacketInterceptors(packet);
        try {
            this.queue.put(packet);
            synchronized (this.queue) {
                this.queue.notifyAll();
            }
            this.connection.firePacketSendingListeners(packet);
        } catch (InterruptedException e2) {
            e2.printStackTrace();
        }
    }

    void setWriter(Writer writer) {
        this.writer = writer;
    }

    public void shutdown() {
        this.done = true;
        synchronized (this.queue) {
            this.queue.notifyAll();
        }
        Thread thread = this.keepAliveThread;
        if (thread != null) {
            thread.interrupt();
        }
    }

    public void startup() {
        this.writerThread.start();
    }
}