| /** |
| * Copyright 2013 Florian Schmaus |
| * |
| * All rights reserved. Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| package org.jivesoftware.smack.compression; |
| |
| import java.io.InputStream; |
| import java.io.OutputStream; |
| import java.lang.reflect.Constructor; |
| import java.lang.reflect.InvocationTargetException; |
| import java.lang.reflect.Method; |
| |
| /** |
| * This class provides XMPP "zlib" compression with the help of JZLib. Note that jzlib-1.0.7 must be used (i.e. in the |
| * classpath), newer versions won't work! |
| * |
| * @author Florian Schmaus |
| * @see <a href="http://www.jcraft.com/jzlib/">JZLib</a> |
| * |
| */ |
| public class JzlibInputOutputStream extends XMPPInputOutputStream { |
| |
| private static Class<?> zoClass = null; |
| private static Class<?> ziClass = null; |
| |
| static { |
| try { |
| zoClass = Class.forName("com.jcraft.jzlib.ZOutputStream"); |
| ziClass = Class.forName("com.jcraft.jzlib.ZInputStream"); |
| } catch (ClassNotFoundException e) { |
| } |
| } |
| |
| public JzlibInputOutputStream() { |
| compressionMethod = "zlib"; |
| } |
| |
| @Override |
| public boolean isSupported() { |
| return (zoClass != null && ziClass != null); |
| } |
| |
| @Override |
| public InputStream getInputStream(InputStream inputStream) throws SecurityException, NoSuchMethodException, |
| IllegalArgumentException, IllegalAccessException, InvocationTargetException, InstantiationException { |
| Constructor<?> constructor = ziClass.getConstructor(InputStream.class); |
| Object in = constructor.newInstance(inputStream); |
| |
| Method method = ziClass.getMethod("setFlushMode", Integer.TYPE); |
| method.invoke(in, 2); |
| return (InputStream) in; |
| } |
| |
| @Override |
| public OutputStream getOutputStream(OutputStream outputStream) throws SecurityException, NoSuchMethodException, |
| IllegalArgumentException, InstantiationException, IllegalAccessException, InvocationTargetException { |
| Constructor<?> constructor = zoClass.getConstructor(OutputStream.class, Integer.TYPE); |
| Object out = constructor.newInstance(outputStream, 9); |
| |
| Method method = zoClass.getMethod("setFlushMode", Integer.TYPE); |
| method.invoke(out, 2); |
| return (OutputStream) out; |
| } |
| } |