remoteresult.h
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2011 by Dr. Marc Boris Duerner, Tommi Maekitalo
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2.1 of the License, or (at your option) any later version.
8  *
9  * As a special exception, you may use this file as part of a free
10  * software library without restriction. Specifically, if other files
11  * instantiate templates or use macros or inline functions from this
12  * file, or you compile this file and link it with other files to
13  * produce an executable, this file does not by itself cause the
14  * resulting executable to be covered by the GNU General Public
15  * License. This exception does not however invalidate any other
16  * reasons why the executable file might be covered by the GNU Library
17  * General Public License.
18  *
19  * This library is distributed in the hope that it will be useful,
20  * but WITHOUT ANY WARRANTY; without even the implied warranty of
21  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
22  * Lesser General Public License for more details.
23  *
24  * You should have received a copy of the GNU Lesser General Public
25  * License along with this library; if not, write to the Free Software
26  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
27  */
28 #ifndef CXXTOOLS_REMOTERESULT_H
29 #define CXXTOOLS_REMOTERESULT_H
30 
31 #include <string>
32 #include <cxxtools/remoteclient.h>
34 
35 namespace cxxtools
36 {
37 
39 {
40  public:
42  : _failed(false),
43  _rc(0)
44  { }
45 
46  void setFault(int rc, const std::string& msg)
47  {
48  _failed = true;
49  _rc = rc;
50  _msg = msg;
51  }
52 
53  void clearFault()
54  {
55  _failed = false;
56  _rc = 0;
57  _msg.clear();
58  }
59 
60  bool failed() const
61  { return _failed; }
62 
63  protected:
64  void checkFault() const
65  {
66  if (_failed)
67  throw RemoteException(_msg, _rc);
68  }
69 
70  private:
71  bool _failed;
72  int _rc;
73  std::string _msg;
74 };
75 
76 template <typename R>
78 {
79  public:
81  : _client(0)
82  { }
83 
85  : _client(&client)
86  {
87  }
88 
89  const R& value() const
90  {
91  return _result;
92  }
93 
94  R& value()
95  {
96  return _result;
97  }
98 
99 #if __cplusplus >= 201103L
100  R&& get()
101  {
102  _client->endCall();
103  checkFault();
104  return std::move(_result);
105  }
106 #else
107  R& get()
108  {
109  _client->endCall();
110  checkFault();
111  return _result;
112  }
113 #endif
114 
115  RemoteClient& client() { return *_client; }
116 
117  private:
118  RemoteClient* _client;
119  R _result;
120 };
121 
122 }
123 
124 #endif