//go:build windows

package yu_hpsocket

// TcpPackServer
// @Description: TcpPackServerListener 对象，请自己创建和销毁，目的是保证安全
type TcpPackServer struct {
	Server[TcpPackServer]
	TcpServer
}

// NewTcpPackServer
//
//	@Description:  创建 TcpPackServer 对象
func NewTcpPackServer() (t *TcpPackServer) {
	t = &TcpPackServer{}
	return
}

// Create
//
//	@Description: 创建 TcpPackServer 环境
func (t *TcpPackServer) Create(SSL bool) bool {
	t.Close()
	if t.hListener, _, _ = Create_HP_TcpPackServerListener.Call(); t.hListener == 0 {
		return false
	}
	if t.SSL = SSL; t.SSL {
		t.hServer, _, _ = Create_HP_SSLPackServer.Call(t.hListener)
	} else {
		t.hServer, _, _ = Create_HP_TcpPackServer.Call(t.hListener)
	}
	if t.hServer == 0 {
		Destroy_HP_TcpPackServerListener.Call(t.hListener)
		t.hListener = 0
		return false
	}
	_server_on_set(t.hServer, &_server_item{
		_type: _server_type_TcpPackServer,
		t:     t,
	})
	return true
}

// Close
//
//	@Description: 销毁 TcpPackServer 环境
func (t *TcpPackServer) Close() {
	t.Stop()
	t.Wait(-1)
	if t.hServer != 0 {
		if t.SSL {
			Destroy_HP_SSLPackServer.Call(t.hServer)
		} else {
			Destroy_HP_TcpPackServer.Call(t.hServer)
		}
		_server_on_del(t.hServer)
		t.hServer = 0
	}
	if t.hListener != 0 {
		Destroy_HP_TcpPackServerListener.Call(t.hListener)
		t.hListener = 0
	}
}

// SetMaxPackSize
//
//	@Description: 设置数据包最大长度（有效数据包最大长度不能超过 4194303/0x3FFFFF 字节，默认：262144/0x40000）
func (t *TcpPackServer) SetMaxPackSize(MaxPackSize int) *TcpPackServer {
	if !t.isValid() {
		return t
	}
	HP_TcpPackServer_SetMaxPackSize.Call(t.hServer, MaxPackSize)
	return t
}

// SetPackHeaderFlag
//
//	@Description: 设置包头标识（有效包头标识取值范围 0 ~ 1023/0x3FF，当包头标识为 0 时不校验包头，默认：0）
func (t *TcpPackServer) SetPackHeaderFlag(PackHeaderFlag int) *TcpPackServer {
	if !t.isValid() {
		return t
	}
	HP_TcpPackServer_SetPackHeaderFlag.Call(t.hServer, PackHeaderFlag)
	return t
}

// GetMaxPackSize
//
//	@Description: 获取数据包最大长度
func (t *TcpPackServer) GetMaxPackSize() int {
	if !t.isValid() {
		return 0
	}
	return HP_TcpPackServer_GetMaxPackSize.CallInt(t.hServer)
}

// GetPackHeaderFlag
//
//	@Description: 获取包头标识
func (t *TcpPackServer) GetPackHeaderFlag() uintptr {
	if !t.isValid() {
		return 0
	}
	return HP_TcpPackServer_GetPackHeaderFlag.CallUintptr(t.hServer)
}
