// Path: src/main/java/org/cleverframe/fastdfs/protocol/storage/callback/DownloadCallback.java
// public interface DownloadCallback<T> {
// 
//     /**
//      * 注意不能直接返回入参的InputStream，因为此方法返回后将关闭原输入流<br/>
//      * 不能关闭inputStream? TODO 验证是否可以关闭
//      *
//      * @param inputStream 返回数据输入流
//      */
//     T receive(InputStream inputStream) throws IOException;
// }
// 
// Path: src/main/java/org/cleverframe/fastdfs/protocol/storage/request/DownloadFileRequest.java
// public class DownloadFileRequest extends BaseRequest {
// 
//     /**
//      * 开始位置
//      */
//     @FastDFSColumn(index = 0)
//     private long fileOffset;
//     /**
//      * 读取文件长度
//      */
//     @FastDFSColumn(index = 1)
//     private long fileSize;
//     /**
//      * 组名
//      */
//     @FastDFSColumn(index = 2, max = OtherConstants.FDFS_GROUP_NAME_MAX_LEN)
//     private String groupName;
//     /**
//      * 文件路径
//      */
//     @FastDFSColumn(index = 3, dynamicField = DynamicFieldType.allRestByte)
//     private String path;
// 
//     /**
//      * 文件下载请求
//      *
//      * @param groupName  组名称
//      * @param path       文件路径
//      * @param fileOffset 开始位置
//      * @param fileSize   读取文件长度
//      */
//     public DownloadFileRequest(String groupName, String path, long fileOffset, long fileSize) {
//         super();
//         this.groupName = groupName;
//         this.fileSize = fileSize;
//         this.path = path;
//         this.fileOffset = fileOffset;
//         head = new ProtocolHead(CmdConstants.STORAGE_PROTO_CMD_DOWNLOAD_FILE);
//     }
// 
//     public long getFileOffset() {
//         return fileOffset;
//     }
// 
//     public String getGroupName() {
//         return groupName;
//     }
// 
//     public String getPath() {
//         return path;
//     }
// 
//     @Override
//     public long getFileSize() {
//         return fileSize;
//     }
// }
// 
// Path: src/main/java/org/cleverframe/fastdfs/protocol/storage/response/DownloadFileResponse.java
// public class DownloadFileResponse<T> extends BaseResponse<T> {
// 
//     private DownloadCallback<T> callback;
// 
//     public DownloadFileResponse(DownloadCallback<T> callback) {
//         super();
//         this.callback = callback;
//     }
// 
//     /**
//      * 解析反馈内容
//      */
//     @Override
//     public T decodeContent(InputStream in, Charset charset) throws IOException {
//         // 解析报文内容
//         FastDFSInputStream input = new FastDFSInputStream(in, getContentLength());
//         return callback.receive(input);
//     }
// }


import org.cleverframe.fastdfs.protocol.storage.callback.DownloadCallback;
import org.cleverframe.fastdfs.protocol.storage.request.DownloadFileRequest;
import org.cleverframe.fastdfs.protocol.storage.response.DownloadFileResponse;
package org.cleverframe.fastdfs.protocol.storage;


/**
 * 下载文件
 * 作者：LiZW <br/>
 * 创建时间：2016/11/20 16:02 <br/>
 */
public class DownloadFileCommand<T> extends StorageCommand<T> {

    /**
     * 下载文件
     *
     * @param groupName  组名称
     * @param path       文件路径
     * @param fileOffset 开始位置
     * @param fileSize   读取文件长度
     * @param callback   文件下载回调
     */
    public DownloadFileCommand(String groupName, String path, long fileOffset, long fileSize, DownloadCallback<T> callback) {
        super();
        this.request = new DownloadFileRequest(groupName, path, fileOffset, fileSize);
        // 输出响应
        this.response = new DownloadFileResponse<T>(callback);
    }

    /**
     * 下载文件
     *
     * @param groupName 组名称
     * @param path      文件路径
     * @param callback  文件下载回调
     */
    public DownloadFileCommand(String groupName, String path, DownloadCallback<T> callback) {
// Path: src/main/java/org/cleverframe/fastdfs/protocol/storage/callback/DownloadCallback.java
// public interface DownloadCallback<T> {
// 
//     /**
//      * 注意不能直接返回入参的InputStream，因为此方法返回后将关闭原输入流<br/>
//      * 不能关闭inputStream? TODO 验证是否可以关闭
//      *
//      * @param inputStream 返回数据输入流
//      */
//     T receive(InputStream inputStream) throws IOException;
// }
// 
// Path: src/main/java/org/cleverframe/fastdfs/protocol/storage/request/DownloadFileRequest.java
// public class DownloadFileRequest extends BaseRequest {
// 
//     /**
//      * 开始位置
//      */
//     @FastDFSColumn(index = 0)
//     private long fileOffset;
//     /**
//      * 读取文件长度
//      */
//     @FastDFSColumn(index = 1)
//     private long fileSize;
//     /**
//      * 组名
//      */
//     @FastDFSColumn(index = 2, max = OtherConstants.FDFS_GROUP_NAME_MAX_LEN)
//     private String groupName;
//     /**
//      * 文件路径
//      */
//     @FastDFSColumn(index = 3, dynamicField = DynamicFieldType.allRestByte)
//     private String path;
// 
//     /**
//      * 文件下载请求
//      *
//      * @param groupName  组名称
//      * @param path       文件路径
//      * @param fileOffset 开始位置
//      * @param fileSize   读取文件长度
//      */
//     public DownloadFileRequest(String groupName, String path, long fileOffset, long fileSize) {
//         super();
//         this.groupName = groupName;
//         this.fileSize = fileSize;
//         this.path = path;
//         this.fileOffset = fileOffset;
//         head = new ProtocolHead(CmdConstants.STORAGE_PROTO_CMD_DOWNLOAD_FILE);
//     }
// 
//     public long getFileOffset() {
//         return fileOffset;
//     }
// 
//     public String getGroupName() {
//         return groupName;
//     }
// 
//     public String getPath() {
//         return path;
//     }
// 
//     @Override
//     public long getFileSize() {
//         return fileSize;
//     }
// }
// 
// Path: src/main/java/org/cleverframe/fastdfs/protocol/storage/response/DownloadFileResponse.java
// public class DownloadFileResponse<T> extends BaseResponse<T> {
// 
//     private DownloadCallback<T> callback;
// 
//     public DownloadFileResponse(DownloadCallback<T> callback) {
//         super();
//         this.callback = callback;
//     }
// 
//     /**
//      * 解析反馈内容
//      */
//     @Override
//     public T decodeContent(InputStream in, Charset charset) throws IOException {
//         // 解析报文内容
//         FastDFSInputStream input = new FastDFSInputStream(in, getContentLength());
//         return callback.receive(input);
//     }
// }


// Path: src/main/java/org/cleverframe/fastdfs/protocol/storage/DownloadFileCommand.java
import org.cleverframe.fastdfs.protocol.storage.callback.DownloadCallback;
import org.cleverframe.fastdfs.protocol.storage.request.DownloadFileRequest;
import org.cleverframe.fastdfs.protocol.storage.response.DownloadFileResponse;

package org.cleverframe.fastdfs.protocol.storage;


/**
 * 下载文件
 * 作者：LiZW <br/>
 * 创建时间：2016/11/20 16:02 <br/>
 */
public class DownloadFileCommand<T> extends StorageCommand<T> {

    /**
     * 下载文件
     *
     * @param groupName  组名称
     * @param path       文件路径
     * @param fileOffset 开始位置
     * @param fileSize   读取文件长度
     * @param callback   文件下载回调
     */
    public DownloadFileCommand(String groupName, String path, long fileOffset, long fileSize, DownloadCallback<T> callback) {
        super();
        this.request = new DownloadFileRequest(groupName, path, fileOffset, fileSize);
        // 输出响应
        this.response = new DownloadFileResponse<T>(callback);
    }

    /**
     * 下载文件
     *
     * @param groupName 组名称
     * @param path      文件路径
     * @param callback  文件下载回调
     */
    public DownloadFileCommand(String groupName, String path, DownloadCallback<T> callback) {
        super();