package smb2

import (
	
	

	. 
)

type treeConn struct {
	*session
	treeId     uint32
	shareFlags uint32

	// path string
	// shareType  uint8
	// capabilities uint32
	// maximalAccess uint32
}

func treeConnect( *session,  string,  uint16,  context.Context) (*treeConn, error) {
	 := &TreeConnectRequest{
		Flags: ,
		Path:  ,
	}

	.CreditCharge = 1

	,  := .send(, )
	if  != nil {
		return nil, 
	}

	,  := .recv()
	if  != nil {
		return nil, 
	}

	,  := accept(SMB2_TREE_CONNECT, )
	if  != nil {
		return nil, 
	}

	 := TreeConnectResponseDecoder()
	if .IsInvalid() {
		return nil, &InvalidResponseError{"broken tree connect response format"}
	}

	 := &treeConn{
		session:    ,
		treeId:     PacketCodec().TreeId(),
		shareFlags: .ShareFlags(),
		// path:    path,
		// shareType:  r.ShareType(),
		// capabilities: r.Capabilities(),
		// maximalAccess: r.MaximalAccess(),
	}

	return , nil
}

func ( *treeConn) ( context.Context) error {
	 := new(TreeDisconnectRequest)

	.CreditCharge = 1

	,  := .sendRecv(SMB2_TREE_DISCONNECT, , )
	if  != nil {
		return 
	}

	 := TreeDisconnectResponseDecoder()
	if .IsInvalid() {
		return &InvalidResponseError{"broken tree disconnect response format"}
	}

	return nil
}

func ( *treeConn) ( uint16,  Packet,  context.Context) ( []byte,  error) {
	,  := .send(, )
	if  != nil {
		return nil, 
	}

	,  := .recv()
	if  != nil {
		return nil, 
	}

	return accept(, )
}

func ( *treeConn) ( Packet,  context.Context) ( *requestResponse,  error) {
	return .sendWith(, , )
}

func ( *treeConn) ( *requestResponse) ( []byte,  error) {
	,  = .session.recv()
	if  != nil {
		return nil, 
	}
	if .asyncId != 0 {
		if  := PacketCodec().AsyncId();  != .asyncId {
			return nil, &InvalidResponseError{fmt.Sprintf("expected async id: %v, got %v", .asyncId, )}
		}
	} else {
		if  := PacketCodec().TreeId();  != .treeId {
			return nil, &InvalidResponseError{fmt.Sprintf("expected tree id: %v, got %v", .treeId, )}
		}
	}
	return , 
}