Jamoma API  0.6.0.a19
MinuitAnswerManager.cpp
Go to the documentation of this file.
1 /** @file
2  *
3  * @ingroup modularMinuit
4  *
5  * @brief A Protocol interface
6  *
7  * @details
8  *
9  * @authors Laurent Garnier, Théo de la Hogue
10  *
11  * @copyright © 2011, Laurent Garnier, Théo de la Hogue @n
12  * This code is licensed under the terms of the "New BSD License" @n
13  * http://creativecommons.org/licenses/BSD/
14  */
15 
16 
17 #include "MinuitAnswerManager.h"
18 
19 MinuitAnswerManager::MinuitAnswerManager(MinuitPtr aMinuitProtocol)
20 {
21  mProtocol = aMinuitProtocol;
22 
23  mDiscoverAnswers = new TTHash();
24  mGetAnswers = new TTHash();
25 }
26 
27 MinuitAnswerManager::~MinuitAnswerManager()
28 {
29  delete mDiscoverAnswers;
30  delete mGetAnswers;
31 }
32 
33 void MinuitAnswerManager::AddDiscoverAnswer(TTSymbol from, TTAddress address, int timeOutInMs)
34 {
35  TTString key = from.string();
36  key += address.string();
37 
38  MinuitAnswerPtr anAnswer = new MinuitAnswer();
39  anAnswer->setTimeOut(timeOutInMs);
40 
41  mDiscoverAnswers->append(TTSymbol(key), (TTPtr)anAnswer);
42 }
43 
44 TTErr MinuitAnswerManager::ReceiveDiscoverAnswer(TTSymbol from, TTAddress address, const TTValue& value, TTErr error)
45 {
46  TTValue v;
47  TTString key;
48  MinuitAnswerPtr anAnswer;
49  TTErr err;
50 
51  key = from.string();
52  key += address.string();
53 
54  err = mDiscoverAnswers->lookup(TTSymbol(key), v);
55 
56  if (!err) {
57  anAnswer = MinuitAnswerPtr((TTPtr)v[0]);
58 
59  if (anAnswer->getState() != TIMEOUT_EXCEEDED) {
60  anAnswer->setAnswer(value, error);
61  return kTTErrNone;
62  }
63  }
64  else
65  cout << "MinuitAnswerManager::ReceiveDiscoverAnswer can't find a request at " << key << endl;
66 
67  return kTTErrGeneric;
68 }
69 
70 int MinuitAnswerManager::CheckDiscoverAnswer(TTSymbol from, TTAddress address, TTValue& value)
71 {
72  int state;
73  TTValue v;
74  TTString key;
75  MinuitAnswerPtr anAnswer;
76  TTErr err;
77 
78  key = from.string();
79  key += address.string();
80 
81  // Looking for a MinuitDiscoverAnswer object at the given address
82  err = mDiscoverAnswers->lookup(TTSymbol(key), v);
83 
84  if (!err) {
85  anAnswer = MinuitAnswerPtr((TTPtr)v[0]);
86 
87  // wait
88  anAnswer->wait();
89 
90  state = anAnswer->getState();
91 
92  // if an answer is received
93  if(state != NO_ANSWER)
94  {
95  // get the answer
96  anAnswer->getAnswer(value);
97  mDiscoverAnswers->remove(TTSymbol(key));
98  delete anAnswer;
99  }
100 
101  return state;
102  }
103  else
104  return REQUEST_NOT_SENT;
105 }
106 
107 TTErr MinuitAnswerManager::ParseDiscoverAnswer(const TTValue& answer, TTSymbol& returnedType, TTValue& returnedChildren, TTValue& returnedAttributes)
108 {
109  TTSymbol toParse, parsed;
110  TTBoolean endFlagFound;
111 
112  // pars the type
113  returnedType = answer[0];
114 
115  // parse something like : nodes={ all nodes below } attributes={ all current node's attributes }
116  for (TTUInt32 i = 1; i < answer.size(); i++) {
117 
118  toParse = answer[i];
119 
120  // parse nodes
121  if (toParse == TTSymbol(MINUIT_START_NODES)) {
122 
123  endFlagFound = NO;
124  do {
125  i++;
126  parsed = kTTSymEmpty;
127  if (answer[i].type() == kTypeSymbol)
128  parsed = answer[i];
129 
130  // don't store the end flag
131  if (parsed != TTSymbol(MINUIT_END_NODES)) {
132 
133  returnedChildren.append(parsed);
134 
135 #ifdef TT_PROTOCOL_DEBUG
136  cout << "Parsed node " << parsed.c_str() << endl;
137 #endif
138  }
139  else
140  endFlagFound = YES;
141  }
142  while (!endFlagFound);
143 
144  }
145  else if (toParse == TTSymbol(MINUIT_START_ATTRIBUTES)) {
146 
147  endFlagFound = NO;
148  do {
149  i++;
150  parsed = kTTSymEmpty;
151  if (answer[i].type() == kTypeSymbol)
152  parsed = answer[i];
153 
154  // don't store the end flag
155  if (parsed != TTSymbol(MINUIT_END_ATTRIBUTES)) {
156 
157  returnedAttributes.append(parsed);
158 
159 #ifdef TT_PROTOCOL_DEBUG
160  cout << "Parsed attribute " << parsed.c_str() << endl;
161 #endif
162  }
163  else
164  endFlagFound = YES;
165  }
166  while (!endFlagFound);
167 
168  }
169  else
170  i++;
171  } // end for to parse answer
172 
173  return kTTErrNone;
174 }
175 
176 void MinuitAnswerManager::AddGetAnswer(TTSymbol from, TTAddress address, int timeOutInMs)
177 {
178  TTString key = from.string();
179  key += address.string();
180 
181  MinuitAnswerPtr anAnswer = new MinuitAnswer();
182  anAnswer->setTimeOut(timeOutInMs);
183 
184  mGetAnswers->append(TTSymbol(key), (TTPtr)anAnswer);
185 }
186 
187 TTErr MinuitAnswerManager::ReceiveGetAnswer(TTSymbol from, TTAddress address, const TTValue& value, TTErr error)
188 {
189  TTValue v;
190  TTString key;
191  MinuitAnswerPtr anAnswer;
192  TTErr err;
193 
194  key = from.string();
195  key += address.string();
196 
197  err = mGetAnswers->lookup(TTSymbol(key), v);
198 
199  if (!err) {
200  anAnswer = MinuitAnswerPtr((TTPtr)v[0]);
201 
202  if (anAnswer->getState() != TIMEOUT_EXCEEDED) {
203  anAnswer->setAnswer(value, error);
204  return kTTErrNone;
205  }
206  }
207  else
208  cout << "MinuitAnswerManager::ReceiveGetAnswer can't find a request at " << key << endl;
209 
210  return kTTErrGeneric;
211 }
212 
213 int MinuitAnswerManager::CheckGetAnswer(TTSymbol from, TTAddress address, TTValue& value)
214 {
215  int state;
216  TTValue v;
217  TTString key;
218  MinuitAnswerPtr anAnswer;
219  TTErr err;
220 
221  key = from.string();
222  key += address.string();
223 
224  // Looking for a MinuitDiscoverAnswer object at the given address
225  err = mGetAnswers->lookup(TTSymbol(key), v);
226 
227  if (!err) {
228  anAnswer = MinuitAnswerPtr((TTPtr)v[0]);
229 
230  // wait
231  anAnswer->wait();
232 
233  state = anAnswer->getState();
234 
235  // if an answer is received
236  if(state != NO_ANSWER)
237  {
238  // get the answer
239  anAnswer->getAnswer(value);
240  mGetAnswers->remove(TTSymbol(key));
241  delete anAnswer;
242  }
243 
244  return state;
245  }
246  else
247  return REQUEST_NOT_SENT;
248 }
bool TTBoolean
Boolean flag, same as Boolean on the Mac.
Definition: TTBase.h:167
The TTAddress class is used to represent a string and efficiently pass and compare that string...
Definition: TTAddress.h:29
size_type size() const noexcept
Return the number of elements.
Maintain a collection of TTValue objects indexed by TTSymbol pointers.
Definition: TTHash.h:36
Symbol type.
Definition: TTBase.h:282
void append(const T &anElementValueToAppend)
Insert a single TTElement at the end.
Definition: TTValue.h:243
void * TTPtr
A generic pointer.
Definition: TTBase.h:248
The TTSymbol class is used to represent a string and efficiently pass and compare that string...
Definition: TTSymbol.h:26
const char * c_str() const
Return a pointer to the internal string as a C-string.
Definition: TTSymbol.h:77
Something went wrong, but what exactly is not known. Typically used for context-specific problems...
Definition: TTBase.h:344
TTErr
Jamoma Error Codes Enumeration of error codes that might be returned by any of the TTBlue functions a...
Definition: TTBase.h:342
std::uint32_t TTUInt32
32 bit unsigned integer
Definition: TTBase.h:178
A Protocol interface.
No Error.
Definition: TTBase.h:343
The TTString class is used to represent a string.
Definition: TTString.h:34
[doxygenAppendixC_copyExample]
Definition: TTValue.h:34