47 struct RepeatOpeation { };
52 struct ReplaceOperation
58 std::unique_ptr<XrdCl::Operation<true>> opr;
64 struct ReplacePipeline
76 struct IgnoreError { };
86 responseHandler( handler )
97 nextOperation->AddOperation( operation );
101 nextOperation.reset( operation );
108 void PipelineHandler::HandleResponseImpl(
XRootDStatus *status,
111 std::unique_ptr<PipelineHandler> myself(
this );
116 if( responseHandler )
120 responseHandler->HandleResponseWithHosts( status, response, hostList );
122 catch(
const StopPipeline &stop )
124 if(
final )
final( stop.status );
125 prms.set_value( stop.status );
128 catch(
const RepeatOpeation &repeat )
130 Operation<true> *opr = currentOperation.release();
131 opr->handler.reset( myself.release() );
132 opr->Run( timeout, std::move( prms ), std::move(
final ) );
135 catch( ReplaceOperation &replace )
137 Operation<true> *opr = replace.opr.release();
138 opr->handler.reset( myself.release() );
139 opr->Run( timeout, std::move( prms ), std::move(
final ) );
142 catch( ReplacePipeline &replace )
144 Pipeline p = std::move( replace.pipeline );
145 Operation<true> *opr = p.operation.release();
146 opr->Run( timeout, std::move( prms ), std::move(
final ) );
149 catch(
const IgnoreError &ignore )
155 dealloc( status, response, hostList );
157 if( !st.IsOK() || !nextOperation )
159 if(
final )
final( st );
160 prms.set_value( st );
164 Operation<true> *opr = nextOperation.release();
165 opr->Run( timeout, std::move( prms ), std::move(
final ) );
174 HandleResponseImpl( status, response, hostList );
183 HandleResponseImpl( status, response );
190 std::promise<XRootDStatus> p,
195 prms = std::move( p );
196 if( !
final )
final = std::move( f );
199 auto f1 = std::move(
final );
200 final = [f1, f](
const XRootDStatus &st ){ f1( st ); f( st ); };
202 currentOperation.reset( opr );
210 final = std::move( f );
222 if(
final || !nextOperation )
return;
235 f.swap( last->final );
245 throw StopPipeline( status );
253 throw RepeatOpeation();
261 throw ReplaceOperation( std::move( opr ) );
269 throw ReplacePipeline( std::move( p ) );
std::unique_ptr< PipelineHandler > handler
Operation handler.
void HandleResponseWithHosts(XRootDStatus *status, AnyObject *response, HostList *hostList)
Callback function.
PipelineHandler()
Default Constructor.
void PreparePipelineStart()
Called by a pipeline on the handler of its first operation before Run.
void Assign(const Timeout &timeout, std::promise< XRootDStatus > prms, std::function< void(const XRootDStatus &)> final, Operation< true > *opr)
void HandleResponse(XRootDStatus *status, AnyObject *response)
Callback function.
void AddOperation(Operation< true > *operation)
static void Repeat()
Repeat current operation.
static void Stop(const XRootDStatus &status=XrdCl::XRootDStatus())
static void Replace(Operation< false > &&opr)
Replace current operation.
static void Ignore()
Ignore error and proceed with the pipeline.
Handle an async response.
std::vector< HostInfo > HostList