source: xplcommon/src/xplcommon/win32/Completer.h@ 22:d13fbc745959

Last change on this file since 22:d13fbc745959 was 22:d13fbc745959, checked in by István Váradi <ivaradi@…>, 11 years ago

Cleaned up and simplified the code

File size: 5.6 KB
Line 
1// Copyright (c) 2012 by István Váradi
2
3// This file is part of libxplcommon, a common utility library for
4// development related to X-Plane
5
6// Redistribution and use in source and binary forms, with or without
7// modification, are permitted provided that the following conditions are met:
8
9// 1. Redistributions of source code must retain the above copyright notice, this
10// list of conditions and the following disclaimer.
11// 2. Redistributions in binary form must reproduce the above copyright notice,
12// this list of conditions and the following disclaimer in the documentation
13// and/or other materials provided with the distribution.
14
15// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
16// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
17// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
18// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
19// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
20// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
21// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
22// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
24// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25
26// The views and conclusions contained in the software and documentation are those
27// of the authors and should not be interpreted as representing official policies,
28// either expressed or implied, of the FreeBSD Project.
29
30#ifndef XPLCOMMON_WIN32_COMPLETER_H
31#define XPLCOMMON_WIN32_COMPLETER_H
32//------------------------------------------------------------------------------
33
34#include "Overlapped.h"
35#include "Overlappable.h"
36
37//------------------------------------------------------------------------------
38
39namespace xplcommon { namespace win32 {
40
41//------------------------------------------------------------------------------
42
43/**
44 * Base class for objects that handle the completion of some
45 * operation. They are associated with an Overlappable, and if that
46 * overlappable is non-blocking (i.e. has a waiter), an Overlapped
47 * object is created and stored in this object.
48 */
49class Completer
50{
51protected:
52 /**
53 * The overlappable object this completer belongs to.
54 */
55 Overlappable& overlappable;
56
57 /**
58 * The overlapped object.
59 */
60 Overlapped* overlapped;
61
62protected:
63 /**
64 * Construct the completer for the given Overlappable.
65 */
66 Completer(Overlappable* overlappable);
67
68 /**
69 * Destroy the completer.
70 */
71 virtual ~Completer();
72
73 /**
74 * Add the overlapped object (if any) to the given waiter.
75 */
76 void addTo(Waiter* waiter);
77
78 /**
79 * Remove the overlapped object (if any) from the waiter it is
80 * associated with.
81 */
82 void removeFromWaiter();
83
84 /**
85 * Determine if there is an overlapped object and it is being
86 * waited for.
87 */
88 bool isWaited() const;
89
90 /**
91 * Get the result of the overlapped operation, if any.
92 *
93 * @see Overlapped::getResult
94 */
95 bool getResult(DWORD& size);
96
97 /**
98 * Check whether we are waiting for an overlapped result and if
99 * so, return that.
100 *
101 * @param result will contain the result to return if we are
102 * waiting for an overlapped result.
103 *
104 * @return whether we are waiting for an overlapped result
105 */
106 bool checkWaitedResult(bool& result);
107
108 /**
109 * Handle the given result coming from an overlapped object.
110 */
111 virtual void handleWaitedResult(DWORD size) = 0;
112};
113
114//------------------------------------------------------------------------------
115// Inline definitions
116//------------------------------------------------------------------------------
117
118inline Completer::Completer(Overlappable* overlappable) :
119 overlappable(*overlappable),
120 overlapped((overlappable->waiter==0) ? 0 : new Overlapped(*overlappable))
121{
122}
123
124//------------------------------------------------------------------------------
125
126inline Completer::~Completer()
127{
128 delete overlapped;
129}
130
131//------------------------------------------------------------------------------
132
133inline void Completer::addTo(Waiter* waiter)
134{
135 if (overlapped!=0 && waiter!=0) overlapped->addTo(*waiter);
136}
137
138//------------------------------------------------------------------------------
139
140inline void Completer::removeFromWaiter()
141{
142 if (overlapped!=0) overlapped->removeFromWaiter();
143}
144
145//------------------------------------------------------------------------------
146
147inline bool Completer::isWaited() const
148{
149 return overlapped!=0 && overlapped->isWaited();
150}
151
152//------------------------------------------------------------------------------
153
154inline bool Completer::getResult(DWORD& size)
155{
156 return overlapped!=0 && overlapped->getResult(size, overlappable.handle);
157}
158
159//------------------------------------------------------------------------------
160
161inline bool Completer::checkWaitedResult(bool& result)
162{
163 if (!isWaited()) {
164 return false;
165 }
166
167 DWORD size = 0;
168 result = getResult(size);
169
170 if (result) {
171 removeFromWaiter();
172 handleWaitedResult(size);
173 } else if (overlappable.failed()) {
174 removeFromWaiter();
175 }
176
177 return true;
178}
179
180//------------------------------------------------------------------------------
181
182} /* namespace xplcommon::win32 */ } /* namespace xplcommon */
183
184//------------------------------------------------------------------------------
185#endif // XPLCOMMON_WIN32_COMPLETER_H
186
187// Local Variables:
188// mode: C++
189// c-basic-offset: 4
190// indent-tabs-mode: nil
191// End:
Note: See TracBrowser for help on using the repository browser.