| 
									
										
										
										
											2016-02-01 12:22:29 +01:00
										 |  |  | package io | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							|  |  |  | 	"io" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-20 20:55:45 +02:00
										 |  |  | 	"v2ray.com/core/common" | 
					
						
							|  |  |  | 	"v2ray.com/core/common/alloc" | 
					
						
							| 
									
										
										
										
											2016-02-01 12:22:29 +01:00
										 |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-06 22:28:35 +01:00
										 |  |  | // Writer extends io.Writer with alloc.Buffer. | 
					
						
							| 
									
										
										
										
											2016-02-01 12:22:29 +01:00
										 |  |  | type Writer interface { | 
					
						
							| 
									
										
										
										
											2016-04-12 21:43:13 +02:00
										 |  |  | 	common.Releasable | 
					
						
							| 
									
										
										
										
											2016-02-06 22:28:35 +01:00
										 |  |  | 	// Write writes an alloc.Buffer into underlying writer. | 
					
						
							| 
									
										
										
										
											2016-02-01 12:22:29 +01:00
										 |  |  | 	Write(*alloc.Buffer) error | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-06 22:28:35 +01:00
										 |  |  | // AdaptiveWriter is a Writer that writes alloc.Buffer into underlying writer. | 
					
						
							| 
									
										
										
										
											2016-02-01 12:22:29 +01:00
										 |  |  | type AdaptiveWriter struct { | 
					
						
							|  |  |  | 	writer io.Writer | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-06 22:28:35 +01:00
										 |  |  | // NewAdaptiveWriter creates a new AdaptiveWriter. | 
					
						
							| 
									
										
										
										
											2016-02-01 12:22:29 +01:00
										 |  |  | func NewAdaptiveWriter(writer io.Writer) *AdaptiveWriter { | 
					
						
							|  |  |  | 	return &AdaptiveWriter{ | 
					
						
							|  |  |  | 		writer: writer, | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-28 22:31:33 +02:00
										 |  |  | // Write implements Writer.Write(). Write() takes ownership of the given buffer. | 
					
						
							| 
									
										
										
										
											2016-02-01 12:22:29 +01:00
										 |  |  | func (this *AdaptiveWriter) Write(buffer *alloc.Buffer) error { | 
					
						
							| 
									
										
										
										
											2016-05-11 10:54:20 -07:00
										 |  |  | 	defer buffer.Release() | 
					
						
							|  |  |  | 	for !buffer.IsEmpty() { | 
					
						
							|  |  |  | 		nBytes, err := this.writer.Write(buffer.Value) | 
					
						
							|  |  |  | 		if err != nil { | 
					
						
							|  |  |  | 			return err | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		buffer.SliceFrom(nBytes) | 
					
						
							| 
									
										
										
										
											2016-02-01 12:22:29 +01:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2016-05-11 10:54:20 -07:00
										 |  |  | 	return nil | 
					
						
							| 
									
										
										
										
											2016-02-01 12:22:29 +01:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2016-03-11 23:51:58 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | func (this *AdaptiveWriter) Release() { | 
					
						
							|  |  |  | 	this.writer = nil | 
					
						
							|  |  |  | } |