Module: sems Branch: master Commit: a0ecb34f0c802b5be80a443bbbcb10fff93a8630 URL: https://github.com/sems-server/sems/commit/a0ecb34f0c802b5be80a443bbbcb10fff93a8630
Author: Stefan Sayer <[email protected]> Committer: Stefan Sayer <[email protected]> Date: 2015-06-09T00:27:49+02:00 b/f:dsm: sets() - don't try to replace within already replaced strings --- Modified: apps/dsm/DSMCoreModule.cpp --- Diff: https://github.com/sems-server/sems/commit/a0ecb34f0c802b5be80a443bbbcb10fff93a8630.diff Patch: https://github.com/sems-server/sems/commit/a0ecb34f0c802b5be80a443bbbcb10fff93a8630.patch --- diff --git a/apps/dsm/DSMCoreModule.cpp b/apps/dsm/DSMCoreModule.cpp index c96528d..2e53b8c 100644 --- a/apps/dsm/DSMCoreModule.cpp +++ b/apps/dsm/DSMCoreModule.cpp @@ -753,23 +753,37 @@ string replaceParams(const string& q, AmSession* sess, DSMSession* sc_sess, // todo: simply use resolveVars (?) switch(res[rstart]) { case '$': { - - if (sc_sess->var.find(keyname) == sc_sess->var.end()) - res.erase(rstart, rend-rstart); - else - res.replace(rstart, rend-rstart, sc_sess->var[keyname]); + if (sc_sess->var.find(keyname) == sc_sess->var.end()) { + res.erase(rstart, rend-rstart); + if (repl_pos) repl_pos--; // repl_pos was after $ + } else { + res.replace(rstart, rend-rstart, sc_sess->var[keyname]); + if (sc_sess->var[keyname].size()) + repl_pos+=sc_sess->var[keyname].size()-1; // skip after new string + } } break; case '#': if (NULL!=event_params) { - if (event_params->find(keyname) != event_params->end()) + if (event_params->find(keyname) != event_params->end()) { res.replace(rstart, rend-rstart, (*event_params)[keyname]); - else - res.erase(rstart, rend-rstart); + if (repl_pos+=(*event_params)[keyname].size()) + repl_pos+=(*event_params)[keyname].size()-1; // skip after new string + } else { + res.erase(rstart, rend-rstart); + if (repl_pos) repl_pos--; // repl_pos was after # + } } break; case '@': { - // todo: optimize - res.replace(rstart, rend-rstart, - resolveVars("@"+keyname, sess, sc_sess, event_params)); + // todo: optimize + string n = resolveVars("@"+keyname, sess, sc_sess, event_params); + res.replace(rstart, rend-rstart, n); + if (n.size()) + repl_pos+=n.size()-1; // skip after new string + // rstart rend + // bla@(varname)uuuu + // r + // r + // bla12345huuuu } break; default: break; } _______________________________________________ Semsdev mailing list [email protected] http://lists.iptel.org/mailman/listinfo/semsdev
