bool SIPFrom::setHeaderParams(std::string& from, const char* headerParams) { char* raQuotOffSet = raquotFinder_1.parse(from.c_str()); if (raQuotOffSet != from.c_str()) { from = std::string(from.c_str(), (const char*)raQuotOffSet); from += headerParams; return true; } else { ABNFTokens fsTokens; fromSpecParser.parseTokens(from.c_str(), fsTokens); if (fsTokens.size() != 2) return false; char* addrSpecOffSet = addrSpecParser.parse(fsTokens[0].c_str()); if (addrSpecOffSet == fsTokens[0].c_str()) return false; std::string addrSpec(fsTokens[0].c_str(), (const char*)addrSpecOffSet); char* paramsOffSet = uriParamsFinder.parse(addrSpec.c_str()); if (paramsOffSet == addrSpec.c_str()) { from += headerParams; } else { from = std::string(addrSpec.c_str(), (const char*)paramsOffSet); from += headerParams; } } return true; }
bool SIPURI::getParams(const std::string& uri, std::string& params) { ABNFTokens tokens; uriParametersParser.parseTokens(uri.c_str(), tokens); if (tokens.size() != 2) return false; params = tokens[1]; return true; }
bool SIPURI::getHostPort(const std::string& uri, std::string& value) { ABNFTokens tokens; hostPortParser.parseTokens(uri.c_str(), tokens); if (tokens.size() != 2) return false; value = tokens[1]; return true; }
bool SIPURI::getUser(const std::string& uri, std::string& value) { char* offSet = ABNF::findNextIterFromString(":", uri.c_str()); if (offSet == uri.c_str()) return false; ABNFTokens tokens; userInfoParser.parseTokens(offSet, tokens); if (tokens.size() != 3) return false; value = tokens[0]; return !value.empty(); }
bool SIPURI::getHeaders(const std::string& uri, std::string& headers) { //typedef ABNFLRSequence2<URIParametersParser, ABNF_SIP_headers> URIHeadersParser; //static URIHeadersParser uriHeadersParser; //ABNFEvaluate<URIHeadersParser> headersVerify; ABNFTokens tokens; uriHeadersParser.parseTokens(uri.c_str(), tokens); if (tokens.size() == 2) { headers = tokens[1]; return true; } return false; }
bool SIPURI::setHostPort(std::string& uri, const char* hostPort) { if (is_empty(hostPort)) { return false; } if (!hostPortVerify(hostPort)) { return false; } ABNFTokens tokens; char* tailOffSet = hostPortParser.parseTokens(uri.c_str(), tokens); if (tokens.size() != 2) return false; std::string front = tokens[0]; front += hostPort; front += tailOffSet; uri = front; return true; }
bool SIPFrom::setDisplayName(std::string& from, const char* displayName) { ABNFTokens fsTokens; fromSpecParser.parseTokens(from.c_str(), fsTokens); if (fsTokens.size() != 2) return false; ABNFTokens naTokens; char* offSet = nameAddrParser.parseTokens(fsTokens[0].c_str(), naTokens); if (offSet == fsTokens[0].c_str() || naTokens.size() != 4) { from = displayName; from += " <"; char* paramsOffSet = uriParamsFinder.parse(fsTokens[0].c_str()); if (paramsOffSet == fsTokens[0].c_str()) { from += fsTokens[0]; from += ">"; from += fsTokens[1]; return true; } std::string uriNoParams(fsTokens[0].c_str(), (const char*)paramsOffSet); from += uriNoParams; from += ">"; from += paramsOffSet; return true; } from = displayName; from += " <"; from += naTokens[2]; from += ">"; from += fsTokens[1]; return true; }
bool SIPFrom::getURI(const std::string& from, std::string& uri) { char* laQuotOffSet = laquotFinder_1.parse(from.c_str()); if (laQuotOffSet == from.c_str()) { //uri params is considered as header params ABNFTokens fsTokens; fromSpecParser.parseTokens(from.c_str(), fsTokens); if (fsTokens.size() != 2) return false; char* addrSpecOffSet = addrSpecParser.parse(fsTokens[0].c_str()); if (addrSpecOffSet == fsTokens[0].c_str()) return false; std::string addrSpec(fsTokens[0].c_str(), (const char*)addrSpecOffSet); char* paramsOffSet = uriParamsFinder.parse(addrSpec.c_str()); if (paramsOffSet == addrSpec.c_str()) { uri = addrSpec; return true; } else { uri = std::string(addrSpec.c_str(), (const char*)paramsOffSet); return true; } } else { char* raQuotOffSet = raquotFinder_0.parse(laQuotOffSet); if (raQuotOffSet == laQuotOffSet) return false; uri = std::string(laQuotOffSet, raQuotOffSet); return true; } return true; }
bool SIPFrom::setURI(std::string& from, const char* uri) { char* laQuotOffSet = laquotFinder_1.parse(from.c_str()); if (laQuotOffSet == from.c_str()) { // // uri params is considered as header params if // there is no angle bracket enclosure // ABNFTokens fsTokens; fromSpecParser.parseTokens(from.c_str(), fsTokens); if (fsTokens.size() != 2) return false; char* addrSpecOffSet = addrSpecParser.parse(fsTokens[0].c_str()); if (addrSpecOffSet == fsTokens[0].c_str()) return false; std::string addrSpec(fsTokens[0].c_str(), (const char*)addrSpecOffSet); char* paramsOffSet = uriParamsFinder.parse(addrSpec.c_str()); if (paramsOffSet == addrSpec.c_str()) { from = uri; return true; } else { std::string headerParams = paramsOffSet; from = uri; from += headerParams; return true; } } else { ABNFTokens fsTokens; fromSpecParser.parseTokens(from.c_str(), fsTokens); if (fsTokens.size() != 2) return false; /// first check if the uri has LQUOT/RQUOT enclosure bool hasEnclosure = laquotFinder_1.parse(uri) != uri; if (hasEnclosure) { from = uri; from += fsTokens[1]; return true; } else { char* raQuotOffSet = raquotFinder_0.parse(laQuotOffSet); if (raQuotOffSet == laQuotOffSet) return false; std::string headerParams = raQuotOffSet; from = std::string(from.c_str(), (const char*)laQuotOffSet); from += uri; from += headerParams; return true; } } return false; }