|  | @@ -1,93 +0,0 @@
 | 
	
		
			
				|  |  | -package command
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -import (
 | 
	
		
			
				|  |  | -	"io"
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	v2net "github.com/v2ray/v2ray-core/common/net"
 | 
	
		
			
				|  |  | -	proto "github.com/v2ray/v2ray-core/common/protocol"
 | 
	
		
			
				|  |  | -	"github.com/v2ray/v2ray-core/common/serial"
 | 
	
		
			
				|  |  | -	"github.com/v2ray/v2ray-core/common/uuid"
 | 
	
		
			
				|  |  | -	"github.com/v2ray/v2ray-core/transport"
 | 
	
		
			
				|  |  | -)
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -func init() {
 | 
	
		
			
				|  |  | -	RegisterResponseCommand(1, func() Command { return new(SwitchAccount) })
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -// Structure
 | 
	
		
			
				|  |  | -// 1 byte: host len N
 | 
	
		
			
				|  |  | -// N bytes: host
 | 
	
		
			
				|  |  | -// 2 bytes: port
 | 
	
		
			
				|  |  | -// 16 bytes: uuid
 | 
	
		
			
				|  |  | -// 2 bytes: alterid
 | 
	
		
			
				|  |  | -// 1 byte: level
 | 
	
		
			
				|  |  | -// 1 bytes: time
 | 
	
		
			
				|  |  | -type SwitchAccount struct {
 | 
	
		
			
				|  |  | -	Host     v2net.Address
 | 
	
		
			
				|  |  | -	Port     v2net.Port
 | 
	
		
			
				|  |  | -	ID       *uuid.UUID
 | 
	
		
			
				|  |  | -	AlterIds serial.Uint16Literal
 | 
	
		
			
				|  |  | -	Level    proto.UserLevel
 | 
	
		
			
				|  |  | -	ValidMin byte
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -func (this *SwitchAccount) Marshal(writer io.Writer) {
 | 
	
		
			
				|  |  | -	hostStr := ""
 | 
	
		
			
				|  |  | -	if this.Host != nil {
 | 
	
		
			
				|  |  | -		hostStr = this.Host.String()
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | -	writer.Write([]byte{byte(len(hostStr))})
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	if len(hostStr) > 0 {
 | 
	
		
			
				|  |  | -		writer.Write([]byte(hostStr))
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	writer.Write(this.Port.Bytes())
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	idBytes := this.ID.Bytes()
 | 
	
		
			
				|  |  | -	writer.Write(idBytes)
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	writer.Write(this.AlterIds.Bytes())
 | 
	
		
			
				|  |  | -	writer.Write([]byte{byte(this.Level)})
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	writer.Write([]byte{this.ValidMin})
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -func (this *SwitchAccount) Unmarshal(data []byte) error {
 | 
	
		
			
				|  |  | -	if len(data) == 0 {
 | 
	
		
			
				|  |  | -		return transport.ErrorCorruptedPacket
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | -	lenHost := int(data[0])
 | 
	
		
			
				|  |  | -	if len(data) < lenHost+1 {
 | 
	
		
			
				|  |  | -		return transport.ErrorCorruptedPacket
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | -	if lenHost > 0 {
 | 
	
		
			
				|  |  | -		this.Host = v2net.ParseAddress(string(data[1 : 1+lenHost]))
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | -	portStart := 1 + lenHost
 | 
	
		
			
				|  |  | -	if len(data) < portStart+2 {
 | 
	
		
			
				|  |  | -		return transport.ErrorCorruptedPacket
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | -	this.Port = v2net.PortFromBytes(data[portStart : portStart+2])
 | 
	
		
			
				|  |  | -	idStart := portStart + 2
 | 
	
		
			
				|  |  | -	if len(data) < idStart+16 {
 | 
	
		
			
				|  |  | -		return transport.ErrorCorruptedPacket
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | -	this.ID, _ = uuid.ParseBytes(data[idStart : idStart+16])
 | 
	
		
			
				|  |  | -	alterIdStart := idStart + 16
 | 
	
		
			
				|  |  | -	if len(data) < alterIdStart+2 {
 | 
	
		
			
				|  |  | -		return transport.ErrorCorruptedPacket
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | -	this.AlterIds = serial.BytesLiteral(data[alterIdStart : alterIdStart+2]).Uint16()
 | 
	
		
			
				|  |  | -	levelStart := alterIdStart + 2
 | 
	
		
			
				|  |  | -	if len(data) < levelStart+1 {
 | 
	
		
			
				|  |  | -		return transport.ErrorCorruptedPacket
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | -	this.Level = proto.UserLevel(data[levelStart])
 | 
	
		
			
				|  |  | -	timeStart := levelStart + 1
 | 
	
		
			
				|  |  | -	if len(data) < timeStart {
 | 
	
		
			
				|  |  | -		return transport.ErrorCorruptedPacket
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | -	this.ValidMin = data[timeStart]
 | 
	
		
			
				|  |  | -	return nil
 | 
	
		
			
				|  |  | -}
 |