use crate::client::Client;
use crate::constants;
use crate::db_info::DbInfo;
use crate::error::Error;
use crate::messages::Message;
use crate::messages::auth::AuthMessage;
use crate::messages::data_types::DataTypesMessage;
use crate::messages::protocol::ProtocolMessage;
use crate::response::Response;
use crate::write_buffer::WriteBuffer;
const TTC_FAST_AUTH_VERSION: u8 = 1;
const TTC_SERVER_CONVERTS_CHARS: u8 = 0x01;
pub struct FastAuthMessage {
protocol_message: ProtocolMessage,
data_types_message: DataTypesMessage,
auth_message: AuthMessage,
}
impl FastAuthMessage {
pub(crate) fn new() -> FastAuthMessage {
FastAuthMessage {
protocol_message: ProtocolMessage::new(),
data_types_message: DataTypesMessage::new(),
auth_message: AuthMessage::new(),
}
}
pub(crate) fn process_auth_phase_two(
&mut self,
client: &mut Client,
) -> Result<DbInfo, Error> {
client.process_message(&mut self.auth_message)?;
client.post_connect(&mut self.auth_message)
}
}
impl Message for FastAuthMessage {
fn deserialize_ttc_message(
&mut self,
client: &Client,
resp: &mut Response,
message_type: u8,
) -> Result<(), Error> {
match message_type {
constants::TTC_MSG_TYPE_PROTOCOL => self
.protocol_message
.deserialize_ttc_message(client, resp, message_type),
constants::TTC_MSG_TYPE_DATA_TYPES => self
.data_types_message
.deserialize_ttc_message(client, resp, message_type),
_ => self.auth_message.deserialize_ttc_message(
client,
resp,
message_type,
),
}
}
fn is_final_ttc_message_type(
&self,
client: &Client,
message_type: u8,
) -> bool {
self.auth_message
.is_final_ttc_message_type(client, message_type)
}
fn pre_deserialize(&mut self, client: &mut Client, _resp: &mut Response) {
client.reset_ttc_field_version();
}
fn pre_process(&mut self, client: &mut Client) {
self.protocol_message.pre_process(client);
self.data_types_message.pre_process(client);
self.auth_message.pre_process(client);
}
fn post_deserialize(
&mut self,
client: &mut Client,
resp: &mut Response,
) -> Result<(), Error> {
self.protocol_message.post_deserialize(client, resp)?;
self.data_types_message.post_deserialize(client, resp)?;
self.auth_message.post_deserialize(client, resp)
}
fn serialize(&self, client: &Client, buf: &mut WriteBuffer) {
buf.write_u8(constants::TTC_MSG_TYPE_FAST_AUTH);
buf.write_u8(TTC_FAST_AUTH_VERSION);
buf.write_u8(TTC_SERVER_CONVERTS_CHARS); buf.write_u8(0); self.protocol_message.serialize(client, buf);
buf.write_u16be(0); buf.write_u8(0); buf.write_u16be(0); buf.write_u8(constants::FAST_AUTH_TTC_FIELD_VERSION);
self.data_types_message.serialize(client, buf);
self.auth_message.serialize(client, buf);
}
}