5 #include <qi/jsoncodec.hpp>
10 #ifndef QICORE_TASK_CALL_H_
11 # define QICORE_TASK_CALL_H_
27 virtual void start(
const AnyVarArguments& args)
32 std::vector<AnyReference> nargs;
33 nargs.reserve(args.args().size());
34 for (
unsigned i=0; i<args.args().size(); ++i)
35 nargs.push_back(AnyReference(args.args()[i].type(), args.args()[i].rawValue()));
36 T res =
_f.call(nargs);
37 result.setValue(AnyReference(res));
39 catch(
const std::exception& e)
45 error.set(
"Unknown exception");
60 TaskCall(AnyFunction f, TypeInterface* eff = 0)
61 :
result(eff?eff:typeOf<T>())
63 , _live(new bool(true))
65 if (eff && qi::typeOf<T>()->info() != qi::typeOf<qi::AnyValue>()->info())
66 qiLogWarning(
"TaskCall") <<
"Overriding TaskCall type for a template different from GenericValue";
67 qiLogDebug(
"TaskCall") <<
"TaskCall " <<
this;
71 qiLogDebug(
"TaskCall") <<
"~TaskCall " <<
this;
74 virtual void start(
const AnyVarArguments& args)
76 qiLogDebug(
"TaskCall") <<
"start " <<
this;
80 std::vector<AnyReference> nargs;
81 nargs.reserve(args.args().size());
82 for (
unsigned i=0; i<args.args().size(); ++i)
83 nargs.push_back(AnyReference(args.args()[i].type(), args.args()[i].rawValue()));
84 AnyReference v =
_f.call(nargs);
85 _fut = *v.ptr<Future<T> >();
87 _fut.connect(boost::bind(&
TaskCall<Future<T> >::onResult,
this, _1, _live));
89 catch(
const std::exception& e)
95 error.set(
"Unknown exception");
98 void onResult(Future<T> fut, boost::shared_ptr<bool> live)
100 qiLogDebug(
"TaskCall") <<
"onResult " <<
this;
105 case FutureState_Canceled:
106 error.set(
"interrupted");
108 case FutureState_FinishedWithError:
109 error.set(fut.error());
111 case FutureState_FinishedWithValue:
112 qiLogDebug(
"TaskCall") <<
"setResult " << encodeJSON(AnyReference::from(fut.value()));
113 result.setValue(fut.value());
115 case FutureState_None:
116 case FutureState_Running:
117 error.set(
"Inconsistent state");