Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  /* ************************************************************************
  #
  #  DivConq
  #
  #  http://divconq.com/
  #
  #  Copyright:
  #    Copyright 2014 eTimeline, LLC. All rights reserved.
  #
 #  License:
 #    See the license.txt file in the project's top-level directory for details.
 #
 #  Authors:
 #    * Andy White
 #
 ************************************************************************ */
 package divconq.io.stream;
 
 
 
 
 
 public class GzipStream extends BaseStream implements IStreamSource {
     protected static final byte[] gzipHeader = {0x1f, (byte) 0x8b, ., 0, 0, 0, 0, 0, 0, 0};
     
     protected int compressionLevel = 6;
     
     protected Deflater deflater = null;
     protected CRC32 crc = new CRC32();
     protected boolean writeHeader = true;
     
     protected String nameHint = null;
     protected String lastpath = null;
     
     public GzipStream() {
     }
     
     public GzipStream(int compressionLevel) {
     	this. = compressionLevel;
     }
 
 	public void init(StackEntry stackXElement el) {
 		this. = stack.stringFromElement(el"NameHint");
 	}
 
     public void close() {
 		//System.out.println("GZip killed");	// TODO
 		
     	this. = null;
     
     	super.close();
     }
     
 	// make sure we don't return without first releasing the file reference content
     @Override
     public HandleReturn handle(TaskRun cbStreamMessage msg) {
     	if (msg == .
     		return this..handle(cbmsg);
     	
     	// we don't know what to do with a folder at this stage - gzip is for file content only
     	// folder scanning is upstream in the FileSourceStream and partners
     	if (msg.isFolder())
     		return .;
     	
     	// init if not set for this round of processing 
     	if (this. == null) {
             this. = new Deflater(this.true);
             this..reset();
         	this. = true;
     	}
         
     	ByteBuf in = msg.getPayload();
         ByteBuf out = null
     	
 		if (in != null) {
 	        byte[] inAry = in.array();
 	
 	        // always allow for a header (10) plus footer (8) plus extra (12)
 	        // in addition to content
 	        int sizeEstimate = (int) Math.ceil(in.readableBytes() * 1.001) + 30;
 	        out = ..getBufferAllocator().heapBuffer(sizeEstimate);
 	        
 	        if (this.) {
 	        	this. = false;
 	            out.writeBytes();
 	        } 
 	
	        this..update(inAryin.arrayOffset(), in.writerIndex());
	        this..setInput(inAryin.arrayOffset(), in.writerIndex());
	        
	        while (!this..needsInput()) 
	            deflate(out);
		}
		else
		if (StringUtil.isEmpty(this.)) {
			if (StringUtil.isNotEmpty(this.)) 
				this. = "/" +  this.;
			else if (msg.getPath() != null
				this. = "/" +  GzipUtils.getCompressedFilename(msg.getPath().getFileName());
			else
				this. = "/" + FileUtil.randomFilename("gz");
		}
		blk.setPath(this.);
		blk.setPayload(out);
        if (msg.isEof()) {
	        this..finish();
	        
	        while (!this..finished()) 
	            deflate(out);
	    
	        int crcValue = (intthis..getValue();
	        
	        out.writeByte(crcValue);
	        out.writeByte(crcValue >>> 8);
	        out.writeByte(crcValue >>> 16);
	        out.writeByte(crcValue >>> 24);
	        
	        int uncBytes = this..getTotalIn();
	        
	        out.writeByte(uncBytes);
	        out.writeByte(uncBytes >>> 8);
	        out.writeByte(uncBytes >>> 16);
	        out.writeByte(uncBytes >>> 24);
	        this..end();
	        this. = null;		// cause a reset for next time we use stream
	        
        	blk.setEof(true);
        }
        
        if (in != null)
        	in.release();
        
       	return this..handle(cbblk);
    }
    protected void deflate(ByteBuf out) {
        int numBytes = 0;
        
        do {
        	byte[] o = out.array();
        	
            numBytes = this..deflate(oout.arrayOffset() + out.writerIndex(), out.writableBytes(), .);
            
            out.writerIndex(out.writerIndex() + numBytes);
        } while (numBytes > 0);
    }
    
    @Override
    public void request(TaskRun cb) {
    	this..request(cb);
    }
New to GrepCode? Check out our FAQ X