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  { }
44 
45  void setFault(int rc, const std::string& msg)
46  {
47  _failed = true;
48  _rc = rc;
49  _msg = msg;
50  }
51 
52  void clearFault()
53  {
54  _failed = false;
55  _rc = 0;
56  _msg.clear();
57  }
58 
59  bool failed() const
60  { return _failed; }
61 
62  protected:
63  void checkFault() const
64  {
65  if (_failed)
66  throw RemoteException(_msg, _rc);
67  }
68 
69  private:
70  bool _failed;
71  int _rc;
72  std::string _msg;
73 };
74 
75 template <typename R>
77 {
78  public:
80  : _client(client)
81  {
82  }
83 
84  R& value()
85  {
86  return _result;
87  }
88 
89  const R& get() const
90  {
91  _client.endCall();
92  checkFault();
93  return _result;
94  }
95 
96  RemoteClient& client() { return _client; }
97 
98  private:
99  RemoteClient& _client;
100  R _result;
101 };
102 
103 }
104 
105 #endif