ftp_progress.erl
来自「OTP是开放电信平台的简称」· ERL 代码 · 共 126 行
ERL
126 行
%% ``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 via the world wide web 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.%% %% The Initial Developer of the Original Code is Ericsson Utvecklings AB.%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings%% AB. All Rights Reserved.''%% %% $Id$%%%% Description: This module impements a temporary process that %% performes progress reporting during file transfer calling a user %% defined callback function. Its life span is as long as the ftp connection%% processes that spawned it lives. The purpose of this process is to %% shild the ftp connection process from errors and time consuming operations%% in the user defined callback function. -module(ftp_progress).%% Internal API-export([start_link/1, report/2, stop/1]).%% Spawn export-export([init/1]).-include_lib("kernel/include/file.hrl").-record(progress, { file, % string() cb_module, % atom() cb_function, % atom() init_progress_term, % term() current_progress_term % term() }).%%%=========================================================================%%% Internal application API %%%=========================================================================%%--------------------------------------------------------------------------%% start_link(Options) -> ignore | pid()%% Options = ignore | {CBModule, CBFunction, InitProgressTerm}%%%% Description: Starts the progress report process unless progress reporting%% should not be performed.%%--------------------------------------------------------------------------start_link(ignore) -> ignore;start_link(Options) -> spawn_link(?MODULE, init, [Options]).%%--------------------------------------------------------------------------%% report_progress(Pid, Report) -> _%% Pid = pid()%% Report = {local_file, File} | {remote_file, File} | %% {transfer_size, Size}%% Size = integer()%%%% Description: Reports progress to the reporting process that calls the%% user defined callback function.%%--------------------------------------------------------------------------report(Pid, Report) -> Pid ! {progress_report, Report}.%%--------------------------------------------------------------------------%% stop(Pid) -> _%% Pid = pid()%%%% Description: %%-------------------------------------------------------------------------- stop(Pid) -> Pid ! stop.%%%=========================================================================%%% Internal functions%%%=========================================================================init(Options) -> loop(progress(Options)).loop(Progress) -> receive {progress_report, Report} -> NewProgress = report_progress(Report, Progress), loop(NewProgress); stop -> ok end.progress({CBModule, CBFunction, InitProgressTerm}) when is_atom(CBModule), is_atom(CBFunction) -> #progress{cb_module = CBModule, cb_function = CBFunction, init_progress_term = InitProgressTerm, current_progress_term = InitProgressTerm}.report_progress({local_file, File}, Progress) -> {ok, FileInfo} = file:read_file_info(File), report_progress({file_size, FileInfo#file_info.size}, Progress#progress{file = File});report_progress({remote_file, File}, Progress) -> report_progress({file_size, unknown}, Progress#progress{file = File});report_progress(Size, #progress{file = File, cb_module = CBModule, cb_function = CBFunction, current_progress_term = Term, init_progress_term = InitTerm} = Progress) -> NewProgressTerm = CBModule:CBFunction(Term, File, Size), case Size of {transfer_size, 0} -> %% Transfer is compleat reset initial values Progress#progress{current_progress_term = InitTerm, file = undefined}; _ -> Progress#progress{current_progress_term = NewProgressTerm} end.
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?