⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sipparser.cxx

📁 一个SIP协议栈
💻 CXX
📖 第 1 页 / 共 2 页
字号:
        str->erase();        if(!empty())        {            HdrArray::const_iterator it;            mp_StartLine.dump(str);            for(it = mp_HdrArray.begin(); it != mp_HdrArray.end(); ++it)            {                if(*it)                {                    (*it)->dump(str);                }            }        }    }    //---------------------------------------------------------------------------------------    //Divide a string into two pieces: hdr_name and hdr_content    static void div_line(const std::mstring &line, std::mstring *hdr_name, std::mstring *hdr_content)    {        hdr_name->erase();        hdr_content->erase();        std::string::size_type posn = line.find(':');        if(posn != std::string::npos)        {            hdr_name->assign(line, 0, posn);            ++posn;            std::string::size_type posc = line.find_first_not_of(" \t", posn);            if(posc == std::string::npos) posc = posn;            hdr_content->assign(line, posc, std::string::npos);        }       }    //---------------------------------------------------------------------------------------    void     MsgParser::decodeContent(const std::mstring &content)    {        if(header(hdrnContentType).val(mpnSubVal).comparei("multipart") != 0)        {            contentType(0).decode(header(hdrnContentType).encode(false), false);            setContent(content, 0);        }        else        {            std::string::size_type start = 0;            std::mstring tmp;            unsigned count = 0;            int status = 0;            while((start = content.token(&tmp, start, mp_Separator, "", 0, std::mstring::sep_single)) != string::npos)            {                tmp.atrim();                if(tmp.empty()) continue;                std::mstring hdr_name;                std::mstring hdr_content;                div_line(tmp, &hdr_name, &hdr_content);                if(!hdr_name.empty() && !hdr_content.empty())                {                    if(MpHeader::isHeader(hdr_name, hdrnContentType))                    {                        if(status != 0)                        {                            throw MpSyntaxError("MsgParser: Unexpected 'ContentType' in multiple payload");                        }                        contentType(count).decode(hdr_content);                        ++count;                        status = 1;                         continue;                    }                    if(MpHeader::isHeader(hdr_name, hdrnContentLength))                    {                        if(status != 1)                        {                            throw MpSyntaxError("MsgParser: Unexpected 'ContentLength' in multiple payload");                        }                        unsigned len = atoi(hdr_content.c_str());                        std::mstring part;                        part.assign(content, start, len);                        setContent(part, count-1);                        start += len;                        status = 0;                    }                }            }        }    }    //---------------------------------------------------------------------------------------    void MsgParser::decode(const std::mstring & str, std::string::size_type len, bool chk_syntax_flag)    {        erase();        setLineSep(detectLineSep(str));        std::string::size_type cont_len = atoi(findHeader(str, hdrnContentLength, mp_Separator).c_str());        std::string::size_type start = 0;        std::mstring line;        std::mstring hdr_name;        std::mstring hdr_content;        std::mstring hdr_token;        bool start_line_parsed = false;        for(;;)        {            start = str.token(&line, start, mp_Separator, QuoteSymb, QPairSymb,                               std::mstring::sep_whole_str);            if(start == std::string::npos) break;            line.atrim();            if(!line.empty())            {                if(!start_line_parsed)                {                    mp_StartLine.decode(line, chk_syntax_flag);                    start_line_parsed = true;                }                else                {                    div_line(line, &hdr_name, &hdr_content);                    if(!hdr_name.empty() && !hdr_content.empty())                    {                        MpHeader * p_hdr = &insertHeader(hdr_name.c_str(), 32767);                        if(p_hdr->is_multiple_hdr())                        {                            std::string::size_type strt_hdr = 0;                            unsigned index = 0;                            while((strt_hdr = hdr_content.token(&hdr_token, strt_hdr, ",",                                                                QuoteSymb, QPairSymb,                                                                std::mstring::sep_multiple)) !=                                                                std::string::npos)                            {                                hdr_token.atrim();                                if(index)                                {                                    p_hdr = &insertHeader(hdr_name.c_str(), 32767);                                }                                p_hdr->decode(hdr_token, chk_syntax_flag);                                index++;                            }                        }                        else                        {                            p_hdr->decode(hdr_content, chk_syntax_flag);                        }                    }                }            }            if(start >= len - cont_len) break;        }        if(start != std::string::npos)        {            if(cont_len)            {                std::mstring content;                content.assign(str, start, cont_len);                decodeContent(content);            }        }    }    //---------------------------------------------------------------------------------------    void     MsgParser::encodeContent(std::mstring *content)    {        content->erase();        if(mp_Content.size() > 1)        {            header(hdrnContentType).val(mpnValue) = "application";            header(hdrnContentType).val(mpnSubVal) = "multipart";            ContentArray::iterator it;            MpContentLength len;            for(it = mp_Content.begin(); it != mp_Content.end(); ++it)            {                it->m_content.rtrims(mp_Separator);                it->m_content += mp_Separator;                content->append(it->m_type->encodeHeaderName());                content->append(it->m_type->encode());                content->append(mp_Separator);                len.val(mpnValue) = it->m_content.length();                content->append(len.encodeHeaderName());                content->append(len.encode());                content->append(mp_Separator);                content->append(it->m_content);                content->append(mp_Separator);            }        }        else        {            if(mp_Content.size() == 1)            {                mp_Content[0].m_content.rtrims(mp_Separator);                mp_Content[0].m_content += mp_Separator;                (*content) = mp_Content[0].m_content;                header(hdrnContentType).decode(mp_Content[0].m_type->encode());            }        }        header(hdrnContentLength).val(mpnValue) = content->length();    }    //---------------------------------------------------------------------------------------    std::mstring MsgParser::encode(bool chk_syntax_flag)    {        std::mstring ret;        if(!empty())        {            std::mstring content;            encodeContent(&content);            HdrArray built;             HdrArray::const_iterator it;            HdrArray::iterator b_it;            ret = mp_StartLine.encode(chk_syntax_flag) + mp_Separator;            for(it = mp_HdrArray.begin(); it != mp_HdrArray.end(); ++it)            {                MpHeader * p_hdr = *it;                if(p_hdr == 0)                {                    throw MpAccessError(null_pointer_detected);                }                if(!p_hdr->empty())                {                    bool built_flag = false;                    for(b_it = built.begin(); b_it != built.end(); ++b_it)                    {                        if(p_hdr == *b_it)                         {                            built_flag = true;                            break;                        }                    }                    if(!built_flag)                    {                        built.push_back(p_hdr);                        if(p_hdr->uniteDesired())                        {                            ret += p_hdr->encodeHeaderName();                            std::mstring name = p_hdr->getHeaderName();                            unsigned n = count(name.c_str());                            unsigned i;                            for(i = 0; i < n; i++)                            {                                p_hdr = &header(name.c_str(), i);                                ret += p_hdr->encode(chk_syntax_flag);                                if(i != n - 1) ret += ", ";                                built.push_back(p_hdr);                            }                            ret += mp_Separator;                        }                        else                        {                            ret += p_hdr->encodeHeaderName() +                                    p_hdr->encode(chk_syntax_flag) +                                    mp_Separator;                        }                    }                }            }            ret += mp_Separator;            ret += content;        }        return ret;    }    //---------------------------------------------------------------------------------------    void MsgParser::checkSyntax()    {        mp_StartLine.checkSyntax();        HdrArray::iterator it = mp_HdrArray.begin();        for(; it != mp_HdrArray.end(); ++it)        {            MpHeader * p_hdr = *it;            if(p_hdr == 0)            {                throw MpAccessError(null_pointer_detected);            }            p_hdr->checkSyntax();        }    }    //---------------------------------------------------------------------------------------    MpContentType &     MsgParser::contentType(unsigned index)    {        Content cont;        while(mp_Content.size() <= index)        {            cont.m_type = new MpContentType;            mp_Content.push_back(cont);        }        return *(mp_Content[index].m_type);    }    //---------------------------------------------------------------------------------------    const MpContentType &     MsgParser::contentType(unsigned index) const    {        if(index < mp_Content.size()) return *(mp_Content[index].m_type);        throw MpAccessError("MsgParser: Out of content index");    }    //---------------------------------------------------------------------------------------    const std::mstring &     MsgParser::getContent(unsigned index) const    {        if(index < mp_Content.size()) return mp_Content[index].m_content;        throw MpAccessError("MsgParser: Out of content index");    }    //---------------------------------------------------------------------------------------    void     MsgParser::setContent(const std::string & content, unsigned index)    {        Content cont;        while(mp_Content.size() <= index)        {            cont.m_type = new MpContentType;            mp_Content.push_back(cont);        }        mp_Content[index].m_content = content;    }    //---------------------------------------------------------------------------------------    void     MsgParser::removeContent(unsigned index)    {        if(index < mp_Content.size())         {            if(mp_Content[index].m_type) delete mp_Content[index].m_type;            mp_Content.erase(ContentArray::iterator(mp_Content.begin() + index));        }    }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -