blob: 1e81d6f19040b2043180c6af862b27b38b8e8b61 [file] [log] [blame]
// Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef SHILL_RESULT_AGGREGATOR_H_
#define SHILL_RESULT_AGGREGATOR_H_
#include <base/basictypes.h>
#include <base/memory/ref_counted.h>
#include "shill/callbacks.h"
#include "shill/error.h"
namespace shill {
// The ResultAggregator is used to aggregate the result of multiple
// asynchronous operations. To use: construct a ResultAggregator, and
// Bind its ReportResult methods to some Callbacks.
//
// When the Callbacks are destroyed, they will drop their references
// to the ResultAggregator. When all references to the
// ResultAggregator are destroyed, the ResultAggregator will invoke
// the |callback| with which ResultAggregator was constructed. However,
// if no Callbacks invoked ReportResult, then the original |callback|
// will not be invoked.
//
// |callback| will see Error type of Success if all Callbacks reported
// Success to ResultAggregator. Otherwise, |callback| will see the first
// of the Errors reported to ResultAggregator.
class ResultAggregator : public base::RefCounted<ResultAggregator> {
public:
explicit ResultAggregator(const ResultCallback &callback);
virtual ~ResultAggregator();
void ReportResult(const Error &error);
private:
const ResultCallback callback_;
bool got_result_;
Error error_;
DISALLOW_COPY_AND_ASSIGN(ResultAggregator);
};
} // namespace shill
#endif // SHILL_RESULT_AGGREGATOR_H_