MCPcopy Create free account
hub / github.com/digego/extempore / read_handler

Function read_handler

src/SchemeProcess.cpp:257–313  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

255 }
256
257 void read_handler(const boost::system::error_code& error, std::size_t bytes_transferred, SchemeProcess* scm, boost::asio::ip::tcp::socket* client_socket, std::stringstream* ss, void* data)
258 {
259 //std::cout << "READ HANDLER" << std::endl;
260 if(!error) {
261 //std::cout << "New Data: " << bytes_transferred << ": " << (char*)data << std::endl;
262 boost::asio::ip::tcp::acceptor* server_socket = scm->getServerSocket();
263 std::string evalstr = "\r\n";
264 *ss << (char*)data;
265 evalstr = ss->str();
266 //yay we have a full expression!!
267 if(evalstr[evalstr.length()-1] == 10 && evalstr[evalstr.length()-2] == 13) {
268 EXTMonitor& guard = scm->getGuard();
269 std::queue<SchemeTask>& taskq = scm->getQueue();
270 // there can be a number of separate expressions in a single string
271 int subexprs = 0;
272 for(int k=0;k<evalstr.length()-1;k++) { // remote -1
273 // if(evalstr[k] == TERMINATION_CHAR) subexptrs++;
274 if(evalstr[k] == 13 & evalstr[k+1] == 10) subexprs++;
275 }
276 int subexprspos = 0;
277 int subexprsnext = 0;
278 for(int y=0;y<subexprs;y++) {
279 for( ; subexprsnext<evalstr.length();subexprsnext++) {
280 //if(evalstr[subexprsnext] == TERMINATION_CHAR) break;
281 if(evalstr[subexprsnext] == 13 && evalstr[subexprsnext+1] == 10) break;
282 }
283 if(evalstr != "#break#" && evalstr != "") {
284 if(guard.isOwnedByCurrentThread()) {
285 printf("Extempore interpreter server thread trying to relock. Dropping Task!. Let me know andrew@moso.com.au\n");
286 }
287 else {
288 guard.lock();
289 char c[64];
290 //memset(c,0,64);
291 //sprintf(c, "%p", client_socket); //*pos);
292 //std::cout << "client socket: " << (char*)c << std::endl;
293 subexprsnext++;
294 std::string* s = new std::string(evalstr.substr(subexprspos,(subexprsnext-subexprspos)));
295 //std::cout << extemp::UNIV::TIME << "> SCHEME TASK WITH SUBEXPR:" << y << ">><" << subexprspos << "," << (subexprsnext-subexprspos) << "> " << *s << std::endl;
296 subexprspos = subexprsnext;
297 taskq.push(SchemeTask(extemp::UNIV::TIME, scm->getMaxDuration(), s, "socket", 0, client_socket));// Task<std::string*>(0l, NULL, new std::string(evalstr), c));
298 guard.signal(); //Notify();
299 guard.unlock();
300 // if this is an ipc call don't wait for a reply
301 //if(0==strncmp(s->c_str(), "(ipc", 4)) continue;
302 }
303 }
304 }
305 ss->str(""); //reset stringstream to null for next expression
306 start_read(scm,client_socket,ss,data);
307 return;
308 }else{
309 start_read(scm,client_socket,ss,data);
310 return;
311 }
312 }
313 }
314#endif

Callers

nothing calls this directly

Calls 9

SchemeTaskClass · 0.85
start_readFunction · 0.85
getServerSocketMethod · 0.80
getGuardMethod · 0.80
lockMethod · 0.45
getMaxDurationMethod · 0.45
signalMethod · 0.45
unlockMethod · 0.45

Tested by

no test coverage detected