| 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 |
nothing calls this directly
no test coverage detected