%%% The MIT License (MIT) %%% Copyright (c) 2019 Hajime Nakagami -module(efirebirdsql_socket). -export([send/2, recv/2, recv_align/2, recv_null_bitmap/2]). -include("efirebirdsql.hrl"). send(State, Data) when State#state.write_state =:= undefined -> gen_tcp:send(State#state.sock, Data), State; send(State, Message) -> {NewWriteState, Encrypted} = crypto:stream_encrypt(State#state.write_state, Message), gen_tcp:send(State#state.sock, Encrypted), State#state{write_state=NewWriteState}. recv(State, Len) when Len =:= 0 -> {ok, [], State}; recv(State, Len) when State#state.read_state =:= undefined -> {T, V} = gen_tcp:recv(State#state.sock, Len), {T, V, State}; recv(State, Len) -> {T, Encrypted} = gen_tcp:recv(State#state.sock, Len), {NewReadState, Message} = crypto:stream_decrypt(State#state.read_state, Encrypted), {T, Message, State#state{read_state=NewReadState}}. recv_align(State, Len) -> {T, V, S2} = recv(State, Len), S4 = case Len rem 4 of 0 -> S2; 1 -> {_, _, S3} = recv(S2, 3), S3; 2 -> {_, _, S3} = recv(S2, 2), S3; 3 -> {_, _, S3} = recv(S2, 1), S3 end, {T, V, S4}. recv_null_bitmap(State, BitLen) when BitLen =:= 0 -> {[], State}; recv_null_bitmap(State, BitLen) -> Div8 = BitLen div 8, Len = if BitLen rem 8 =:= 0 -> Div8; BitLen rem 8 =/= 0 -> Div8 + 1 end, {ok, Buf, S2} = recv_align(State, Len), <> = Buf, {Bitmap, S2}.