//----------------------------------------------------------------- // Externally visible functions //----------------------------------------------------------------- StringX PWSAuxParse::GetExpandedString(const StringX &sxRun_Command, const StringX &sxCurrentDB, const CItemData *pci, bool &bAutoType, StringX &sxAutotype, stringT &serrmsg, StringX::size_type &st_column, bool &bURLSpecial) { std::vector<st_RunCommandTokens> v_rctokens; std::vector<st_RunCommandTokens>::iterator rc_iter; StringX sxretval(_T("")), sxurl; stringT spath, sdrive, sdir, sfname, sextn; stringT sdbdir; bURLSpecial = false; UINT uierr = ParseRunCommand(sxRun_Command, v_rctokens, bAutoType, sxAutotype, serrmsg, st_column); // if called with NULL ci, then we just parse to validate if (uierr > 0 || pci == NULL || sxCurrentDB.empty()) { v_rctokens.clear(); return sxretval; } // derive current db's directory and basename: spath = sxCurrentDB.c_str(); pws_os::splitpath(spath, sdrive, sdir, sfname, sextn); sdbdir = pws_os::makepath(sdrive, sdir, _T(""), _T("")); for (rc_iter = v_rctokens.begin(); rc_iter < v_rctokens.end(); rc_iter++) { st_RunCommandTokens &st_rctoken = *rc_iter; if (!st_rctoken.is_variable) { sxretval += st_rctoken.sxname.c_str(); continue; } if (st_rctoken.sxname == _T("appdir")) { sxretval += pws_os::getexecdir().c_str(); } else if (st_rctoken.sxname == _T("dbdir")) { sxretval += sdbdir.c_str(); } else if (st_rctoken.sxname == _T("fulldb")) { sxretval += spath.c_str(); } else if (st_rctoken.sxname == _T("dbname")) { sxretval += sfname.c_str(); } else if (st_rctoken.sxname == _T("dbextn")) { sxretval += sextn.c_str(); } else if (st_rctoken.sxname == _T("g") || st_rctoken.sxname == _T("group")) { sxretval += pci->GetGroup(); } else if (st_rctoken.sxname == _T("G") || st_rctoken.sxname == _T("GROUP")) { StringX sxg = pci->GetGroup(); StringX::size_type st_index; st_index = sxg.rfind(_T(".")); if (st_index != StringX::npos) { sxg = sxg.substr(st_index + 1); } sxretval += sxg; } else if (st_rctoken.sxname == _T("t") || st_rctoken.sxname == _T("title")) { sxretval += pci->GetTitle(); } else if (st_rctoken.sxname == _T("u") || st_rctoken.sxname == _T("user")) { sxretval += pci->GetUser(); } else if (st_rctoken.sxname == _T("p") || st_rctoken.sxname == _T("password")) { sxretval += pci->GetPassword(); } else if (st_rctoken.sxname == _T("e") || st_rctoken.sxname == _T("email")) { sxretval += pci->GetEmail(); } else if (st_rctoken.sxname == _T("a") || st_rctoken.sxname == _T("autotype")) { // Do nothing - autotype variable handled elsewhere } else if (st_rctoken.sxname == _T("url")) { sxurl = pci->GetURL(); if (sxurl.length() > 0) { // Remove 'Browse to' specifics StringX::size_type ipos; ipos = sxurl.find(_T("[alt]")); if (ipos != StringX::npos) { bURLSpecial = true; sxurl.erase(ipos, 5); } ipos = sxurl.find(_T("[ssh]")); if (ipos != StringX::npos) { bURLSpecial = true; sxurl.erase(ipos, 5); } ipos = sxurl.find(_T("{alt}")); if (ipos != StringX::npos) { bURLSpecial = true; sxurl.erase(ipos, 5); } ipos = sxurl.find(_T("[autotype]")); if (ipos != StringX::npos) { sxurl.erase(ipos, 10); } ipos = sxurl.find(_T("[xa]")); if (ipos != StringX::npos) { sxurl.erase(ipos, 4); } sxretval += sxurl; } } else if (st_rctoken.sxname == _T("n") || st_rctoken.sxname == _T("notes")) { StringX sx_notes = pci->GetNotes(); if (st_rctoken.index == 0) { sxretval += sx_notes; } else { std::vector<StringX> vsxnotes_lines; ParseNotes(sx_notes, vsxnotes_lines); // If line there - use it; otherwise ignore it if (st_rctoken.index > 0 && st_rctoken.index <= static_cast<int>(vsxnotes_lines.size())) { sxretval += vsxnotes_lines[st_rctoken.index - 1]; } else if (st_rctoken.index < 0 && abs(st_rctoken.index) <= static_cast<int>(vsxnotes_lines.size())) { sxretval += vsxnotes_lines[vsxnotes_lines.size() + st_rctoken.index]; } } } else { // Unknown variable name - rebuild it sxretval += _T("$"); if (st_rctoken.has_brackets) sxretval += _T("("); sxretval += st_rctoken.sxname.c_str(); if (st_rctoken.index != 0) sxretval += st_rctoken.sxindex.c_str(); if (st_rctoken.has_brackets) sxretval += _T(")"); } } v_rctokens.clear(); return sxretval; }