%% %% %CopyrightBegin% %% %% Copyright Ericsson AB 1997-2009. All Rights Reserved. %% %% The contents of this file are subject to the Erlang Public License, %% Version 1.1, (the "License"); you may not use this file except in %% compliance with the License. You should have received a copy of the %% Erlang Public License along with this software. If not, it can be %% retrieved online at http://www.erlang.org/. %% %% Software distributed under the License is distributed on an "AS IS" %% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See %% the License for the specific language governing rights and limitations %% under the License. %% %% %CopyrightEnd% %% %%%---------------------------------------------------------------------- %%% Purpose : The purpouse of the buffer process is to take %%% care of the data that is received by the converter %%% process and pass it on to the printer process in chunks %%% that can be handled. %%% %%% This module is a part of the buffering system, and %%% should not be used except through the API defined %%% in the pman_buf module. %%% %%%---------------------------------------------------------------------- -module(pman_buf_buffer). %%-compile(export_all). -export([init/1]). -include("pman_buf.hrl"). %% %% Initialization function for the buffer process. %% To be started with spawn from the calling process. %% init(Editor) -> Printer_pid = spawn_link(pman_buf_printer,init,[Editor,self()]), receive {converter_pid,Pid} -> Pid!{buffer,accept}, buffer_loop([],0,0,Printer_pid,Pid) end. %% %% Receive loop for the buffer process. %% buffer_loop(Buffer,Size,Acc,Printer,Converter) -> receive {save_buffer,Name} -> Printer!{save_buffer,Name}, buffer_loop(Buffer,Size,Acc,Printer,Converter); {raw,Raw,Length} -> %%output to editor New_Size = Size + Length, if New_Size < ?BUFF_SIZE -> Converter!{buffer,accept}; true -> ok end, Print = lists:map(fun(X) -> pman_buf_utils:textformat(X) end, Raw), New_Buff = lists:append(Buffer,Print), buffer_loop(New_Buff,New_Size,Acc,Printer,Converter); {clear,Text,N_Converter} -> Converter!{buffer,accept}, Printer!clear, buffer_loop([Text],1,1,Printer,N_Converter); {printer,send} when Buffer /= [] -> if Acc > ?EDITOR_MAX -> Printer!clear, Printer !{buffer,"Cleared Buffer due to Size\n\n"}, buffer_loop(Buffer,Size,1,Printer,Converter); true -> {Length,Rest,Print} = pman_buf_utils:split(Buffer, ?PRINT_LEN, 0, []), Printer ! {buffer,Print}, New_Size = Size - Length, if New_Size < ?BUFF_SIZE -> Converter!{buffer,accept}; true -> ok end, buffer_loop(Rest,New_Size,Acc+Length,Printer,Converter) end; {converter,file} -> Converter!{buffer,Buffer}, self()!{raw,[to_file],1}, buffer_loop([],0,Acc,Printer,Converter) end.